1、ABAP中DOI的实现我们再做复杂报表或是特定格式的报表时,ALV往往不能满足我们的需求,这时我们可以用DIO来做,DIO的原理是我们首先上载一个EXCEL模板,然后根据我们的模板定义特定格式的内表,然后将内表中的数据填充至模板显示,DIO具有极大的灵活性,可以满足我们对任何复杂报表的需求。上载EXCEL模板的TCODE是OAOR.假如我们上载了如下格式的模板:然后代码如下:*&-*& Report Z_Rocky_TEST*&*&-*& Rocky Wang*& RockyTech (AT) *& RockT*&-*REPORT Z_ROCKY_TEST.TABLES: T001.TYPE-
2、POOLS: SLIS,VRM, SBDST, SOI.引入必要的类型组CONSTANTS DOCUMENT_NAME(30) VALUE TEMP.模板名字CONSTANTS INPLACE VALUE X.控制参数,在GUI中显示ExcelDATA: FLAG .DATA:CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,容器实例CONTROL TYPE REF TO I_OI_CONTAINER_CONTROL,控制器实例 DOCUMENT TYPE REF TO I_OI_DOCUMENT_PROXY,文档操作对象 SPREADSHEET TY
3、PE REF TO I_OI_SPREADSHEET,分隔符对象 ERROR TYPE REF TO I_OI_ERROR,错误信息 ERRORS TYPE REF TO I_OI_ERROR OCCURS 0 WITH HEADER LINE.错误信息* spreadsheet interface structures for Excel data inputDATA: RANGEITEM TYPE SOI_RANGE_ITEM.DATA: RANGES TYPE SOI_RANGE_LIST.DATA: EXCEL_INPUT TYPE SOI_GENERIC_TABLE.DATA: EX
4、CEL_INPUT_WA TYPE SOI_GENERIC_ITEM.DATA: INITIALIZED(1), RETCODE TYPE SOI_RET_STRING.DATA: ITEM_URL(256).存放模板的UrlDATA DOCUMENT_TYPE(80).文档类型DATA: EXCEL(80) VALUE Excel.Sheet.DATA: LINE_COUNT TYPE I, COLUMN_COUNT TYPE I.DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM.CLASS C_OI_ERRORS DEFINITION L
5、OAD.DATA: BEGIN OF ITAB OCCURS 0.INCLUDE STRUCTURE T001.DATA: END OF ITAB.SELECT-OPTIONS BUKRS FOR T001-BUKRS.START-OF-SELECTION.PERFORM GETDATA.CALL SCREEN 100.*&-*& Form getdata*&-* text*-* - p1 text* CLOSE_DOCUMENT.关闭文档FREE DOCUMENT.ENDIF.IF NOT CONTROL IS INITIAL.CALL METHOD CONTROL-DESTROY_CONT
6、ROL.FREE CONTROL.ENDIF.LEAVE PROGRAM.WHEN BACK .IF NOT DOCUMENT IS INITIAL.CALL METHOD DOCUMENT-CLOSE_DOCUMENT.FREE DOCUMENT.ENDIF.IF NOT CONTROL IS INITIAL.CALL METHOD CONTROL-DESTROY_CONTROL.FREE CONTROL.ENDIF.SET SCREEN 0. quit the programset screen 1000.ENDCASE.ENDMODULE. USER_COMMAND_0100 INPUT
7、*&-*& Form CREATE_BASIC_OBJECTS*&-* text*-* -P_APP_NAME text* -P_CLASSNAME text* -P_CLASSTYPE text* -P_OBJ_KEY text* -P_DOCNAME text*-*FORM CREATE_BASIC_OBJECTS USING P_APP_NAME P_CLASSNAME P_CLASSTYPE P_OBJ_KEY P_DOCNAME.CHECK INITIALIZED IS INITIAL.* 获取SAP DOI的控制器接口CALL METHOD C_OI_CONTAINER_CONTR
8、OL_CREATOR=GET_CONTAINER_CONTROLIMPORTINGCONTROL = CONTROL ERROR = ERROR.* check no errors occuredCALL METHOD ERROR-RAISE_MESSAGEEXPORTINGTYPE = E.实例化容器实例CREATE OBJECT CONTAINEREXPORTING CONTAINER_NAME = CONTAINER.DATA L_APP_NAME(200).IF P_APP_NAME IS INITIAL. L_APP_NAME = TEST.ELSE. L_APP_NAME = P_
9、APP_NAME.ENDIF.初始化控制器的接口CALL METHOD CONTROL-INIT_CONTROLEXPORTING R3_APPLICATION_NAME = L_APP_NAME INPLACE_ENABLED = INPLACE INPLACE_SCROLL_DOCUMENTS = X PARENT = CONTAINER REGISTER_ON_CLOSE_EVENT = X REGISTER_ON_CUSTOM_EVENT = X NO_FLUSH = XIMPORTING ERROR = ERRORS.* save error object in collection
10、APPEND ERRORS.CLEAR ITEM_URL.定义BDS实例变量,用于设置文档信息DATA: BDS_INSTANCE TYPE REF TO CL_BDS_DOCUMENT_SET.DATA: DOC_SIGNATURE TYPE SBDST_SIGNATURE, WA_DOC_SIGNATURE LIKE LINE OF DOC_SIGNATURE, DOC_COMPONENTS TYPE SBDST_COMPONENTS, DOC_URIS TYPE SBDST_URI, WA_DOC_URIS LIKE LINE OF DOC_URIS.*以下三个值为Tcode:OAOR里
11、面新建模板文件的参数DATA: DOC_CLASSNAME TYPE SBDST_CLASSNAME VALUE HRFPM_EXCEL_STANDARD, DOC_CLASSTYPE TYPE SBDST_CLASSTYPE VALUE OT, DOC_OBJECT_KEY TYPE SBDST_OBJECT_KEY VALUE TEMP. WA_DOC_SIGNATURE-PROP_NAME = DESCRIPTION. DOCUMENT_TYPE = EXCEL. WA_DOC_SIGNATURE-PROP_VALUE = P_DOCNAME.赋给文档名字APPEND WA_DOC_SI
12、GNATURE TO DOC_SIGNATURE.DOC_SIGNATURE存储了文档信息CREATE OBJECT BDS_INSTANCE.CALL METHOD BDS_INSTANCE-GET_INFO获取文档信息EXPORTING CLASSNAME = DOC_CLASSNAME CLASSTYPE = DOC_CLASSTYPE OBJECT_KEY = DOC_OBJECT_KEYCHANGING COMPONENTS = DOC_COMPONENTS SIGNATURE = DOC_SIGNATURE.CALL METHOD BDS_INSTANCE-GET_WITH_URL
13、获取文档的url地址放到DOC_URIS中EXPORTING CLASSNAME = DOC_CLASSNAME CLASSTYPE = DOC_CLASSTYPE OBJECT_KEY = DOC_OBJECT_KEYCHANGING URIS = DOC_URIS SIGNATURE = DOC_SIGNATURE.FREE BDS_INSTANCE.释放该对象READ TABLE DOC_URIS INTO WA_DOC_URIS INDEX 1. ITEM_URL = WA_DOC_URIS-URI.获取对象的地址* 告诉SAP DOI容器开辟一个Excel策略CALL METHOD
14、CONTROL-GET_DOCUMENT_PROXYEXPORTING DOCUMENT_TYPE = Excel.Sheet NO_FLUSH = XIMPORTING DOCUMENT_PROXY = DOCUMENT ERROR = ERRORS.APPEND ERRORS.* 根据模板地址打开Excel文件CALL METHOD DOCUMENT-OPEN_DOCUMENTEXPORTING OPEN_INPLACE = INPLACE DOCUMENT_URL = ITEM_URL.DATA: HAS TYPE I.CALL METHOD DOCUMENT-HAS_SPREADSHE
15、ET_INTERFACEEXPORTING NO_FLUSH = IMPORTING IS_AVAILABLE = HAS ERROR = ERRORS.APPEND ERRORS.获取模板文档的表格分割器接口给SPREADSHEETCALL METHOD DOCUMENT-GET_SPREADSHEET_INTERFACEEXPORTING NO_FLUSH = IMPORTING SHEET_INTERFACE = SPREADSHEET ERROR = ERRORS.APPEND ERRORS.*激活第一个sheetCALL METHOD SPREADSHEET-SELECT_SHEET
16、EXPORTING NAME = 表整理* NO_FLUSH = IMPORTING ERROR = ERRORS.* RETCODE =.APPEND ERRORS. LOOP AT ERRORS. CALL METHOD ERRORS-RAISE_MESSAGE EXPORTING TYPE = E.ENDLOOP.FREE ERRORS. INITIALIZED = X.ENDFORM. CREATE_BASIC_OBJECTS*&-*& Form output_to_excel*&-* fill the EXCEL sheet*-*FORM OUTPUT_TO_EXCEL.DATA N
17、UM TYPE I VALUE 0.LOOP AT ITAB. NUM = SY-TABIX + 2.PERFORM FILL_CELL USING NUM 1 ITAB-BUKRS.行列值PERFORM FILL_CELL USING NUM 2 ITAB-SPRAS.PERFORM FILL_CELL USING NUM 3 ITAB-BUTXT.ENDLOOP.ENDFORM. output_to_excel*&-*& Form FILL_CELL*&-* text*-* -I text* -J text* -VAL text*-*FORM FILL_CELL USING I J VAL
18、.DATA: COLUMNS_NUMBER TYPE I, ROWS_NUMBER TYPE I. COLUMNS_NUMBER = 1. ROWS_NUMBER = 1.CALL METHOD SPREADSHEET-INSERT_RANGE_DIMEXPORTING NAME = cell NO_FLUSH = X TOP = ILEFT = JROWS = ROWS_NUMBER COLUMNS = COLUMNS_NUMBERIMPORTING ERROR = ERRORS.APPEND ERRORS.REFRESH: RANGES, EXCEL_INPUT. RANGEITEM-NA
19、ME = cell. RANGEITEM-COLUMNS = 1. RANGEITEM-ROWS = 1.APPEND RANGEITEM TO RANGES. EXCEL_INPUT_WA-COLUMN = 1. EXCEL_INPUT_WA-ROW = 1. EXCEL_INPUT_WA-VALUE = VAL.APPEND EXCEL_INPUT_WA TO EXCEL_INPUT.* set dataCALL METHOD SPREADSHEET-SET_RANGES_DATAEXPORTINGRANGES = RANGES CONTENTS = EXCEL_INPUT NO_FLUSH = XIMPORTING ERROR = ERRORS.APPEND ERRORS.CALL METHOD SPREADSHEET-FIT_WIDESTEXPORTING NAME = SPACE NO_FLUSH = X.REFRESH: RANGES, EXCEL_INPUT.ENDFORM. fill_cellDOI必须放在自定义屏幕的一个Container中。最终的运行结果如图:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1