理论
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
选择帮助及table control
组织选择帮助
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、带自定义参考文本的选择帮助
TYPE-POOLS: vrm. DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE OF list. REFRESH list. CLEAR list. PARAMETERS: iscn TYPE c 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.
4、 弹出框多筛选条件的搜索帮助
TABLES makt. DATA: BEGIN OF str_f4, matnr TYPE matnr, maktx TYPE maktx, END OF str_f4. DATA:l_it_f4 LIKE TABLE OF str_f4. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01. SELECT-OPTIONS: s_matnr FOR makt-matnr NO INTERVALS. SELECTION-SCREEN END OF BLOCK b1. "帮助 AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_matnr-low. SELECT * FROM makt INTO CORRESPONDING FIELDS OF TABLE l_it_f4. PERFORM frm_f4." USING \'S_MATNR-LOW\' . *&------------------------------------------------------------------- *& 搜索帮助 *&------------------------------------------------------------------- FORM frm_f4. DATA g_shlp_descr_t TYPE shlp_descr_t. DATA gwa_shlp_descr_t_interface TYPE ddshiface. DATA: gt_return_tab TYPE TABLE OF ddshretval WITH HEADER LINE. "调用标准帮助 CALL FUNCTION \'F4IF_GET_SHLP_DESCR\' EXPORTING shlpname = \'MAT1W\' shlptype = \'SH\' IMPORTING shlp = g_shlp_descr_t. LOOP AT g_shlp_descr_t-interface INTO gwa_shlp_descr_t_interface. IF gwa_shlp_descr_t_interface = \'MATNR\'. gwa_shlp_descr_t_interface-valfield = \'X\'. MODIFY g_shlp_descr_t-interface FROM gwa_shlp_descr_t_interface. ENDIF. ENDLOOP. CALL FUNCTION \'F4IF_START_VALUE_REQUEST\' EXPORTING shlp = g_shlp_descr_t maxrecords = 500 multisel = \'X\' TABLES return_values = gt_return_tab. "获取选中值 可以多选 拥有select options LOOP AT gt_return_tab. s_matnr-sign = \'I\'. s_matnr-option = \'EQ\'. s_matnr-low = gt_return_tab-fieldval. APPEND s_matnr. ENDLOOP. ENDFORM. " FRM_F4
5、 联动搜索帮助
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
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有些区别
聚合函数
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
选择屏幕
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\'. 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 . *&---------------------------------------------------------------------* 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. *&---------------------------------------------------------------------*
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: 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
结构
SQL
http://blog.sina.com.cn/s/blog_77af9dc501017g1c.html
DBCO
https://blog.csdn.net/qq_42080586/article/details/108867449
https://mp.weixin.qq.com/s/xL5e1BjR3UT4eS0xaBHuZw
sap官方是不支持mysql的
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.
其他服务器取数:
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.
动态内表
思想:首先造一个需要动态展示的结构字段,再进行行列转秩,循环内表,将数值写<fs> ,再 APPEND <dyn_wa> TO <dyn_table>.
bpc
DATA: dyn_table TYPE REF TO data. DATA: dyn_wa TYPE REF TO data,p_name TYPE string. FIELD-SYMBOLS: <dyn_table> TYPE table, <dyn_wa> TYPE any, <fs> TYPE any. TYPES : BEGIN OF ty_bk_year , z_entity_bk(32), year_actual(32), next_year_adjust(32), next_year_res(32), next_year_g_r(32), END OF ty_bk_year. p_name = \'TY_BK_YEAR\'. CREATE DATA dyn_table TYPE TABLE OF (p_name). ASSIGN dyn_table->* TO <dyn_table>. CREATE DATA dyn_wa LIKE LINE OF <dyn_table>. ASSIGN dyn_wa->* TO <dyn_wa>. ** 下面往结构里写数 LOOP AT gt_yt_bk ASSIGNING FIELD-SYMBOL(<fs2>).. * <fs2>-z_entity = |BCSYB.INP|."写死 <fs2>-z_entity = |YT.INP_TOTAL|."写死 ASSIGN COMPONENT \'Z_ENTITY_BK\' OF STRUCTURE <dyn_wa> TO <fs>. <fs> = <fs2>-z_entity. ASSIGN COMPONENT \'YEAR_ACTUAL\' OF STRUCTURE <dyn_wa> TO <fs>. " READ TABLE it_year_yt_act INTO is_year_yt_act WITH KEY z_entity = <fs2>-z_entity z_product = <fs2>-z_product . IF sy-subrc = 0. <fs> = is_year_yt_act-signeddata. CONDENSE <fs>. ENDIF. <fs> = 666."写死 CONDENSE <fs>. ASSIGN COMPONENT \'NEXT_YEAR_ADJUST\' OF STRUCTURE <dyn_wa> TO <fs>. " READ TABLE it_year_yt_adju INTO is_year_yt_adju WITH KEY z_entity = <fs2>-z_entity z_product = <fs2>-z_product . IF sy-subrc = 0. <fs> = is_year_yt_adju-signeddata. CONDENSE <fs>. ENDIF. * ASSIGN COMPONENT \'NEXT_YEAR_RES\' OF STRUCTURE <dyn_wa> TO <fs>. " * <fs> = <fs2>-signeddata. ASSIGN COMPONENT \'NEXT_YEAR_G_R\' OF STRUCTURE <dyn_wa> TO <fs>. " <fs> = <fs2>-signeddata. CONDENSE <fs>. AT END OF z_entity. APPEND <dyn_wa> TO <dyn_table>. ENDAT. ENDLOOP.
LOOP AT <dyn_table> INTO <dyn_wa>.
ENDLOOP.
*----------------------------------------------------------------------* * 动态内表 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
动态内表排序
动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用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).
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.
内存传值三(不展示ALV)
1 DATA: ls_data TYPE REF TO data. 2 *DATA:s_matnr TYPE RANGE OF matnr. 3 *DATA:seltab TYPE TABLE OF rsparams, 4 * seltab_wa LIKE LINE OF seltab. 5 *seltab = VALUE #( FOR s IN s_matnr ( sign = \'I\' low = s-low high = \'\' selname = \'S_MATNR\' option = \'EQ\' ) ). 6 *seltab = VALUE #( BASE seltab ( sign = \'I\' low = \'\' high = \'\' selname = \'P_MA\' option = \'EQ\' ) 7 * ( sign = \'I\' low = \'\' high = \'\' selname = \'P_KA\' option = \'EQ\' ) 8 * ( sign = \'I\' low = sy-datum high = \'\' selname = \'P_DATE\' option = \'EQ\' ) 9 * ( sign = \'I\' low = \'\' high = \'\' selname = \'S_UPDATE\' option = \'EQ\' ) ). 10 * 11 *SUBMIT zsdi004 12 * WITH SELECTION-TABLE seltab 13 * AND RETURN. 14 FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. 15 CALL METHOD cl_salv_bs_runtime_info=>set "可以让被调用的ALV不显示出来 16 EXPORTING 17 display = \'\' 18 metadata = \'\' " 防止基本信息(布局,字段目录等)被取到内存中 19 data = \'X\'. "迫使数据表导出到内存而不是显示报表 20 *SUBMIT z93_fico_r003 WITH p_vkorg = \'9399\' WITH p_werks = \'9900\' WITH s_ny-low = \'201606\' AND RETURN. 21 SUBMIT zsdr07 WITH s_zcxtgh-low = \'2019093000001\' AND RETURN. 22 *GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。 23 *参数: 24 * T_DATA - 输出参数数据表。 25 * T_DATA_LINE - 如果执行的ALV有HEADER(可选)。 26 27 TRY . 28 CALL METHOD cl_salv_bs_runtime_info=>get_data_ref 29 IMPORTING 30 r_data = ls_data 31 * R_DATA_LINE = "如果执行的ALV有HEADER的(可选) 32 . 33 ASSIGN ls_data->* TO <lt_data>. 34 CATCH cx_salv_bs_sc_runtime_info. 35 MESSAGE \'UNABLE TO RETRIEVE ALV DATA\' TYPE \'E\'. 36 ENDTRY. 37 cl_salv_bs_runtime_info=>clear_all( )."此方法清除在set()方法设置的标志。如果之后本程序还需要显示其他ALV 那么这个方法尤为重要。如果不清除设置,你的ALV就不会被显示出来 38 39 DATA gt_zppt_b001_yg LIKE TABLE OF zppt_b001_yg WITH HEADER LINE. 40 FIELD-SYMBOLS:<af1> TYPE any . 41 IF <lt_data> IS ASSIGNED. 42 LOOP AT <lt_data> ASSIGNING <af1>. 43 gt_zppt_b001_yg = CORRESPONDING #( <af1> ). 44 APPEND gt_zppt_b001_yg.CLEAR gt_zppt_b001_yg. 45 ENDLOOP. 46 ENDIF.
增强
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.
后台设置
一、se38 进入程序首先设置变式,如下图:
需要注意的是对于动态变式的设置,如下
在下面这里可以控制变式运行时的时间周期范围:
然后点击 即完成变式的保存。
二、 运行事务代码SM36进入后台设置界面
三、先给后台作业命名,然后选择“开始条件”进入后台运行条件设置
四、设置后台出发时间和频率,然后点击保存
然后保存即可。
五、进入“步骤”选择需运行的程序以及对应的变式,点击保存进入步骤清单总览进入审核,如果问题可进行修改,确认无误后点击返回按钮,再保存即可,点击检查可以自动弹出第一步保存的变式
返回后点击保存即完成后台的设置了。
六、SM36创建成功后,通过SM37可以对所创建的后台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=DKDEV -client=200 -user=MTC_WUY -pw=Snailwac -language=ZH