AMDP + XLSX Workbench 报表开发模式
本文介紹了我和同事通過使用AMDP +?XLSX Workbench縮短報(bào)表開發(fā)周期、分離數(shù)據(jù)查詢處理邏輯和前端展示工作的經(jīng)驗(yàn)。歡迎討論。
前言
最近接到了一套人力資源報(bào)表的開發(fā)需求,需要以EXCEL表格的方式輸出,且包含大量sheet頁,每個(gè)sheet相當(dāng)于一個(gè)獨(dú)立的報(bào)表。
這種情況下,如果讓同一個(gè)人開發(fā)所有內(nèi)容,將會(huì)花費(fèi)較長(zhǎng)的開發(fā)周期,因此,要將程序分解成若干個(gè)部分,最好每個(gè)報(bào)表(sheet)都是一個(gè)獨(dú)立的子模塊,讓不同的人同時(shí)開發(fā)。
對(duì)于這類報(bào)表,我們之前的做法是,使用OLE輸出EXCEL文件,在report程序中,使用邏輯數(shù)據(jù)庫獲取數(shù)據(jù),引入常用的OLE方法,為每個(gè)sheet創(chuàng)建一個(gè)include文件,實(shí)現(xiàn)不同sheet的代碼分離。
代碼類似這樣:
REPORT zhr_report .************************************************************************ * INCLUDES ************************************************************************ INCLUDE zhr_report_top. "//數(shù)據(jù)定義INCLUDE zhr_report_s01. "//選擇屏幕```````````INCLUDE z_ole_excel_hr. "//通用EXCEL操作子程序INCLUDE zhr_report_m01. "//事件INCLUDE zhr_report_f01. "//通用模塊INCLUDE zhr_report_ex01. "//Sheet1INCLUDE zhr_report ex02. "//Sheet2INCLUDE zhr_report_ex03. "//Sheet3INCLUDE zhr_report_ex04. "//Sheet4INCLUDE zhr_report_ex05. "//Sheet5
示意圖:
?
?
通過將通用的OLE方法封裝到一個(gè)包含文件中,并使sheet頁的處理放到不同的包含文件,可以使對(duì)它們的同時(shí)編輯成為可能。但是,這種做法也是有問題的:
- 包含文件不是單獨(dú)的程序,這意味著只要有一個(gè)include文件中有語法錯(cuò)誤,語法檢查時(shí)就會(huì)給出提示,從而無法激活整個(gè)程序。
- 命名空間相同,這意味著定義子程序或FORM名時(shí),很容易發(fā)生沖突
- 只能通過增加包含文件實(shí)現(xiàn)程序的橫向擴(kuò)展,較難實(shí)現(xiàn)程序的縱向擴(kuò)展。通用部分一旦確定,再想修改會(huì)比較困難。
- OLE的性能較差。
為了解決這些問題,我們引入了AMDP + XLSX Workbench的報(bào)表開發(fā)模式。
改進(jìn)后的模式示意圖:
?
本文鏈接:http://www.cnblogs.com/hhelibeb/p/8422711.html
名詞解釋
AMDP
全稱ABAP-Managed Database Procedure,一種ABAP on HANA的實(shí)現(xiàn)方式,提供了在ABAP中運(yùn)行SQL Script的可能,并且與ABAP中的類和數(shù)據(jù)類型有良好的集成。之前的有關(guān)AMDP的文章:
ABAP中的AMDP(ABAP-Managed Database Procedures )
XLSX Workbench
一種可視化表單生成工具,相比復(fù)雜的OLE,可以用少量代碼+一些拖拽和配置來生成EXCEL報(bào)表,性能更好。按XLSX Workbench的文檔介紹,它有九大特性:
- 無需ABAP編程技能
- 可視化設(shè)計(jì)方式
- 高性能
- 支持后臺(tái)處理
- 強(qiáng)大的表單格式特性支持
- 支持公式
- 支持圖片
- 支持圖表
- 支持樹
官方文檔:https://sites.google.com/site/sapxlwb/home
代碼例子
注意,本部分內(nèi)容會(huì)假設(shè)讀者已經(jīng)有使用AMDP的XLSX Workbench的初步經(jīng)驗(yàn)(至少是能輸出Hello World的水平)。如果不是這樣的話,可能會(huì)對(duì)其中的某些內(nèi)容感到困惑。
1,首先,創(chuàng)建一個(gè)接口ZIF_XLSX_REPORT。
INTERFACE zif_xlsx_reportPUBLIC .METHODS get_dataCHANGING!data TYPE sflight_tRAISINGcx_amdp_error .ENDINTERFACE.接口包含一個(gè)get_data方法,方法有一個(gè)參數(shù)data,它數(shù)據(jù)類型,即為將要輸出給XLSX Workbench表單的的數(shù)據(jù)類型。
?
2,為接口創(chuàng)建實(shí)現(xiàn)類。
?為接口創(chuàng)建一個(gè)實(shí)現(xiàn)類,在方法ZIF_XLSX_REPORT~GET_DATA中調(diào)用AMDP類方法,進(jìn)行數(shù)據(jù)處理后,將得到的數(shù)據(jù)填充進(jìn)chaging參數(shù)data中。
CLASS zcl_xlsx_report1 DEFINITIONPUBLICFINALCREATE PUBLIC .PUBLIC SECTION.INTERFACES zif_xlsx_report .PROTECTED SECTION.PRIVATE SECTION.ENDCLASS.CLASS ZCL_XLSX_REPORT1 IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_XLSX_REPORT1->ZIF_XLSX_REPORT~GET_DATA * +-------------------------------------------------------------------------------------------------+ * | [<-->] DATA TYPE SFLIGHT_T * | [!CX!] CX_AMDP_ERROR * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD zif_xlsx_report~get_data."調(diào)用AMDP類的方法"數(shù)據(jù)處理ENDMETHOD. ENDCLASS.3,在report程序中調(diào)用各個(gè)實(shí)現(xiàn)類。
?
這是關(guān)鍵的一步:在report程序中動(dòng)態(tài)地獲取全部實(shí)現(xiàn)類,并依次實(shí)例化、調(diào)用其接口方法。
CONSTANTS: c_interface TYPE seoclsname VALUE 'ZIF_XLSX_REPORT'.TRY.DATA(gt_classes) = cl_sic_configuration=>get_classes_for_interface( c_interface ).CATCH cx_class_not_existent .ENDTRY.LOOP AT gt_classes INTO DATA(gs_class).TRY .CREATE OBJECT go_ref TYPE (gs_class-clsname).CATCH cx_sy_create_object_error.ENDTRY.IF go_ref IS BOUND.go_ref->get_data( CHANGING data = g_data_structure ).ENDIF.ENDLOOP.
?
- 由于XLSX Workbench中的一個(gè)表單在同一時(shí)間只能由一個(gè)人編輯,對(duì)于多sheet頁的表格,無法讓兩個(gè)人并行開發(fā)表單。但是,因?yàn)楸韱为?dú)立于ABAP 程序,二者只需要通過約定好的內(nèi)表結(jié)構(gòu)(在示例中是SFLIGHT_T)通信。因此,可以在約定好通信結(jié)構(gòu)的前提下,由一個(gè)人進(jìn)行XLSX Workbench中表單的組件編輯、上下文綁定等工作,另一個(gè)(或多個(gè))人進(jìn)行數(shù)據(jù)邏輯處理工作。如果在引入了HANA開發(fā)人員,還可以把主要邏輯下推至HANA,從而使多人同時(shí)在不同層級(jí)上開發(fā)同一個(gè)套表,以提高總體開發(fā)速度。
- 將每個(gè)sheet頁寫成一個(gè)類,所有類繼承同一個(gè)接口,在report程序中動(dòng)態(tài)地調(diào)用,可以將報(bào)表主程序的代碼穩(wěn)定下來,實(shí)現(xiàn)程序的解耦。不同的類之間也是個(gè)例的,可以方便地進(jìn)行單獨(dú)的單元測(cè)試,而不會(huì)在語法檢查時(shí)受到其他人的開發(fā)內(nèi)容的干擾。
- 相比于本文開頭提到的INCLUDE的方式,使用面向?qū)ο蟮男麻_發(fā)模式不僅提供了更好的橫向擴(kuò)展能力(只要增加新的實(shí)現(xiàn)類和結(jié)構(gòu)字段即可實(shí)現(xiàn)數(shù)據(jù)處理邏輯和報(bào)表內(nèi)容的擴(kuò)展),而且也提供了更好的縱向擴(kuò)展能力,可以通過面向?qū)ο蟮膹?qiáng)大特性——繼承——來實(shí)現(xiàn)對(duì)報(bào)表中相似部分進(jìn)行抽象整合。
注意事項(xiàng)
總結(jié)了幾點(diǎn)我們?cè)趯?shí)際開發(fā)中的經(jīng)驗(yàn),以供參考。
AMDP與SELECT-OPTIONS
細(xì)心的讀者可能已經(jīng)注意到上文的示例代碼中并未處理選擇屏幕這一關(guān)鍵問題。在Open SQL中我們可以很方便地直接使用range table。而在AMDP中使用它話需要一點(diǎn)點(diǎn)額外的代碼:
可以通過CL_SHDB_SELTAB=>COMBINE_SELTABS( )來將選擇屏幕的輸入條件轉(zhuǎn)換為AMDP中的SQL Script中的WHERE條件字符串,并使用APPLY_FILTER函數(shù)應(yīng)用這一條件,具體的例子:
(引用自 Handling of SELECT-OPTIONS parameters within AMDP)
異常處理
在本文介紹的開發(fā)模式下,HANA視圖、XLSX Workbench表單和ABAP類是可以并行開發(fā)的,這意味著開發(fā)階段的HANA視圖可能處于不穩(wěn)定的狀態(tài)。ABAP開發(fā)者應(yīng)注意在AMDP方法中顯式地聲明異常、并在調(diào)用它時(shí)進(jìn)行處理。不然會(huì)很容易遇到程序dump的情況:)
具體的異常可見:AMDP異常
自建結(jié)構(gòu)/表命名
無論是AMDP方法還是XLSX Workbench表單,在實(shí)踐中都需要自建結(jié)構(gòu)/表來接收數(shù)據(jù)。在開發(fā)內(nèi)容分離的情況下,作為通信定義的結(jié)構(gòu)/表類型的命名尤其重要。應(yīng)當(dāng)有一套合理的規(guī)則來為它們以及其中的字段命名。特別是XLSX Workbench表單的參數(shù)結(jié)構(gòu),在表單復(fù)雜的情況下,參數(shù)結(jié)構(gòu)同樣會(huì)是復(fù)雜的深度結(jié)構(gòu),而且XLSX Workbench的組件自動(dòng)生成功能會(huì)以ABAP結(jié)構(gòu)名為組件命名。如果命名不當(dāng)?shù)脑?#xff0c;將會(huì)給后續(xù)的開發(fā)和溝通帶來相當(dāng)?shù)呢?fù)擔(dān)。
另外,創(chuàng)建XLSX Workbench上下文時(shí),如選擇自動(dòng)創(chuàng)建,則生成的組件名和描述會(huì)與數(shù)據(jù)字典中定義的數(shù)據(jù)名與描述一致。如果定義時(shí)能仔細(xì)填入這些信息,對(duì)后續(xù)的工作很有幫助。
模板處理
上傳模板至XLSX Workbench后,建議首先對(duì)空模板進(jìn)行測(cè)試輸出,確認(rèn)無誤后,再進(jìn)行context和template的綁定等工作。因?yàn)橛袝r(shí)導(dǎo)入的模板也許會(huì)出現(xiàn)兼容問題,在輸出報(bào)表時(shí)會(huì)提示文件錯(cuò)誤。較早地發(fā)現(xiàn)、解決這種問題,可以避免后期一些無謂的工作。
XLSX Workbench設(shè)置
在使用XLSX Workbench的過程中,點(diǎn)擊鼠標(biāo)是一項(xiàng)略顯繁瑣的工作,建議把在配置選項(xiàng)中將確認(rèn)彈窗關(guān)掉,以減輕手指負(fù)擔(dān):
大報(bào)表的列修改問題
報(bào)表中增加列、減少列是常見的需求,在使用XLSX Workbench的時(shí)候,如果采取了簡(jiǎn)單表的輸出方式,那么插入或刪除新列時(shí),就要把這個(gè)新列以右的全部列重新綁定至新位置。
在報(bào)表總列數(shù)較小的情況下,這很容易做到。但某些報(bào)表的列數(shù)較多,如我們開發(fā)的系統(tǒng)使用情況表,約有167列,需求變更的內(nèi)容是在第5行新增一列,則意味著要重新綁定162個(gè)context value,這是件麻煩的工作。為了避免這種情況的發(fā)生,在表單的列數(shù)較多時(shí),建議使用動(dòng)態(tài)列或其它動(dòng)態(tài)方式實(shí)現(xiàn)對(duì)表單內(nèi)容的填充,以降低變更成本。
?
?
參考閱讀:SAP BADI的“多次使用”(multiple use)
Dynamic Range
?
本文鏈接:http://www.cnblogs.com/hhelibeb/p/8422711.html
轉(zhuǎn)載請(qǐng)注明
?
轉(zhuǎn)載于:https://www.cnblogs.com/hhelibeb/p/8422711.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的AMDP + XLSX Workbench 报表开发模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj 1834: [ZJOI2010
- 下一篇: 需求工程阅读笔记01