ABAP中DOI的实现.docx
《ABAP中DOI的实现.docx》由会员分享,可在线阅读,更多相关《ABAP中DOI的实现.docx(9页珍藏版)》请在冰豆网上搜索。
ABAP中DOI的实现
我们再做复杂报表或是特定格式的报表时,ALV往往不能满足我们的需求,这时我们可以用DIO
来做,DIO的原理是我们首先上载一个EXCEL模板,然后根据我们的模板定义特定格式的内表,然后
将内表中的数据填充至模板显示,DIO具有极大的灵活性,可以满足我们对任何复杂报表的需求。
上载EXCEL模板的TCODE是OAOR.
假如我们上载了如下格式的模板:
然后代码如下:
*&---------------------------------------------------------------------*
*&ReportZ_Rocky_TEST
*&
*&---------------------------------------------------------------------*
*&RockyWang
*&RockyTech(AT)
*&RockT
*&---------------------------------------------------------------------*
REPORTZ_ROCKY_TEST.
TABLES:
T001.
TYPE-POOLS:
SLIS,VRM,SBDST,SOI."引入必要的类型组
CONSTANTSDOCUMENT_NAME(30)VALUE'TEMP'."模板名字
CONSTANTSINPLACEVALUE'X'."控制参数,在GUI中显示Excel
DATA:
FLAG.
DATA:
CONTAINERTYPEREFTOCL_GUI_CUSTOM_CONTAINER,"容器实例
CONTROLTYPEREFTOI_OI_CONTAINER_CONTROL,"控制器实例
DOCUMENTTYPEREFTOI_OI_DOCUMENT_PROXY,"文档操作对象
SPREADSHEETTYPEREFTOI_OI_SPREADSHEET,"分隔符对象
ERRORTYPEREFTOI_OI_ERROR,"错误信息
ERRORSTYPEREFTOI_OI_ERROROCCURS0WITHHEADERLINE."错误信息
*spreadsheetinterfacestructuresforExceldatainput
DATA:
RANGEITEMTYPESOI_RANGE_ITEM.
DATA:
RANGESTYPESOI_RANGE_LIST.
DATA:
EXCEL_INPUTTYPESOI_GENERIC_TABLE.
DATA:
EXCEL_INPUT_WATYPESOI_GENERIC_ITEM.
DATA:
INITIALIZED
(1),RETCODETYPESOI_RET_STRING.
DATA:
ITEM_URL(256)."存放模板的Url
DATADOCUMENT_TYPE(80)."文档类型
DATA:
EXCEL(80)VALUE'Excel.Sheet'.
DATA:
LINE_COUNTTYPEI,
COLUMN_COUNTTYPEI.
DATA:
OK_CODETYPESY-UCOMM,
SAVE_OKTYPESY-UCOMM.
CLASSC_OI_ERRORSDEFINITIONLOAD.
DATA:
BEGINOFITABOCCURS0.
INCLUDESTRUCTURET001.
DATA:
ENDOFITAB.
SELECT-OPTIONSBUKRSFORT001-BUKRS.
START-OF-SELECTION.
PERFORMGETDATA.
CALLSCREEN100.
*&---------------------------------------------------------------------*
*&Formgetdata
*&---------------------------------------------------------------------*
*text
*----------------------------------------------------------------------*
*-->p1text
*<--p2text
*----------------------------------------------------------------------*
FORMGETDATA.
SELECT*
FROMT001
INTOTABLEITAB
WHEREBUKRSINBUKRS.
ENDFORM."getdata
*&---------------------------------------------------------------------*
*&ModuleSTATUS_0100OUTPUT
*&---------------------------------------------------------------------*
*text
*----------------------------------------------------------------------*
MODULESTATUS_0100OUTPUT.
SETPF-STATUS'SA1'.
IFFLAG=SPACE.
PERFORMCREATE_BASIC_OBJECTSUSING''''''''DOCUMENT_NAME.
PERFORMOUTPUT_TO_EXCEL.
ENDIF.
ENDMODULE."STATUS_0100OUTPUT
*&---------------------------------------------------------------------*
*&ModuleUSER_COMMAND_0100INPUT
*&---------------------------------------------------------------------*
*text
*----------------------------------------------------------------------*
MODULEUSER_COMMAND_0100INPUT.
FLAG='X'.
SAVE_OK=OK_CODE.
CLEAROK_CODE.
CASESAVE_OK.
WHEN'CANCLE'.
IFNOTDOCUMENTISINITIAL.
CALLMETHODDOCUMENT->CLOSE_DOCUMENT."关闭文档
FREEDOCUMENT.
ENDIF.
IFNOTCONTROLISINITIAL.
CALLMETHODCONTROL->DESTROY_CONTROL.
FREECONTROL.
ENDIF.
LEAVEPROGRAM.
WHEN'BACK'.
IFNOTDOCUMENTISINITIAL.
CALLMETHODDOCUMENT->CLOSE_DOCUMENT.
FREEDOCUMENT.
ENDIF.
IFNOTCONTROLISINITIAL.
CALLMETHODCONTROL->DESTROY_CONTROL.
FREECONTROL.
ENDIF.
SETSCREEN0."quittheprogram
"setscreen1000.
ENDCASE.
ENDMODULE."USER_COMMAND_0100INPUT
*&---------------------------------------------------------------------*
*&FormCREATE_BASIC_OBJECTS
*&---------------------------------------------------------------------*
*text
*----------------------------------------------------------------------*
*-->P_APP_NAMEtext
*-->P_CLASSNAMEtext
*-->P_CLASSTYPEtext
*-->P_OBJ_KEYtext
*-->P_DOCNAMEtext
*----------------------------------------------------------------------*
FORMCREATE_BASIC_OBJECTSUSINGP_APP_NAME
P_CLASSNAME
P_CLASSTYPE
P_OBJ_KEY
P_DOCNAME.
CHECKINITIALIZEDISINITIAL.
*获取SAPDOI的控制器接口
CALLMETHOD
C_OI_CONTAINER_CONTROL_CREATOR=>GET_CONTAINER_CONTROL
IMPORTING
CONTROL=CONTROL
ERROR=ERROR.
*checknoerrorsoccured
CALLMETHODERROR->RAISE_MESSAGE
EXPORTING
TYPE='E'.
"实例化容器实例
CREATEOBJECTCONTAINER
EXPORTING
CONTAINER_NAME='CONTAINER'.
DATAL_APP_NAME(200).
IFP_APP_NAMEISINITIAL.
L_APP_NAME='TEST'.
ELSE.
L_APP_NAME=P_APP_NAME.
ENDIF.
"初始化控制器的接口
CALLMETHODCONTROL->INIT_CONTROL
EXPORTING
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='X'
IMPORTING
ERROR=ERRORS.
*saveerrorobjectincollection
APPENDERRORS.
CLEARITEM_URL.
"定义BDS实例变量,用于设置文档信息
DATA:
BDS_INSTANCETYPEREFTOCL_BDS_DOCUMENT_SET.
DATA:
DOC_SIGNATURETYPESBDST_SIGNATURE,
WA_DOC_SIGNATURELIKELINEOFDOC_SIGNATURE,
DOC_COMPONENTSTYPESBDST_COMPONENTS,
DOC_URISTYPESBDST_URI,
WA_DOC_URISLIKELINEOFDOC_URIS.
*以下三个值为Tcode:
OAOR里面新建模板文件的参数
DATA:
DOC_CLASSNAMETYPESBDST_CLASSNAMEVALUE'HRFPM_EXCEL_STANDARD',
DOC_CLASSTYPETYPESBDST_CLASSTYPEVALUE'OT',
DOC_OBJECT_KEYTYPESBDST_OBJECT_KEYVALUE'TEMP'.
WA_DOC_SIGNATURE-PROP_NAME='DESCRIPTION'.
DOCUMENT_TYPE=EXCEL.
WA_DOC_SIGNATURE-PROP_VALUE=P_DOCNAME."赋给文档名字
APPENDWA_DOC_SIGNATURETODOC_SIGNATURE."DOC_SIGNATURE存储了文档信息
CREATEOBJECTBDS_INSTANCE.
CALLMETHODBDS_INSTANCE->GET_INFO"获取文档信息
EXPORTING
CLASSNAME=DOC_CLASSNAME
CLASSTYPE=DOC_CLASSTYPE
OBJECT_KEY=DOC_OBJECT_KEY
CHANGING
COMPONENTS=DOC_COMPONENTS
SIGNATURE=DOC_SIGNATURE.
CALLMETHODBDS_INSTANCE->GET_WITH_URL"获取文档的url地址放到DOC_URIS中
EXPORTING
CLASSNAME=DOC_CLASSNAME
CLASSTYPE=DOC_CLASSTYPE
OBJECT_KEY=DOC_OBJECT_KEY
CHANGING
URIS=DOC_URIS
SIGNATURE=DOC_SIGNATURE.
FREEBDS_INSTANCE."释放该对象
READTABLEDOC_URISINTOWA_DOC_URISINDEX1.
ITEM_URL=WA_DOC_URIS-URI."获取对象的地址
*告诉SAPDOI容器开辟一个Excel策略
CALLMETHODCONTROL->GET_DOCUMENT_PROXY
EXPORTING
DOCUMENT_TYPE='Excel.Sheet'
NO_FLUSH='X'
IMPORTING
DOCUMENT_PROXY=DOCUMENT
ERROR=ERRORS.
APPENDERRORS.
*根据模板地址打开Excel文件
CALLMETHODDOCUMENT->OPEN_DOCUMENT
EXPORTING
OPEN_INPLACE=INPLACE
DOCUMENT_URL=ITEM_URL.
DATA:
HASTYPEI.
CALLMETHODDOCUMENT->HAS_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH=''
IMPORTING
IS_AVAILABLE=HAS
ERROR=ERRORS.
APPENDERRORS.
"获取模板文档的表格分割器接口给SPREADSHEET
CALLMETHODDOCUMENT->GET_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH=''
IMPORTING
SHEET_INTERFACE=SPREADSHEET
ERROR=ERRORS.
APPENDERRORS.
*激活第一个sheet
CALLMETHODSPREADSHEET->SELECT_SHEET
EXPORTING
NAME='表整理'
*NO_FLUSH=''
IMPORTING
ERROR=ERRORS.
*RETCODE=
.
APPENDERRORS.
"LOOPATERRORS.
"CALLMETHODERRORS->RAISE_MESSAGE
"EXPORTING
"TYPE='E'.
"ENDLOOP.
FREEERRORS.
INITIALIZED='X'.
ENDFORM."CREATE_BASIC_OBJECTS
*&---------------------------------------------------------------------*
*&Formoutput_to_excel
*&---------------------------------------------------------------------*
*filltheEXCELsheet
*----------------------------------------------------------------------*
FORMOUTPUT_TO_EXCEL.
DATANUMTYPEIVALUE0.
LOOPATITAB.
NUM=SY-TABIX+2.
PERFORMFILL_CELLUSINGNUM1ITAB-BUKRS."行列值
PERFORMFILL_CELLUSINGNUM2ITAB-SPRAS.
PERFORMFILL_CELLUSINGNUM3ITAB-BUTXT.
ENDLOOP.
ENDFORM."output_to_excel
*&---------------------------------------------------------------------*
*&FormFILL_CELL
*&---------------------------------------------------------------------*
*text
*----------------------------------------------------------------------*
*-->Itext
*-->Jtext
*-->VALtext
*----------------------------------------------------------------------*
FORMFILL_CELLUSINGIJVAL.
DATA:
COLUMNS_NUMBERTYPEI,
ROWS_NUMBERTYPEI.
COLUMNS_NUMBER=1.
ROWS_NUMBER=1.
CALLMETHODSPREADSHEET->INSERT_RANGE_DIM
EXPORTING
NAME='cell'
NO_FLUSH='X'
TOP=I
LEFT=J
ROWS=ROWS_NUMBER
COLUMNS=COLUMNS_NUMBER
IMPORTING
ERROR=ERRORS.
APPENDERRORS.
REFRESH:
RANGES,EXCEL_INPUT.
RANGEITEM-NAME='cell'.
RANGEITEM-COLUMNS=1.
RANGEITEM-ROWS=1.
APPENDRANGEITEMTORANGES.
EXCEL_INPUT_WA-COLUMN=1.
EXCEL_INPUT_WA-ROW=1.
EXCEL_INPUT_WA-VALUE=VAL.
APPENDEXCEL_INPUT_WATOEXCEL_INPUT.
*setdata
CALLMETHODSPREADSHEET->SET_RANGES_DATA
EXPORTING
RANGES=RANGES
CONTENTS=EXCEL_INPUT
NO_FLUSH='X'
IMPORTING
ERROR=ERRORS.
APPENDERRORS.
CALLMETHODSPREADSHEET->FIT_WIDEST
EXPORTING
NAME=SPACE
NO_FLUSH='X'.
REFRESH:
RANGES,EXCEL_INPUT.
ENDFORM."fill_cell
DOI必须放在自定义屏幕的一个Container中。
最终的运行结果如图: