SAPABAPDOI技术的优化与说明.docx
《SAPABAPDOI技术的优化与说明.docx》由会员分享,可在线阅读,更多相关《SAPABAPDOI技术的优化与说明.docx(11页珍藏版)》请在冰豆网上搜索。
![SAPABAPDOI技术的优化与说明.docx](https://file1.bdocx.com/fileroot1/2022-11/30/3ad62fa8-7a76-43d4-bb76-8dadbf53030f/3ad62fa8-7a76-43d4-bb76-8dadbf53030f1.gif)
SAPABAPDOI技术的优化与说明
应以前一个公司的邀请,对ABAP程序使用DOI技术输出EXCEL文件的程序进行优化处理。
此公司的问题是,DOI输出的EXCEL太难看了。
X系列的THINKPAD看程序要来回滚动,而现在的大屏幕的台式机上的EXCEL又局限在一个小小的角落。
从我的角度来看,那批程序也是太难看了。
DOI技术的优点,就不用说了!
速度快,可定制EXCEL模板。
缺点呢,缺点是我们ABAP顾问都太懒了,直接在网上搜到相关的程序,搞个例程下来,修理修理就成自己的了。
我也在网上搜了一下,N个人的博客写的程序大同小异,甚至就是直接把别人的东西挂到自己的博客上。
声讨一下,然后挂出我本人优化后的一个程序。
优化如下:
1、创建一个空屏幕上,只在屏幕上激活PAI、PBO事件下的FUNCTIONMOUDLE。
干嘛非要在屏幕上放一个CONTAINER组件呢,固定后那么难看。
完全可以动态创建吗?
动态创建使用CL_GUI_CONTAINER这个类。
动态创建的好处在于,CONTAINER的大小不是固定的,完全随着屏幕的大小而创建。
2、本人发发善心,把夹杂在代码中的乱七八糟的内表与变量统统移到外面,定义成全局变量。
在程序中随意定义代码的缺点都知道,就是没有人来给整理一下。
本人还给这部分全局变量统计了命名规则,内表、变量、工作区分别用不同的前导符做区分。
3、把代码重新划分到不同的子程序里。
通常XX出来的代码真是太乱了,我受不了。
在我的项目中,非把他们开掉不可(哦,我只是一个小兵,没这个权力)。
4、OAOR上传模版这些基本知识就说了,不知道的请XX一下。
说明一下,我在程序指定了固定的区域输出数据时,不带边框;除去这一部分外,其他的部分数据输出时都加了边框,请各位兄弟姐妹们使用时注意。
具体位置请搜索“CALLMETHODcl_spreadsheet->set_frame”。
废说少说,上代码:
*&--------------------------------------------------------------*
*&Report ZTRAINING26事件的使用与说明 *
*&--------------------------------------------------------------*
REPORT ztraining26NOSTANDARDPAGEHEADING.
*****************************************************************
** 声明数据库表Declarationofdatabase **
*****************************************************************
TABLES:
mara. "物料主数据
*****************************************************************
** 定义结构类型Definethestructure'stype **
*****************************************************************
* 结果内表结构
TYPES:
BEGINOFtyp_result,
matnrTYPEmatnr, "物料编号
werksTYPEwerks_d, "工厂
lgortTYPElgort_d, "库存地点
chargTYPEcharg_d, "批次
box TYPEc,
ENDOFtyp_result.
*****************************************************************
** 定义变量与内表DefinethevariantsandInternaltables **
*****************************************************************
DATA:
gt_resultTYPETABLEOFtyp_resultWITHHEADERLINE. "结果内表
*@--------------------------------------------------------------*
*调用相关对象使用的变量
TYPE-POOLS:
vrm,sbdst,soi.
* 定位EXCEL的单元格,
TYPES:
BEGINOFtyp_excel,
row TYPEkcd_ex_row_n,
col TYPEkcd_ex_col_n,
valueTYPEchar50,
ENDOFtyp_excel.
DATA:
gt_tabcontentTYPETABLEOFtyp_excel.
DATA:
wa_tabcontentTYPEtyp_excel.
TYPES:
typ_urlLIKEbapiuri-uri.
TYPES:
BEGINOFtyp_docu_descr,
document_name(40),
document_id(64),
ENDOFtyp_docu_descr.
TYPES:
BEGINOFtyp_area_excel,
areano
(2)TYPEn,
tabcontentLIKEgt_tabcontent,
ENDOFtyp_area_excel.
*SAPDesktopOfficeIntegrationInterfaces
DATA:
cl_container TYPEREFTOcl_gui_container,
cl_splitter TYPEREFTOcl_gui_splitter_container,
cl_control TYPEREFTOi_oi_container_control,
cl_docu_proxy TYPEREFTOi_oi_document_proxy,
cl_spreadsheetTYPEREFTOi_oi_spreadsheet,
cl_error TYPEREFTOi_oi_error,
cl_errors TYPEREFTOi_oi_errorOCCURS0WITHHEADERLINE.
*spreadsheetinterfacestructuresforExceldatainput
DATA:
wa_cellitem TYPEsoi_generic_item,
wa_rangeitem TYPEsoi_range_item,
gt_ranges TYPEsoi_range_list,
gt_excel_inputTYPEsoi_generic_table,
wa_excel_inputTYPEsoi_generic_item,
g_initialized typec,
g_retcode TYPEsoi_ret_string,
gt_excel_formatTYPEsoi_format_table,
wa_format LIKELINEOFgt_excel_format.
DATA:
gt_itab TYPETABLEOFalsmex_tablineWITHHEADERLINE,
gt_imt_tab TYPETABLEOFtyp_area_excel,
wa_imt_tab LIKELINEOFgt_imt_tab,
g_macro TYPEtext100,
g_sheet(10)TYPEc,
g_cell_fit TYPEc.
DATA:
cl_bds_instance TYPEREFTOcl_bds_document_set,
gt_doc_signature TYPEsbdst_signature,
wa_doc_signature LIKELINEOFgt_doc_signature,
gt_doc_componentsTYPEsbdst_components,
gt_doc_uris TYPEsbdst_uri,
wa_doc_uris LIKELINEOFgt_doc_uris.
DATA:
g_app TYPEvrm_id,
gt_applistTYPEvrm_values,
g_excel TYPEtext80VALUE'Excel.Sheet', "EXCEL的表单
g_docu_typeTYPEtext80,
g_url(256) TYPEc,
g_has_activexTYPEc,
g_colTYPEi, "字段所在的列数
g_rowTYPEi. "字段所在的行数
*以下三个值为Tcode:
OAOR里面新建模板文件的参数
DATA:
g_classname TYPEsbdst_classnameVALUE'HRFPM_EXCEL_STANDARD',
g_classtype TYPEsbdst_classtypeVALUE'OT',
g_object_keyTYPEsbdst_object_keyVALUE'ZMB51_FZ'.
*****************************************************************
** 宏定义Definethemacro **
*****************************************************************
DEFINEm_value.
clear&1.
&1-key=&2.
&1-text=&3.
append&1.
END-OF-DEFINITION.
*将数据对应到EXCEL的单元格,并添加到内表中
DEFINEm_excel_cell.
clearwa_tabcontent.
g_col=g_col+1.
wa_tabcontent-row =g_row.
wa_tabcontent-col =g_col.
wa_tabcontent-value=&1.
shiftwa_tabcontent-valueleftdeletingleadingspace.
appendwa_tabcontenttogt_tabcontent.
END-OF-DEFINITION.
*****************************************************************
** 选择屏幕Customizetheselection-screen **
*****************************************************************
SELECTION-SCREENBEGINOFBLOCKxaveryWITHFRAMETITLEtext-001.
SELECT-OPTIONS:
s_matnrFORmara-matnrMEMORYIDmat. "物料编号
SELECTION-SCREENENDOFBLOCKxavery.
*****************************************************************
** 执行程序事件Executingtheprogram'sevents **
*****************************************************************
INITIALIZATION.
START-OF-SELECTION.
PERFORMsub_query_mara.
END-OF-SELECTION.
PERFORMsub_process_excel.
CALLSCREEN0100.
*&---------------------------------------------------------------*
*& Form sub_query_mara
*&---------------------------------------------------------------*
* 从物料主数据表MARA中取数
*---------------------------------------------------------------*
FORMsub_query_mara.
*取物料主数据
SELECTmatnr
FROMmara
INTOCORRESPONDINGFIELDSOFTABLEgt_result
WHEREmatnrINs_matnr.
ENDFORM. "sub_query_mara
*****************************************************************
**DialogModulesPBOandPAI
*****************************************************************
MODULEstatus_0100OUTPUT.
DATA:
wa_tabTYPEtyp_area_excel.
DATA:
its_tabTYPETABLEOFtyp_excel.
SETPF-STATUS'XAVERY_HSUEH'.
SETTITLEBAR'TIT_100'WITH'活动界面示例'.
PERFORMsub_create_basic_object.
LOOPATgt_imt_tabINTOwa_tab.
REFRESHgt_itab.
gt_itab[]=wa_tab-tabcontent[].
PERFORMsub_set_cell.
ENDLOOP.
IFg_cell_fit='X'.
CALLMETHODcl_spreadsheet->fit_widest
EXPORTING
name =space
no_flush='X'.
ENDIF.
*修改WORKSHEET的名字
CALLMETHODcl_spreadsheet->set_sheet_name
EXPORTING
newname='物料主数据清单'
oldname='Sheet1'
IMPORTING
error =cl_errors.
*宏执行
IFNOTg_macroISINITIAL.
* CALLMETHODDOCUMENT->EXECUTE_MACRO
* EXPORTING
* g_macro=g_macro
** SCRIPT_NAME ='Open_text'
** NO_FLUSH =''
* IMPORTING
* cl_error =cl_errorS.
** CALLMETHODC_OI_ERRORS=>SHOW_MESSAGE
** EXPORTING
** TYPE='E'.
* APPENDcl_errorS.
ENDIF.
ENDMODULE. "status_0100OUTPUT
*&--------------------------------------------------------------*
*&DialogModulesPAI
*&--------------------------------------------------------------*
MODULEuser_command_0100INPUT.
LEAVETOSCREEN0.
ENDMODULE. "USER_COMMAND_0100INPUT
*&--------------------------------------------------------------*
*& Form SUB_CREATE_BASIC_OBJECT
*&--------------------------------------------------------------*
* 创建相关的对象
*---------------------------------------------------------------*
FORMsub_create_basic_object.
CHECKg_initializedISINITIAL.
CALLFUNCTION'GUI_HAS_ACTIVEX'
IMPORTING
return=g_has_activex.
IFg_has_activexISINITIAL.
MESSAGEe007(demoofficeintegratio).
ENDIF.
*firstgettheSAPDOIi_oi_container_controlinterface
CALLMETHOD
c_oi_container_control_creator=>get_container_control
IMPORTING
control=cl_control
error =cl_error.
*checknoerrorsoccured
CALLMETHODcl_error->raise_message
EXPORTING
type='E'.
*创建CONTIANER
CREATEOBJECTcl_splitter
EXPORTING
parent =cl_gui_container=>screen0
rows =1
columns=1.
CALLMETHODcl_splitter->set_border
EXPORTING
border=cl_gui_cfw=>false.
cl_container =cl_splitter->get_container(row=1column=1).
*initializetheSAPDOIContainer,tellittoruninthecontainer
*specifiedaboveandtellittorunExcelin-place
CALLMETHODcl_control->init_control
EXPORTING
r3_application_name ='RBasis' "#ECNOTEXT
inplace_enabled ='X'
inplace_scroll_documents='X'
parent =cl_container
register_on_close_event ='X'
register_on_custom_event='X'
no_flush ='X'
IMPORTING
error =cl_errors.
*saveerrorobjectincollection
APPENDcl_errors.
CALLMETHODcl_gui_cfw=>dispatch.
wa_doc_signature-prop_name='DESCRIPTION'.
g_app='excel'. "
IFg_app='excel'.
g_docu_type=g_excel.
wa_doc_signature-prop_value='PP_REPORT'.
ELSE.
ENDIF.
APPENDwa_doc_signatureTOgt_doc_signature.
CREATEOBJECTcl_bds_instance.
CALLMETHODcl_bds_instance->get_info
EXPORTING
classname =g_classname