最帅的人
理论
https://blog.csdn.net/lalaoye/article/details/95622149 (举例 https://mp.weixin.qq.com/s/zDXMEXfaxavu9vsENiQhqw)
教程 https://www.it1352.com/OnlineTutorial/CategoryList/SAP_Tutorials.html
大纲概览 https://www.cnblogs.com/VerySky/articles/2143562.html
断点
https://www.cnblogs.com/wh-cnblogs/p/16709842.html
ABAP-BASIS基本操作
SM12 锁定对象 用户总是会时不时的因为某种原因(如断线,程序出错等等)而锁定一个对象。所有被锁定的老的对象均要被分析,更正。 出错分析 ST22出错分析 当一个报表或事务因为严重的错误而停止工作时,ABAP/4开发工作台就会发出一个“突然出错”(short dump)。系统在系统日志中记录错误信息,并在表SNAP中记录程序终止时的出错信息。管理员需要每天检查是否有short dump 出现,如果有则分析并试图解决问题。 系统日志 SM21系统日日志 R/3服务器在系统日志中记录系统的事件和问题。所有的警告和错误信息应被分析和解决。此程序应包括将问题及其解决方案做成文档。 数据库 DB13 定义DATABASE相关的日常后台job,如: 数据库备份,CHECK DATABASE ,OBTIMIZER STATISTICS UPDATE等等, 也可查看DATABASE相关后台作业的LOG. DB12 SAPDBA日志 检查夜间备份是否成功。 检查日志目录的剩余空间。 DB02 存储管理 监控数据库的扩长。 监控表和索引的扩长及碎片的情况。 如有必要监控数据库的优化统计。 ST02 监控SAP R/3 BUFFER状况 每天监控SAP R/3各种 BUFFER 的命中率,比如: ROLL MEMORY ,EXTEND MEMORY,HEAP MEMORY,TABLE BUFFER,ABAP PROGRAM BUFFER 等等。 ST04 数据库性能监控 每天监控数据库的性能统计值以观察数据库是否处于良好的运行状态。 每天监控对数据库逻辑上和物理上的读,以追踪数据库负载的发展情况。如:DATA BUFFER 命中率,SHARE MEMORY 命中率等等和数据库性能密切相关的重要 参数值。 ST06 监控操作系统资源状况 每天察看ST06用以掌握系统运行过程中整个操作系统资源状况,如: CPU 使用率,内存使用率,PAGE SPACE 使用率等等。 AL02数据库警报监视 所有的警告均需被分析,修正和记录在案。 操作系统 OS06 操作系统监视 所有的警告均需被分析,修正和记录在案。 AL16 操作系统警报监视 所有的警告均需被分析,修正和记录在案。 网络 ST09/ST08 网络警报监视 所有的警告均需被分析,修正和记录在案。 工作定时系统 SM37 工作日志查看 管理员应该检查所有被取消的工作,如有必要分析并修正这些工作。问题及其解决方案需记录在案。 管理器应该检查所有的日志,包括输出列表 SM20 安全审计日志分析 RZ01 图形化的工作监视 打印系统 SP01 打印需求查看 失败的打印任务可以从新启动。这些打印任务的失败往往是用户端的问题(如PC上的SAPLPD程序被关闭了)。由于R/3 系统仅跟踪打印任务到目标队列中,输出控制器中的已经完成的状态并不能表明实际打印成功,因此那些比较重要和大量的打印任务在被从TemSe中删除前必须先确认是否完成。
搜索帮助(含屏幕)及table control
HR模块-组织选择帮助

FORM FRM_SET_SCR USING U_OTYPE U_FIELDNAME. DATA: DYNPFIELDS_UP LIKE DYNPREAD OCCURS 0 WITH HEADER LINE. DATA: PROGNAME LIKE SY-REPID. DATA: DYNPNUMB LIKE SY-DYNNR. DATA: STEPLOOP LIKE SY-STEPL. DATA : SELF_REPID LIKE SY-REPID . "YNKK100992 DATA : SELF_DYNNR LIKE SY-DYNNR . "YNKK100992 DATA : F4_OBJEC LIKE OBJEC. "XMKBCEK002468 SELF_REPID = SY-REPID. "YNKK100992 SELF_DYNNR = SY-DYNNR. "YNKK100992 CALL FUNCTION 'RH_OBJID_REQUEST' "XMKBCEK002468 EXPORTING PLVAR = '01' OTYPE = U_OTYPE DYNPRO_REPID = SELF_REPID DYNPRO_DYNNR = SELF_DYNNR * dynpro_plvarfield = 'PPHDR-PLVAR' * dynpro_searkfield = 'S_EOBJ-LOW' IMPORTING SEL_OBJECT = F4_OBJEC EXCEPTIONS CANCELLED = 1 WRONG_CONDITION = 2 NOTHING_FOUND = 3 ILLEGAL_MODE = 4 INTERNAL_ERROR = 5 OTHERS = 6. CHECK F4_OBJEC-OBJID IS NOT INITIAL. * get actual position CALL FUNCTION 'DYNP_GET_STEPL' IMPORTING POVSTEPL = STEPLOOP. REFRESH DYNPFIELDS_UP. DYNPFIELDS_UP-STEPL = STEPLOOP. DYNPFIELDS_UP-FIELDNAME = U_FIELDNAME. DYNPFIELDS_UP-FIELDVALUE = F4_OBJEC-OBJID. APPEND DYNPFIELDS_UP. * update table control CALL FUNCTION 'DYNP_VALUES_UPDATE' EXPORTING DYNAME = PROGNAME DYNUMB = DYNPNUMB TABLES DYNPFIELDS = DYNPFIELDS_UP EXCEPTIONS INVALID_ABAPWORKAREA = 1 INVALID_DYNPROFIELD = 2 INVALID_DYNPRONAME = 3 INVALID_DYNPRONUMMER = 4 INVALID_REQUEST = 5 NO_FIELDDESCRIPTION = 6 UNDEFIND_ERROR = 7 OTHERS = 8. ENDFORM.
普通选择帮助
1、带参考文本值的返回

TYPES : BEGIN OF typ_name ,
werks TYPE t001w-werks,
NAME1 TYPE t001w-NAME1,
END OF typ_name .
DATA l_tab_name TYPE TABLE OF typ_name WITH HEADER LINE.
SELECT * INTO CORRESPONDING FIELDS OF TABLE l_tab_name FROM t001w WHERE werks LIKE '5%'.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'WERKS' "大写,可选值内表的字段名
value_org = 'S' "就写'S'
dynpprog = sy-repid "返回的输入框所在的main program
dynpnr = sy-dynnr "返回的输入框所在屏幕
dynprofield = 'P_WERKS' "返回的输入框名
TABLES
value_tab = l_tab_name "可选值的内表
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
2、自画屏幕字段带出自定义值

DATA: row1 LIKE sy-curow.
DATA: BEGIN OF tab_help_field OCCURS 1.
INCLUDE STRUCTURE help_value.
DATA: END OF tab_help_field.
DATA: BEGIN OF tab_sel_value OCCURS 1,
text(40) TYPE c,
END OF tab_sel_value.
DATA BEGIN OF select_values OCCURS 0.
INCLUDE STRUCTURE help_vtab.
DATA END OF select_values.
*> 确定下拉框的字段
tab_help_field-tabname = 'ZIEBJKBGD_HEAD'.
tab_help_field-fieldname = 'ZZMXZ'.
tab_help_field-selectflag = 'X'.
APPEND tab_help_field.
tab_help_field-tabname = 'ZIEBJKBGD_HEAD'.
tab_help_field-fieldname = 'TXZ01'.
tab_help_field-selectflag = ' '.
APPEND tab_help_field.
*> 填充下拉框的数据
tab_sel_value-text = '001'. APPEND tab_sel_value.
tab_sel_value-text = '一般征税'. APPEND tab_sel_value.
tab_sel_value-text = '002'. APPEND tab_sel_value.
tab_sel_value-text = '进料加工'. APPEND tab_sel_value.
tab_sel_value-text = '003'. APPEND tab_sel_value.
tab_sel_value-text = '其他法定'. APPEND tab_sel_value.
*> 调用函数进行处理
CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE_EXT'
EXPORTING
cucol = 0
curow = 0
display = ' '
* FIELDNAME = 'LVARI'
fieldname = 'ZZMXZ'
tabname = 'ZIEBJKBGD_HEAD'
IMPORTING
index = row1
* SELECT_VALUE =
TABLES
fields = tab_help_field
select_values = select_values
valuetab = tab_sel_value
EXCEPTIONS
field_not_in_ddic = 01
more_then_one_selectfield = 02
no_selectfield = 03.
3、自定义值的F4

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id,
list TYPE vrm_values,
value LIKE LINE OF list.
REFRESH list.
CLEAR list.
PARAMETERS: iscn TYPE char2 AS LISTBOX VISIBLE LENGTH 10 OBLIGATORY.
AT SELECTION-SCREEN OUTPUT.
name = 'ISCN'.
value-key = '1'.
value-text = 'CN'.
APPEND value TO list.
value-key = '2'.
value-text = 'CW'.
APPEND value TO list.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = list.

View Code4、 多值勾选的F4


View Code5、 联动搜索帮助

搜索8100工厂下的物料
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. PARAMETERS: p_werks TYPE werks_d, p_matnr TYPE matnr. SELECTION-SCREEN END OF BLOCK b1. START-OF-SELECTION. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr. PERFORM frm_f4. *&------------------------------------------------------------------- *&搜索帮助 *&------------------------------------------------------------------- FORM frm_f4. TYPES: BEGIN OF values, matnr TYPE matnr, maktx TYPE maktx, END OF values. DATA: progname TYPE sy-repid, dynnum TYPE sy-dynnr, dynpro_values TYPE TABLE OF dynpread, field_value LIKE LINE OF dynpro_values, values_tab TYPE TABLE OF values. progname = sy-repid. dynnum = sy-dynnr. CLEAR: field_value, dynpro_values. "指定需要取值的屏幕字段 field_value-fieldname = 'P_WERKS'. " APPEND field_value TO dynpro_values. "获取屏幕 P_WERKS 字段的值 CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = progname dynumb = dynnum translate_to_upper = 'X' TABLES dynpfields = dynpro_values. "根据屏幕输入值进行进一步搜索 READ TABLE dynpro_values INDEX 1 INTO field_value. SELECT makt~matnr makt~maktx FROM makt INNER JOIN marc ON marc~matnr = makt~matnr INTO CORRESPONDING FIELDS OF TABLE values_tab WHERE werks = field_value-fieldvalue. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' "需要回传的字段 dynpprog = progname dynpnr = dynnum dynprofield = 'MAKTX' "需要显示的字段 window_title = '情选择物料 ' value_org = 'S' TABLES value_tab = values_tab. ENDFORM. "frm_f4
6、 搜索帮助的出口
https://www.cnblogs.com/ckstock/p/18153094
TABLE CONTROL
https://blog.csdn.net/ft1612796/article/details/1644557

插入列 :从最后一列复制完以后,点击文本下方,拖至所要插入的列
列锁定:



隐藏列
隐藏 PBO部分 CURSOR ZJTZWTXJC_1001-CURRENT_LINE. MODULE ZJTZWTXJC_1001_GET_LINES. MODULE a_1001.
module a_1001 output. data: l_col like line of ZJTZWTXJC_1001-cols. "生丰配送通知单 loop at ZJTZWTXJC_1001-cols into l_col. if l_col-screen-name = 'GT_RETULT-ZINX' . "GW_YS_ITEM-SEL 需要隐藏的列名称 l_col-invisible = '1' . modify ZJTZWTXJC_1001-cols from l_col. "ZJTZWTXJC_1001 表控制名字 endif. endloop. endmodule.
自动带出

带TC的屏幕上展示的内容一般包括以下两个类型: 1、 抬头数据(TC控件之外的数据) 2、 行项目数据(TC控件中的数据) 抬头数据中包括可编辑的与不可编辑的,行项目数据也是一样。 什么代码写在什么位置? 举个简单的例子: 我在屏幕1000中输入公司代码、银行科目代码,然后调用屏幕2000。 在屏幕2000中,抬头部分展示公司代码及描述、记账日期,行项目中展示借方-现金的会计分录和贷方-银行的会计分录,在屏幕2000中保存时,生成一个从银行取现的会计凭证。 屏幕1000不赘述。 屏幕2000-抬头字段: 公司代码(灰),描述(灰),记账日期(可编辑) 屏幕2000-行项目字段: 记账码(灰),科目(灰),科目描述(灰),原因代码(可编辑),原因代码描述(灰),金额(可编辑),货币(可编辑) 在屏幕1000的PAI中,需要CALL SCREEN 2000。 在CALL SCREEN 2000之前,我们可以 1、 先把2000中需要用到的数据先取出来。 这些数据包括:公司代码描述、科目描述、所有的原因代码及其描述 2、 给屏幕2000的公司代码、公司代码描述赋值 3、 给屏幕2000的记账日期一个默认值 4、 为屏幕2000的TC,构建一个初始内表,包括借方-现金和贷方-银行两行数据 在屏幕2000的PBO中,对于抬头部分: 没有什么需要做的。 对于行项目: 需要在PBO的TC控件的LOOP中,读取原因代码描述,将其赋值给行项目中的原因代码描述①。 在屏幕2000的PAI中,对于抬头部分: 检查记账日期是否符合要求(比如输入的日期是否允许记账),可以通过 Field xx module check_xxx on request.实现 对于行项目: 1、 在TC控件的LOOP中,需要检查原因代码、货币码是否存在 可以通过field xxx module check_xxx on request实现② 2、 在LOOP外,可以对行项目做总体校验,比如,校验行项目金额是否相等 说明:PAI中报错误消息的时候,如果是在FIELD后面的module中报E消息,则只有该field都不可编辑。如果是在chain中报E消息,则只有触发E消息的CHAIN中包含的字段可以编辑。如果在LOOP外报E消息,则屏幕上所有字段都不可编辑。 其他说明:在Process on value-request中,如果需要做字段的搜索帮助时,需要用到函数dynp_values_update和dynp_values_read。 ① 为什么不建议把取字段描述的内容写在当前屏幕的PAI中? 因为屏幕除了用来做编辑,还可以用来做展示。如果取字段描述的内容写在PAI中,当以查询方式进入该屏幕,还未触发PAI的时候,字段描述就都显示不出来了。 ② 为什么建议在FIELD后面写检查代码 TC中输入内容的校验,分为单字段的独立校验和多字段的相关校验。 单字段的独立校验,建议写在FIELD后面。这样用户输入出错的时候,可以得到最准确的字段定位; 多字段的相关校验,看是针对每一行的相关校验,还是针对所有行的相关校验。 如果是针对每一行的相关校验,建议把相关字段组成CHAIN,并在CHAIN中做校验; 如果是针对所有行的相关校验,建议在TC的LOOP之外进行校验。 以上建议并非定式的。如果单字段的独立校验过多,用户输入错误的时候,可能需要改一个字段敲一次回车,再去改正下一个错误,变的非常繁琐,这时候可以把这些字段放在一个CHAIN里。 其他:能不能在PBO中进行校验 一般不建议。PBO中的E类型消息,会显示为A类型的,即ABORT,会导致屏幕退出。
pai里写module有以下几种类型:
1、module xx at exit command
2、field xx module xxx.
2、field xx module xxx on xxx .
3、chain里面的module xxx on xxx.
4、module xxx,在field外面
5、pov里的module,pov也可以算是pai,也可以不算。看怎么理解
6、module xx on exit-command 这个是exit类型的按钮触发的
field里面的module,如果报E错误,屏幕上的效果是,除了field之外的字段,都是灰的
chain里面的module报错,屏幕上的效果是,除了chain之外的字段,都是灰的
field、chain以外的module报错,屏幕都是灰的
on request和on input有些区别
ALV
标准函数弹出alv
FUNCTION zmc_alv_popup. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(I_STRNM) TYPE DD02L-TABNAME *" VALUE(I_COL_S) DEFAULT '88' *" VALUE(I_COL_E) DEFAULT '165' *" VALUE(I_ROW_S) DEFAULT '5' *" VALUE(I_ROW_E) DEFAULT '25' *" VALUE(IM_TOOLBAR) OPTIONAL *" TABLES *" IT_DATA *" IT_FCAT TYPE LVC_T_FCAT OPTIONAL *"---------------------------------------------------------------------- TYPE-POOLS:slis. DATA i_callback_pf_status_set TYPE slis_formname . DATA: ls_layo TYPE lvc_s_layo, ls_fcat TYPE lvc_s_fcat, lt_fcat TYPE lvc_t_fcat, extab TYPE slis_t_extab, lt_extb TYPE slis_t_extab. IF it_fcat[] IS INITIAL. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = i_strnm CHANGING ct_fieldcat = lt_fcat EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3. ELSE. lt_fcat[] = it_fcat[]. ENDIF. ls_layo-cwidth_opt = 'X'. ls_layo-totals_bef = 'X'. ls_layo-zebra = 'X'. ls_layo-sel_mode = 'D'. IF im_toolbar <> 'X'. APPEND '&OUP' TO lt_extb." 正序 APPEND '&ODN' TO lt_extb." 倒序 APPEND '&ILT' TO lt_extb." 过滤 APPEND '&ILD' TO lt_extb." 删滤 APPEND '&RNT' TO lt_extb." 打印 APPEND '&ELP' TO lt_extb." 帮助 APPEND '%SC' TO lt_extb." 搜索 ELSE. i_callback_pf_status_set = 'PFSTATUS_POPUP'. ENDIF. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid * i_grid_title = conv lvc_title( | 共{ LINES( it_data ) }条数据 | ) is_layout_lvc = ls_layo it_fieldcat_lvc = lt_fcat i_save = 'A' it_excluding = lt_extb i_screen_start_column = i_col_s i_screen_start_line = i_row_s i_screen_end_column = i_col_e i_screen_end_line = i_row_e * i_callback_pf_status_set = COND #( WHEN im_toolbar IS NOT INITIAL THEN 'PFSTATUS_POPUP' ELSE '' ) i_callback_pf_status_set = i_callback_pf_status_set TABLES t_outtab = it_data EXCEPTIONS program_error = 1 OTHERS = 2. ENDFUNCTION. *&---------------------------------------------------------------------* *& Form pfstatus_popup *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->LT_EXTB text *----------------------------------------------------------------------* FORM pfstatus_popup USING lt_extb TYPE slis_t_extab. SET PF-STATUS 'PFSTATUS_POPUP' EXCLUDING lt_extb. ENDFORM. "SET_PFSTATUS * CALL SELECTION-SCREEN 9101 STARTING AT 10 50 ENDING AT 200 70. * i_col_s = 10. * i_row_s = 50. * i_col_e = 200. * i_row_e = 70.
聚合函数
https://www.cnblogs.com/aqsyc/p/10764512.html
Odata
https://www.cnblogs.com/liyafei/p/10654706.html
开发优化
http://blog.sina.com.cn/s/blog_3f3df76a0100ajx5.html
https://www.cnblogs.com/abap-ll/p/5053390.html
WEBSERVICE
https://www.cnblogs.com/zohoo/p/7295920.html
webservice,就是一种系统与系统间的接口方式。
wsdl,是Web Services Description Language,它描述了一个接口的调用规则。
在SAP里,我们接触到webservice有两种场景,一种是发布,一种是调用。
发布:
我们需要创建一个rfc函数,然后将其发布为webservice。这时候我们SAP是service provider。
发布成功后,会有一个wsdl的地址。这个地址就描述了我们的函数的调用规则(也就是我们的函数结构和调用地址)。
比如,入参都有啥、出参都有啥、参数是什么类型的,有哪些异常。
wsdl中描述这个函数结构的东西,是通用的描述规则。所以别的系统拿到这个wsdl,他们可以很方便的知道我们的函数结构是什么样的。配合我们提供的API文档,他们就可以方便的调用我们的webservice了。发布后,我们还需要创建端口。
端口可以通过lpconfig创建,可以通过soamanager创建。这两种创建方式都可以,具体的区别我还没细研究。
这里说一下端口。
如果我们需要把这个服务提供给两个外围系统。我们可以创建两个端口。每个端口配上不同的用户名,可以做不同的权限控制。但我们一般都只用一个端口就够了。所以网上的文档一般也都是创建一个端口。
*调用接口相关参数定义 DATA:lo_proxy TYPE REF TO zsdco_posoap, input TYPE zsdget_sap_accountability_soa1, output TYPE zsdget_sap_accountability_soap, ls_zsd_mm001 TYPE zsdarray_of_sap_accountability, lt_mm001 TYPE TABLE OF zsdsap_accountability, ls_mm001 TYPE zsdsap_accountability. *lt_mm001 = CORRESPONDING #( gt_send ). LOOP AT gt_send_result INTO gs_send_result. ls_mm001 = CORRESPONDING #( gs_send_result ). IF gs_send_result-zresponsible = '门店'. ls_mm001-zresponsible = '0'. ELSE. ls_mm001-zresponsible = '1'. ENDIF. APPEND ls_mm001 TO lt_mm001. CLEAR:ls_mm001,gs_send_result. ENDLOOP. ls_zsd_mm001-SAP_ACCOUNTABILITY = lt_mm001. input-ACCOUNTABILITY = ls_zsd_mm001. *调用代理类 下发数据 TRY. CREATE OBJECT lo_proxy EXPORTING logical_port_name = 'ZPORT'. CALL METHOD lo_proxy->GET_SAP_ACCOUNTABILITY EXPORTING input = input IMPORTING output = output. CATCH cx_ai_system_fault INTO DATA(lo_sys_exception). CATCH cx_ai_application_fault INTO DATA(lo_app_exception). DATA(lv_msg1) = lo_sys_exception->if_message~get_text( ). DATA(lv_msg2) = lo_app_exception->if_message~get_text( ). ENDTRY. IF output-GET_SAP_ACCOUNTABILITY_RESULT = 'S'. MESSAGE |数据下发成功| TYPE 'S'. ELSEIF lo_sys_exception IS NOT INITIAL OR lo_app_exception IS NOT INITIAL . MESSAGE |下发失败,请联系管理员处理| TYPE 'E'. ENDIF.
SMARTFORMS

https://www.cnblogs.com/zuisha13/archive/2011/08/05/2128223.html 实用
https://www.cnblogs.com/communist/p/6591122.html 史上最全
https://www.cnblogs.com/clsoho/archive/2010/04/23/1718624.html
PERFORM frm_print_data. FORM frm_print_data . DATA lw_control TYPE ssfctrlop. "Smart Forms: 控制结构 DATA lw_output TYPE ssfcompop. DATA lt_errtab TYPE tsferror. "SAP Smart Forms: 运行时错误 DATA:lv_fmname TYPE rs38l_fnam, "功能模块的名称 lv_smartform TYPE tdsfname. " 智能表: 表格名称 DATA: lw_ssfcrescl TYPE ssfcrescl."Smart Forms: 表格打印结束时返回值 * DATA: lt_zppf001 TYPE TABLE OF zpp_f001_s, * ls_zppf001 TYPE zpp_f001_s. DATA: lt_zppf001 TYPE TABLE OF zsd_f001_s, ls_zppf001 TYPE zsd_f001_s. * DATA:BEGIN OF lt_head OCCURS 0, lgort TYPE resb-lgort, lgfsb TYPE marc-lgfsb, mblnr TYPE mseg-mblnr, END OF lt_head. DATA lv_no TYPE n LENGTH 2. DATA :lv_meins TYPE meins. FIELD-SYMBOLS <fs_sf> LIKE ls_zppf001. DATA ot_table LIKE TABLE OF ZSD_F001_S WITH HEADER LINE. "记录数据 "1 * SORT gt_itab BY lgort lgfsb. * FIELD-SYMBOLS <fs2> LIKE LINE OF gt_itab. * LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<fs1>) WHERE box = 'X' AND mblnr IS NOT INITIAL."未过账也可打印 20190201 chengqi AND mblnr IS NOT INITIAL. * lt_head-lgort = <fs1>-lgort. * lt_head-lgfsb = <fs1>-lgfsb. * lt_head-mblnr = <fs1>-mblnr. * APPEND lt_head. * CLEAR lt_head. * ENDLOOP. * SORT lt_head BY lgort lgfsb mblnr. * DELETE ADJACENT DUPLICATES FROM lt_head COMPARING ALL FIELDS. "1准备数据 lv_smartform = 'ZSD_FORM_001'. lv_smartform = 'ZSDSF01'. PERFORM f_get_sfname USING lv_smartform CHANGING lv_fmname. PERFORM f_open_smartforms CHANGING lw_output lw_control. CLEAR lv_no. "调用 sf CALL FUNCTION lv_fmname EXPORTING control_parameters = lw_control * i_head = <fs_head> * output_options = lw_output TABLES i_table = ot_table[] EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. * error handling MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. REFRESH lt_zppf001[]. PERFORM f_close_smartforms CHANGING lw_ssfcrescl. CALL FUNCTION 'SSF_READ_ERRORS' IMPORTING errortab = lt_errtab. ENDFORM. *&---------------------------------------------------------------------* *& Form F_GET_SFNAME *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> LV_SMARTFORM *& <-- LV_FMNAME *&---------------------------------------------------------------------* FORM f_get_sfname USING uv_smartform TYPE tdsfname CHANGING cv_fmname TYPE rs38l_fnam. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = uv_smartform * VARIANT = ' ' * DIRECT_CALL = ' ' IMPORTING fm_name = cv_fmname EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form F_OPEN_SMARTFORMS *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& <-- LW_CONTROL *&---------------------------------------------------------------------* FORM f_open_smartforms CHANGING cs_output TYPE ssfcompop cs_control TYPE ssfctrlop. cs_control-no_dialog = 'X'. cs_control-preview = 'X'. cs_control-no_open = 'X'. cs_control-no_close = 'X'. cs_output-tdiexit = 'X'. CALL FUNCTION 'SSF_OPEN' EXPORTING * ARCHIVE_PARAMETERS = * USER_SETTINGS = 'X' * MAIL_SENDER = * MAIL_RECIPIENT = * MAIL_APPL_OBJ = output_options = cs_output control_parameters = cs_control * IMPORTING * JOB_OUTPUT_OPTIONS = EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. * Implement suitable error handling here MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. ENDFORM. FORM f_close_smartforms CHANGING us_ssfcrescl TYPE ssfcrescl. CALL FUNCTION 'SSF_CLOSE' IMPORTING job_output_info = us_ssfcrescl EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM.
注意字段长度:模板纸张不够就用表类型sf





预留号:&W_HD-RSNUM(C)&
主要区域填充数据:&I_TABLE-MATNR&

四舍五入以及负数

data:lt_result TYPE string. data:abs_like like rv13a-konwa. data:abs_like1 like rv13a-konwa. data:abs_like2 like rv13a-konwa. abs_like1 = '-2'. abs_like2 = '-3'. abs_like = abs_like1 + abs_like2. lt_result = abs_like. condense lt_result. CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT' CHANGING value = lt_result . write:/ lt_result. DATA lv_input TYPE p DECIMALS 2 VALUE '12.45'. DATA lv_output TYPE p DECIMALS 2. CALL FUNCTION 'ROUND' EXPORTING decimals = 0 " 保留多少位小数 input = lv_input sign = 'X' " X 四舍五入 向上取舍 - 向下取舍 (负数也一样) IMPORTING output = lv_output " 输出返回结果 EXCEPTIONS input_invalid = 1 overflow = 2 type_invalid = 3 OTHERS = 4. WRITE: /'四舍五入'. WRITE: / 'lv_input:' , lv_input, ' -> ', lv_output . "另外,直接用 P类型接收,本身就是四舍五入 DATA: lv_dec0 TYPE p DECIMALS 0. DATA: lv_dec1 TYPE p DECIMALS 1. lv_dec0 = lv_input. WRITE: / 'lv_dec0:', lv_input, ' -> ', lv_dec0 . lv_dec1 = lv_input. WRITE: / 'lv_dec1:', lv_input, ' -> ', lv_dec1 .
DEBUG
[FUNCTION] Command=/H Title=Barry Test Type=SystemCommand
选择屏幕

TYPE-POOLS: vrm. DATA: name TYPE vrm_id, list TYPE vrm_values, VALUE LIKE LINE OF list. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 33." PARAMETERS:p_mblx TYPE zmct_zx-zmc_mblx DEFAULT 'C' MODIF ID lx. SELECTION-SCREEN COMMENT 39(6) mblx. SELECTION-SCREEN POSITION 47."日 PARAMETERS: p_smon TYPE char2 AS LISTBOX VISIBLE LENGTH 10 . SELECTION-SCREEN COMMENT 01(10) c_text1 FOR FIELD p_smon MODIF ID lx."目标类型 SELECTION-SCREEN END OF LINE. INITIALIZATION. c_text1 = '目标类型'. AT SELECTION-SCREEN OUTPUT. PERFORM screen_control. START-OF-SELECTION. *&---------------------------------------------------------------------* *& Form SCREEN_CONTROL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form SCREEN_CONTROL . mblx = '季度'. FREE list. IF p_mblx = 'C'.. name = 'P_SMON'. VALUE-KEY = '01'. VALUE-TEXT = '一月'. APPEND VALUE TO list. VALUE-KEY = '02'. VALUE-TEXT = '二月'. APPEND VALUE TO list. VALUE-KEY = '03'. VALUE-TEXT = '三月'. APPEND VALUE TO list. VALUE-KEY = '04'. VALUE-TEXT = '四月'. APPEND VALUE TO list. VALUE-KEY = '05'. VALUE-TEXT = '五月'. APPEND VALUE TO list. VALUE-KEY = '06'. VALUE-TEXT = '六月'. APPEND VALUE TO list. VALUE-KEY = '07'. VALUE-TEXT = '七月'. APPEND VALUE TO list. VALUE-KEY = '08'. VALUE-TEXT = '八月'. APPEND VALUE TO list. VALUE-KEY = '09'. VALUE-TEXT = '九月'. APPEND VALUE TO list. VALUE-KEY = '10'. VALUE-TEXT = '十月'. APPEND VALUE TO list. VALUE-KEY = '11'. VALUE-TEXT = '十一月'. APPEND VALUE TO list. VALUE-KEY = '12'. VALUE-TEXT = '十二月'. APPEND VALUE TO list. ENDIF. IF p_mblx = 'B'.. name = 'P_SMON'. VALUE-KEY = '01'. VALUE-TEXT = '一季度'. APPEND VALUE TO list. VALUE-KEY = '02'. VALUE-TEXT = '二季度'. APPEND VALUE TO list. VALUE-KEY = '03'. VALUE-TEXT = '三季度'. APPEND VALUE TO list. VALUE-KEY = '03'. VALUE-TEXT = '四季度'. APPEND VALUE TO list. ENDIF. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING ID = name values = list. endform. " SCREEN_CONTROL

TABLES:bkpf . SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 33." PARAMETERS: p_monat TYPE bkpf-monat DEFAULT 01 MODIF ID lx. SELECTION-SCREEN COMMENT 01(10) c_text1 FOR FIELD p_monat MODIF ID bl1. SELECTION-SCREEN POSITION 40." PARAMETERS:p_mblx TYPE bkpf-monat DEFAULT 02 MODIF ID lx."目标类型 SELECTION-SCREEN COMMENT 44(10) mblx. SELECTION-SCREEN END OF LINE. INITIALIZATION. c_text1 = '目标类型'. mblx = '月度/季度'.

REPORT 1. TABLES:sscrfields. TYPE-POOLS:sydb0,abap. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE ms. PARAMETERS: rd_t1 TYPE c RADIOBUTTON GROUP rd01 USER-COMMAND com ." DEFAULT 'X' . PARAMETERS: rd_t2 TYPE c RADIOBUTTON GROUP rd01 DEFAULT 'X' . SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 6(30) descr1 MODIF ID hz. SELECTION-SCREEN POSITION 4. PARAMETERS:p_1 AS CHECKBOX MODIF ID hz . SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 6(30) descr2 MODIF ID hz. SELECTION-SCREEN POSITION 4. PARAMETERS:p_2 AS CHECKBOX MODIF ID hz . SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b2. SELECTION-SCREEN FUNCTION KEY 1. "//--------------------------------------------------- "// 文本备注 SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE bz. SELECTION-SCREEN COMMENT /02(70) c01. SELECTION-SCREEN COMMENT /02(70) c02. SELECTION-SCREEN COMMENT /02(70) c03. SELECTION-SCREEN COMMENT /02(70) c04. SELECTION-SCREEN END OF BLOCK b3. INITIALIZATION . sscrfields-functxt_01 = '下载模板'. ms = '类型选择' . descr1 = '@CL@ 材料类别1' . descr2 = '@9B@ 材料类别2' . %_rd_t1_%_app_%-text = '@B_LIST@ 明细' . %_rd_t2_%_app_%-text = '@B_SUMP@ 汇总' . * @B_LIFE@ @B_CUST@ bz = '提示 ..' . c01 = '@1V@本部机构填写规则:'. c02 = '1. 四川米兰(含高新店)请用6100'. c03 = '2. 晶肤事业部请用6200:'. c04 = '3. 其他机构请用自身机构代码'. AT SELECTION-SCREEN OUTPUT. *---------------------------------------------------------------------* * 隐藏 function-key *---------------------------------------------------------------------* * DATA: current_screen TYPE string VALUE '(RSDBRUNT)CURRENT_SCREEN'. * FIELD-SYMBOLS: <current_screen> TYPE sydb0_screen. * ASSIGN (current_screen) TO <current_screen>. * IF sy-subrc EQ 0. * <current_screen>-func_keys(1) = rd_t1. * ENDIF. * * * DATA: current_scr TYPE string VALUE'(RSDBRUNT)CURRENT_SCR'. * FIELD-SYMBOLS: <current_scr> TYPE sydb0_scr_stack_line. * ASSIGN (current_scr) TO <current_scr>. * IF sy-subrc EQ 0. * IF rd_t1 EQ abap_true. * DELETE <current_scr>-excl WHERE fcode EQ 'FC01'. * ELSE. * READ TABLE <current_scr>-excl WITH KEY fcode = 'FC01' TRANSPORTING NO FIELDS. * IF sy-subrc NE 0. * APPEND 'FC01' TO <current_scr>-excl. * ENDIF. * ENDIF. * ENDIF. DATA:lt_ucomm TYPE STANDARD TABLE OF sy-ucomm. DATA:ls_ucomm like sy-ucomm. IF rd_t1 = 'X'.. CLEAR:lt_ucomm[],lt_ucomm. ELSE. ls_ucomm = 'FC01'. APPEND ls_ucomm TO lt_ucomm.CLEAR ls_ucomm. ENDIF. CALL FUNCTION 'RS_SET_SELSCREEN_STATUS' EXPORTING p_status = sy-pfkey * P_PROGRAM = ' ' TABLES p_exclude = lt_ucomm . "控制页签 IF rd_t1 = 'X'. LOOP AT SCREEN. IF screen-group1 = 'HZ'. screen-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ELSEIF rd_t2 = 'X'. LOOP AT SCREEN. IF screen-group1 = 'SUM'. screen-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF.

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-t00. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_t1 RADIOBUTTON GROUP gp1 DEFAULT 'X' USER-COMMAND gp1. SELECTION-SCREEN COMMENT 4(20) pa_t1t FOR FIELD pa_t1. * SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 7. PARAMETERS: pa_t11 RADIOBUTTON GROUP gp2 DEFAULT 'X' USER-COMMAND gp2. SELECTION-SCREEN COMMENT 8(20) pa_t11T FOR FIELD pa_t11. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 7. PARAMETERS: pa_t12 RADIOBUTTON GROUP gp2 . SELECTION-SCREEN COMMENT 8(20) pa_t12t FOR FIELD pa_t12. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 7. PARAMETERS: pa_t13 RADIOBUTTON GROUP gp2 . SELECTION-SCREEN COMMENT 8(20) pa_t13t FOR FIELD pa_t13. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 7. PARAMETERS: pa_t14 RADIOBUTTON GROUP gp2 . SELECTION-SCREEN COMMENT 8(20) pa_t14t FOR FIELD pa_t14. SELECTION-SCREEN END OF LINE. * SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 7. PARAMETERS: pa_t15 RADIOBUTTON GROUP gp2 . SELECTION-SCREEN COMMENT 8(20) pa_t15t FOR FIELD pa_t15. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: pa_t2 RADIOBUTTON GROUP gp1 . SELECTION-SCREEN COMMENT 4(20) pa_t2t FOR FIELD pa_t2. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b02. INITIALIZATION. * %__%_app_%-text = '医生'. pa_t1t = '岗位选择'. pa_t11T = '医生'. pa_t12t = '咨询'.

SELECTION-SCREEN: BEGIN OF BLOCK btx WITH FRAME TITLE format. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: p_djg AS CHECKBOX DEFAULT 'X'.. SELECTION-SCREEN COMMENT 3(20) djgt . PARAMETERS: p_total AS CHECKBOX ."朗姿总体 SELECTION-SCREEN COMMENT 26(8) totalt . SELECTION-SCREEN POSITION 45. PARAMETERS: p_jf AS CHECKBOX . SELECTION-SCREEN COMMENT 47(8) jft ." SELECTION-SCREEN END OF LINE. SELECTION-SCREEN: END OF BLOCK btx."按钮选择 INITIALIZATION. format = '模式选择'. djgt = '单机构'. totalt = '朗姿总体'. jft = '晶肤合计'.

TABLES:pa0001,pa0000,mkpf,mkal. *&---------------------------------------------------------------------* SELECTION-SCREEN: BEGIN OF BLOCK blk WITH FRAME TITLE TEXT-t01. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(7) func1 FOR FIELD p_func1. PARAMETERS: p_func1 RADIOBUTTON GROUP f1 DEFAULT 'X' USER-COMMAND z05. SELECTION-SCREEN COMMENT 30(7) func2 FOR FIELD p_func2. PARAMETERS: p_func2 RADIOBUTTON GROUP f1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN: END OF BLOCK blk."按钮选择 SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE t1. PARAMETERS: p_werks LIKE mkal-werks OBLIGATORY DEFAULT '1000' MODIF ID fu1. SELECT-OPTIONS: s_matnr FOR mkal-matnr MODIF ID fu1, s_verid FOR mkal-verid MODIF ID fu1. PARAMETERS: p_datuv LIKE stko-datuv OBLIGATORY DEFAULT sy-datum MODIF ID fu1. SELECTION-SCREEN: END OF BLOCK b1."组 SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE t2. PARAMETERS: p_werks1 LIKE mkal-werks OBLIGATORY DEFAULT '1000' MODIF ID fu2. SELECT-OPTIONS: s_matnr1 FOR mkal-matnr MODIF ID fu2, s_stlal1 FOR mkal-stlal MODIF ID fu2, s_stlan1 FOR mkal-stlan MODIF ID fu2. PARAMETERS: p_datuv1 LIKE stko-datuv OBLIGATORY DEFAULT sy-datum MODIF ID fu2. SELECTION-SCREEN: END OF BLOCK b2."组 *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-002. PARAMETERS: rd_a1 TYPE C RADIOBUTTON GROUP rd01 USER-COMMAND com DEFAULT 'X'. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 4(10) lb_tstic . SELECTION-SCREEN POSITION 14. PARAMETERS: p_new AS CHECKBOX . SELECTION-SCREEN END OF LINE. PARAMETERS: rd_a2 TYPE C RADIOBUTTON GROUP rd01 . SELECTION-SCREEN END OF BLOCK blk1. SELECTION-SCREEN:BEGIN OF BLOCK blk0 WITH FRAME TITLE TEXT-001, SKIP 1, BEGIN OF LINE, PUSHBUTTON 1(20) but1 USER-COMMAND download, END OF LINE, END OF BLOCK blk0. SELECTION-SCREEN BEGIN OF BLOCK blk6 WITH FRAME TITLE TEXT-003. SELECT-OPTIONS: s_systm3 FOR pa0001-pernr NO INTERVALS MODIF ID m3. "系统 SELECT-OPTIONS: s_equip3 FOR pa0001-begda NO INTERVALS MODIF ID m3. "设备 SELECT-OPTIONS: s_major3 FOR pa0001-endda NO INTERVALS MODIF ID m3. "相关专业 SELECT-OPTIONS: s_eneny3 FOR mkpf-mjahr MODIF ID m3. "年份 SELECT-OPTIONS: s_evenc4 FOR pa0000-begda NO INTERVALS MODIF ID m4. PARAMETERS p_file1 TYPE rlgrap-filename MODIF ID m5. SELECTION-SCREEN END OF BLOCK blk6. INITIALIZATION . %_p_new_%_app_%-text = '新物料'. *&---------------------------------------------------------------------* func1 = '按生产版本查找'. func2 = '按BOM用途查找'. *&---------------------------------------------------------------------* CALL FUNCTION 'ICON_CREATE' " 文本 EXPORTING name = 'ICON_OPEN_FOLDER' TEXT = '下载模板' info = 'EVEN' IMPORTING RESULT = but1 EXCEPTIONS OTHERS = 0. "初始化标签名称 AT SELECTION-SCREEN OUTPUT. "控制页签 IF rd_a1 = 'X'. LOOP AT SCREEN. IF SCREEN-group1 = 'M3'. SCREEN-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ELSEIF rd_a2 = 'X'. LOOP AT SCREEN. IF SCREEN-group1 = 'M4'. SCREEN-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. *&---------------------------------------------------------------------* LOOP AT SCREEN. IF ( p_func1 EQ 'X' AND SCREEN-group1 EQ 'FU2' ) OR ( p_func2 EQ 'X' AND SCREEN-group1 EQ 'FU1' ). SCREEN-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. *&---------------------------------------------------------------------*
TABLES:pa0001,pa0000,mkpf,mkal. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-002. PARAMETERS: rd_a1 TYPE C RADIOBUTTON GROUP rd01 USER-COMMAND com DEFAULT 'X'. PARAMETERS: rd_a2 TYPE C RADIOBUTTON GROUP rd01 . SELECTION-SCREEN END OF BLOCK blk1. SELECTION-SCREEN BEGIN OF BLOCK blk6 WITH FRAME TITLE TEXT-003. SELECT-OPTIONS: s_systm3 FOR pa0001-pernr NO INTERVALS MODIF ID m3. "系统 SELECT-OPTIONS: s_equip3 FOR pa0001-begda NO INTERVALS MODIF ID m3. "设备 SELECT-OPTIONS: s_major3 FOR pa0001-endda NO INTERVALS MODIF ID m3. "相关专业 SELECT-OPTIONS: s_eneny3 FOR mkpf-mjahr MODIF ID m3. "年份 SELECT-OPTIONS: s_evenc4 FOR pa0000-begda NO INTERVALS MODIF ID m4. PARAMETERS p_file1 TYPE rlgrap-filename MODIF ID m5. SELECTION-SCREEN END OF BLOCK blk6. INITIALIZATION . AT SELECTION-SCREEN OUTPUT. "控制页签 IF rd_a1 = 'X'." LOOP AT SCREEN. IF SCREEN-group1 = 'M3'. SCREEN-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ELSEIF rd_a2 = 'X'. LOOP AT SCREEN. IF SCREEN-group1 = 'M4'. SCREEN-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF.

PARAMETERS:p_mtart type rmmg1-mtart as LISTBOX VISIBLE LENGTH 10. "t134

TABLES:sscrfields. SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1. PARAMETERS: p_typ TYPE ctu_mode AS LISTBOX OBLIGATORY DEFAULT 'N' VISIBLE LENGTH 20, p_upd TYPE ctu_update AS LISTBOX OBLIGATORY DEFAULT 'S' VISIBLE LENGTH 20. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(31) TEXT-t01. PARAMETERS:p_from TYPE i OBLIGATORY DEFAULT 2. SELECTION-SCREEN COMMENT 48(2) TEXT-t02. PARAMETERS:p_to TYPE i OBLIGATORY DEFAULT 2000. SELECTION-SCREEN END OF LINE. PARAMETERS p_file TYPE c LENGTH 1024 LOWER CASE. SELECTION-SCREEN END OF BLOCK 001. SELECTION-SCREEN FUNCTION KEY 1. INITIALIZATION. sscrfields-functxt_01 = '下载模板'. %_p_typ_%_app_%-text = '处理模式'. %_p_upd_%_app_%-text = '更新模式'. %_p_file_%_app_%-text = '模板路径'. %ct01004_1000 = '数据行'. %ct02006_1000 = '到'.

SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE text-001. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(20) text-104. "文本备注(IE工厂) PARAMETERS: p1 AS CHECKBOX. SELECTION-SCREEN COMMENT (30) text-102. PARAMETERS: p2 AS CHECKBOX. SELECTION-SCREEN COMMENT (30) text-103. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK 001.

TYPE-POOLS:slis. TABLES:mseg,sscrfields. DATA: functxt TYPE smp_dyntxt. SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. SELECT-OPTIONS:s_werks FOR mseg-werks, s_lgort FOR mseg-lgort. SELECTION-SCREEN:END OF BLOCK b1. SELECTION-SCREEN:FUNCTION KEY 1. INITIALIZATION. functxt-icon_id = '@0K@'. functxt-quickinfo = '排除异常数据'. functxt-icon_text = '排除异常数据'. sscrfields-functxt_01 = functxt. AT SELECTION-SCREEN. IF sscrfields-ucomm = 'FC01'. PERFORM frm_skip_sm30. ENDIF. START-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_SKIP_SM30 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* form FRM_SKIP_SM30 . * CALL FUNCTION 'VIEW_MAINTENANCE_CALL' * EXPORTING * action = 'U' * view_name = 'ZTMM_VMI_REMOVE'. endform. " FRM_SKIP_SM30

TABLES:sscrfields. TYPE-POOLS:icon. SELECTION-SCREEN: BEGIN OF BLOCK blk_note WITH FRAME TITLE text-002. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON 1(8) btn1 USER-COMMAND sall. SELECTION-SCREEN PUSHBUTTON 9(12) btn2 USER-COMMAND dall. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm01 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd01. " 基金中心主数据 SELECTION-SCREEN: COMMENT 5(20) text-b01. PARAMETERS: p_bpm02 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd02. " 物料组 SELECTION-SCREEN: COMMENT 30(20) text-b02. PARAMETERS: p_bpm03 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd03. " 工厂数据 SELECTION-SCREEN: COMMENT 55(20) text-b03. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm04 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd04. "承诺项目数据 SELECTION-SCREEN: COMMENT 5(20) text-b04. PARAMETERS: p_bpm05 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd05. "成本中心数据 SELECTION-SCREEN: COMMENT 30(20) text-b05. PARAMETERS: p_bpm06 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd06. "公司代码 SELECTION-SCREEN: COMMENT 55(20) text-b06. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm07 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd07. "会计科目主数据 SELECTION-SCREEN: COMMENT 5(20) text-b07. PARAMETERS: p_bpm08 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd08. "内部订单主数据 SELECTION-SCREEN: COMMENT 30(20) text-b08. PARAMETERS: p_bpm09 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd09. "现金流量原因 SELECTION-SCREEN: COMMENT 55(20) text-b09. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm10 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd10. "计量单位 SELECTION-SCREEN: COMMENT 5(20) text-b10. PARAMETERS: p_bpm11 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd11. "货币-汇率 SELECTION-SCREEN: COMMENT 30(20) text-b11. PARAMETERS: p_bpm12 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd12. "物料类型 SELECTION-SCREEN: COMMENT 55(20) text-b12. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm13 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd13. "资产主数据 SELECTION-SCREEN: COMMENT 5(20) text-b13. PARAMETERS: p_bpm14 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd14. "资材分类 SELECTION-SCREEN: COMMENT 30(20) text-b14. PARAMETERS: p_bpm15 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd15. "基金中心与成本中心 SELECTION-SCREEN: COMMENT 55(20) text-b15. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm16 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd16. "基金中心与内部订单 SELECTION-SCREEN: COMMENT 5(20) text-b16. PARAMETERS: p_bpm17 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd17. "会计科目与承诺项目 SELECTION-SCREEN: COMMENT 30(20) text-b17. PARAMETERS: p_bpm18 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd18. "物料类型 SELECTION-SCREEN: COMMENT 55(20) text-b18. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm22 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd22. "内部订单和会计科目推导承诺项目 SELECTION-SCREEN: COMMENT 5(20) text-b22. PARAMETERS: p_bpm23 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd23. "公司代码和资产编号推导基金中心 SELECTION-SCREEN: COMMENT 30(20) text-b23. PARAMETERS: p_bpm24 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd24. "物料类型 SELECTION-SCREEN: COMMENT 55(20) text-b24. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_bpm25 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd25. "库存地点 SELECTION-SCREEN: COMMENT 5(20) text-b19. PARAMETERS: p_hr01 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd25. " 利润中心 SELECTION-SCREEN: COMMENT 30(20) text-h01. PARAMETERS: p_hr02 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd26. "成本要素 SELECTION-SCREEN: COMMENT 55(20) text-h02. * costa.du 20180604 add end SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN: END OF BLOCK blk_note. INITIALIZATION. GET TIME. *&---------------------------------------------------------------------* * AT SELECTION-SCREEN *&---------------------------------------------------------------------* AT SELECTION-SCREEN OUTPUT. * 初始化选择屏幕 PERFORM frm_init_scr. AT SELECTION-SCREEN. PERFORM frm_sel_scr. *&---------------------------------------------------------------------* *& Form FRM_INIT_SCR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_init_scr . * 创建屏幕按钮 "全选 CALL FUNCTION 'ICON_CREATE' EXPORTING name = icon_select_all info = '全选' IMPORTING RESULT = btn1. "取消全选 CALL FUNCTION 'ICON_CREATE' EXPORTING name = icon_deselect_all info = '取消全选' IMPORTING RESULT = btn2. ENDFORM. "FRM_INIT_SCR *&---------------------------------------------------------------------* *& Form FRM_SEL_SCR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_sel_scr . CASE sscrfields-ucomm. WHEN 'SALL'. p_bpm01 = 'X'. p_bpm02 = 'X'. p_bpm03 = 'X'. p_bpm04 = 'X'. p_bpm05 = 'X'. p_bpm06 = 'X'. p_bpm07 = 'X'. p_bpm08 = 'X'. p_bpm09 = 'X'. p_bpm10 = 'X'. p_bpm11 = 'X'. p_bpm12 = 'X'. p_bpm13 = 'X'. p_bpm14 = 'X'. p_bpm15 = 'X'. p_bpm16 = 'X'. p_bpm17 = 'X'. p_bpm18 = 'X'. p_bpm25 = 'X'. p_bpm22 = 'X'. p_bpm23 = 'X'. p_bpm24 = 'X'. * costa.du 20180604 add start p_hr01 = 'X'. p_hr02 = 'X'. * costa.du 20180604 add end WHEN 'DALL'. CLEAR: p_bpm01, p_bpm02, p_bpm03, p_bpm04, p_bpm05, p_bpm06, p_bpm07, p_bpm08, p_bpm09, p_bpm10, p_bpm11, p_bpm12, p_bpm13, p_bpm14, p_bpm15, p_bpm16, p_bpm17, p_bpm22, p_bpm23, p_bpm24, p_bpm18, p_bpm25. * costa.du 20180604 add start CLEAR: p_hr01, p_hr02. * costa.du 20180604 add end WHEN OTHERS. ENDCASE. ENDFORM. " FRM_SEL_SCR

TABLES sscrfields. TYPE-POOLS: vrm, cntb. SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (6) text1 FOR FIELD p_devc. SELECTION-SCREEN POSITION 10. PARAMETERS p_devc TYPE devclass. SELECTION-SCREEN PUSHBUTTON 45(10) tmp USER-COMMAND tmp. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (6) text2 FOR FIELD p_trkorr. SELECTION-SCREEN POSITION 10. PARAMETERS p_trkorr TYPE trkorr VISIBLE LENGTH 10. SELECTION-SCREEN COMMENT (60) t_trkorr. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN ULINE. SELECTION-SCREEN COMMENT /1(79) cmt2. SELECTION-SCREEN END OF BLOCK 001. INITIALIZATION. text1 = '开发类'. text2 = '请求号'. tmp = '本地对象'. AT SELECTION-SCREEN OUTPUT. AT USER-COMMAND. IF sy-ucomm = 'ECAN'. LEAVE TO SCREEN 0. ENDIF. AT SELECTION-SCREEN.
选择屏幕显示说明TEXT

REPORT ztest. TYPE-POOLS:slis. TABLES:mseg,sscrfields. DATA: functxt TYPE smp_dyntxt. SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS:s_werks FOR mseg-werks, s_lgort FOR mseg-lgort. SELECTION-SCREEN:END OF BLOCK b1. SELECTION-SCREEN:FUNCTION KEY 1. SELECTION-SCREEN BEGIN OF BLOCK block9 WITH FRAME TITLE w_title. SELECTION-SCREEN COMMENT 1(30) w_char1. SELECTION-SCREEN COMMENT /3(77) w_char2. SELECTION-SCREEN COMMENT /1(77) w_char3. SELECTION-SCREEN COMMENT /3(77) w_char4. SELECTION-SCREEN COMMENT /1(77) w_char5. SELECTION-SCREEN COMMENT /3(77) w_char6. SELECTION-SCREEN END OF BLOCK block9. INITIALIZATION. functxt-icon_id = '@0K@'. functxt-quickinfo = '排除异常数据'. functxt-icon_text = '排除异常数据'. sscrfields-functxt_01 = functxt. w_title = '程序属性'. w_char1 = '【程序目的】'. w_char2 = '按模板填好财务凭证凭证抬头与行项目信息,后确认格式无误,导入系统生成财务凭证选出相应的财务凭证'. w_char3 = '【适用范围】'. w_char4 = '所有公司'. w_char5 = '【注意事项】'. w_char6 = '要求每一行,每一格按模板要求严格填写,不能有丝毫的差错!'. AT SELECTION-SCREEN. IF sscrfields-ucomm = 'FC01'. PERFORM frm_skip_sm30. ENDIF. START-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_SKIP_SM30 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_skip_sm30 . * CALL FUNCTION 'VIEW_MAINTENANCE_CALL' * EXPORTING * action = 'U' * view_name = 'ZTMM_VMI_REMOVE'. ENDFORM. " FRM_SKIP_SM30
https://www.cnblogs.com/rainysblog/p/11953172.html
选择屏幕勾选后某字段设置必输(看着是必输入)
AT SELECTION-SCREEN OUTPUT . PERFORM frm_set_screen. *&---------------------------------------------------------------------* *& Form frm_set_screen *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_set_screen . IF p_new = 'X'. LOOP AT SCREEN. IF screen-group1 = 'CB' .. IF screen-name = 'S_MA_CB-LOW'. .. screen-required = '2'. MODIFY SCREEN. ENDIF. ENDIF. ENDLOOP. ENDIF. ENDFORM. "frm_set_screen
选择屏幕隐藏屏幕

REPORT 1. TYPE-POOLS: abap,ICON,slis,vrm. TABLES: but000. DATA: gv_bemon TYPE char2, gv_enmon TYPE char2. DATA: gv_bedat TYPE char2, gv_endat TYPE char2. DATA: g_vrmid TYPE vrm_id, gt_vrmv TYPE vrm_values, gs_vrmv LIKE LINE OF gt_vrmv. SELECTION-SCREEN BEGIN OF BLOCK b0 WITH FRAME TITLE TEXT-t00. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON 1(4) but1 USER-COMMAND but1 VISIBLE LENGTH 2. SELECTION-SCREEN COMMENT 5(20) com1. SELECTION-SCREEN END OF LINE. SELECT-OPTIONS: s_kunr FOR but000-partner MODIF ID bl1. "//---------------------可以控制位置------------------------------ SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 33."月 PARAMETERS: p_frcsy TYPE numc2 AS LISTBOX VISIBLE LENGTH 10 MODIF ID bl1. SELECTION-SCREEN COMMENT 01(20) c_text1 FOR FIELD p_frcsy MODIF ID bl1. SELECTION-SCREEN POSITION 46."日 PARAMETERS: p_frcsr TYPE numc2 AS LISTBOX VISIBLE LENGTH 8 MODIF ID bl1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 33."月 PARAMETERS: p_tocsy TYPE numc2 AS LISTBOX VISIBLE LENGTH 10 MODIF ID bl1. SELECTION-SCREEN COMMENT 01(20) c_text2 FOR FIELD p_tocsy MODIF ID bl1. SELECTION-SCREEN POSITION 46."日 PARAMETERS: p_tocsr TYPE numc2 AS LISTBOX VISIBLE LENGTH 8 MODIF ID bl1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b0. INITIALIZATION. %_s_kunr_%_app_%-TEXT = '客户'. PERFORM frm_data_initial. AT SELECTION-SCREEN. PERFORM frm_at_selectscr. AT SELECTION-SCREEN OUTPUT. PERFORM frm_screen_output. PERFORM frm_fill_listbox. *&---------------------------------------------------------------------* *& Form frm_data_initial *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_data_initial. WRITE icon_data_area_expand AS ICON TO but1 . * com1 = TEXT-t01. com1 = '基本信息'.. ENDFORM. " FRM_DATA_INITIAL *&---------------------------------------------------------------------* *& Form FRM_SCREEN_OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_screen_output . LOOP AT SCREEN. IF but1 = '@K2@' AND SCREEN-group1 = 'BL1'. SCREEN-active = 0. ENDIF. * IF but2 = '@K2@' AND SCREEN-group1 = 'BL2'. * SCREEN-active = 0. * ENDIF. MODIFY SCREEN. ENDLOOP. ENDFORM. " FRM_SCREEN_OUTPUT *&---------------------------------------------------------------------* *& Form FRM_AT_SELECTSCR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_at_selectscr . CASE sy-ucomm. WHEN 'BUT1'. IF but1 = '@K1@'. WRITE icon_data_area_collapse AS ICON TO but1. ELSE. WRITE icon_data_area_expand AS ICON TO but1. ENDIF. WHEN 'BUT2'. * IF but2 = '@K1@'. * WRITE icon_data_area_collapse AS ICON TO but2. * ELSE. * WRITE icon_data_area_expand AS ICON TO but2. * ENDIF. WHEN OTHERS. ENDCASE. ENDFORM. " FRM_AT_SELECTSCR *&---------------------------------------------------------------------* *& Form FRM_FILL_LISTBOX *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_fill_listbox . DEFINE m_set_listbox. CLEAR gs_vrmv. gs_vrmv-KEY = &1. gs_vrmv-TEXT = &2. COLLECT gs_vrmv INTO gt_vrmv. END-OF-DEFINITION. DEFINE m_set_values. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING ID = &1 values = gt_vrmv. END-OF-DEFINITION. c_text1 = '生日开始月日'. c_text2 = '生日截止月日'. DATA: l_text1 TYPE numc2, l_text2 TYPE char4. REFRESH: gt_vrmv. DO 12 TIMES. ADD 1 TO l_text1. CONCATENATE l_text1 '月' INTO l_text2. m_set_listbox l_text1 l_text2. ENDDO. m_set_values 'P_FRCSY'. m_set_values 'P_TOCSY'. REFRESH: gt_vrmv. CLEAR: l_text1,l_text2. DO 31 TIMES. ADD 1 TO l_text1. CONCATENATE l_text1 '日' INTO l_text2. m_set_listbox l_text1 l_text2. ENDDO. m_set_values 'P_FRCSR'. m_set_values 'P_TOCSR'. ENDFORM. " FRM_FILL_LISTBOX
结构

SQL
http://blog.sina.com.cn/s/blog_77af9dc501017g1c.html
动态SQL
REPORT 1. TABLES: spfli. DATA: ls_line(80) OCCURS 0 WITH HEADER LINE. DATA:ls_spfli TYPE spfli. CONCATENATE 'carrid in (''AA'',' '''AZ'')' INTO ls_line. APPEND ls_line. CONCATENATE ' or carrid in (''LH'',' '''AZ'')' INTO ls_line. APPEND ls_line.CLEAR ls_line. SELECT * INTO TABLE @DATA(lt_spfli) FROM spfli. *---------------------------------------------------------------------* * Marcus *---------------------------------------------------------------------* DATA:itab1 TYPE TABLE OF t001, itab2 TYPE TABLE OF t001. DATA:wa1 LIKE LINE OF itab1. DATA:wa2 LIKE LINE OF itab2. FIELD-SYMBOLS:<fs_itab> TYPE STANDARD TABLE. FIELD-SYMBOLS:<fs_wa> TYPE any. DATA:lv_tabname TYPE char30. DATA(lv_wa) = 'WA1'. DATA(lv_where) = 'bukrs = 0001 '. lv_tabname = 'ITAB1'. ASSIGN (lv_tabname) TO <fs_itab>. ASSIGN (lv_wa) TO <fs_wa>. READ TABLE <fs_itab> INTO <fs_wa> WITH KEY lv_where. READ TABLE ITAB1 INTO <fs_wa> WITH KEY lv_where. LOOP AT <fs_itab> INTO <fs_wa> WHERE (lv_where) . ENDLOOP.
DBCO
https://blog.csdn.net/qq_42080586/article/details/108867449
https://mp.weixin.qq.com/s/xL5e1BjR3UT4eS0xaBHuZw
sap链接mysql https://www.cnblogs.com/ckstock/p/16077749.html
hana 连接hana 不会有问题
hana 连接 oracle 会有问题 hana上面需要打oracle驱动
hana 连接ms-sql server 会有问题 hana上需要打ms-sql server 驱动

端口是否通着:


这样就表示这个端口可以连接、,ping有时候不能确定端口有没有问题
OBJECT_SOURCE=ERP_MES MSSQL_DBNAME=ERP_MES MSSQL_SERVER=192.168.18.
native sql:游标每打开一次就要关闭一次,update 时候不能 set = 主键
其他服务器取数:
游标取数时候,需要每次进行开启 并关闭。
更新对方数据库表时候 : 如果对方数据库主键 SAP不需要传值,对方要把他们的数据库表设置为主键自动递增, SAP端 不需要传此字段即可
TRY . EXEC SQL. CONNECT TO 'P1WMSDB' ENDEXEC. EXEC SQL. SET CONNECTION 'P1WMSDB' ENDEXEC. CATCH cx_sy_native_sql_error INTO exec_ref. mes_str = exec_ref->get_text( ). ENDTRY. TRY . EXEC SQL PERFORMING FRM_APPEND. SELECT A.SKU, A.FACTORY, A.STOCK, A.LOCATIONID, A.QTY, A.STATUS FROM V_CUS_FOR_SAP_INV A INTO :GS_DATA-MATNR, :GS_DATA-WERKS, :GS_DATA-LGORT, :GS_DATA-LOCATIONID, :GS_DATA-MENGE, :GS_DATA-STATUS WHERE A.STATUS = 'U' OR A.STATUS = 'S' AND A.SKU IN :S_MATNR AND A.FACTORY IN :S_WERKS AND A.STOCK IN :S_LGORT ENDEXEC. CATCH cx_sy_native_sql_error INTO exec_ref. mes_str = exec_ref->get_text( ). CATCH cx_sql_exception. ENDTRY. "in s_S_WERKS 这句话不会起作用 *&---------------------------------------------------------------------* *& Form frm_append *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_append . APPEND gs_data TO gt_data_middle. ENDFORM. "frm_append DELETE gt_data_middle[] WHERE matnr NOT IN s_matnr OR werks NOT IN s_werks OR lgort NOT IN s_lgort .
SM59

动态SQL
动态 https://www.cnblogs.com/ricoo/p/10169928.html

https://www.cnblogs.com/rainysblog/p/6514946.html
* 日 it_date * 周 s_data * 半月 s_mon_half * 月 s_mon DATA(iv_type) = VALUE #( it_mdpd[ 1 ]-in_type OPTIONAL ). lv_kcond = COND #( WHEN iv_type = '0' THEN 'a~budat EQ @it_date' "日 WHEN iv_type = '1' THEN 'a~budat IN @s_data' "周 WHEN iv_type = '2' THEN 'a~budat IN @s_mon_half' "半月 WHEN iv_type = '3' THEN 'a~budat IN @s_mon' "月 ELSE '1 = 1' ). SELECT a~kunnr, a~zxsdh, a~budat, b~matnr, b~zxssl INTO TABLE @DATA(gt_car_result) FROM zsdt_r001_hd AS a INNER JOIN zsdt_r001_it AS b ON b~kunnr = a~kunnr AND b~zxsdh = a~zxsdh AND (lv_kcond) * AND ( ( a~budat LIKE @rq_result ) OR ( a~budat LIKE @rq_result_now ) ) FOR ALL ENTRIES IN @it_mdpd WHERE a~kunnr = @it_mdpd-kunnr.
动态内表
最全demo演示
思想:首先造一个需要动态展示的结构字段,再进行行列转秩,循环内表,将数值写<fs> ,再 APPEND <dyn_wa> TO <dyn_table>.
https://www.cnblogs.com/ckstock/p/17488243.html#_label1_0
*&---------------------------------------------------------------------* *& Report YSL01 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ysl01. INCLUDE zabap_dynamic_table. TYPES:BEGIN OF ty_base, num TYPE n LENGTH 5, maktx TYPE maktx, END OF ty_base. TYPES:BEGIN OF ty_item, num TYPE n LENGTH 5, lifnr TYPE lifnr, unit TYPE c LENGTH 3, value TYPE i, END OF ty_item. DATA: gt_base TYPE TABLE OF ty_base. DATA: gt_item TYPE TABLE OF ty_item. START-OF-SELECTION. APPEND VALUE #( num = 1 maktx = '物料1' ) TO gt_base. APPEND VALUE #( num = '2' maktx = '物料2' ) TO gt_base. APPEND VALUE #( num = '3' maktx = '物料3' ) TO gt_base. APPEND VALUE #( num = '1' lifnr = 'A01' unit = '个' value = '100' ) TO gt_item. APPEND VALUE #( num = '1' lifnr = 'A02' unit = '个' value = '200' ) TO gt_item. APPEND VALUE #( num = '1' lifnr = 'A03' unit = '个' value = '300' ) TO gt_item. APPEND VALUE #( num = '2' lifnr = 'A01' unit = '只' value = '400' ) TO gt_item. APPEND VALUE #( num = '2' lifnr = 'A02' unit = '只' value = '500' ) TO gt_item. APPEND VALUE #( num = '2' lifnr = 'A03' unit = 'KG' value = '600' ) TO gt_item. APPEND VALUE #( num = '3' lifnr = 'A01' unit = 'KM' value = '700' ) TO gt_item. APPEND VALUE #( num = '3' lifnr = 'A03' unit = 'XX' value = '900' ) TO gt_item. DATA(lt_lifnr) = gt_item. SORT lt_lifnr BY lifnr. DELETE ADJACENT DUPLICATES FROM lt_lifnr COMPARING lifnr. DATA: go_data TYPE REF TO data. FIELD-SYMBOLS: <gt_data> TYPE STANDARD TABLE. DATA: lt_fields TYPE TABLE OF zabap_dynamic_table_field. DO lines( lt_lifnr ) TIMES. DATA(lv_num) = CONV numc3( sy-index ). APPEND VALUE #( fieldname = |UNIT{ lv_num }| rollname = 'MEINS' ) TO lt_fields. APPEND VALUE #( fieldname = |VALUE{ lv_num }| rollname = 'WERT8' ) TO lt_fields. ENDDO. PERFORM create_dynamic_table TABLES lt_fields USING 'TY_BASE' CHANGING go_data. ASSIGN go_data->* TO <gt_data>. <gt_data> = CORRESPONDING #( gt_base ). SORT gt_item BY num lifnr. LOOP AT <gt_data> ASSIGNING FIELD-SYMBOL(<ls_data>). ASSIGN COMPONENT 'NUM' OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_num>). "取序号 LOOP AT lt_lifnr ASSIGNING FIELD-SYMBOL(<ls_lifnr>). lv_num = sy-tabix. DATA(lv_fname_unit) = |UNIT{ lv_num }|. DATA(lv_fname_value) = |VALUE{ lv_num }|. READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<ls_item>) WITH KEY num = <lv_num> lifnr = <ls_lifnr>-lifnr BINARY SEARCH. IF sy-subrc = 0. ASSIGN COMPONENT lv_fname_unit OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_unit>). ASSIGN COMPONENT lv_fname_value OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_value>). <lv_unit> = <ls_item>-unit. <lv_value> = <ls_item>-value. ENDIF. ENDLOOP. ENDLOOP. *"--- 动态内表数据计算,不在前面直接计算是因为:有的数据缺失,错行赋值很容易出问题 - --- *CLEAR:lv_fname_zxyjje,lv_fname_ksrg,lv_fname_rate. * *LOOP AT <gt_data> ASSIGNING <ls_data>. * DO gv_jgbm_count TIMES. * lv_num_c = sy-INDEX. * CONCATENATE 'ZXYJJE' lv_num_c INTO lv_fname_zxyjje. * CONCATENATE 'KSRG' lv_num_c INTO lv_fname_ksrg. * CONCATENATE 'RATE' lv_num_c INTO lv_fname_rate. * ASSIGN COMPONENT lv_fname_zxyjje OF STRUCTURE <ls_data> TO <lv_zxyjje>. * ASSIGN COMPONENT lv_fname_ksrg OF STRUCTURE <ls_data> TO <lv_ksrg>. * ASSIGN COMPONENT lv_fname_rate OF STRUCTURE <ls_data> TO <lv_rate>. * IF <lv_zxyjje> NE 0. * <lv_rate> = <lv_ksrg> / <lv_zxyjje>. * ENDIF. * ENDDO. * *ENDLOOP. DATA: lt_fieldcat TYPE lvc_t_fcat. PERFORM alv_build_fieldcat IN PROGRAM zabap_sedi_forms TABLES lt_fieldcat USING: * FIELD KEY REF_T REF_F CFIELD QFIELD CHK HOT NO0 JUS COLOR CONV LEN EDT F4 NCHK DESCRIPTION 'NUM' 'X' '' '' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 10 ' ' ' ' ' ' '序号', 'MAKTX' 'X' '' '' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 10 ' ' ' ' ' ' '描述'. DATA(lv_color1) = 'C300'. DATA(lv_color2) = 'C500'. DATA: lv_color TYPE c LENGTH 4. DO lines( lt_lifnr ) TIMES. lv_num = CONV numc3( sy-index ). lv_fname_unit = |UNIT{ lv_num }|. lv_fname_value = |VALUE{ lv_num }|. DATA(lv_str) = |{ lt_lifnr[ lv_num ]-lifnr }单位|. IF lv_num MOD 2 = 0. lv_color = lv_color1. ELSE. lv_color = lv_color2. ENDIF. PERFORM alv_build_fieldcat IN PROGRAM zabap_sedi_forms TABLES lt_fieldcat USING: * FIELD KEY REF_T REF_F CFIELD QFIELD CHK HOT NO0 JUS COLOR CONV LEN EDT F4 NCHK DESCRIPTION lv_fname_unit ' ' '' '' ' ' ' ' ' ' ' ' ' ' ' ' lv_color ' ' 10 ' ' ' ' ' ' lv_str, lv_fname_value ' ' '' '' ' ' ' ' ' ' ' ' ' ' ' ' lv_color ' ' 10 ' ' ' ' ' ' '金额'. ENDDO. DATA: ls_layout TYPE lvc_s_layo. ls_layout-cwidth_opt = 'X'. ls_layout-sel_mode = 'D'. ls_layout-smalltitle = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_grid_title = CONV lvc_title( |共{ lines( <gt_data> ) }条数据| ) is_layout_lvc = ls_layout it_fieldcat_lvc = lt_fieldcat i_default = 'X' i_save = 'A' TABLES t_outtab = <gt_data> EXCEPTIONS OTHERS = 1.


*----------------------------------------------------------------------* * 动态内表 SMON TYPES:BEGIN OF ty_excel1, z_product(32), SIGNDATA(32), z_time(8). * INCLUDE STRUCTURE ztco018." TYPES:END OF ty_excel1. DATA:itab8 TYPE TABLE OF ty_excel1 WITH HEADER LINE. *LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs1>). * <fs1>-z_time = <fs1>-z_time+0(4) && <fs1>-z_time+5 . * itab8 = CORRESPONDING #( <fs1> ). * APPEND itab8.CLEAR itab8. *ENDLOOP. itab8-z_product = '苹果'. itab8-SIGNDATA = '567'. itab8-z_time = '20210317'. APPEND itab8.CLEAR itab8. itab8-z_product = '香蕉'. itab8-SIGNDATA = '23'. itab8-z_time = '20210317'. APPEND itab8.CLEAR itab8. itab8-z_product = '橙子'. itab8-SIGNDATA = '43'. itab8-z_time = '20210317'. APPEND itab8.CLEAR itab8. itab8-z_product = '花生'. itab8-SIGNDATA = '234'. itab8-z_time = '20210317'. APPEND itab8.CLEAR itab8. itab8-z_product = '牛奶'. itab8-SIGNDATA = '234'. itab8-z_time = '20210317'. APPEND itab8.CLEAR itab8. *------------------------------- itab8-z_product = '苹果'. itab8-SIGNDATA = '567'. itab8-z_time = '20210318'. APPEND itab8.CLEAR itab8. itab8-z_product = '香蕉'. itab8-SIGNDATA = '44'. itab8-z_time = '20210318'. APPEND itab8.CLEAR itab8. itab8-z_product = '橙子'. itab8-SIGNDATA = '574'. itab8-z_time = '20210318'. APPEND itab8.CLEAR itab8. itab8-z_product = '花生'. itab8-SIGNDATA = '88'. itab8-z_time = '20210318'. APPEND itab8.CLEAR itab8. itab8-z_product = '牛奶'. itab8-SIGNDATA = '78'. itab8-z_time = '20210318'. APPEND itab8.CLEAR itab8. itab8-z_product = '牛奶'. itab8-SIGNDATA = '618'. itab8-z_time = '20210618'. APPEND itab8.CLEAR itab8. SORT itab8 BY z_product z_time . * 要以日期作为列,得先取得唯一的日期。 * DATA tdate LIKE sy-datum OCCURS 0 WITH HEADER LINE. *DATA tdate LIKE TABLE OF zsds_024_04-smon WITH HEADER LINE. DATA TDATE LIKE SY-DATUM OCCURS 0 WITH HEADER LINE. LOOP AT itab8. CONDENSE itab8-z_time. tdate = itab8-z_time. COLLECT tdate. ENDLOOP. * 下面构建动态内表结构 DATA: dy_table TYPE REF TO DATA, dy_wa TYPE REF TO DATA, it_str TYPE lvc_t_fcat, "是Table Type wa_str TYPE lvc_s_fcat. "是一个Structure 用于存储即将构建的动态内表结构 FIELD-SYMBOLS: <dyn_table> TYPE TABLE, "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问 <dyn_wa> TYPE ANY, <fs> TYPE ANY. wa_str-fieldname = 'Z_PRODUCT'. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 32. APPEND wa_str TO it_str. CLEAR wa_str. wa_str-fieldname = 'SIGNDATA'. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 32. APPEND wa_str TO it_str. CLEAR wa_str. * REFRESH fieldcat. * PERFORM input_fieldcat USING 'Z_PRODUCT' '销售办事处' '' '' '' '' ''. LOOP AT tdate. wa_str-fieldname = tdate. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 20. APPEND wa_str TO it_str. CLEAR wa_str. * PERFORM input_fieldcat USING tdate tdate '' '' '' '' ''. ENDLOOP. *此方法用于构建动态内表,输入=构建的结构,输出=dy_table CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = it_str IMPORTING ep_table = dy_table. ASSIGN dy_table->* TO <dyn_table>. CREATE DATA dy_wa LIKE LINE OF <dyn_table>. ASSIGN dy_wa->* TO <dyn_wa>. * 下面往结构里写数 DATA fieldname(20). LOOP AT itab8. ASSIGN COMPONENT 'Z_PRODUCT' OF STRUCTURE <dyn_wa> TO <fs>. <fs> = itab8-z_product. fieldname = itab8-z_time. "这里把日期类型定义为char型,因为用DATS报错。 ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs>. "分配结构的日期,将FS指向它 <fs> = itab8-signdata. AT END OF z_product. APPEND <dyn_wa> TO <dyn_table>. CLEAR :<dyn_wa>. ENDAT. ENDLOOP. LOOP AT <dyn_table> INTO <dyn_wa>. ENDLOOP.
动态内表动态增加字段
1 REPORT z123. 2 3 TYPES:BEGIN OF ty_dynamic_table_field, 4 fieldname TYPE fieldname, 5 rollname TYPE rollname, 6 END OF ty_dynamic_table_field. 7 DATA:ls_zabap_dynamic_table_field type ty_dynamic_table_field. 8 DATA: lt_fields TYPE TABLE OF ty_dynamic_table_field, 9 ls_field TYPE ty_dynamic_table_field. 10 DATA: lo_data TYPE REF TO data, 11 lo_line TYPE REF TO data. 12 DATA:g_index TYPE i. 13 DATA:gt_date LIKE TABLE OF mara WITH HEADER LINE. 14 15 SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_date FROM mara UP TO 10 ROWS. 16 17 "动态字段 18 * DATA(lv_lines) = lines( gt_date ). 19 DO 3 TIMES. 20 g_index = sy-index. 21 ls_field-fieldname = 'FIELD' && g_index. 22 ls_field-rollname = 'CHAR20'. 23 APPEND ls_field TO lt_fields. 24 ENDDO. 25 26 PERFORM create_dynamic_table TABLES lt_fields USING 'MAKT' CHANGING lo_data. 27 28 FIELD-SYMBOLS:<gt_alv> TYPE table,<gs_alv> TYPE any,<fs> TYPE any . 29 30 ASSIGN lo_data->* TO <gt_alv>. 31 32 * 根据动态内表创建对应的工作区 33 CREATE DATA lo_line LIKE LINE OF <gt_alv>. 34 ASSIGN lo_line->* TO <gs_alv>. 35 36 BREAK-POINT. 37 FORM create_dynamic_table TABLES pt_fields STRUCTURE ls_zabap_dynamic_table_field 38 USING p_strucname "可以是主程序中的TYPES定义的结构,也可以是数据字典中的结构 39 CHANGING po_data TYPE REF TO data. 40 DATA: lo_struct TYPE REF TO cl_abap_structdescr, 41 lo_element TYPE REF TO cl_abap_elemdescr, 42 lo_tab TYPE REF TO cl_abap_tabledescr, 43 lt_comps TYPE cl_abap_structdescr=>component_table, 44 ls_comp LIKE LINE OF lt_comps, 45 ls_field TYPE zabap_dynamic_table_field. 46 47 * 获取已定义结构 48 IF p_strucname IS NOT INITIAL. 49 lo_struct ?= cl_abap_typedescr=>describe_by_name( p_strucname ). 50 lt_comps = lo_struct->get_components( ). 51 ENDIF. 52 53 LOOP AT pt_fields INTO ls_field. 54 ls_comp-name = ls_field-fieldname. 55 lo_element ?= cl_abap_elemdescr=>describe_by_name( ls_field-rollname ). 56 ls_comp-type ?= lo_element. 57 APPEND ls_comp TO lt_comps. 58 ENDLOOP. 59 60 61 lo_struct = cl_abap_structdescr=>create( lt_comps ). 62 lo_tab = cl_abap_tabledescr=>create( p_line_type = lo_struct 63 p_table_kind = cl_abap_tabledescr=>tablekind_std 64 p_unique = abap_false ). 65 66 * 创建动态内表 67 CREATE DATA po_data TYPE HANDLE lo_tab. 68 ENDFORM. "create_dynamic_table
动态内表排序
https://blog.csdn.net/u012232542/article/details/105444179
动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用SORT table BY field1 field2... 可以使用下面的方法来实现:SORT table BY (sorttable) 表类型: ABAP_SORTORDER_TAB 结构类型: ABAP_SORTORDER 代码示例: DATA: W_IT_FIELD TYPE ABAP_SORTORDER_TAB, W_STR_FIELD TYPE ABAP_SORTORDER. W_STR_FIELD-NAME = 'NAME1'. W_STR_FIELD-DESCENDING = ''. APPEND W_STR_FIELD TO W_IT_FIELD. W_STR_FIELD-NAME = 'KUNNR'. W_STR_FIELD-DESCENDING = ''. APPEND W_STR_FIELD TO W_IT_FIELD. SORT <DYN_TABLE> BY (W_IT_FIELD).
SORT <ft_tab> STABLE BY ('JGBM') .
传递动态内表数据
REPORT zdynamic_transfer. DATA et_return TYPE TABLE OF bapiret2. DATA gt_alv TYPE TABLE OF makt WITH HEADER LINE . *https://www.cnblogs.com/ricoo/p/13882973.html START-OF-SELECTION. SELECT * FROM makt INTO TABLE @DATA(it_makt) UP TO 10 ROWS . CALL FUNCTION 'ZFGTR_17_BILL_DETAIL' TABLES et_return = et_return * IT_ANY_TAB = it_any_tab_01 = it_makt. PERFORM frm_get_data TABLES gt_alv . cl_demo_output=>display( gt_alv[] ). FORM frm_get_data TABLES gt_alv. DATA: lr_any_t TYPE REF TO data, lr_any_s TYPE REF TO data. DATA: lr_dref TYPE REF TO data, lr_stru TYPE REF TO cl_abap_structdescr, lr_table TYPE REF TO cl_abap_tabledescr, lr_elem TYPE REF TO cl_abap_elemdescr, lt_para TYPE cl_abap_structdescr=>component_table, lt_comp TYPE cl_abap_structdescr=>component_table. DATA: lt_comps TYPE TABLE OF abap_compdescr. FIELD-SYMBOLS: <fs_tab> TYPE any, <ft_tab> TYPE STANDARD TABLE. IMPORT tab = lt_comps FROM MEMORY ID 'ZDTR0780_V1'. LOOP AT lt_comps INTO DATA(ls_comps). IF ls_comps-type_kind = 'P' OR ls_comps-type_kind = 'X'. ELSE. ls_comps-length = ls_comps-length / 2. ENDIF. APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>). <fs_comp>-name = ls_comps-name. <fs_comp>-type ?= cl_abap_elemdescr=>get_by_kind( p_type_kind = ls_comps-type_kind p_length = ls_comps-length p_decimals = ls_comps-decimals ). UNASSIGN <fs_comp>. ENDLOOP. IF lt_comp[] IS NOT INITIAL. CLEAR:lr_stru,lr_table. lr_stru = cl_abap_structdescr=>create( lt_comp ). lr_table = cl_abap_tabledescr=>create( lr_stru ). CREATE DATA lr_any_s TYPE HANDLE lr_stru. ASSIGN lr_any_s->* TO <fs_tab>. CREATE DATA lr_any_t TYPE HANDLE lr_table. ASSIGN lr_any_t->* TO <ft_tab>. ENDIF. IMPORT tab = <ft_tab>[] FROM MEMORY ID 'ZDTR0780_V2'. FREE MEMORY ID 'ZDTR0780_V1'. FREE MEMORY ID 'ZDTR0780_V2'. MOVE-CORRESPONDING <ft_tab>[] TO gt_alv[]. ENDFORM.
ZFGTR_17_BILL_DETAIL
FUNCTION zfgtr_17_bill_detail. *"---------------------------------------------------------------------- *"*"本地接口: *" TABLES *" ET_RETURN STRUCTURE BAPIRET2 OPTIONAL *" IT_ANY_TAB OPTIONAL *" IT_ANY_TAB_01 OPTIONAL *"---------------------------------------------------------------------- * 如何传递动态内表数据: * * 1.发送方根据动态内表记录重新生成新的内表结构体,并将动态数据转换到新的内表,传值两个记录表:结构体,数据记录。 * * 2.接收方根据结构体重新生成新的内表,根据新生成内表接收数据。 DATA: lr_any_t TYPE REF TO data, lr_any_s TYPE REF TO data. DATA: lr_dref TYPE REF TO data, lr_stru TYPE REF TO cl_abap_structdescr, lr_table TYPE REF TO cl_abap_tabledescr, lr_elem TYPE REF TO cl_abap_elemdescr, lt_para TYPE cl_abap_structdescr=>component_table, lt_comp TYPE cl_abap_structdescr=>component_table. FIELD-SYMBOLS: <fs_tab> TYPE any, <ft_tab> TYPE STANDARD TABLE. TRY. lr_stru ?= cl_abap_tabledescr=>describe_by_data( it_any_tab_01 ). * LOOP AT lr_stru->components[] INTO DATA(ls_comps). DATA ls_comps like LINE OF lr_stru->components[]. LOOP AT lr_stru->components[] INTO ls_comps. IF ls_comps-type_kind = 'P' OR ls_comps-type_kind = 'X'. ELSE. ls_comps-length = ls_comps-length / 2. ENDIF. APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>). <fs_comp>-name = ls_comps-name. <fs_comp>-type ?= cl_abap_elemdescr=>get_by_kind( p_type_kind = ls_comps-type_kind p_length = ls_comps-length p_decimals = ls_comps-decimals ). UNASSIGN <fs_comp>. ENDLOOP. IF lt_comp[] IS NOT INITIAL. CLEAR:lr_stru,lr_table. lr_stru = cl_abap_structdescr=>create( lt_comp ). lr_table = cl_abap_tabledescr=>create( lr_stru ). CREATE DATA lr_any_s TYPE HANDLE lr_stru. ASSIGN lr_any_s->* TO <fs_tab>. CREATE DATA lr_any_t TYPE HANDLE lr_table. ASSIGN lr_any_t->* TO <ft_tab>. ENDIF. MOVE-CORRESPONDING it_any_tab_01[] TO <ft_tab>[]. FREE MEMORY ID 'ZDTR0780_V1'. FREE MEMORY ID 'ZDTR0780_V2'. EXPORT tab = lr_stru->components TO MEMORY ID 'ZDTR0780_V1'. EXPORT tab = <ft_tab>[] TO MEMORY ID 'ZDTR0780_V2'. * SUBMIT zdtr0780 AND RETURN. CATCH cx_root INTO DATA(lr_root). DATA(lv_msg) = lr_root->get_text( ). * PERFORM frm_public_message_get * TABLES et_return * USING 'ZMCTR0040' '000' 'E' * lv_msg * space * space * space. ENDTRY. ENDFUNCTION. FORM frm_get_data . DATA: lr_any_t TYPE REF TO data, lr_any_s TYPE REF TO data. DATA: lr_dref TYPE REF TO data, lr_stru TYPE REF TO cl_abap_structdescr, lr_table TYPE REF TO cl_abap_tabledescr, lr_elem TYPE REF TO cl_abap_elemdescr, lt_para TYPE cl_abap_structdescr=>component_table, lt_comp TYPE cl_abap_structdescr=>component_table. DATA: lt_comps TYPE TABLE OF abap_compdescr. FIELD-SYMBOLS: <fs_tab> TYPE any, <ft_tab> TYPE STANDARD TABLE. IMPORT tab = lt_comps FROM MEMORY ID 'ZDTR0780_V1'. LOOP AT lt_comps INTO DATA(ls_comps). IF ls_comps-type_kind = 'P' OR ls_comps-type_kind = 'X'. ELSE. ls_comps-length = ls_comps-length / 2. ENDIF. APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>). <fs_comp>-name = ls_comps-name. <fs_comp>-type ?= cl_abap_elemdescr=>get_by_kind( p_type_kind = ls_comps-type_kind p_length = ls_comps-length p_decimals = ls_comps-decimals ). UNASSIGN <fs_comp>. ENDLOOP. IF lt_comp[] IS NOT INITIAL. CLEAR:lr_stru,lr_table. lr_stru = cl_abap_structdescr=>create( lt_comp ). lr_table = cl_abap_tabledescr=>create( lr_stru ). CREATE DATA lr_any_s TYPE HANDLE lr_stru. ASSIGN lr_any_s->* TO <fs_tab>. CREATE DATA lr_any_t TYPE HANDLE lr_table. ASSIGN lr_any_t->* TO <ft_tab>. ENDIF. IMPORT tab = <ft_tab>[] FROM MEMORY ID 'ZDTR0780_V2'. FREE MEMORY ID 'ZDTR0780_V1'. FREE MEMORY ID 'ZDTR0780_V2'. * MOVE-CORRESPONDING <ft_tab>[] TO gt_alv[]. ENDFORM.
动态SQL以及校验
DATA:lv_message(255). DEFINE macro_msg. IF &1 = 'E'. &2-sep_flag = icon_red_light. ELSEIF &1 = 'S'. &2-sep_flag = icon_green_light. ELSEIF &1 = 'W'. &2-sep_flag = icon_yellow_light. ENDIF. CONCATENATE &2-msg ' & ' &3 INTO &2-msg. CLEAR:lv_message. END-OF-DEFINITION. DATA formula TYPE string. DATA result TYPE menge_d. DATA:p1 TYPE menge_d,p2 TYPE menge_d,p3 TYPE menge_d,p4 TYPE menge_d,p5 TYPE menge_d,p6 TYPE menge_d,p7 TYPE menge_d,p8 TYPE menge_d. INITIALIZATION. func1 = '医生'. func2 = '咨询'. START-OF-SELECTION. *---------------------------------------------------------------------* * 取数 *---------------------------------------------------------------------* SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_zmc_tygh FROM zmc_tygh . SORT gt_zmc_tygh BY ygid. *---------------------------------------------------------------------* * 公共部分 *---------------------------------------------------------------------* gv_form_pernr_check = 'B_CHECK_PERNR'. formula = p1 + p2 * p3. IF func1 = 'X'.. PERFORM a_get_data TABLES gt_doctor USING 'ZMCT_DOCTOR'. ELSE. PERFORM a_get_data TABLES gt_consault USING 'ZMCT_ZX'. ENDIF. *---------------------------------------------------------------------* * 校验 *---------------------------------------------------------------------* LOOP AT gt_doctor INTO gs_doctor. CLEAR:resul. PERFORM (gv_form_pernr_check) IN PROGRAM (sy-repid) CHANGING gs_doctor IF FOUND. p1 = '900'. p2 = 7. p3 = 2. PERFORM dynamicformula(zabap_sedi_forms) USING formula p1 p2 p3 p4 p5 p6 p7 p8 result. MODIFY gt_doctor FROM gs_doctor.CLEAR gs_doctor. ENDLOOP. LOOP AT gt_consault INTO gs_consault. PERFORM (gv_form_pernr_check) IN PROGRAM (sy-repid) CHANGING gs_consault IF FOUND. MODIFY gt_consault FROM gs_consault.CLEAR gs_consault. ENDLOOP. *&---------------------------------------------------------------------* *& FORM A_GET_DATA *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * -->CT_TABLE TEXT * -->IV_TABNAME TEXT *----------------------------------------------------------------------* FORM a_get_data TABLES ct_table USING iv_tabname TYPE tabname. SELECT * INTO CORRESPONDING FIELDS OF TABLE ct_table FROM (iv_tabname) WHERE jgbm IN s_jgbm1 AND zmc_mblx IN s_mblx1 AND zmc_mbbb IN s_mbbb1 AND gjahr IN s_gjahr1 AND smon IN s_smon1 . ENDFORM. "FRM_GET_DATA_FROM_TABLE *&---------------------------------------------------------------------* *& FORM B_CHECK_DOCTOR_PERNR *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * <--P_GS_TABLE TEXT *----------------------------------------------------------------------* FORM b_check_pernr CHANGING gs_doctor TYPE typ_doctor. READ TABLE gt_zmc_tygh WITH KEY ygid = gs_doctor-pernr . IF sy-subrc NE 0. MESSAGE e017(zmc_goal) INTO lv_message. macro_msg 'E' gs_doctor lv_message . ENDIF. ENDFORM. " B_CHECK_DOCTOR_PERNR
动态类/函数模块使用动态传参示例

METHOD determine_mat_sublelvel. DATA: table_type TYPE REF TO cl_abap_tabledescr, stru_type TYPE REF TO cl_abap_structdescr, ref_stru TYPE REF TO data. FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE, <fs_stru> TYPE any, <fs_field> TYPE any. "Dynamic Object Assign ASSIGN et_data TO <fs_table>. "Get Importing data Struture table_type ?= cl_abap_typedescr=>describe_by_data( <fs_table> ). stru_type ?= table_type->get_table_line_type( ). "Create Dynamic Object & Assign CREATE DATA ref_stru TYPE HANDLE stru_type. ASSIGN ref_stru->* TO <fs_stru>. "Process * <fs_table> "动态传入的表 * <fs_stru> "动态传入的表的结构 ENDMETHOD.
动态read
DATA:fl1 TYPE char20. DATA:fl2 TYPE char20. DATA:fl3 TYPE char20. DATA:cl1 TYPE char20. DATA:cl2 TYPE char20. DATA:cl3 TYPE char20.DATA:cl4 TYPE char20. DATA:cl5 TYPE char20. DATA:gv_level TYPE I. fl1 = 'ZZ1JFL '.fl2 = 'ZZ2JFL '. fl3 = 'ZZ3JFL '. cl1 = 'ZZCLL1' .cl2 = 'ZZCLL2' . cl3 = 'ZZCLL3' . cl4 = 'ZZCLL4'.cl5 = 'ZZCLL5'. PERFORM frm_find_zxpl TABLES it_plxx CHANGING ls_fl_info ev_zzxpl ev_zplwb. IF ev_zzxpl IS INITIAL. ev_message = '没有查询到记录'. ENDIF. *&---------------------------------------------------------------------* *& Form frm_find_zxpl *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IT_PLXX text * -->LS_FL_INFO text * -->EV_ZZXPL text * -->EV_ZPLWB text *----------------------------------------------------------------------* FORM frm_find_zxpl TABLES it_plxx STRUCTURE zmct_plxx CHANGING ls_fl_info TYPE zmcs_flxx1 ev_zzxpl ev_zplwb. READ TABLE it_plxx WITH KEY (fl1) = ls_fl_info-zz1jfl (fl2) = ls_fl_info-zz2jfl (fl3) = ls_fl_info-zz3jfl (cl1) = ls_fl_info-zzcll1 (cl2) = ls_fl_info-zzcll2 (cl3) = ls_fl_info-zzcll3 (cl4) = ls_fl_info-zzcll4 (cl5) = ls_fl_info-zzcll5 . IF sy-subrc = 0 . ev_zzxpl = it_plxx-zzxpl. ev_zplwb = it_plxx-zplwb. EXIT. ENDIF. gv_level = gv_level + 1. CASE gv_level. WHEN 1. CLEAR:cl5. WHEN 2. CLEAR:cl4. WHEN 3. CLEAR:cl3. WHEN 4. CLEAR:cl2. WHEN 5. CLEAR:cl1. WHEN OTHERS. EXIT. ENDCASE. PERFORM frm_find_zxpl TABLES it_plxx CHANGING ls_fl_info ev_zzxpl ev_zplwb. ENDFORM. " FRM_FIND_ZXPL
read 所隐行巧妙用法
REPORT 1. TABLES:bkpf. TABLES:t001w. PARAMETERS :p_jgbm type t001w-werks OBLIGATORY DEFAULT '6106'. PARAMETERS :p_gjahr type bkpf-gjahr OBLIGATORY DEFAULT '2023'. PARAMETERS :p_monat type bkpf-monat OBLIGATORY DEFAULT '04'. TYPES:BEGIN OF typ_data, jgbm TYPE I, gjahr TYPE gjahr, monat TYPE monat, percentage TYPE menge_d. TYPES:END OF typ_data. DATA lt_data TYPE TABLE OF typ_data. DATA lt_data2 TYPE TABLE OF typ_data WITH HEADER LINE. DATA ls_data TYPE typ_data. START-OF-SELECTION. lt_data = VALUE #( BASE lt_data ( jgbm = '6104' gjahr = '2023' monat = '10' ) ( jgbm = '6103' gjahr = '2023' monat = '10' ) ( jgbm = '6208' gjahr = '2023' monat = '8' ) ( jgbm = '6128' gjahr = '2023' monat = '10' ) ( jgbm = '6106' gjahr = '2023' monat = '04' ) ( jgbm = '6106' gjahr = '2023' monat = '02' ) *( jgbm = '6106' gjahr = '2023' monat = '03' ) *( jgbm = '6106' gjahr = '2023' monat = '07' ) *( jgbm = '6106' gjahr = '2023' monat = '06' ) ). p_monat = p_monat + 1. SORT lt_data by jgbm gjahr monat. *---------------------------------------------------------------------* * 月份 大于输入日期则退出:目的就是找到自己的合适位置,放进去 *---------------------------------------------------------------------* data:lv_je type sy-tabix. READ TABLE lt_data INTO ls_data binary search WITH KEY jgbm = p_jgbm gjahr = p_gjahr monat = p_monat transporting no fields . READ TABLE lt_data INDEX sy-tabix INTO ls_data. IF ls_data-jgbm = p_jgbm AND ls_data-gjahr = p_gjahr. WRITE:'找到了,退出'. ENDIF. *cl_demo_output=>display( lt_data ). *IF sy-subrc = 0 . * lv_je = sy-tabix. * MOVE-CORRESPONDING ls_data to lt_data2. * lt_data2-monat = p_monat. * APPEND lt_data2. *ENDIF. * *INSERT lt_data2 into lt_data INDEX lv_je . * 如果sy-subrc = 0. read index (sy-tabix+1) 读下一行。 *如果subrc<>0.read index sy-tabix
HR信息类型
事务码


ABAP+函数总结+常用函数解释
https://wenku.baidu.com/view/4fb3010f76c66137ee061944.html
双击弹屏

分配一个功能码 给他


弹出窗口/弹窗

IF zcl_xhl=>confirm( |该交货单 { sy-mandt } 批次为空,被过滤| ) = abap_false. RETURN. ENDIF. write 'S'.

DATA:lv_err TYPE char1,lv_answer TYPE answer,lv_line1 TYPE string.
IF iv_type = 'X'. CHECK lv_err IS INITIAL. lv_line1 = '确认保存数据?'. ELSE. "@8.0 add IF lv_err IS INITIAL. lv_line1 = '确认保存数据?'. ELSE. CLEAR lv_err. lv_line1 = '通知单还有错误信息,只能暂存数据,确认继续暂存数据?'. ENDIF. ENDIF. CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' EXPORTING defaultoption = 'Y' textline1 = lv_line1 titel = '确认继续执行' cancel_display = 'X' IMPORTING answer = lv_answer. IF lv_answer <> 'J'. EXIT. ENDIF.

TYPE-POOLS:ICON. DATA:L_ANSWER TYPE C. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING * TITLEBAR = ' ' * DIAGNOSE_OBJECT = ' ' TEXT_QUESTION = '所有数据已保存成功!!!' TEXT_BUTTON_1 = 'Yes'(002) 'Yes'(001) 请输入选择条件 ICON_BUTTON_1 = 'ICON_CHECKED' TEXT_BUTTON_2 = 'No'(002) ICON_BUTTON_2 = 'ICON_INCOMPLETE' * DEFAULT_BUTTON = '1' * DISPLAY_CANCEL_BUTTON = 'X' * USERDEFINED_F1_HELP = ' ' * START_COLUMN = 25 * START_ROW = 6 * POPUP_TYPE = * IV_QUICKINFO_BUTTON_1 = ' ' * IV_QUICKINFO_BUTTON_2 = ' ' IMPORTING ANSWER = L_ANSWER * TABLES * PARAMETER = EXCEPTIONS TEXT_NOT_FOUND = 1 OTHERS = 2. WRITE:L_ANSWER.
POPUP_WITH_TABLE_DISPLAY_OK


DATA: lt_fields TYPE /plmb/t_spi_b_sval, lv_returncode(1) TYPE c, gv_matnr TYPE matnr. DATA:BEGIN OF gt_vtab OCCURS 0, value(40) TYPE c, END OF gt_vtab. gt_vtab-value = '000000001100000107'. APPEND gt_vtab.CLEAR gt_vtab. gt_vtab-value = '牛腩-【蔡澜Pho,10kg/箱】'. APPEND gt_vtab.CLEAR gt_vtab. gt_vtab-value = '000000001100000108'. APPEND gt_vtab.CLEAR gt_vtab. gt_vtab-value = '金钱腱-5kg/箱'. APPEND gt_vtab.CLEAR gt_vtab. gt_vtab-value = '000000001100000109'. APPEND gt_vtab.CLEAR gt_vtab. gt_vtab-value = '越南白米-【冠丰,50kg/袋】'. APPEND gt_vtab.CLEAR gt_vtab. lt_fields = VALUE /plmb/t_spi_b_sval( ( tabname = 'MARA' fieldname = 'MATNR' value = '' field_attr = '01' ) ). CALL FUNCTION 'POPUP_GET_VALUES_USER_HELP' EXPORTING f4_formname = 'F4_FOR_MATNR' f4_programname = sy-repid "程序名字 popup_title = |选择替换物料| start_column = '30' start_row = '12' IMPORTING returncode = lv_returncode TABLES fields = lt_fields EXCEPTIONS error_in_fields = 1 OTHERS = 2. IF sy-subrc <> 0. CASE sy-subrc. WHEN 1. MESSAGE 'internal error' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. WHEN 2. MESSAGE 'other error' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDCASE. ENDIF. IF lv_returncode = 'A'. ELSE. CLEAR:gv_matnr. IF line_exists( lt_fields[ 1 ] ). gv_matnr = CONV cffilename( lt_fields[ 1 ]-value ). ENDIF. ENDIF. FORM f4_for_matnr USING tabname fieldname display CHANGING returncode value. DATA:lt_ftab TYPE TABLE OF help_value. lt_ftab = VALUE #( ( tabname = 'MARA' fieldname = 'MATNR' selectflag = 'X' ) ( tabname = 'MAKT' fieldname = 'MAKTX' ) ). CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE' EXPORTING display = display fieldname = fieldname tabname = tabname IMPORTING select_value = value TABLES valuetab = gt_vtab fields = lt_ftab. ENDFORM.

DATA: BEGIN OF gs_lifnr, zwsyj(13), " 试验件数量 zddjsl(13), " 对刀件数量 znsyj(13), "内部试验件数量 END OF gs_lifnr, gt_lifnr LIKE TABLE OF gs_lifnr. DATA lt_lifnr LIKE gt_lifnr. DATA(lt_lifnr_input_data) = zcl_tabbed=>input( iv_upper = 1 iv_left = 30 iv_lower = 20 iv_right = 50 iv_alv_fields_ref_common = 'lifnr#lfa1#lifnr' is_alv = VALUE #( io_tabbed = zcl_tabbed=>new( lt_lifnr ) iv_alv_fields_length = 'lifnr#10' iv_alv_except_fields = 'name1' iv_alv_fields_desc = |zwsyj:试验件数量,zddjsl:对刀件数量,znsyj:内部试验件数量| ) ). FIELD-SYMBOLS <lt_input> TYPE STANDARD TABLE. ASSIGN lt_lifnr_input_data->* TO <lt_input>. MOVE-CORRESPONDING <lt_input> TO lt_lifnr[]. DELETE lt_lifnr WHERE zwsyj IS INITIAL. IF lines( <lt_input> ) > 0. "// 校验供应商,编码,以及扩展情况? ELSE. MESSAGE '未输入供应商' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. LOOP AT lt_lifnr ASSIGNING FIELD-SYMBOL(<FS_output>).. ENDLOOP.
锁
START-OF-SELECTION. CALL FUNCTION 'ENQUEUE_ESRDIRE' EXPORTING name = sy-repid _scope = '1' EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
ALV显示
https://www.cnblogs.com/kalasitifen/archive/2012/10/16/2726457.html
https://www.cnblogs.com/hcmy00/p/6524107.html
普通
REPORT ytest007. *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* ***************ALV报表需要定义的参数************************ TYPE-POOLS:slis. DATA:gt_fieldcat TYPE slis_t_fieldcat_alv, "列描述内表,列清单 gt_layput TYPE slis_layout_alv. DATA:gridlsl TYPE lvc_s_glay. DATA: gs_fieldcat TYPE lvc_s_fcat, gs_layout TYPE lvc_s_layo, g_repid TYPE sy-repid, gt_sort TYPE lvc_t_sort, gs_sort TYPE lvc_s_sort. ***************ALV报表需要定义的参数************************ PERFORM display_alv. *&---------------------------------------------------------------------* *& Form display_alv *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM display_alv . PERFORM layout_build. PERFORM fieldcat USING gt_fieldcat. PERFORM display. PERFORM sort_build. "小计求和 ENDFORM. "DISPLAY_ALV *&---------------------------------------------------------------------* *& Form LAYOUT_BUILD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM layout_build . gt_layput-colwidth_optimize = 'X'. gt_layput-zebra = 'X'. gt_layput-detail_initial_lines = 'X'. gt_layput-box_fieldname = 'BOX'. "复选框 ENDFORM. "LAYOUT_BUILD *&---------------------------------------------------------------------* *& Form FIELDCAT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->GT_FIELDCAT text *----------------------------------------------------------------------* FORM fieldcat USING gt_fieldcat TYPE slis_t_fieldcat_alv. DATA: afieldcat TYPE slis_fieldcat_alv, pos TYPE i. CLEAR pos. DEFINE d_get_field. pos = pos + 1. clear afieldcat. afieldcat-col_pos = pos. afieldcat-fieldname = &1. afieldcat-seltext_l = &2. afieldcat-key = &3. afieldcat-no_out = &4. afieldcat-checkbox = &5. afieldcat-edit = &6. append afieldcat to gt_fieldcat. END-OF-DEFINITION. CLEAR: gt_fieldcat[], gs_fieldcat. CLEAR gs_fieldcat. afieldcat-fieldname = 'BOX'. afieldcat-seltext_l = '选择审批对象'. afieldcat-checkbox = 'X'. afieldcat-edit = 'X'. APPEND afieldcat TO gt_fieldcat. d_get_field 'YGBH ' '员工编号 ' '' '' '' ''. d_get_field 'NACHN ' '姓名 ' '' '' '' ''. d_get_field 'ICNUM ' '身份证号 ' '' '' '' ''. d_get_field 'RZRQ ' '入职日期 ' '' '' '' ''. d_get_field 'ORG1 ' '事业部/板块' '' '' '' ''. d_get_field 'ORG2 ' '三级组织 ' '' '' '' ''. d_get_field 'ORG3 ' '四级组织 ' '' '' '' ''. d_get_field 'ORG4 ' '五级组织 ' '' '' '' ''. d_get_field 'ORG5 ' '六级组织 ' '' '' '' ''. d_get_field 'ZHIWEI ' '职位' '' '' '' ''. d_get_field 'ZHIWU ' '职务' '' '' '' ''. d_get_field 'STEXT1 ' '管理类别1' '' '' '' ''. d_get_field 'STEXT2 ' '管理类别2' '' '' '' ''. d_get_field 'STEXT3 ' '管理类别3' '' '' '' ''. d_get_field 'STEXT4 ' '管理类别4' '' '' '' ''. d_get_field 'STEXT5 ' '管理类别5' '' '' '' ''. ENDFORM. "FIELDCAT *&---------------------------------------------------------------------* *& Form DISPLAY *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM display . gridlsl-edt_cll_cb = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_user_command = 'USER_COMMAND' i_callback_pf_status_set = 'USER_STATUS' i_callback_program = sy-repid is_layout = gt_layput i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE' " 调用ALV表头显示 it_fieldcat = gt_fieldcat[] i_html_height_top = 18 " 设置抬头宽度 TABLES t_outtab = itab EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. "事件CALLBACK *&---------------------------------------------------------------------* *& Form sort_build *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM sort_build . DATA lwa_sort TYPE slis_sortinfo_alv. lwa_sort-fieldname = 'YGBH'. lwa_sort-up = 'X'. lwa_sort-subtot = 'X'. APPEND lwa_sort TO lt_sort. ENDFORM. "sort_build *&---------------------------------------------------------------------* *& Form user_status *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->EXTAB text *----------------------------------------------------------------------* FORM user_status USING extab TYPE slis_t_extab. SET PF-STATUS 'STATUS_ALV'. "自定义按钮不要系统自带的 * SET TITLEBAR 'TITLE_ALV'. ENDFORM. "user_status *&---------------------------------------------------------------------* *& Form user_command *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELD text *----------------------------------------------------------------------* FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. DATA: l_grid TYPE REF TO cl_gui_alv_grid. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = l_grid. CALL METHOD l_grid->check_changed_data. rs_selfield-refresh = 'X'. DATA:ok_code TYPE sy-ucomm. ok_code = r_ucomm. CASE ok_code. WHEN 'BACK'. SET SCREEN 0. LEAVE SCREEN. WHEN 'SAVE'. ENDCASE. ENDFORM. "user_command
form html_top_of_page using document type ref to cl_dd_document. data: text type sdydo_text_element. data: m_p type i, m_buffer1 type string, m_buffer2 type string, m_buffer3 type string, m_buffer4 type string. data:l_tit3(30),g_lines(5),a1(30),a2(30),b1(30),b2(30),d(30). select single stext into l_tit3 from hrp1000 where objid = p_objid and otype = 'O'. a1 = s_data-low. . a2 = s_data-high. "sy-datum+4(2). b1 = a1+4(2). b2 = a2+4(2). shift b1 left deleting leading '0'. shift b2 left deleting leading '0'. concatenate '<HTML><CENTER><H2>' l_tit3 a1+0(4) '年' b1 '月到' b2 '月工资明细表' '</H2></CENTER></HTML>' into m_buffer1. " 居中 <H1>设置字体格式 call method document->html_insert exporting contents = m_buffer1 changing position = m_p. endform. "HTML_TOP_OF_PAGE
excel导入数据
https://sites.google.com/site/sapxlwb/home/eng/description
Doi用起来比较麻烦 出了错不好跟 代码冗长,新语法的话可能还好点
官方的alsm那个函数
1、只能限制9999行。我这个没限制
2、导入后得到的数据是行、列、值格式的内表。我这个得到的是你自己定义的内表格式
3、必须指定结束行和列。我这个不用指定结束行和列
4、我这个支持导入后不关闭Excel,保持application对象,以便回填数据到excel中
5、增加了对负号数据导出,带"的Excel数据导出问题的处理
6、对于有回车符的Excel内容,通过alsm*的函数导入时会串行。我这个函数对此进行了处理(换行符没事,回车符会有问题)
7、KCD_EXCEL_OLE_TO_INT_CONVERT, ALSM_EXCEL_TO_INTERNAL_TABLE等FM导入Excel
函数报错sy-subrc = 2 ,debug发现Excel数据未进入函数输出内表。如果电脑装了福昕PDF阅读器,那么原因是由于福昕PDF阅读器与SAP的EXCEL上传功能冲突了,需要卸载电脑里的福昕PDF阅读器
convert xls to sap的这个就是doi的 不好debug,它的原理是:创建一个文件接口类,通过文件接口类来读取excel内容。每次读取的时候,需要先指定一个读取范围,为其指定名称(excel里的名称,随便定义),然后从名称里把数据读取到格式如SOI_GENERIC_ITEM的内表里。
这个内表,最多只能存1000行的数据,系统的这个convert的函数,如果是10万条数据,通过这种方式读取,至少需要设置100个名称,读100次。SAP这个接口设计的渣,所以用最新这个
注:带“的导出的时候,如果用粘贴的方式导出,会出现单元格内容合并到一个单元格的情况,甚至跨行
如果一个个单元格赋值导出,是不会出现跨行的问题,但是效率慢,DOI还有个问题,就是你电脑上装了wps和office的话,他就经常没办法用了,他是通过获取你本地的excel的打开方式,来打开excel文件的,而wps不知道怎么做的,用doi打开excel的时候,总是通过wps来打开。即便你设置了excel文件的打开方式是office,也不行。而ole,用的是office的clsid来创建excel程序,是没问题的。
Doi对装了wps的 也不是完全不支持 可能跟版本有关系 有些就是不行

* SET PROPERTY OF ole_excel 'DisplayAlerts' = 0.
*前者并不会清空剪贴板,但是会让一些警告消息不再弹出
*如果你对文件做了更改,不保存就关闭的话,会有提示是否关闭的对话框,
*这个时候displayalerts = 0就起作用了,可以跳过这个关闭提示
set property of ole_excel 'CutCopyMode' = 0.
*或者这个


1.有时候,有些excel里的数据,换行的, 看到的是换行,但不是我们正常输入的换行,我们正常在单元格里输入换行,是ALT+ENTER,但是Excel里的数据,可能是用户从其他系统导出来的,里面的换行,可能是带有回车字符的,这就导致ALSM复制数据,再粘贴到内表的时候,串行
2.往excel里写入,用ole的时候,对于带引号的字符,也有一些小bug,遇到再说,客户在物料描述里写了个引号,导出的时候,和后面的字段一起,甚至好几行一起,写到一个单元格里去了,如果用粘贴方式导出的话
OLE慢,是因为两个原因:
1:文件打开慢
2:调用方式不对
第一个没办法避免,第二个可以适当优化,大量数据导出,比如1万行,20列,还是ole块,
而且zabap2xlsx导出,会清单元格格式,模板里设置的条件格式、单元格格式,都会被干掉。
对于公式,zabap2xlsx上载的时候,也会读取到公式的内容,而不是值,ole就不一样,但是他也有很多好处,就是不会遇到进程的问题,
他小数据量比较快,ole是粘贴过去,比前者循环20万次处理单元格要快的多
比如:2万行,20列,就是40万次处理。每一次处理都要设置单元格的很多属性,可能里面有一堆的read itab等操作语句,可能里面有一堆的read itab等操作语句,
但是如果是自定义报表,同样大小的数据,你改一下代码,发送到剪贴板,粘贴到Excel,用OLE的方式处理的话,最大的时间就是在发送剪贴板这一步,这一步可能1分钟。但是粘贴很快啊
alv导出excel,并不是单元格操作,而是abap代码,它是生成一个很长串的xml,然后导出成文件,生成这个很长的string,慢
include zexcel_public.
1 form excel_data . 2 data: l_name like wwwdatatab, 3 l_rc like sy-subrc, 4 l_fullpath type string, 5 l_sheet_number type i value 1, 6 l_text type string. 7 8 concatenate 'C:/HR/五险一金明细表表' sy-datum '.XLS' into g_file. 9 10 l_name-relid = 'MI'. 11 l_name-objid = 'ZR_HR_PA11_PRINT'."EXCEL模板的名 12 13 call function 'DOWNLOAD_WEB_OBJECT' 14 exporting 15 key = l_name 16 destination = g_file 17 importing 18 rc = l_rc. 19 if l_rc <> 0. 20 message '模板文件(SMW0:ZHRRPY005)下载失败,请与开发人员联系!' type 'S'. 21 leave list-processing. 22 endif. 23 24 l_fullpath = g_file. 25 26 concatenate '正在处理文件:' g_file into l_text. 27 call function 'SAPGUI_PROGRESS_INDICATOR' 28 exporting 29 text = l_text. 30 31 perform frm_open_excel using l_fullpath 0. " 打开excel模板 32 33 perform frm_open_excel_sheet using l_sheet_number. "打开excel第一个sheet 34 perform frm_process_excel. "向EXCEL中填充数据 35 set property of g_excel 'VISIBLE' = 1. "过程可见 36 endform.
*&---------------------------------------------------------------------* *& 包含 ZEXCEL_PUBLIC *&---------------------------------------------------------------------* DATA: ROWS TYPE OLE2_OBJECT, "Sheet的行对象 COLUMNS TYPE OLE2_OBJECT, G_ROW TYPE OLE2_OBJECT.
*&---------------------------------------------------------------------* *& Form FRM_OPEN_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_FULLPATH text *----------------------------------------------------------------------* FORM FRM_OPEN_EXCEL USING P_FULLPATH P_VISIBLE. CREATE OBJECT G_EXCEL 'Excel.Application'. SET PROPERTY OF G_EXCEL 'VISIBLE' = P_VISIBLE. CALL METHOD OF G_EXCEL 'Workbooks' = G_WORKBOOK. CALL METHOD OF G_WORKBOOK 'Open' = G_WORKBOOK EXPORTING #1 = P_FULLPATH. IF SY-SUBRC <> 0. MESSAGE S009(ZHRFD) WITH 'Open file failed!'. STOP. ENDIF. ENDFORM. " FRM_OPEN_EXCEL *&---------------------------------------------------------------------* *& Form FRM_OPEN_EXCEL_SHEET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_SHEET_NUMBER text *----------------------------------------------------------------------* FORM FRM_OPEN_EXCEL_SHEET USING P_SHEET. * CALL METHOD OF g_workbook 'Worksheets' = g_sheet * EXPORTING * #1 = 'Sheet1'. CALL METHOD OF G_WORKBOOK 'Sheets' = G_SHEET EXPORTING #1 = P_SHEET. CALL METHOD OF G_SHEET 'Activate'. ENDFORM. " FRM_OPEN_EXCEL_SHEET *&---------------------------------------------------------------------* *& Form FRM_COPY_SHEET_ALL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_COPY_SHEET_ALL USING P_FROM_SHEET P_TO_SHEET. CALL METHOD OF G_EXCEL 'Sheets' = G_SHEET EXPORTING #1 = P_FROM_SHEET. CALL METHOD OF G_SHEET 'Cells' = G_CELL. CALL METHOD OF G_CELL 'Copy'. CALL METHOD OF G_EXCEL 'Sheets' = G_SHEET EXPORTING #1 = P_TO_SHEET. CALL METHOD OF G_EXCEL 'Range' = G_RANGE EXPORTING #1 = 'A1'. CALL METHOD OF G_RANGE 'PasteSpecial'. ENDFORM. " FRM_COPY_SHEET_ALL *&---------------------------------------------------------------------* *& Form FRM_SAVE_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_FULLPATH text *----------------------------------------------------------------------* FORM FRM_SAVE_EXCEL USING P_FULLPATH. SET PROPERTY OF G_EXCEL 'DisplayAlerts' = 0. CALL METHOD OF G_SHEET 'SAVEAS' EXPORTING #1 = P_FULLPATH #2 = 1. *****关闭WORKSHEET**** CALL METHOD OF G_SHEET 'CLOSE'. *****关闭WORKBOOK CALL METHOD OF G_WORKBOOK 'SAVE'. CALL METHOD OF G_WORKBOOK 'CLOSE' EXPORTING #1 = 0. *****关闭EXCEL对象**** CALL METHOD OF G_EXCEL 'QUIT'. FREE OBJECT G_RANGE. FREE OBJECT G_CELL. FREE OBJECT G_SHEET. FREE OBJECT G_WORKBOOK. FREE OBJECT G_EXCEL. ENDFORM. " FRM_SAVE_EXCEL *&---------------------------------------------------------------------* *& Form FRM_CREATE_SHEET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_CREATE_SHEET . CALL METHOD OF G_EXCEL 'Sheets' = G_SHEET. CALL METHOD OF G_SHEET 'ADD'. ENDFORM. " FRM_CREATE_SHEET *&---------------------------------------------------------------------* *& Form FRM_SET_SHEET_NAME *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_SHEET_NAME text *----------------------------------------------------------------------* FORM FRM_SET_SHEET_NAME USING P_SHEET_NAME. SET PROPERTY OF G_SHEET 'Name' = P_SHEET_NAME. ENDFORM. " FRM_SET_SHEET_NAME *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_ROW text * -->P_L_COL text * -->P_L_XH text *----------------------------------------------------------------------* FORM FRM_FILL_CELL USING P_ROW P_COL P_VALUE. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = 9. SET PROPERTY OF G_FONT 'Name' = '宋体'. * SET PROPERTY OF CELL 'HorizontalAlignment' = 3. " 居中 ENDFORM. " FRM_FILL_CELL *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_ROW text * -->P_L_COL text * -->P_L_XH text *----------------------------------------------------------------------* FORM FRM_FILL_CELL_NEW USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 0. SET PROPERTY OF G_FONT 'Name' = '黑体'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 ENDFORM. " FRM_FILL_CELL *&---------------------------------------------------------------------* *& Form FRM_MERGE_RANGE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_XH_MERGE_X1 text * -->P_L_XH_MERGE_Y1 text * -->P_L_XH_MERGE_X2 text * -->P_L_XH_MERGE_Y2 text *----------------------------------------------------------------------* FORM FRM_MERGE_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL 'Cells' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL 'Cells' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL 'Range' = G_CELLS EXPORTING #1 = G_CELL1 #2 = G_CELL2. CALL METHOD OF G_CELLS 'merge'. ENDFORM. " FRM_MERGE_RANGE *&---------------------------------------------------------------------* *& Form FRM_DRAWLINE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_X1 text * -->P_Y1 text * -->P_X2 text * -->P_Y2 text *----------------------------------------------------------------------* FORM FRM_DRAWLINE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL 'Cells' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL 'Cells' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL 'Range' = G_CELLS EXPORTING #1 = G_CELL1 #2 = G_CELL2. * CALL METHOD OF cells 'Select'. GET PROPERTY OF G_CELLS 'borders' = G_RANGE. SET PROPERTY OF G_RANGE 'weight' = '2'. SET PROPERTY OF G_RANGE 'linestyle' = '1'. ENDFORM. " FRM_DRAWLINE *&---------------------------------------------------------------------* *& Form FRM_WRITE_TITLE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_2 text * -->P_1 text * -->P_L_STR text *----------------------------------------------------------------------* FORM FRM_WRITE_TITLE USING P_ROW P_COL P_VALUE. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = 10. SET PROPERTY OF G_FONT 'Name' = '华文中宋'. SET PROPERTY OF G_FONT 'bold' = 0. SET PROPERTY OF G_CELL 'HorizontalAlignment' = 2. " 居左 ENDFORM. " FRM_WRITE_TITLE *&---------------------------------------------------------------------* *& Form FRM_DEL_COL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_COL text *----------------------------------------------------------------------* FORM FRM_DEL_COL USING P_COLNUM. CALL METHOD OF G_EXCEL 'COLUMNS' = G_COLUMNS EXPORTING #1 = P_COLNUM. CALL METHOD OF G_COLUMNS 'DELETE'. ENDFORM. " FRM_DEL_COL *&---------------------------------------------------------------------* *& Form FRM_CLEAR_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_YZ_MERGE_X1 text * -->P_L_YZ_MERGE_Y1 text * -->P_L_YZ_MERGE_X2 text * -->P_L_YZ_MERGE_Y2 text *----------------------------------------------------------------------* FORM FRM_CLEAR_DATA USING P_X1 P_Y1 P_X2 P_Y2. PERFORM FRM_SELECT_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_RANGE 'ClearContents'. ENDFORM. " FRM_CLEAR_DATA *&---------------------------------------------------------------------* *& Form FRM_SELECT_RANGE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_P_X1 text * -->P_P_Y1 text * -->P_P_X2 text * -->P_P_Y2 text *----------------------------------------------------------------------* FORM FRM_SELECT_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL 'RANGE' = G_RANGE EXPORTING #1 = G_CELL1 #2 = G_CELL2. CALL METHOD OF G_RANGE 'SELECT'. ENDFORM. " FRM_SELECT_RANGE *&---------------------------------------------------------------------* *& Form FRM_PREVIEW_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_PREVIEW_EXCEL . SET PROPERTY OF G_EXCEL 'VISIBLE' = 1. CALL METHOD OF G_SHEET 'PrintPreview'. ENDFORM. " FRM_PREVIEW_EXCEL *&---------------------------------------------------------------------* *& Form insert_colmun *&---------------------------------------------------------------------* * 在EXCEL模板中插入行 *----------------------------------------------------------------------* * -->row 行位置 *----------------------------------------------------------------------* FORM INSERT_ROW USING ROW . CALL METHOD OF G_EXCEL 'ROWS' = ROWS EXPORTING #1 = ROW. CALL METHOD OF ROWS 'INSERT'. FREE OBJECT ROWS. ENDFORM. "insert_row *&---------------------------------------------------------------------* *& Form delete_row *&---------------------------------------------------------------------* * 在EXCEL模板中删除行 *----------------------------------------------------------------------* * -->row 行位置 *----------------------------------------------------------------------* FORM DELETE_ROW USING ROW . CALL METHOD OF G_EXCEL 'ROWS' = ROWS EXPORTING #1 = ROW. CALL METHOD OF ROWS 'DELETE'. FREE OBJECT ROWS. ENDFORM. "delete_row *&---------------------------------------------------------------------* *& Form auto_fit *&---------------------------------------------------------------------* * 在EXCEL模板中自适应高度 *----------------------------------------------------------------------* * *----------------------------------------------------------------------* FORM AUTO_FIT USING ROW . DATA: L_END TYPE STRING, L_STR TYPE STRING. L_STR = ROW. CONCATENATE L_STR ':' L_STR INTO L_END . CONDENSE L_END NO-GAPS. CALL METHOD OF G_EXCEL 'ROWS' = ROWS EXPORTING #1 = L_END. CALL METHOD OF ROWS 'SELECT'. CALL METHOD OF ROWS 'AutoFit'. ENDFORM. *&---------------------------------------------------------------------* *& Form COLUMNWIDTH *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_1091 text *----------------------------------------------------------------------* FORM COLUMNWIDTH USING COLNUM . CALL METHOD OF G_EXCEL 'COLUMNS' = COLUMNS EXPORTING #1 = COLNUM. CALL METHOD OF COLUMNS 'AutoFit'. ENDFORM. "columnwidth *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL_NEW1 *&---------------------------------------------------------------------* * text 宋体 *----------------------------------------------------------------------* * -->P_R1 text * -->P_1 text * -->P_ITAB_TABIX text * -->P_11 text * -->P_3 text *----------------------------------------------------------------------* FORM FRM_FILL_CELL_NEW1 USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 0. SET PROPERTY OF G_FONT 'Name' = '宋体'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. ENDFORM. " FRM_FILL_CELL_NEW1 FORM FRM_FILL_CELL_NEW2 USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 1. SET PROPERTY OF G_FONT 'Name' = '华文中宋'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW3 USING P_ROW "模版低栏 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 0. SET PROPERTY OF G_FONT 'Name' = '黑体'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW4 USING P_ROW "华文仿宋10加粗 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CHECK P_VALUE NE ''. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 1. SET PROPERTY OF G_FONT 'Name' = '华文仿宋'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW5 USING P_ROW "华文仿宋 12 不加粗 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CHECK P_VALUE NE ''. CALL METHOD OF G_EXCEL 'CELLS' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'size' = P_SIZE. GET PROPERTY OF G_CELL 'font' = G_FONT. SET PROPERTY OF G_FONT 'bold' = 0. SET PROPERTY OF G_FONT 'Name' = '华文仿宋'. SET PROPERTY OF G_CELL 'HorizontalAlignment' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL 'VALUE' = P_VALUE. ENDFORM. *&---------------------------------------------------------------------* *& Form HEBING *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_R1 text * -->P_0217 text * -->P_R1 text * -->P_0219 text *----------------------------------------------------------------------* FORM HEBING USING P_R1 P_0217 P_R2 P_0219. DATA: L1 TYPE STRING, L3 TYPE STRING, L4 TYPE STRING, L2 TYPE STRING. MOVE P_R1 TO L3. MOVE P_R2 TO L4. CONCATENATE P_0217 L3 INTO L1. CONCATENATE P_0219 L4 INTO L2. CALL METHOD OF G_EXCEL 'Range' = G_RANGE EXPORTING #1 = L1 #2 = L2. CALL METHOD OF G_RANGE 'Select'. SET PROPERTY OF G_RANGE 'MergeCells' = 1. "合并单元格" ENDFORM. " HEBING *&---------------------------------------------------------------------* *& Form set height *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_R1 text * -->P_0217 text * -->P_R1 text * -->P_0219 text *----------------------------------------------------------------------* FORM SET_ROW_HEIGHT USING IROW TYPE I IHEIGHT TYPE I. *Set Row Height CALL METHOD OF G_EXCEL 'ROWS' = G_ROW EXPORTING #1 = IROW. SET PROPERTY OF G_ROW 'ROWHEIGHT' = IHEIGHT. ENDFORM.
EXPORT:
data: g_excel type ole2_object, g_sheet type ole2_object, g_workbook type ole2_object, g_cell type ole2_object, g_range type ole2_object, g_font type ole2_object, g_cell1 type ole2_object, g_cell2 type ole2_object, g_cells type ole2_object, g_columns type ole2_object, g_file like rlgrap-filename, g_border type ole2_object, g_column type ole2_object, g_wkbk type ole2_object, g_sheet_number type i. **&---------------------------------------------------------------------* **& 包含 ZR_HR_PA12_DOWNLOAD **&---------------------------------------------------------------------* FORM EXCEL_DATA . DATA: L_NAME LIKE WWWDATATAB, L_RC LIKE SY-SUBRC, L_FULLPATH TYPE STRING, L_SHEET_NUMBER TYPE I VALUE 1, L_TEXT TYPE STRING. CONCATENATE 'C:/HR/工资明细表' SY-DATUM '.XLS' INTO G_FILE. L_NAME-RELID = 'MI'. L_NAME-OBJID = 'ZR_HR_PA12_PRINT'."EXCEL模板的名 需要修改 CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING KEY = L_NAME DESTINATION = G_FILE IMPORTING RC = L_RC. IF L_RC <> 0. MESSAGE '模板文件(SMW0:ZTEST_001)下载失败,请与开发人员联系!' TYPE 'S'. LEAVE LIST-PROCESSING. ENDIF. L_FULLPATH = G_FILE. CONCATENATE '正在处理文件:' G_FILE INTO L_TEXT. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING TEXT = L_TEXT. PERFORM FRM_OPEN_EXCEL USING L_FULLPATH 0. " 打开excel模板 PERFORM FRM_OPEN_EXCEL_SHEET USING L_SHEET_NUMBER. "打开excel第一个sheet PERFORM FRM_PROCESS_EXCEL. "向EXCEL中填充数据 SET PROPERTY OF G_EXCEL 'VISIBLE' = 1. "过程可见 ENDFORM. " EXCEL_DAOCHU *&---------------------------------------------------------------------* *& Form FRM_PROCESS_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_PROCESS_EXCEL . DATA:R1 TYPE I . DATA:L_TIT TYPE CHAR50,L_TIT1(30),L_TIT2(30). * CALL METHOD OF G_EXCEL 'COLUMNS' = G_COLUMN "将第6列设置为文本格式 列宽为20 * EXPORTING * #1 = 7. * SET PROPERTY OF G_COLUMN 'ColumnWidth' = 20. * SET PROPERTY OF G_COLUMN 'NumberFormat' = '@'. DATA:L_LINE TYPE I. DESCRIBE TABLE GT_MAIN_DATA LINES L_LINE. "这里的 gt_main_data是报表开头建立的内表 DATA:L_INDEX TYPE I, WA_EXCEL(4096), L_STR(512). DATA:LT_EXCEL(4096) OCCURS 0. FIELD-SYMBOLS:<FSSTR> LIKE GT_MAIN_DATA, "同报表开头内表 <FSFLD>. DATA:G_SEPARATOR TYPE C. G_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB. ********************************_----------------------------------------------------------- DATA:TITLE(50),TITLE1(20). SELECT SINGLE STEXT INTO TITLE1 FROM HRP1000 WHERE OBJID = P_OBJID AND OTYPE = 'O'. CONCATENATE TITLE1 S_DATA-LOW+0(4) '年' S_DATA-LOW+4(2) '月到' S_DATA-HIGH+4(2) '月工资明细表' INTO TITLE. " 居中 <H1>设置字体格式 PERFORM FRM_FILL_CELL_NEW1 USING 1 1 TITLE 17 3. "3是居中 ********************************_----------------------------------------------------------- LOOP AT GT_MAIN_DATA ASSIGNING <FSSTR>. "报表开头内表 L_INDEX = 0. DO 42 TIMES. " ADD 1 TO L_INDEX. ASSIGN COMPONENT L_INDEX OF STRUCTURE <FSSTR> TO <FSFLD>. IF SY-SUBRC <> 0. EXIT. ENDIF. CLEAR:L_STR. WRITE <FSFLD> TO L_STR LEFT-JUSTIFIED. CONDENSE L_STR. IF L_INDEX EQ 1. WA_EXCEL = L_STR. ELSE. CONCATENATE WA_EXCEL L_STR INTO WA_EXCEL SEPARATED BY G_SEPARATOR. ENDIF. ENDDO. APPEND WA_EXCEL TO LT_EXCEL. CLEAR:WA_EXCEL. ENDLOOP. DATA: L_RET TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT IMPORTING DATA = LT_EXCEL CHANGING RC = L_RET. CALL METHOD OF G_SHEET 'Activate'. CALL METHOD OF G_SHEET 'Cells' = G_CELL EXPORTING #1 = 5 #2 = 'A'. * Paste data from clipboard CALL METHOD OF G_CELL 'Select'. CALL METHOD OF G_SHEET 'Paste'. DESCRIBE TABLE GT_MAIN_DATA LINES R1. R1 = R1 + 4. PERFORM FRM_DRAWLINE USING 5 'A' R1 'AP'. "加边框 从第五行开始 到R1行结束 从A列到I列 ENDFORM.
OOALV
https://www.cnblogs.com/ckstock/p/11586045.html
OO初级
https://github.com/abapoop/abap_oop_sample



抽象类:不能实例化的类


"父类水果,从ABAP根类object继承 CLASS zcl_fruit DEFINITION INHERITING FROM object. ENDCLASS. "子类苹果,继承自水果类 CLASS zcl_apple DEFINITION INHERITING FROM zcl_fruit. ENDCLASS. "子类梨子,继承自水果类 CLASS zcl_pear DEFINITION INHERITING FROM zcl_apple. ENDCLASS. "定义类对象 DATA go_fruit TYPE REF TO zcl_fruit. DATA go_apple TYPE REF TO zcl_apple. DATA go_pear TYPE REF TO zcl_pear. "第1种上转型,按子类类型创建父类对象 "父类是可创建对象实例的类,或者抽象类和接口 CREATE OBJECT go_fruit TYPE zcl_apple. "或者使用NEW语句 go_fruit = NEW zcl_apple( ).
*SELECTION-SCREEN FUNCTION KEY 3. *变量定义 TYPES TY_SPFLI TYPE SPFLI OCCURS 0. *DATA:ty_spfli LIKE TABLE OF spfli WITH HEADER LINE. *----------------------------------------------------------------------* * CLASS vehicle DEFINITION *----------------------------------------------------------------------* * ALV操作类(定义) *----------------------------------------------------------------------* CLASS VEHICLE DEFINITION. PUBLIC SECTION. METHODS: GETDATA "取得要显示的数据 RETURNING VALUE(LT_TAB) TYPE TY_SPFLI, ALV_PROCESS "ALV处理方法 IMPORTING VALUE(LT_TAB) TYPE TY_SPFLI, MAIN. "主方法 PRIVATE SECTION. DATA GR_TABLE TYPE REF TO CL_SALV_TABLE. ENDCLASS. "vehicle DEFINITION *----------------------------------------------------------------------* * CLASS vehicle IMPLEMENTATION *----------------------------------------------------------------------* * ALV操作类(实现) *----------------------------------------------------------------------* CLASS VEHICLE IMPLEMENTATION. *取得要显示的数据 METHOD GETDATA. SELECT * INTO TABLE LT_TAB FROM SPFLI. ENDMETHOD. "getdata *ALV处理方法 METHOD ALV_PROCESS. "创建实例 TRY. CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = GR_TABLE CHANGING T_TABLE = LT_TAB ). CATCH CX_SALV_MSG. ENDTRY. "显示列表 GR_TABLE->DISPLAY( ). ENDMETHOD. "alv_process *--------------实参的动态传递------------------ * data:ptab LIKE TABLE OF abap_parmbind. ** call METHOD 【oref -> / class => 】 method. * PARAMETER-table ptab(参数表) * PARAMETER-table etab(异常表) . *-------------------------------- *主方法,整合数据 METHOD MAIN. DATA: LT_TAB TYPE TABLE OF SPFLI. "取得要显示的数据 LT_TAB = ME->GETDATA( )."me (局部引用变量,隐藏在所有实例方法中)是对象的自身引用, "当方法被调用时,该变量将包含自身的地址指针 "处理数据 ME->ALV_PROCESS( LT_TAB )."call method 的简化形式 * 方法还可以进行动态调用,即通过变量对方法名进行指定 * meth = accelerate . * call method o_vehicle -> meth . ENDMETHOD. "main ENDCLASS. "vehicle IMPLEMENTATION *报表执行 START-OF-SELECTION. DATA O_VEHICLE TYPE REF TO VEHICLE. CREATE OBJECT O_VEHICLE. "创建一个类 vehicle 的实例,并同时将该对象的地址指针赋给引用类型o_vehicle O_VEHICLE->MAIN( ). "访问对象 或者 ===> 组件 " 引用类型变量-> 类成员 (comp ) ->可访问 实例组件 和 静态组件 "静态组件 另一种访问 类名称本身(class ) => 类成员 (comp ) "引用类型变量 本身也可以定义为类属性因此可以链式访问 "oref1 -> oref2 -> comp class => oref2-> comp "基类 vehicle 派生类 ship car train -> 子类 "抽象类和最终类 " 1> 抽象类和抽象方法:(抽象类)该基类只是作为模板出现,并不需要任何对象作为实例 " 2> 最终类和最终方法:是不能被继承的,若果一个类(尤其全局类)有很多派生类, " 则其中公有和被保护成员方法与之相关,随意改动该类,易造成派生类中语法和语义冲突, " 因而不想继续对该类进行派生,则课定义为最终类 "注册事件处理方法 * SET HANDLER go_receiver->handle_user_command FOR wcl_grid."对增加的功能键写如对应的功能 * SET HANDLER go_receiver->handle_toolbar FOR wcl_grid. "增加菜单栏里面的功能键 "类成员:属性,方法,事件(类对象发布其状态的改变) * MODIFY IT_ITAB TRANSPORTING MAKTX. **动态数据对象:字段符号,数据引用or(对象引用) **强制类型转换 **隐式强制类型转换: assign f to <fs> casting. **显式强制类型转换: assign f to <fs> casting type ~~~~. * TYPES:BEGIN OF gt_show, * COL1 TYPE I, * COL2 TYPE I, * END OF gt_show. **1 声明引用变量 * DATA DREF1 TYPE REF TO DATA. * DATA DREF2 TYPE REF TO DATA. * * FIELD-SYMBOLS: <FS1> TYPE gt_show, * <FS2> TYPE I. **2 动态对象创建 :该语句在运行期间内动态创建一个数据对象,同时引用变量DREF1 指向这一对象, **-- 该对象没有名称,只能通过数据引用变量进行寻址 * CREATE DATA DREF1 TYPE gt_show. * ASSIGN DREF1->* TO <FS1>. "解引操作 * <FS1>-COL1 = 1. * <FS1>-COL2 = 2. * DREF2 = DREF1. * ASSIGN DREF2->* TO <FS2> CASTING . "隐式强制类型转换: * WRITE / <FS2>. **3 获取对象引用 * GET REFERENCE OF <FS1>-COL2 INTO DREF2. **4 接触数据引用 * ASSIGN DREF2->* TO <FS2>. * WRITE / <FS2>.
内存传值

内存传值一(两报表之间)
https://www.cnblogs.com/mingdashu/p/5609503.html


DATA:seltab TYPE TABLE OF rsparams, seltab_wa LIKE LINE OF seltab. *"-------------审批代码 seltab_wa-sign = 'I'. seltab_wa-low = is_input-iv_zspnum1. seltab_wa-high = is_input-iv_zspnum2. seltab_wa-selname = 'S_ZSPNUM'. IF is_input-iv_zspnum2 IS NOT INITIAL. seltab_wa-option = 'BT'. APPEND seltab_wa TO seltab. ELSE. IF is_input-iv_zspnum1 IS NOT INITIAL. seltab_wa-option = 'EQ'. APPEND seltab_wa TO seltab. ENDIF. ENDIF. SUBMIT z29fie210201_copy WITH SELECTION-TABLE seltab AND RETURN .
FUNCTION Z_HR_KQPT_002. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(I_OBJID) TYPE HROBJID *" VALUE(I_BEGDA) TYPE SYDATUM *" VALUE(I_ENDDA) TYPE SYDATUM *" VALUE(I_PERNR) TYPE PERSNO OPTIONAL *" TABLES *" OT_KQMX STRUCTURE ZHRR300_02 *"---------------------------------------------------------------------- DATA:MEM_ID TYPE C. CONCATENATE 'ZHRR301-MX' SY-DATUM INTO MEM_ID. IF I_PERNR NE 0. SUBMIT ZHRR301 USING SELECTION-SCREEN '1000' WITH P_OBJID = I_OBJID WITH P_BEGDA = I_BEGDA WITH P_ENDDA = I_ENDDA WITH PNPPERNR-LOW = I_PERNR WITH 02P02 = 'X' WITH 01P02 = ' ' AND RETURN. ELSE. SUBMIT ZHRR301 USING SELECTION-SCREEN '1000' WITH P_OBJID = I_OBJID WITH P_BEGDA = I_BEGDA WITH P_ENDDA = I_ENDDA * WITH PNPPERNR-LOW = I_PERNR WITH 02P02 = 'X' WITH 01P02 = ' ' AND RETURN. ENDIF. IMPORT TABLE1 = OT_KQMX[] FROM MEMORY ID MEM_ID. IF I_PERNR IS NOT INITIAL. DELETE OT_KQMX WHERE PERNR NE I_PERNR. ENDIF. ENDFUNCTION. IF 02P02 = 'X'. CONCATENATE 'ZHRR301-MX' SY-DATUM INTO MEM_ID. FREE MEMORY ID MEM_ID. LOOP AT T_ITAB. MOVE-CORRESPONDING T_ITAB TO GT_ITAB1. APPEND GT_ITAB1.CLEAR GT_ITAB1. ENDLOOP. EXPORT TABLE1 = GT_ITAB1 TO MEMORY ID MEM_ID. ELSE. PERFORM DISPLAY_ALV. "ALV 数据展示 后期加的 他的from在from里 T_ITAB ENDIF.
FUNCTION Z_HR_KQPT_002. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(I_OBJID) TYPE HROBJID *" VALUE(I_BEGDA) TYPE SYDATUM *" VALUE(I_ENDDA) TYPE SYDATUM *" VALUE(I_PERNR) TYPE PERSNO OPTIONAL *" TABLES *" OT_KQMX STRUCTURE ZHRR300_02 *"---------------------------------------------------------------------- DATA:MEM_ID TYPE C. CONCATENATE 'ZHRR301-MX' SY-DATUM INTO MEM_ID. IF I_PERNR NE 0. SUBMIT ZHRR301 USING SELECTION-SCREEN '1000' WITH P_OBJID = I_OBJID WITH P_BEGDA = I_BEGDA WITH P_ENDDA = I_ENDDA WITH PNPPERNR-LOW = I_PERNR WITH 02P02 = 'X' WITH 01P02 = ' ' AND RETURN. ELSE. SUBMIT ZHRR301 USING SELECTION-SCREEN '1000' WITH P_OBJID = I_OBJID WITH P_BEGDA = I_BEGDA WITH P_ENDDA = I_ENDDA * WITH PNPPERNR-LOW = I_PERNR WITH 02P02 = 'X' WITH 01P02 = ' ' AND RETURN. ENDIF. IMPORT TABLE1 = OT_KQMX[] FROM MEMORY ID MEM_ID. IF I_PERNR IS NOT INITIAL. DELETE OT_KQMX WHERE PERNR NE I_PERNR. ENDIF. ENDFUNCTION.
内存传值二(全局变量)


FUNCTION-POOL ztestck. "MESSAGE-ID .. * INCLUDE LZTESTCKD... " Local class definition TYPES:BEGIN OF ty_matnr, matnr TYPE matnr, line TYPE tlinet, END OF ty_matnr. DATA:gwa TYPE ty_matnr. DATA gv_value TYPE sy-uname.. DATA gt_itab TYPE TABLE OF pa0001.
FUNCTION z0001. *"---------------------------------------------------------------------- *"*"本地接口: *"---------------------------------------------------------------------- FIELD-SYMBOLS:<fs1> TYPE matnr. "结构中字段 FIELD-SYMBOLS:<fs> TYPE matnr. "结构中字段 FIELD-SYMBOLS:<fs2> TYPE sy-uname."单个变量 FIELD-SYMBOLS:<fs3> TYPE sy-uname. FIELD-SYMBOLS:<fs4> TYPE table. CALL FUNCTION 'Z_STE_TEST'. *结构中字段 ASSIGN ('(SAPLZTESTCK)GWA-matnr') TO <fs1> . *内表 ASSIGN ('(SAPLZTESTCK)GWA-line') TO <fs4> . *单个变量 ASSIGN ('(SAPLZTESTCK)Gv_value') TO <fs3> . *内表 ASSIGN ('(SAPLZTESTCK)gt_itab') TO <fs4> . ENDFUNCTION.
submit alv
常规-1
TABLES:t000. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: s_mandt FOR t000-mandt ,"no INTERVALS, "客户端 s_mtext FOR t000-mtext, "集团名 s_logsys FOR t000-logsys. "逻辑系统 SELECTION-SCREEN END OF BLOCK b1. "//--------------------------------------------------- DATA:seltab TYPE TABLE OF rsparams, seltab_wa LIKE LINE OF seltab. DATA: ls_data TYPE REF TO DATA. DATA:lv_sel_low_exist_more(1). DEFINE d_sel. CLEAR:lv_sel_low_exist_more. seltab_wa-SIGN = 'I' . seltab_wa-selname = &1 . seltab_wa-low = &2 . IF &3 IS NOT INITIAL. seltab_wa-option = 'BT' . seltab_wa-high = &3 . ELSE. IF LINES( &4[] ) > 1. lv_sel_low_exist_more = 'X'. ELSE. seltab_wa-option = 'EQ' . ENDIF. ENDIF. IF &3 IS INITIAL AND &2 IS INITIAL. ELSE. IF lv_sel_low_exist_more = 'X'.. CLEAR:seltab_wa. LOOP AT &4. seltab_wa-SIGN = 'I' . seltab_wa-selname = &1 . seltab_wa-low = &2 . seltab_wa-option = 'EQ' . APPEND seltab_wa TO seltab..CLEAR seltab_wa. ENDLOOP. ELSE. APPEND seltab_wa TO seltab..CLEAR seltab_wa. ENDIF. ENDIF. END-OF-DEFINITION. d_sel 'S_ZSTYPI' s_zstypi-low s_zstypi-high S_ZSTYPI. DEFINE d_sel_parameter. IF &1 IS NOT INITIAL. seltab_wa-SIGN = 'I' . seltab_wa-selname = &1 . seltab_wa-option = 'EQ' . seltab_wa-low = &2 . APPEND seltab_wa TO seltab..CLEAR seltab_wa. ENDIF. END-OF-DEFINITION. * APPEND seltab FROM VALUE seltab( SIGN = 'I' selname = &1 option = 'EQ' ) d_sel_parameter 'P_0YD' 'X'. "//--------------------------------------------------- FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. CALL METHOD cl_salv_bs_runtime_info=>set "可以让被调用的ALV不显示出来 EXPORTING display = '' metadata = '' " 防止基本信息(布局,字段目录等)被取到内存中 DATA = 'X'. "迫使数据表导出到内存而不是显示报表 SUBMIT zmc_rfi_xdmx WITH SELECTION-TABLE seltab AND RETURN. *SUBMIT zsdr07 WITH s_zcxtgh-low = '2019093000001' AND RETURN. *GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。 *参数: * T_DATA - 输出参数数据表。 * T_DATA_LINE - 如果执行的ALV有HEADER(可选)。 TRY . CALL METHOD cl_salv_bs_runtime_info=>get_data_ref IMPORTING r_data = ls_data * R_DATA_LINE = "如果执行的ALV有HEADER的(可选) . ASSIGN ls_data->* TO <lt_data>. CATCH cx_salv_bs_sc_runtime_info. MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'. ENDTRY. cl_salv_bs_runtime_info=>clear_all( )."此方法清除在set()方法设置的标志。如果之后本程序还需要显示其他ALV 那么这个方法尤为重要。如果不清除设置,你的ALV就不会被显示出来 DATA gt_zppt_b001_yg LIKE TABLE OF zppt_b001_yg WITH HEADER LINE. FIELD-SYMBOLS:<af1> TYPE ANY . IF <lt_data> IS ASSIGNED. LOOP AT <lt_data> ASSIGNING <af1>. gt_zppt_b001_yg = corresponding #( <af1> ). APPEND gt_zppt_b001_yg.CLEAR gt_zppt_b001_yg. ENDLOOP. ENDIF.
常规-2 封装调用
INCLUDE zabap_pool. DATA:lt_submit_alv TYPE TABLE OF ty_tab WITH HEADER LINE. iv_program = 'ZMCPRC1002'. d_sel 'S_JGBM' s_jgbm-low s_jgbm-high s_jgbm. d_sel 'S_GJAHR' s_smon-low+0(4) s_smon-high+0(4) s_gjahr. d_sel 'S_MONAT' s_smon-low+4(2) s_smon-high+4(2) s_monat. d_sel 'S_SJLX' 'B' s_sjlx-high s_sjlx. * d_sel_parameter 'P_XD' 'X'. APPEND LINES OF seltab TO it_parameters. fs_data = zcl_ck=>submit_alv( iv_program = iv_program it_parameters = it_parameters ) . ASSIGN fs_data->* TO <lt_data>. LOOP AT <lt_data> ASSIGNING <ls_data>. MOVE-CORRESPONDING <ls_data> TO lt_submit_alv. APPEND lt_submit_alv.CLEAR lt_submit_alv. ENDLOOP.
METHOD SUBMIT_ALV. FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. DATA: ls_data TYPE REF TO data. CALL METHOD cl_salv_bs_runtime_info=>set "可以让被调用的ALV不显示出来 EXPORTING display = '' metadata = '' " 防止基本信息(布局,字段目录等)被取到内存中 data = 'X'. "迫使数据表导出到内存而不是显示报表 SUBMIT (iv_program) WITH SELECTION-TABLE it_parameters AND RETURN. TRY . CALL METHOD cl_salv_bs_runtime_info=>get_data_ref IMPORTING r_data = fs_data. ASSIGN fs_data->* TO <lt_data>. CATCH cx_salv_bs_sc_runtime_info. MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'. ENDTRY. cl_salv_bs_runtime_info=>clear_all( )." "//-----------------demo代码---------------------------------- * INCLUDE zabap_pool. * DATA:lt_submit_alv TYPE TABLE OF ty_tab WITH HEADER LINE. * iv_program = 'ZMCPRC1002'. * d_sel 'S_JGBM' s_jgbm-low s_jgbm-high s_jgbm. * d_sel 'S_GJAHR' s_smon-low+0(4) s_smon-high+0(4) s_gjahr. * d_sel 'S_MONAT' s_smon-low+4(2) s_smon-high+4(2) s_monat. * d_sel 'S_SJLX' 'B' s_sjlx-high s_sjlx. * ** d_sel_parameter 'P_XD' 'X'. * APPEND LINES OF seltab TO it_parameters. * fs_data = zcl_ck=>submit_alv( iv_program = iv_program it_parameters = it_parameters ) . * ASSIGN fs_data->* TO <lt_data>. * * LOOP AT <lt_data> ASSIGNING <ls_data>. * MOVE-CORRESPONDING <ls_data> TO lt_submit_alv. * APPEND lt_submit_alv.CLEAR lt_submit_alv. * ENDLOOP. "//-----------------demo代码---------------------------------- **&---------------------------------------------------------------------* **& Include ZABAP_POOL **&---------------------------------------------------------------------* * DATA:lv_sel_low_exist_more(1). * DATA:gv_cs TYPE I. * DEFINE d_sel. * LOOP AT &4. * gv_cs = gv_cs + 1. * seltab_wa-selname = &1 . * MOVE-corresponding &4 TO seltab_wa. * APPEND seltab_wa TO seltab..CLEAR seltab_wa. * ENDLOOP. * IF sy-subrc NE 0 . * CLEAR:lv_sel_low_exist_more. * * seltab_wa-SIGN = 'I' . * seltab_wa-selname = &1 . * seltab_wa-low = &2 . * IF &3 IS NOT INITIAL. * seltab_wa-option = 'BT' . * seltab_wa-high = &3 . * ELSE. * IF LINES( &4[] ) > 1. * lv_sel_low_exist_more = 'X'. * ELSE. * seltab_wa-option = 'EQ' . * ENDIF. * ENDIF. * IF &3 IS INITIAL AND &2 IS INITIAL. * ELSE. * IF lv_sel_low_exist_more = 'X'.. * CLEAR:seltab_wa. * LOOP AT &4. * seltab_wa-SIGN = 'I' . * seltab_wa-selname = &1 . * seltab_wa-low = &2 . * seltab_wa-option = &4-option . * APPEND seltab_wa TO seltab..CLEAR seltab_wa. * ENDLOOP. * ELSE. * APPEND seltab_wa TO seltab..CLEAR seltab_wa. * ENDIF. * ENDIF. * ENDIF. * END-OF-DEFINITION. * DEFINE d_sel_parameter. * IF &1 IS NOT INITIAL. * seltab_wa-SIGN = 'I' . * seltab_wa-selname = &1 . * seltab_wa-option = 'EQ' . * seltab_wa-low = &2 . * APPEND seltab_wa TO seltab..CLEAR seltab_wa. * ENDIF. * END-OF-DEFINITION. * FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. * FIELD-SYMBOLS: <ls_data> TYPE ANY . * DATA: fs_data TYPE REF TO DATA. * DATA:seltab TYPE TABLE OF rsparams, * seltab_wa LIKE LINE OF seltab. * DATA:it_parameters TYPE ztt_rsparams. * DATA:is_parameters TYPE rsparams. * DATA:iv_program TYPE name.. ENDMETHOD.
动态选择屏幕alv
REPORT 1. *DEBUG发现,SUBMIT指定的动态条件带不到程序中 *前台输进去的动态条件却有 TYPE-POOLs RSDS. DATA: ls_dyns TYPE rsds_type. DATA: lt_trange TYPE rsds_trange WITH HEADER LINE. DATA: lt_frange TYPE TABLE OF rsds_frange WITH HEADER LINE. DATA: lt_selopt TYPE TABLE OF rsdsselopt WITH HEADER LINE. lt_selopt-SIGN = 'I'. lt_selopt-option = 'EQ'. lt_selopt-low = '20230808'. APPEND lt_selopt. lt_frange-fieldname = 'BLDAT'. lt_frange-selopt_t = lt_selopt[]. APPEND lt_frange. lt_trange-tablename = 'BSIS_FS'. lt_trange-frange_t = lt_frange[]. APPEND lt_trange. ls_dyns-trange = lt_trange[]. SUBMIT fagl_account_items_gl WITH sd_bukrs-low = '6101' WITH so_wlsak-low = '10010003' WITH fs_dyns = ls_dyns.
给动态选择屏幕赋值
REPORT 1. type-POOLs RSDS. DATA: ls_dyns TYPE rsds_type. DATA: lt_trange TYPE rsds_trange WITH HEADER LINE. DATA: lt_frange TYPE TABLE OF rsds_frange WITH HEADER LINE. DATA: lt_selopt TYPE TABLE OF rsdsselopt WITH HEADER LINE. DATA: lt_field TYPE rsdsfields_t WITH HEADER LINE. DATA: lv_num LIKE sy-tfill. lt_selopt-SIGN = 'I'. lt_selopt-option = 'EQ'. lt_selopt-low = '20230808'. APPEND lt_selopt. lt_frange-fieldname = 'BLDAT'. lt_frange-selopt_t = lt_selopt[]. APPEND lt_frange. lt_trange-tablename = 'BSIS_FS'. lt_trange-frange_t = lt_frange[]. APPEND lt_trange. ls_dyns-trange = lt_trange[]. CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE' EXPORTING field_ranges = ls_dyns-trange IMPORTING where_clauses = ls_dyns-clauses. CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_EX' EXPORTING field_ranges = ls_dyns-trange IMPORTING expressions = ls_dyns-texpr. lt_field-tablename = 'BSIS_FS'. lt_field-fieldname = 'BLDAT'. APPEND lt_field. lv_num = 1. SUBMIT fagl_account_items_gl WITH sd_bukrs-low = '6900' WITH fs_dyns = ls_dyns WITH fs_num = lv_num WITH fs_field = lt_field[] VIA SELECTION-SCREEN.
增强
https://blog.csdn.net/huanglin6/article/details/81353974 隐式
https://blog.csdn.net/huanglin6/article/details/81353793 (BADI)
https://www.cnblogs.com/libihui422/tag/SAP%20BADI/
增强 找smod的,debug customer-function 找badi的,debug那个类 BTE的增强,DEBUG函数PC_FUNCTION_FIND,I_PROCS为处理序号,FIBF里可以根据此序号看到对应的处理函数 如果是屏幕增强,pbo或者pai的,找不到上述两个增强的时候,就到pai或pbo里写隐式 也可以先根据需求上网搜搜,比如销售订单的一些增强,不是smod的,也不是badi的,这个就靠经验了 SAP提供的增强的方式有点杂了,如果只有一两种就好了


查增强代码
*&---------------------------------------------------------------------* *& Report ZENHANCE *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZENHANCE1. *"---------------------------------------------------------------------- *DATA: ld_message TYPE string, * ld_message1 TYPE char20. *DATA: ld_delivery_number TYPE vbeln_vl VALUE '0080003371'. *DATA: ls_delivery_header TYPE likp. * *ld_message = |{ ld_delivery_number ALPHA = OUT }|. *ld_message1 = |{ ld_delivery_number ALPHA = IN }|. *WRITE: / ld_message, * ld_message1. TABLES : tstc, "SAP Transaction Codes(SAP 事务代码) tadir, "Directory of Repository Objects(资源库对象的目录) modsapt, "SAP Enhancements - Short Texts(SAP增强-短文件) sxs_attrt,"Exit: Definition side: Attributes, Text table modact, "Modifications(修正) trdir, "System table TRDIR(系统表 TRDIR) tfdir, "Function Module(功能模块) enlfdir, "Additional Attributes for Function Modules(功能模块的附加属性) tstct. "Transaction Code Texts(事务代码文本) DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE. "SMOD DATA : itab LIKE tadir OCCURS 0 WITH HEADER LINE. "SE18-BADI DATA : ktab LIKE tadir OCCURS 0 WITH HEADER LINE. "Enhancement implementation-ENHO DATA : ltab LIKE tadir OCCURS 0 WITH HEADER LINE. "Enhancement Spot-ENHS DATA : mtab LIKE tadir OCCURS 0 WITH HEADER LINE. "Composite Enhancement implementation-ENHC DATA : field1(30). DATA : v_devclass LIKE tadir-devclass. DATA : t_count LIKE sy-tfill. DATA: bdcdata_wa TYPE bdcdata, bdcdata_tab TYPE TABLE OF bdcdata. DATA opt TYPE ctu_params. SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001. SELECTION-SCREEN SKIP. PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY. SELECTION-SCREEN SKIP. SELECTION-SCREEN END OF BLOCK a01. START-OF-SELECTION. CLEAR: itab,jtab. REFRESH:itab,jtab. SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. IF sy-subrc EQ 0. SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND object = 'PROG' AND obj_name = tstc-pgmna. MOVE : tadir-devclass TO v_devclass. IF sy-subrc NE 0. SELECT SINGLE * FROM trdir WHERE name = tstc-pgmna. IF trdir-subc EQ 'F'. SELECT SINGLE * FROM tfdir WHERE pname = tstc-pgmna. SELECT SINGLE * FROM enlfdir WHERE funcname = tfdir-funcname. SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND object = 'FUGR' AND obj_name = enlfdir-area. MOVE : tadir-devclass TO v_devclass. ENDIF. ENDIF. SELECT * FROM tadir INTO TABLE jtab WHERE pgmid = 'R3TR' AND object = 'SMOD' AND devclass = v_devclass. SELECT * FROM tadir INTO TABLE itab WHERE pgmid = 'R3TR' AND object = 'SXSD' AND devclass = v_devclass. SELECT * FROM tadir INTO TABLE ktab WHERE pgmid = 'R3TR' AND object = 'ENHO' AND devclass = v_devclass. SELECT * FROM tadir INTO TABLE ltab WHERE pgmid = 'R3TR' AND object = 'ENHS' AND devclass = v_devclass. SELECT * FROM tadir INTO TABLE mtab WHERE pgmid = 'R3TR' AND object = 'ENHC' AND devclass = v_devclass. SELECT SINGLE * FROM tstct WHERE sprsl EQ sy-langu AND tcode EQ p_tcode. FORMAT COLOR COL_POSITIVE INTENSIFIED OFF. WRITE:/(12) '事务代码 - ', 13(20) p_tcode, 34(10) '功能 - ' , 45(50) tstct-ttext. SKIP. IF NOT jtab[] IS INITIAL. WRITE:/(117) sy-uline. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 sy-vline, 'Exit Name', sy-vline , 'Description', sy-vline. WRITE:/(117) sy-uline. LOOP AT jtab. CLEAR modsapt. SELECT SINGLE * FROM modsapt WHERE sprsl = sy-langu AND name = jtab-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 sy-vline, jtab-obj_name HOTSPOT ON, sy-vline , modsapt-modtext, sy-vline. ENDLOOP. WRITE:/(117) sy-uline. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 sy-vline, 'Badi Name(definition)', sy-vline , 'Description', sy-vline. WRITE:/(117) sy-uline. LOOP AT itab. CLEAR sxs_attrt. SELECT SINGLE * FROM sxs_attrt WHERE sprsl = sy-langu AND exit_name = itab-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 sy-vline, itab-obj_name HOTSPOT ON, sy-vline , sxs_attrt-text, sy-vline. ENDLOOP. WRITE:/(117) sy-uline. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 sy-vline, 'Enhancement Implementation', sy-vline , 'Description', sy-vline. WRITE:/(117) sy-uline. LOOP AT ktab. CLEAR sxs_attrt. SELECT SINGLE * FROM sxs_attrt WHERE sprsl = sy-langu AND exit_name = ktab-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 sy-vline, ktab-obj_name HOTSPOT ON, sy-vline , sxs_attrt-text, sy-vline. ENDLOOP. WRITE:/(117) sy-uline. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 sy-vline, 'Enhancement Spot', sy-vline , 'Description', sy-vline. WRITE:/(117) sy-uline. LOOP AT ltab. CLEAR sxs_attrt. SELECT SINGLE * FROM sxs_attrt WHERE sprsl = sy-langu AND exit_name = ltab-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 sy-vline, ltab-obj_name HOTSPOT ON, sy-vline , sxs_attrt-text, sy-vline. ENDLOOP. WRITE:/(117) sy-uline. FORMAT COLOR COL_HEADING INTENSIFIED ON. WRITE:/1 sy-vline, 'Composite Enhancement Implementation', sy-vline , 'Description', sy-vline. WRITE:/(117) sy-uline. LOOP AT mtab. CLEAR sxs_attrt. SELECT SINGLE * FROM sxs_attrt WHERE sprsl = sy-langu AND exit_name = mtab-obj_name. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. WRITE:/1 sy-vline, mtab-obj_name HOTSPOT ON, sy-vline , sxs_attrt-text, sy-vline. ENDLOOP. WRITE:/(117) sy-uline. CLEAR t_count. DESCRIBE TABLE jtab. t_count = sy-tfill. DESCRIBE TABLE itab. t_count = t_count + sy-tfill. DESCRIBE TABLE ktab. t_count = t_count + sy-tfill. DESCRIBE TABLE ltab. t_count = t_count + sy-tfill. DESCRIBE TABLE mtab. t_count = t_count + sy-tfill. SKIP. FORMAT COLOR COL_TOTAL INTENSIFIED ON. WRITE:/ '用户出口数量:' , t_count. ELSE. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(95) '此TCode没有用户出口!'. ENDIF. ELSE. FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. WRITE:/(95) '事务代码不存在!'. ENDIF. AT LINE-SELECTION. GET CURSOR FIELD field1. IF field1(4) EQ 'JTAB'. data:L_ck type SYST_LISEL. L_ck = sy-lisel+1(10). condense L_ck. SET PARAMETER ID 'MON' FIELD L_ck. CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN. ELSEIF field1(4) EQ 'ITAB'. * SET PARAMETER ID 'EXN' FIELD sy-lisel+1(40). * CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN. CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLSEXO'. bdcdata_wa-dynpro = '0100'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'G_ENHSPOTNAME'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'G_IS_BADI'. bdcdata_wa-fval = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_OKCODE'. bdcdata_wa-fval = '=ISSPOT'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLSEXO'. bdcdata_wa-dynpro = '0100'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'G_BADINAME'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'G_BADINAME'. bdcdata_wa-fval = sy-lisel+1(40). condense bdcdata_wa-fval NO-GAPS. APPEND bdcdata_wa TO bdcdata_tab. opt-dismode = 'E'. opt-defsize = 'X'. CALL TRANSACTION 'SE18' USING bdcdata_tab OPTIONS FROM opt. REFRESH bdcdata_tab. ELSEIF field1(4) EQ 'KTAB'. * SET PARAMETER ID 'IMN_BADI' FIELD sy-lisel+1(40). * CALL TRANSACTION 'SE19' AND SKIP FIRST SCREEN. CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLENHANCEMENTS'. bdcdata_wa-dynpro = '0100'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'RSEUX-CXH_VALUE'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-CXH'. bdcdata_wa-fval = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-CXH_VALUE'. bdcdata_wa-fval = sy-lisel+1(40). condense bdcdata_wa-fval NO-GAPS. APPEND bdcdata_wa TO bdcdata_tab. * CLEAR bdcdata_wa. * bdcdata_wa-fnam = 'BDC_OKCODE'. * bdcdata_wa-fval = '/00'. * APPEND bdcdata_wa TO bdcdata_tab. opt-dismode = 'E'. opt-defsize = 'X'. CALL TRANSACTION 'SE20' USING bdcdata_tab OPTIONS FROM opt. REFRESH bdcdata_tab. ELSEIF field1(4) EQ 'LTAB'. * SET PARAMETER ID 'ENHSPOT' FIELD sy-lisel+1(40). * CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN. CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLENHANCEMENTS'. bdcdata_wa-dynpro = '0100'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'RSEUX-C_XS_VALUE'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-C_XS'. bdcdata_wa-fval = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-C_XS_VALUE'. bdcdata_wa-fval = sy-lisel+1(40). condense bdcdata_wa-fval NO-GAPS. APPEND bdcdata_wa TO bdcdata_tab. * CLEAR bdcdata_wa. * bdcdata_wa-fnam = 'BDC_OKCODE'. * bdcdata_wa-fval = '/00'. * APPEND bdcdata_wa TO bdcdata_tab. opt-dismode = 'E'. opt-defsize = 'X'. CALL TRANSACTION 'SE20' USING bdcdata_tab OPTIONS FROM opt. REFRESH bdcdata_tab. ELSEIF field1(4) EQ 'MTAB'. * SET PARAMETER ID 'IMN_BADI' FIELD sy-lisel+1(40). CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLENHANCEMENTS'. bdcdata_wa-dynpro = '0100'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'RSEUX-CXT_VALUE'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-CXT'. bdcdata_wa-fval = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'RSEUX-CXT_VALUE'. bdcdata_wa-fval = sy-lisel+1(40). condense bdcdata_wa-fval NO-GAPS. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_OKCODE'. bdcdata_wa-fval = '/00'. APPEND bdcdata_wa TO bdcdata_tab. opt-dismode = 'E'. opt-defsize = 'X'. CALL TRANSACTION 'SE20' USING bdcdata_tab OPTIONS FROM opt. REFRESH bdcdata_tab. ENDIF.

分页
IV_PAGE_SIZE TYPE UPX_PAGE_SIZE UPX 分页大小
DATA lv_page TYPE p. DATA lv_page_size TYPE p. DATA lv_begin TYPE p. DATA lv_end TYPE p. lv_page = iv_page. lv_page_size = iv_page_size. IF lv_page IS NOT INITIAL AND lv_page_size IS NOT INITIAL. lv_begin = ( lv_page - 1 ) * lv_page_size . lv_end = lv_page * lv_page_size + 1. IF lv_begin IS INITIAL. DELETE ot_show FROM lv_end. ELSE. DELETE ot_show FROM lv_end. DELETE ot_show FROM 1 TO lv_begin. ENDIF. ENDIF.
"分页取数测试 WRITE: 10 'PAGE' CENTERED, 20 'LINES' CENTERED, 30 'RESULT' CENTERED, /. ULINE. PERFORM get_data USING 0 0. PERFORM get_data USING 1 2. PERFORM get_data USING 2 2. PERFORM get_data USING 3 2. PERFORM get_data USING 4 2. PERFORM get_data USING 5 2. PERFORM get_data USING 6 2. FORM get_data USING iv_page TYPE i iv_lines TYPE i. DATA(lv_offset) = ( iv_page - 1 ) * iv_lines. SELECT vbeln FROM likp WHERE vbeln LIKE '%03' ORDER BY vbeln INTO TABLE @DATA(lt_data) OFFSET @lv_offset UP TO @iv_lines ROWS. LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data>). WRITE: iv_page UNDER 'PAGE' LEFT-JUSTIFIED, iv_lines UNDER 'LINES' LEFT-JUSTIFIED , <ls_data>-vbeln UNDER 'RESULT' LEFT-JUSTIFIED, /. ENDLOOP. ULINE. ENDFORM.
权限对象
https://blog.csdn.net/candy_mmyy/article/details/54906571
各模块 BAPI
https://www.cnblogs.com/mingdashu/p/5627511.html
踢人
SUBMIT ZHFIUCPL0 USING SELECTION-SCREEN '1000' WITH PNPPERNR-LOW = PERNR WITH KILL = 'X' WITH SHOW = ' ' AND RETURN.
后台设置

用程序创建:
DEFINE macro_record_message. gt_msg-type = &1. gt_msg-message = &2. append gt_msg. END-OF-DEFINITION. DATA: l_status TYPE tbtco-status. DATA: gt_msg TYPE TABLE OF bapiret2 WITH HEADER LINE. DATA: ls_job TYPE tbtcjob. DATA: lt_list TYPE TABLE OF tbtcstep WITH HEADER LINE. DATA: g_progname_trans_job TYPE progname VALUE 'ZCOR_HISTORY_COST'. SELECT SINGLE status INTO l_status FROM tbtco WHERE jobname = g_progname_trans_job AND status = 'S' AND ( sdlstrtdt > sy-datum OR ( sdlstrtdt = sy-datum AND sdlstrttm > sy-uzeit ) ) AND authckman = sy-mandt. IF sy-subrc = 0. "检查有没有已经计划的JOB macro_record_message: 'S' 'JOB已存在,无需重复创建'. EXIT. ENDIF. CLEAR: ls_job, lt_list, lt_list[]. ls_job-jobname = g_progname_trans_job.. CONCATENATE sy-uzeit '00' INTO ls_job-jobcount. ls_job-intreport = '%NEWSTEP'. ls_job-stepcount = 1. ls_job-sdlstrtdt = sy-datum. ls_job-sdlstrttm = sy-uzeit + 30. *ls_job-prdmins = 30. "每隔三十分钟 *ls_job-periodic = 'X'. ls_job-status = 'S'. ls_job-jobclass = 'C'. lt_list-program = g_progname_trans_job. * lt_list-PARAMETER = rt_kunr-low."变式 lt_list-parameter = 'CK'.."变式 lt_list-typ = 'A'. lt_list-authcknam = sy-uname. lt_list-language = sy-langu. lt_list-status = 'P'. APPEND lt_list. CALL FUNCTION 'BP_JOB_CREATE' EXPORTING job_cr_dialog = 'N' job_cr_head_inp = ls_job TABLES job_cr_steplist = lt_list[] EXCEPTIONS cant_create_job = 1 invalid_dialog_type = 2 invalid_job_data = 3 job_create_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. macro_record_message: 'E' 'JOB创建失败,请手工创建JOB'. ELSE. COMMIT WORK. macro_record_message: 'S' 'JOB创建成功'. ENDIF. COMMIT WORK AND WAIT.
手动创建:
se38 进入程序首先设置变式,如下图:


需要注意的是对于动态变式的设置,如下

在下面这里可以控制变式运行时的时间周期范围:

然后点击
即完成变式的保存。
二、 运行事务代码SM36进入后台设置界面

三、先给后台作业命名,然后选择“开始条件”进入后台运行条件设置

四、设置后台出发时间和频率,然后点击保存


然后保存即可。
五、进入“步骤”选择需运行的程序以及对应的变式,点击保存进入步骤清单总览进入审核,如果问题可进行修改,确认无误后点击返回按钮,再保存即可,点击检查可以自动弹出第一步保存的变式


返回后点击保存即完成后台的设置了。
六、SM36创建成功后,通过SM37可以对所创建的后台JOB进行监控和修改
七、
调用后台job
"注:后台运行的标记为SY-BATCH = 'X' FORM FRM_CREATE_JOB. DATA: L_JOBNUMBER TYPE BTCJOBCNT. DATA: L_JOBNAME TYPE BTCJOB VALUE 'Z05HR_BONUS_CALC_JOB'. "检查权限 AUTHORITY-CHECK OBJECT 'S_BTCH_ADM' FOR USER SY-UNAME ID 'BTCADMIN' FIELD 'Y'. IF SY-SUBRC NE 0. MESSAGE S017 DISPLAY LIKE 'E'. ELSE. CALL FUNCTION 'JOB_OPEN' EXPORTING JOBNAME = L_JOBNAME IMPORTING JOBCOUNT = L_JOBNUMBER EXCEPTIONS CANT_CREATE_JOB = 1 INVALID_JOB_DATA = 2 JOBNAME_MISSING = 3 OTHERS = 4. IF SY-SUBRC = 0. SUBMIT Z05HR_BONUS_CALC_JOB USER SY-UNAME VIA JOB L_JOBNAME NUMBER L_JOBNUMBER AND RETURN WITH P_WSBM = GC_WSBM WITH P_YWDW = P_YWDW WITH P_KSRQ = P_KPZQ-LOW WITH P_JZRQ = P_KPZQ-HIGH WITH P_DWJS = P_DWJS WITH P_CHUSHI = GW_CHUSHI WITH P_FLAG = G_FLAG_CHUSHI WITH P_JOBNUM = L_JOBNUMBER. IF SY-SUBRC = 0. CALL FUNCTION 'JOB_CLOSE' EXPORTING JOBCOUNT = L_JOBNUMBER JOBNAME = L_JOBNAME STRTIMMED = 'X' EXCEPTIONS CANT_START_IMMEDIATE = 1 INVALID_STARTDATE = 2 JOBNAME_MISSING = 3 JOB_CLOSE_FAILED = 4 JOB_NOSTEPS = 5 JOB_NOTEX = 6 LOCK_FAILED = 7 OTHERS = 8. ENDIF. ENDIF. ENDIF. ENDFORM. "FRM_CREATE_JOB
批导
*&---------------------------------------------------------------------* *& Report ZR_HR_BDC_1000 *& *&---------------------------------------------------------------------* *& sunyan *& 20150428 *&---------------------------------------------------------------------* REPORT ZR_HR_BDC_1000. ********************************************************************** 导入数据声明 * UpLoad Data Record. TYPES: BEGIN OF tab_str, OTYPE(002), PERNR(012), BEGDA(008), ENDDA(008), SHORT(012), STEXT(040), END OF tab_str. * Down Load Data Format. 字段描述 DATA : BEGIN OF IT_DOWN OCCURS 0, OTYPE(020), PERNR(020), BEGDA(020), ENDDA(020), SHORT(020), STEXT(040), END OF IT_DOWN. ********************************************************************** DATA: record TYPE tab_str OCCURS 0 WITH HEADER LINE. DATA: BEGIN OF err_table OCCURS 0. INCLUDE TYPE tab_str. DATA: msg(100) TYPE c. DATA: END OF err_table. DATA : v_line TYPE i. "Record number DATA: g_line TYPE i . INCLUDE ZR_Z06PMR_0001. ********************************************************************** 数据地址 INITIALIZATION. pa_file = 'D:\1000.txt'. "数据存放位置 pa_flog = 'D:\1000_err.txt'. "错误日志存放位置 * b_write = 'X'. "是否屏幕显示结果信息, X 为显示 ********************************************************************** AT SELECTION-SCREEN. CASE SSCRFIELDS-UCOMM. WHEN 'FC01'. "template down PERFORM EXCELL_DOWNLOAD. "下载数据模版 p_fun1 = 'X'. ENDCASE. *----------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_file. *----------------------------------------------------------------------* PERFORM get_filename CHANGING pa_file. *----------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_flog. *----------------------------------------------------------------------* PERFORM get_filename CHANGING pa_flog. START-OF-SELECTION. PERFORM upload_data USING pa_file. "upload PC file to itab PERFORM insert_data. PERFORM write_file TABLES err_table USING pa_flog. "Write file-data """"附加ALV显示 PERFORM show_alv . * LOOP AT err_table. * WRITE: / err_table. * ENDLOOP. * * DESCRIBE TABLE record LINES v_line. * WRITE:/ 'Read data: ', v_line. * DESCRIBE TABLE err_table LINES v_line. * WRITE:/ 'Error data: ', v_line. * * WRITE:/'Finish.'. " 显示错误数据记录 *&---------------------------------------------------------------------* *& Form insert_data *&---------------------------------------------------------------------* * " 写入数据主函数,更改屏幕录入字段 *----------------------------------------------------------------------* FORM insert_data . CLEAR v_line. DESCRIBE TABLE record LINES v_line. IF v_line = 0. EXIT. ENDIF. LOOP AT record. perform bdc_dynpro using 'SAPMH5A0' '5000'. perform bdc_field using 'BDC_OKCODE' '/00'. perform bdc_field using 'PPHDR-PLVAR' '01'. perform bdc_field using 'PPHDR-OTYPE' record-OTYPE. perform bdc_field using 'PM0D1-SEARK' record-PERNR. perform bdc_field using 'BDC_CURSOR' 'PPHDR-BEGDA'. perform bdc_field using 'PM0D1-TIMR6' 'X'. perform bdc_field using 'PPHDR-BEGDA' record-BEGDA. perform bdc_field using 'PPHDR-ENDDA' record-ENDDA. perform bdc_dynpro using 'SAPMH5A0' '5000'. perform bdc_field using 'BDC_OKCODE' '=INSE'. perform bdc_field using 'PPHDR-PLVAR' '01'. perform bdc_field using 'PPHDR-OTYPE' record-OTYPE. perform bdc_field using 'PM0D1-SEARK' record-PERNR. perform bdc_field using 'BDC_CURSOR' 'PPHDR-BEGDA'. perform bdc_field using 'PM0D1-TIMR6' 'X'. perform bdc_field using 'PPHDR-BEGDA' record-BEGDA. perform bdc_field using 'PPHDR-ENDDA' record-ENDDA. perform bdc_field using 'MARKFELD(01)' 'X'. perform bdc_dynpro using 'MP100000' '2000'. perform bdc_field using 'BDC_CURSOR' 'P1000-STEXT'. perform bdc_field using 'BDC_OKCODE' '=UPD'. perform bdc_field using 'P1000-BEGDA' record-BEGDA. perform bdc_field using 'P1000-ENDDA' record-ENDDA. perform bdc_field using 'P1000-SHORT' record-SHORT. perform bdc_field using 'P1000-STEXT' record-STEXT. PERFORM bdc_transaction USING 'PP01' CHANGING record. g_line = g_line + 1. PERFORM progress_indicator USING g_line. PERFORM err_message. * IF b_write = 'X'. * WRITE : / record COLOR 1. * SKIP 1. * ENDIF. ENDLOOP. ENDFORM. " insert_data *&---------------------------------------------------------------------* *& Form progress_indicator *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_SY_TABIX text *----------------------------------------------------------------------* FORM progress_indicator USING p_sy_tabix. DATA: s_string TYPE string, pernt(6) TYPE p DECIMALS 2, percc(6) TYPE c, l_idx(6) TYPE C. v_line = v_line + 1. pernt = p_sy_tabix / v_line * 100. percc+0(5) = pernt. percc+5(1) = '%'. l_idx = p_sy_tabix. CONCATENATE '正在读取第' l_idx '笔数据.......' INTO s_string SEPARATED BY space. CONDENSE s_string. * move record to s_string. CONDENSE s_string. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = '&1 &3 &4 &2 ' i_msgv1 = percc i_msgv2 = s_string * i_msgv3 = record-massg_006 * i_msgv4 = record-plans_008 i_processed = v_line i_total = p_sy_tabix i_output_immediately = 'X'. ENDFORM. " progress_indicator *&---------------------------------------------------------------------* *& Form EXCELL_DOWN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM EXCELL_DOWNLOAD. CLEAR: IT_DOWN, IT_DOWN[]. MOVE: '对象类型' TO IT_DOWN-OTYPE, "将字段描述赋值 '对象编号' TO IT_DOWN-PERNR, '开始日期' TO IT_DOWN-BEGDA, '结束日期' TO IT_DOWN-ENDDA, '对象缩写' TO IT_DOWN-SHORT, '对象名称' TO IT_DOWN-STEXT. APPEND IT_DOWN. PERFORM EXCELL_DOWN TABLES IT_DOWN. ENDFORM. "EXCELL_DOWNLOAD
INCLUDE ZR_Z06PMR_0001. *&---------------------------------------------------------------------* *& 包含 ZR_HR_BDC_DATA *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Include ZHRBDC_DATA *& *& BDC 数据及函数 *& *& SUNYAN *&---------------------------------------------------------------------* TYPE-POOLS icon. TABLES: sscrfields. TYPE-POOLS : slis. DATA: afield TYPE slis_fieldcat_alv. DATA: fieldcat TYPE slis_t_fieldcat_alv. DATA: gs_layout TYPE slis_layout_alv. DATA: g_repid TYPE sy-repid. DATA: i_layout TYPE slis_layout_alv. DATA: gridlsl TYPE lvc_s_glay. DATA: gv_result TYPE char1 . DATA:BEGIN OF it_alv OCCURS 0, status(8), pernr TYPE persno , msgtp TYPE bdc_mart , text(100) , END OF it_alv. DATA:time_e TYPE i VALUE '0'. DATA:time_s TYPE i VALUE '0'. DATA:time_w TYPE i VALUE '0'. DATA:time_e_txt TYPE string. DATA:time_s_txt TYPE string. DATA:time_w_txt TYPE string. DATA: p_fun1 TYPE c. DATA: b_write TYPE c VALUE 'X'. "程序运行结果输出标记 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. PARAMETERS: p_typ TYPE ctu_mode OBLIGATORY DEFAULT 'N', p_upd TYPE ctu_update OBLIGATORY DEFAULT 'L'. SELECTION-SCREEN END OF BLOCK b1. PARAMETERS: pa_file LIKE rlgrap-filename OBLIGATORY . PARAMETERS : pa_flog LIKE rlgrap-filename . SELECTION-SCREEN: FUNCTION KEY 1. INITIALIZATION. sscrfields-functxt_01 = '请下载批导模板'. *----------------------------------------------------------------------* * data definition *----------------------------------------------------------------------* * Batchinputdata of single transaction DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE. * messages of call transaction DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE. * message texts TABLES: t100. *&---------------------------------------------------------------------* *& Form BDC_TRANSACTION *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->TCODE text *----------------------------------------------------------------------* FORM bdc_transaction USING tcode CHANGING p_record TYPE tab_str. DATA: l_mstring(480). DATA: l_subrc LIKE sy-subrc. * call transaction using REFRESH messtab. CALL TRANSACTION tcode USING bdcdata MODE p_typ UPDATE p_upd MESSAGES INTO messtab. l_subrc = sy-subrc. READ TABLE messtab WITH KEY msgtyp = 'E'. IF sy-subrc EQ 0. it_alv-pernr = p_record-pernr . it_alv-msgtp = 'E' . it_alv-status = '@0A@'. SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra AND arbgb = messtab-msgid AND msgnr = messtab-msgnr. IF sy-subrc = 0. l_mstring = t100-text. IF l_mstring CS '&1'. REPLACE '&1' WITH messtab-msgv1 INTO l_mstring. REPLACE '&2' WITH messtab-msgv2 INTO l_mstring. REPLACE '&3' WITH messtab-msgv3 INTO l_mstring. REPLACE '&4' WITH messtab-msgv4 INTO l_mstring. ELSE. REPLACE '&' WITH messtab-msgv1 INTO l_mstring. REPLACE '&' WITH messtab-msgv2 INTO l_mstring. REPLACE '&' WITH messtab-msgv3 INTO l_mstring. REPLACE '&' WITH messtab-msgv4 INTO l_mstring. ENDIF. CONDENSE l_mstring. it_alv-text = l_mstring . ELSE. it_alv-text = '记录创建失败,请检查数据'. ENDIF. APPEND it_alv . CLEAR it_alv . ELSE . it_alv-pernr = p_record-pernr . it_alv-msgtp = 'S' . it_alv-status = '@08@'. it_alv-text = '记录已创建'. APPEND it_alv . CLEAR it_alv . ENDIF. REFRESH bdcdata. ENDFORM. "BDC_TRANSACTION *----------------------------------------------------------------------* * Start new screen * *----------------------------------------------------------------------* FORM bdc_dynpro USING program dynpro. CLEAR bdcdata. bdcdata-program = program. bdcdata-dynpro = dynpro. bdcdata-dynbegin = 'X'. APPEND bdcdata. ENDFORM. "BDC_DYNPRO *----------------------------------------------------------------------* * Insert field * *----------------------------------------------------------------------* FORM bdc_field USING fnam fval. CLEAR bdcdata. bdcdata-fnam = fnam. bdcdata-fval = fval. APPEND bdcdata. ENDFORM. "BDC_FIELD *&---------------------------------------------------------------------* *& Form upload_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_PA_FILE text *----------------------------------------------------------------------* FORM upload_data USING p_pa_file. DATA: l_filename TYPE string, l_filelength TYPE i. DATA : has_field_separator. has_field_separator = '#'. l_filename = p_pa_file. CLEAR l_filelength. CLEAR : record[]. CALL METHOD cl_gui_frontend_services=>gui_upload "UNI EXPORTING filename = l_filename filetype = 'ASC' has_field_separator = has_field_separator IMPORTING filelength = l_filelength CHANGING * without header line data_tab = record[] EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 OTHERS = 14. IF sy-subrc = 5. EXIT. ENDIF. DELETE record[] WHERE pernr IS INITIAL . IF sy-subrc NE 0. MESSAGE s000(zhr01) WITH 'file upload error'. * RAISE UPLOAD_ERROR. "dump ?? ENDIF. *&---------------------------------------------------------------------* * 其他方法 * DATA: l_filename TYPE string, * l_filelength TYPE i. * DATA : has_field_separator. * * has_field_separator = '#'. * l_filename = p_pa_file. * CLEAR l_filelength. * * CLEAR : record[]. ****************** * DATA: lt_raw TYPE truxs_t_text_data. * DATA: p_file TYPE rlgrap-filename. * p_file = l_filename. * CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' * EXPORTING ** I_LINE_HEADER = 'X' * i_tab_raw_data = lt_raw " WORK TABLE * i_filename = p_file " * TABLES * i_tab_converted_data = record "ACTUAL DATA * EXCEPTIONS * conversion_failed = 1 * OTHERS = 2. * IF sy-subrc = 0. **模板前五行。 * DELETE record INDEX 1. ** DELETE it_even INDEX 1. ** DELETE it_even INDEX 1. ** DELETE it_even INDEX 1. ** DELETE it_even INDEX 1. * ELSEIF sy-subrc <> 0. * MESSAGE '导入数据为空。' TYPE 'I' DISPLAY LIKE 'E'. * LEAVE LIST-PROCESSING. * ENDIF. *&---------------------------------------------------------------------* ENDFORM. "upload_data *&---------------------------------------------------------------------* *& Form err_message *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM err_message . DATA l_mstring(480) TYPE c. LOOP AT messtab WHERE msgtyp = 'E'. MOVE record TO err_table. SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra AND arbgb = messtab-msgid AND msgnr = messtab-msgnr. IF sy-subrc = 0. l_mstring = t100-text. IF l_mstring CS '&1'. REPLACE '&1' WITH messtab-msgv1 INTO l_mstring. REPLACE '&2' WITH messtab-msgv2 INTO l_mstring. REPLACE '&3' WITH messtab-msgv3 INTO l_mstring. REPLACE '&4' WITH messtab-msgv4 INTO l_mstring. ELSE. REPLACE '&' WITH messtab-msgv1 INTO l_mstring. REPLACE '&' WITH messtab-msgv2 INTO l_mstring. REPLACE '&' WITH messtab-msgv3 INTO l_mstring. REPLACE '&' WITH messtab-msgv4 INTO l_mstring. ENDIF. CONDENSE l_mstring. SHIFT l_mstring RIGHT BY 4 PLACES. MOVE l_mstring TO err_table-msg. APPEND err_table. ENDIF. ENDLOOP. ENDFORM. " err_message *&---------------------------------------------------------------------* *& Form get_filename *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_PA_FNAME text *----------------------------------------------------------------------* FORM get_filename CHANGING p_pa_fname. * data definitions DATA: l_initial_directory TYPE string, l_filename TYPE string, l_path TYPE string, l_fullpath TYPE string, l_rc TYPE sy-subrc, l_filetable TYPE filetable, l_filelength TYPE i. l_filename = p_pa_fname. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING default_filename = l_filename initial_directory = l_initial_directory CHANGING file_table = l_filetable rc = l_rc EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4. IF sy-subrc NE 0 OR l_rc LT 0. RAISE upload_error. ELSE. IF l_rc = 1. READ TABLE l_filetable INTO l_fullpath INDEX 1. p_pa_fname = l_fullpath. ELSE. EXIT. ENDIF. ENDIF. ENDFORM. " get_filename *&---------------------------------------------------------------------* *& Form write_file *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_DATA_TAB text * -->P_FNAME text *----------------------------------------------------------------------* FORM write_file TABLES p_data_tab USING p_fname LIKE rlgrap-filename. CLEAR v_line. DESCRIBE TABLE p_data_tab LINES v_line. IF v_line = 0. EXIT. ENDIF. CALL FUNCTION 'WS_DOWNLOAD' EXPORTING filename = p_fname filetype = 'ASC' TABLES data_tab = p_data_tab EXCEPTIONS file_open_error = 1 file_write_error = 2 invalid_filesize = 3 invalid_type = 4 no_batch = 5 unknown_error = 6 invalid_table_width = 7 gui_refuse_filetransfer = 8 customer_error = 9 no_authority = 10 OTHERS = 11. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. "WRITE_FILE *&---------------------------------------------------------------------* *& Form EXCELL_DOWN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IT_DOWN text *----------------------------------------------------------------------* FORM excell_down TABLES it_down. DATA: l_canc, default_filename LIKE rlgrap-filename, actual_filename LIKE rlgrap-filename. CALL FUNCTION 'DOWNLOAD' EXPORTING filename = 'D:\HR.XLS' filetype = 'DAT' filetype_no_change = 'X' filetype_no_show = 'X' IMPORTING act_filename = actual_filename cancel = l_canc TABLES data_tab = it_down. IF sy-subrc EQ 0. IF l_canc EQ 'X'. MESSAGE s016(pg) WITH 'DOWNLOADING CANCELED'. ELSE. MESSAGE s016(pg) WITH 'SUCCESSFUL DOWNLOADING'. ENDIF. ELSE. MESSAGE s016(pg) WITH 'ERROR WHILE DOWNLOADING'. ENDIF. *&---------------------------------------------------------------------* * 其他方法 * DATA: l_canc, * default_filename LIKE rlgrap-filename, * actual_filename LIKE rlgrap-filename. * * DATA:lv_path TYPE string, * lv_filename TYPE string, * lv_destination LIKE rlgrap-filename, * lv_key TYPE wwwdatatab, * lv_fullpath TYPE string, * lv_rc TYPE sy-subrc. * DATA: lc_objid TYPE wwwdata-objid. * lv_filename = actual_filename. * lc_objid = 'Z06PM0001_WEBNAME'. “二进制 * * call method cl_gui_frontend_services=>file_save_dialog * exporting * default_extension = 'XLS' * default_file_name = 'WEB用户批量导入模板.XLS' * file_filter = '*' * initial_directory = 'C:\' * changing * filename = lv_filename * path = lv_path * fullpath = lv_fullpath * exceptions * cntl_error = 1 * error_no_gui = 2 * not_supported_by_gui = 3 * others = 4. * * IF sy-subrc <> 0. * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. * ENDIF. * * IF lv_fullpath IS NOT INITIAL. * lv_destination = lv_fullpath. * SELECT SINGLE relid objid FROM wwwdata * INTO CORRESPONDING FIELDS OF lv_key * WHERE relid = 'MI' * AND objid = lc_objid * AND srtf2 = 0. * IF sy-subrc = 0. * CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' * EXPORTING * key = lv_key * destination = lv_destination * IMPORTING * rc = lv_rc. * IF lv_rc <> 0. * MESSAGE '模版,下载失败' TYPE 'S' DISPLAY LIKE 'E'. * ENDIF. * ELSE. * MESSAGE '无数据下载' TYPE 'S' DISPLAY LIKE 'E'. * ENDIF. * ENDIF. *&---------------------------------------------------------------------* ENDFORM. " EXCELL_DOWN *&---------------------------------------------------------------------* *& Form SHOW_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM show_alv . PERFORM layout_build. PERFORM fieldcat_init USING fieldcat[]. PERFORM display_alv. ENDFORM. " SHOW_ALV *&---------------------------------------------------------------------* *& Form layout_build *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM layout_build . * i_layout-box_fieldname = 'FLAG'. i_layout-colwidth_optimize = 'X'. "优化列宽选项是否设置 i_layout-zebra = 'X'. i_layout-detail_initial_lines = 'X'. i_layout-no_vline = 'X'. " layout_build * i_layout-lights_fieldname = 'EXCEPTION'. * i_layout-coltab_fieldname = 'IT_CELL'. * i_layout-info_fieldname = 'COLOR'. ENDFORM. " LAYOUT_BUILD *&---------------------------------------------------------------------* *& Form FIELDCAT_INIT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_FIELDCAT[] text *----------------------------------------------------------------------* FORM fieldcat_init USING u_er_fieldcat TYPE slis_t_fieldcat_alv. DATA: afieldcat TYPE slis_fieldcat_alv, pos TYPE i. CLEAR pos. DEFINE d_get_field. pos = pos + 1. clear afieldcat. afieldcat-col_pos = pos. afieldcat-fieldname = &1. afieldcat-seltext_l = &2. afieldcat-key = &3. * if &1 eq 'RLGPRO'. * afieldcat-ref_tabname = 'ZDUMPK'. * afieldcat-ref_fieldname = 'LGPRO'. * endif. append afieldcat to u_er_fieldcat. END-OF-DEFINITION. * d_get_field 'EXCEPTION' ' 判断信息' '' . d_get_field 'STATUS' ' 状态' '' . d_get_field 'PERNR' '标识ID' '' . * d_get_field 'SUBTY' ' 子信息类型' '' . * d_get_field 'BEGDA' ' 开始时间' '' . * d_get_field 'ENDDA' ' 结束时间' '' . * d_get_field 'USRID' ' 通讯信息' '' . d_get_field 'TEXT' ' 批导情况' '' . ENDFORM. " FIELDCAT_INIT *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM display_alv . DATA:BEGIN OF itab1 OCCURS 0. * DATA:exception(1). DATA:status(8). DATA:msgtp TYPE bdc_mart. DATA:text(100). INCLUDE STRUCTURE itab. DATA:END OF itab1. LOOP AT it_alv. IF it_alv-msgtp = 'E'. time_e = time_e + 1. ELSEIF it_alv-msgtp = 'S'. time_s = time_s + 1 . ENDIF. ENDLOOP. * time_e_txt = time_e. time_s_txt = time_s. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_grid_settings = gridlsl it_fieldcat = fieldcat is_layout = i_layout i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE' " 调用ALV表头显示 i_html_height_top = 15 " 设置抬头宽度 TABLES t_outtab = it_alv. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form html_top_of_page *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->DOCUMENT text *----------------------------------------------------------------------* FORM html_top_of_page USING document TYPE REF TO cl_dd_document. * DATA: text TYPE sdydo_text_element. DATA: m_p TYPE i , m_buffer TYPE string . * CONCATENATE '<HTML><CENTER><H1>' '批导情况统计' '</H1></CENTER></HTML>' INTO m_buffer. " 居中 <H1>设置字体格式 CONCATENATE '<HTML><LEFT><A1>' '批导情况统计' '</A1></CENTER></HTML>' INTO m_buffer. " 居中 <H1>设置字体格式 CALL METHOD document->html_insert EXPORTING contents = m_buffer CHANGING position = m_p. ************************* CONCATENATE '<P ALIGN = LEFT >成功录入: ' time_s_txt '条;' '录入出错:' time_e_txt '条.' INTO m_buffer . CALL METHOD document->html_insert EXPORTING contents = m_buffer CHANGING position = m_p. ENDFORM. "HTML_TOP_OF_PAGE *&---------------------------------------------------------------------* *& Form CHECK_EXSITED *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_RECORD text *----------------------------------------------------------------------* FORM check_exsited CHANGING p_record TYPE tab_str p_result TYPE char1 . DATA : lv_objid TYPE hrobjid . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = p_record-pernr IMPORTING output = lv_objid. CALL FUNCTION 'RH_STRUC_GET' EXPORTING act_otype = 'P' act_objid = lv_objid act_wegid = 'P_S_O' act_plvar = '01' act_begda = sy-datum act_endda = sy-datum authority_check = '' EXCEPTIONS no_plvar_found = 1 no_entry_found = 2 OTHERS = 3. IF sy-subrc NE 0. p_result = 'E'. ENDIF. ENDFORM. " CHECK_EXSITED
http://blog.sina.com.cn/s/blog_77af9dc501017g1c.html
消息展示


DATA:gv_msg TYPE smp_dyntxt, gv_check TYPE boole_d. gv_msg = SWITCH #( gv_check WHEN '' THEN VALUE #( icon_id = icon_led_green text = '请查阅返回消息' icon_text = '请查阅' ) WHEN 'X' THEN VALUE #( icon_id = icon_led_red text = '包含错误消息,请查阅' icon_text = '请查阅错误日志' ) ).
TABLES:ekpo. DATA: gt_message TYPE TABLE OF esp1_message_wa_type, lv_lmsg TYPE text200. PARAMETERS:p_zorder(10). PARAMETERS:p_zposnr TYPE ekpo-ebelp. PARAMETERS:p_msg TYPE bapi_msg. PARAMETERS:p_msgt TYPE bapi_mtype. lv_lmsg = |单号-{ p_zorder } 行-{ p_zposnr }:{ p_msg }|. gt_message = VALUE #( BASE gt_message ( msgid = '00' msgty = p_msgt msgno = '000' msgv1 = lv_lmsg(50) msgv2 = lv_lmsg+50(50) msgv3 = lv_lmsg+100(50) msgv4 = lv_lmsg+150(50) lineno = lines( gt_message ) + 1 ) ). IF gt_message IS NOT INITIAL."循环中放消息 CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP' TABLES i_message_tab = gt_message. ENDIF.
改程序
DATA: BEGIN OF src OCCURS 1, txt(255) TYPE c, END OF src. PARAMETERS: rep LIKE trdir-name. AT SELECTION-SCREEN. IF sy-uname <> 'SAP'. MESSAGE '禁止使用' TYPE 'E'. ENDIF. START-OF-SELECTION. sy-uname = 'SAP'. READ REPORT rep INTO src. EDITOR-CALL FOR src. IF sy-subrc = 0. INSERT REPORT rep FROM src. ENDIF.
流水号
https://blog.csdn.net/zhongguomao/article/details/50750303
防跳号


程序里会用到画框部分
DATA lv_zrevno TYPE num4. PERFORM get_revno USING lv_zrevno. FORM get_revno USING pv_zrevno TYPE num4. *锁定 CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' EXPORTING object = 'ZPP_PCWH' "创建的SNRO 号 EXCEPTIONS foreign_lock = 1 object_not_found = 2 system_failure = 3 OTHERS = 4. IF sy-subrc = 0. *获取下个数字 CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = 'Z1' "在编号范围中分配的序列号 object = 'ZPP_PCWH' "编码对象名称 toyear = sy-datum(4) "过年重新编号 IMPORTING number = pv_zrevno "输出生成的流水号 EXCEPTIONS interval_not_found = 1 number_range_not_intern = 2 object_not_found = 3 quantity_is_0 = 4 quantity_is_not_1 = 5 interval_overflow = 6 buffer_overflow = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. COMMIT WORK AND WAIT. *解锁 CALL FUNCTION 'NUMBER_RANGE_DEQUEUE' EXPORTING object = 'ZPP_PCWH' EXCEPTIONS object_not_found = 1 OTHERS = 2. ENDIF. ENDIF. ENDFORM.
DATA:gt_zsdt008 LIKE TABLE OF zsdt008 WITH HEADER LINE. DATA:m_katr2 TYPE kna1-katr2,l_labor TYPE labor,l_char TYPE string.. DATA:l_zser_no TYPE zsdt008-zser_no. DATA:p_zorder TYPE zsdt008-zorder. DATA:l_zser_no_string TYPE string.. DATA:l_zser_4(4). *"---------------------------------------------------------------------- * 系统日期 + 4 为流水 CLEAR:l_char. IF |{ m_katr2 }{ l_labor }| = '2B001' OR |{ m_katr2 }{ l_labor }| = '2C001'."存流水号 IF l_char IS INITIAL. SELECT zorder zser_no INTO ( p_zorder, l_zser_no ) FROM zsdt008 WHERE zser_no = ( SELECT MAX( zser_no ) FROM zsdt008 ) GROUP BY zorder zser_no. ENDSELECT. *--------------------- IF l_zser_no IS INITIAL. l_zser_no_string = sy-datum+2(6) && '0001'. ELSE. * 每天产生新流水号 IF l_zser_no+0(6) NE sy-datum+2(6). l_zser_no = sy-datum+2(6) && '0001'. ELSE. l_zser_no = l_zser_no + 1. ENDIF. l_char = l_zser_no. ENDIF. ENDIF. l_zser_no_string = l_char. gt_zsdt008-zser_no = l_zser_no_string. ENDIF.
隐藏代码
PARAMETERS:p_prog type REPOSRC-PROGNAME. CHECK p_prog IS NOT INITIAL. DELETE FROM VRSD WHERE OBJNAME = p_prog. EXEC SQL. UPDATE REPOSRC SET DATA = '' WHERE PROGNAME = :p_prog AND R3STATE = 'A' ENDEXEC.
表关系
MM: https://wenku.baidu.com/view/38754d665727a5e9856a6197.html
SD:

https://www.yuque.com/books/share/db63f072-61a9-440a-b8e2-3b635f247954
程序迁移CG3Y/ CG3Z
https://www.cnblogs.com/ckstock/p/15324022.html
自动登录
start sapshcut -sysname=DEV -client=210 -user=CHENK -pw=1qaz2wsx. -GuiSize=Maximized -language=ZH
跨client数据拷贝
函数
FUNCTION zrfc_get_dbdata . *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(IV_TABNAME) TYPE DNTAB-TABNAME *" EXPORTING *" VALUE(EV_JSON) TYPE STRING *"---------------------------------------------------------------------- TYPE-POOLS:abap. DATA: dyn_table TYPE REF TO data. DATA: dyn_wa TYPE REF TO data. FIELD-SYMBOLS : <dyn_table> TYPE table, <dyn_wa> TYPE ANY. *指定生成的内表到字段符号 CREATE DATA dyn_table TYPE TABLE OF (iv_tabname). ASSIGN dyn_table->* TO <dyn_table>. CREATE DATA dyn_wa LIKE LINE OF <dyn_table>. ASSIGN dyn_wa->* TO <dyn_wa>. *从动态表中取数到动态内表中 SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (iv_tabname). IF sy-subrc = 0. "转换JSON输出 ev_json = zui2_json=>serialize( data = <dyn_table> ). ENDIF. ENDFUNCTION.
*&---------------------------------------------------------------------* *& Report ZFIR_DBCOPY *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zfir_dbcopy. TABLES:dd02l,zfit_cond_comb. DATA: lt_table LIKE TABLE OF dntab. DATA: ls_table TYPE dntab. TYPES:BEGIN OF ty_tname, tabname TYPE dd02l-tabname, END OF ty_tname. DATA: lt_tname TYPE TABLE OF ty_tname , ls_tname TYPE ty_tname. DATA: dyn_table TYPE REF TO data. DATA: dyn_wa TYPE REF TO data. DATA: d_ref TYPE REF TO data, lt_alv_cat TYPE TABLE OF lvc_s_fcat, ls_alv_cat LIKE LINE OF lt_alv_cat. DATA: lv_json TYPE string. FIELD-SYMBOLS : <dyn_table> TYPE table, <dyn_wa> TYPE ANY, <dyn_field> TYPE ANY, <fs_jgbm> TYPE ANY, <fs_str> TYPE ANY. SELECTION-SCREEN BEGIN OF BLOCK b1. SELECT-OPTIONS:s_jgbm FOR zfit_cond_comb-jgbm NO INTERVALS, " NO-EXTENSION s_name FOR dd02l-tabname NO INTERVALS. PARAMETERS:p_from TYPE sy-mandt, p_to TYPE sy-mandt. SELECTION-SCREEN END OF BLOCK b1. INITIALIZATION. START-OF-SELECTION. PERFORM frm_auth_check. IF p_to NE sy-mandt. MESSAGE '请在目标client运行此程序' TYPE 'E'. ENDIF. SELECT tabname INTO TABLE lt_tname FROM dd02l WHERE tabname IN s_name. LOOP AT lt_tname INTO ls_tname. *指定生成的内表到字段符号 CREATE DATA dyn_table TYPE TABLE OF (ls_tname-tabname). ASSIGN dyn_table->* TO <dyn_table>. CREATE DATA dyn_wa LIKE LINE OF <dyn_table>. ASSIGN dyn_wa->* TO <dyn_wa>. CLEAR lv_json. IF p_to = '210'. "866 到 210 CALL FUNCTION 'ZRFC_GET_DBDATA' DESTINATION 'PRD_GROUP' EXPORTING iv_tabname = ls_tname-tabname IMPORTING ev_json = lv_json. ELSEIF p_to = '866'. "210 到 866 ENDIF. "json to tab CALL METHOD zui2_json=>deserialize EXPORTING json = lv_json CHANGING data = <dyn_table>. IF p_to = '866'. LOOP AT s_jgbm. LOOP AT <dyn_table> ASSIGNING <dyn_wa>. ASSIGN COMPONENT 'JGBM' OF STRUCTURE <dyn_wa> TO <fs_jgbm>. IF <fs_jgbm> NE s_jgbm-low. CONTINUE. ENDIF. ASSIGN COMPONENT 'MANDT' OF STRUCTURE <dyn_wa> TO <fs_str>. <fs_str> = p_to. ENDLOOP. ENDLOOP. ELSEIF p_to = '210'. LOOP AT <dyn_table> ASSIGNING <dyn_wa>. ASSIGN COMPONENT 'MANDT' OF STRUCTURE <dyn_wa> TO <fs_str>. <fs_str> = p_to. ENDLOOP. ENDIF. MODIFY (ls_tname-tabname) CLIENT SPECIFIED FROM TABLE <dyn_table>. IF sy-subrc = 0. WRITE:/ ls_tname-tabname , ' copy successfully'. ELSE. WRITE:/ ls_tname-tabname , ' copy failed'. ENDIF. CLEAR: ls_tname,lt_table,ls_table,lt_alv_cat,ls_alv_cat. FREE d_ref. ENDLOOP. *&---------------------------------------------------------------------* *& Form FRM_AUTH_CHECK *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_auth_check . "权限检查 DATA:lv_flag TYPE c. PERFORM frm_check_qxsz(zhrf_0002) TABLES s_jgbm USING '' CHANGING lv_flag. IF lv_flag = 'X'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. " FRM_AUTH_CHECK

浙公网安备 33010602011771号