ABAP中DOI的实现.docx

上传人:b****6 文档编号:5072046 上传时间:2022-12-13 格式:DOCX 页数:9 大小:48.28KB
下载 相关 举报
ABAP中DOI的实现.docx_第1页
第1页 / 共9页
ABAP中DOI的实现.docx_第2页
第2页 / 共9页
ABAP中DOI的实现.docx_第3页
第3页 / 共9页
ABAP中DOI的实现.docx_第4页
第4页 / 共9页
ABAP中DOI的实现.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

ABAP中DOI的实现.docx

《ABAP中DOI的实现.docx》由会员分享,可在线阅读,更多相关《ABAP中DOI的实现.docx(9页珍藏版)》请在冰豆网上搜索。

ABAP中DOI的实现.docx

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中。

最终的运行结果如图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1