首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >多套SAP ERP之间一键同步ABAP开发内容

多套SAP ERP之间一键同步ABAP开发内容

作者头像
齐天大圣
发布2026-03-22 14:33:49
发布2026-03-22 14:33:49
1140
举报

声明:本文仅代表原作者观点,仅用于ERP行业应用和交流,不代表任何公司

最近在做一个项目,开发了一大堆的域、数据元素、表、结构、程序、函数等。跟往常的项目开发不同的是,这个项目需要在好几套单独的SAP上线,也就是说,这些开发的内容需要部署在好几套SAP上,这几套SAP有S4、ECC和R3,但是都可以通过RFC互相连通。

正常的做法是把开发的东西在每一套SAP做一遍,修改的时候也依次修改一遍。或者在其中一个系统做好后,把完整的请求传输到另外的系统,挨个传输一遍。

这两种做法都很烦,第一种方式需要机械的把东西重新做一遍,如果有修改,就在所有系统都重新修改一遍,且不说烦不烦,光是时间浪费也挺要命。

第二种方式,有些东西在每个系统是不一致的,如果是整体请求传输到另外系统,就把正确的对象覆盖了,就彻底完犊子了。

在经历了几次因为几个系统修改不一致导致各种测试问题后,我终于忍受不了,用了一个周末的时间做了一个多系统间同步对象的工具程序,功能就是快速把指定的对象通过副本请求的方式传输到其他系统,以达到节省时间的目的。下面讲一下程序的用法。

程序主界面如下:

首先是添加需要传输的对象,点“添加对象”按钮

可以看到有多种添加的方式,既可以批量添加某一个类型的对象,也可以批量添加不同类型对象或者复制其他请求/任务的内容,还可以一次性添加预设的内容。

比如我需要传输一些数据元素和表,则可以先点击“DTEL 数据元素”,把需要传输的数据元素粘贴到弹出的窗口,点击“复制”

对象就出现在下面了,然后我还需要传输几个表,那么就再点击“添加对象”“TABL 表”,粘贴表名,然后得到:

如果发现有误入的对象,选中行后点击删除按钮删掉即可。这样一个请求就创建完成了,如果还需要添加其他,继续这个步骤即可。

另一种添加方式是批量添加,比如:

还有一个添加方式是添加预设的内容,这个内容在“配置”按钮弹出的屏幕里面维护

可以把最近常用的需要传输的内容维护到这个地方,需要传输的时候一下子就可以加到请求里了,注意维护的时候中间没有空格。

还有一个添加方式就在已经存在的请求/任务里面复制

把需要传输的对象添加完毕后,就可以传输了。事先需要先SM59配置好RFC,然后把RFC连接名称维护到“RFC连接”里面

点击“传输”按钮,就可以看到刚才维护的RFC连接列表,可以分别传输到其他系统

比如我线传输到“股份DEV_105”,在传输完毕,会在状态栏显示传输是否成功,并且因为请求已经释放,添加和删除对象的按钮也会变灰,不能再修改列表的内容。如果还需要继续往其他系统传输,再继续这个步骤即可。

在传输完毕后,可以查看传输日志

传输完毕点击退出的时候,会把这个现生成的副本请求删除,免得时间一长一大堆的副本请求。

其他几个设置和说明:

1、设置里面的目标系统就是副本请求里面的“目标”

2、预设的几个对象类型也是可以配置的

3、“传输成功删除目标系统STMS请求”指的是传输的话就在目标系统的STMS清单删除本条记录

4、“传输完毕更改原始系统”,让目标系统不要认为对象是外来户,从而修改的时候需要动用修改助手

5、本程序不只是可以传输工作台请求,也可以通过复制请求内容的方式传输定制请求(顾问的配置请求)

代码如下:

代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& 通过副本请求推送对象到其他系统
*& Baitianzhen
*&---------------------------------------------------------------------*
REPORT zpush_ojb_by_request NO STANDARD PAGE HEADING.

TYPE-POOLS:trwbo,icon.
TABLES: fmrfc,e070,e071.
DATA: gt_fldct TYPE lvc_t_fcat,
      gs_slayt TYPE lvc_s_layo.
DATA: gr_grid TYPE REF TO cl_gui_alv_grid.
DATA: go_cont TYPE REF TO cl_gui_custom_container.
DATA: gt_out  TYPE TABLE OF e071 WITH HEADER LINE.
DATA: gt_obj  TYPE TABLE OF ko100 WITH HEADER LINE.
DATA: gt_log  TYPE TABLE OF fmrfc-rfcds WITH HEADER LINE.
DATA: gt_func TYPE TABLE OF ui_func.
DATA: gv_trkor TYPE e070-trkorr.
DATA: gv_released.
DATA: BEGIN OF gs_key OCCURS 0,
        object   TYPE trobjtype,
        obj_name TYPE trobj_name,
      END OF gs_key.
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.

SELECTION-SCREEN BEGIN OF SCREEN 1001 AS WINDOW.
PARAMETERS     cp_targ TYPE tr_target DEFAULT sy-sysid.
SELECT-OPTIONS cs_objt FOR e071-object NO INTERVALS.
SELECT-OPTIONS cs_dest FOR fmrfc-rfcds NO INTERVALS.
SELECT-OPTIONS cs_pset FOR gs_key  NO INTERVALS.
PARAMETERS     cp_delt AS CHECKBOX.
PARAMETERS     cp_srcs AS CHECKBOX.
SELECTION-SCREEN END OF SCREEN 1001.

SELECTION-SCREEN BEGIN OF SCREEN 1002 AS WINDOW.
SELECT-OPTIONS: s_trkor FOR e070-trkorr NO INTERVALS.
SELECTION-SCREEN END OF SCREEN 1002.

*&---------------------------------------------------------------------*
*& lcl_event_receiver
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_double_click
      FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column es_row_no.
    METHODS handle_user_command
      FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.
    METHODS handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.
    METHODS handle_menu_button
      FOR EVENT menu_button OF cl_gui_alv_grid
        IMPORTING e_object e_ucomm.
ENDCLASS.                    "lcl_event_receiver DEFINITION

*&---------------------------------------------------------------------*
*& lcl_event_receiver
*&---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_double_click.
    PERFORM grid_double_clik USING e_row e_column es_row_no.
  ENDMETHOD.                    "handle_double_click
  METHOD handle_user_command.
    IF e_ucomm(4) = 'FCTR'.
      PERFORM trans_tr USING e_ucomm.
      PERFORM refresh.
    ELSEIF e_ucomm(3) = 'LOG'.
      PERFORM trans_log USING e_ucomm.
    ELSEIF e_ucomm IN cs_objt.
      PERFORM insert_obj USING e_ucomm.
      PERFORM refresh.
    ELSE.
      CASE e_ucomm.
        WHEN 'BATC'.
          PERFORM batch_insert USING ''.
          PERFORM refresh.
        WHEN 'COPY'.
          IF gv_released IS NOT INITIAL.
            MESSAGE s000(oo) WITH '请求已释放,不能再修改'.
            RETURN.
          ENDIF.
          CALL SELECTION-SCREEN 1002 STARTING AT 10 5.
          CHECK sy-subrc = 0.
          PERFORM copy_tr.
          PERFORM refresh.
        WHEN 'PSET'.
          PERFORM batch_insert USING 'X'.
          PERFORM refresh.
        WHEN 'FC_CONF'.
          CALL SELECTION-SCREEN 1001 STARTING AT 10 5.
          CHECK sy-subrc = 0.
          PERFORM set_scr_para_def USING '1001' 'S'.
        WHEN 'FC_DELE'.
          PERFORM delete_row.
          PERFORM refresh.
        WHEN 'FC_DELT'.
          PERFORM delete_tr.
          LEAVE PROGRAM.
      ENDCASE.
    ENDIF.
  ENDMETHOD.                    "handle_user_command

  METHOD handle_toolbar.
    PERFORM add_button USING e_object: '3' ' ' '       ' '' '   ',
                                       '0' ' ' 'FC_CONF' '@BX@' '配置',
                                       '3' ' ' '       ' '' '   ',
                                       '2' 'X' 'FC_OBJC' '@17@' '添加对象',
                                       '0' 'X' 'FC_DELE' '@18@' '',
                                       '3' ' ' '       ' '' '    ',
                                       '2' ' ' 'FC_TRAN' '@K4@' '传输',
                                       '3' ' ' '       ' '' '    ',
                                       '2' ' ' 'FC_TLOG' '@0P@' '日志',
                                       '3' ' ' '       ' '' '    ',
                                       '0' ' ' 'FC_DELT' '    ' '退出(删除请求)'.
  ENDMETHOD.                    "handle_toolbar

  METHOD handle_menu_button .
    DATA lv_numc TYPE numc2.
    DATA lv_code TYPE char10.
    DATA lv_text TYPE string.

    CASE e_ucomm.
      WHEN 'FC_OBJC'.
        LOOP AT cs_objt INTO cs_objt.
          READ TABLE gt_obj INTO gt_obj WITH KEY pgmid = 'R3TR'
                                                 object = cs_objt-low.
          IF sy-subrc = 0.
            CONCATENATE cs_objt-low gt_obj-text INTO lv_text SEPARATED BY ''.
            PERFORM button_add_func USING e_object cs_objt-low lv_text.
          ENDIF.
        ENDLOOP.
        PERFORM button_add_func USING e_object '----' '-------------------------'.
        PERFORM button_add_func USING e_object 'COPY' '从请求/任务复制'.
        PERFORM button_add_func USING e_object 'BATC' '批量粘贴多种类型'.
        IF cs_pset[] IS NOT INITIAL.
          PERFORM button_add_func USING e_object 'PSET' '预设对象'.
        ENDIF.
      WHEN 'FC_TRAN'.
        LOOP AT cs_dest INTO cs_dest.
          lv_numc = sy-tabix.
          CONCATENATE 'FCTR' lv_numc INTO lv_code.
          PERFORM button_add_func USING e_object lv_code cs_dest-low.
        ENDLOOP.
      WHEN 'FC_TLOG'.
        LOOP AT gt_log INTO gt_log.
          lv_numc = sy-tabix.
          CONCATENATE 'LOG' lv_numc INTO lv_code.
          PERFORM button_add_func USING e_object lv_code gt_log.
        ENDLOOP.
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

INITIALIZATION.
  PERFORM set_scr_para_def USING '1001' 'R'.
  IF cs_objt[] IS INITIAL.
    APPEND 'IEQDOMA' TO cs_objt.
    APPEND 'IEQDTEL' TO cs_objt.
    APPEND 'IEQTABL' TO cs_objt.
    APPEND 'IEQVIEW' TO cs_objt.
    APPEND 'IEQTTYP' TO cs_objt.
    APPEND 'IEQSHLP' TO cs_objt.
    APPEND 'IEQENQU' TO cs_objt.
    APPEND 'IEQPROG' TO cs_objt.
    APPEND 'IEQFUGR' TO cs_objt.
    APPEND 'IEQCLAS' TO cs_objt.
    APPEND 'IEQTRAN' TO cs_objt.
    APPEND 'IEQNROB' TO cs_objt.
  ENDIF.

  CALL FUNCTION 'TR_OBJECT_TABLE'
    TABLES
      wt_object_text = gt_obj.

  PERFORM catset1 TABLES gt_fldct
                  USING: 'TRKORR  ' 'E071' 'TRKORR  ' '',
                         'PGMID   ' 'E071' 'PGMID   ' '',
                         'OBJECT  ' 'E071' 'OBJECT  ' '',
                         'OBJ_NAME' 'E071' 'OBJ_NAME' ''.

AT SELECTION-SCREEN OUTPUT.
  %_cp_targ_%_app_%-text = '目标系统'.
  %_cs_objt_%_app_%-text = '对象'.
  %_cs_dest_%_app_%-text = 'RFC连接'.
  %_cs_pset_%_app_%-text = '预设对象列表'.
  %_cp_srcs_%_app_%-text = '传输完毕更改原始系统'.
  %_cp_delt_%_app_%-text = '传输成功删除目标系统STMS请求'.
  %_s_trkor_%_app_%-text = '请求/任务'.
  PERFORM selscr_exfcode USING '%_CSP' 'GET SPOS'.

START-OF-SELECTION.
  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'M100'.
  SET TITLEBAR '003' OF PROGRAM 'SAPLKKBL'
                     WITH '通过副本请求推送对象到其他系统'.

  IF gr_grid IS INITIAL.
    CREATE OBJECT go_cont
      EXPORTING
        container_name = 'CON1'.
    CREATE OBJECT gr_grid
      EXPORTING
        i_parent = go_cont.

    CREATE OBJECT event_receiver.
    SET HANDLER event_receiver->handle_double_click FOR gr_grid.
    SET HANDLER event_receiver->handle_user_command FOR gr_grid.
    SET HANDLER event_receiver->handle_toolbar      FOR gr_grid.
    SET HANDLER event_receiver->handle_menu_button  FOR gr_grid.

    APPEND cl_gui_alv_grid=>mc_mb_variant TO gt_func.
    APPEND cl_gui_alv_grid=>mc_mb_subtot  TO gt_func.
    APPEND cl_gui_alv_grid=>mc_mb_export  TO gt_func.
    APPEND cl_gui_alv_grid=>mc_mb_sum     TO gt_func.
    APPEND cl_gui_alv_grid=>mc_mb_view    TO gt_func.
    APPEND cl_gui_alv_grid=>mc_fc_info    TO gt_func.
    APPEND cl_gui_alv_grid=>mc_mb_filter  TO gt_func.
    APPEND cl_gui_alv_grid=>mc_fc_print   TO gt_func.
    APPEND cl_gui_alv_grid=>mc_fc_graph   TO gt_func.

    gs_slayt-zebra = 'X'.
    gs_slayt-sel_mode = 'D'.

    CALL METHOD gr_grid->set_table_for_first_display
      EXPORTING
        i_save                        = 'A'
        is_layout                     = gs_slayt
        it_toolbar_excluding          = gt_func[]
      CHANGING
        it_outtab                     = gt_out[]
        it_fieldcatalog               = gt_fldct[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
  ENDIF.
ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*& ALV双击
*&---------------------------------------------------------------------*
FORM grid_double_clik USING pv_row pv_column ps_row_no TYPE lvc_s_roid.
  READ TABLE gt_out INDEX ps_row_no-row_id.
  IF sy-subrc = 0.
    CASE pv_column.
      WHEN 'TRKORR'.
        CALL FUNCTION 'TR_PRESENT_REQUEST'
          EXPORTING
            iv_trkorr = gv_trkor.
      WHEN OTHERS.
        CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
          EXPORTING
            iv_pgmid          = gt_out-pgmid
            iv_object         = gt_out-object
            iv_obj_name       = gt_out-obj_name
            iv_action         = 'SHOW'
          EXCEPTIONS
            jump_not_possible = 1
            OTHERS            = 2.
    ENDCASE.
  ENDIF.
ENDFORM. " grid_double_clik

*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM catset1 TABLES t_fldcat USING pv_field pv_reftab pv_reffld pv_text.
  DATA: ls_fldct TYPE lvc_s_fcat.

  ls_fldct-fieldname  = pv_field.
  ls_fldct-reptext    = pv_text.
  ls_fldct-coltext    = pv_text.
  ls_fldct-colddictxt = 'R'.
  ls_fldct-selddictxt = 'R'.
  ls_fldct-ref_table  = pv_reftab.
  ls_fldct-ref_field  = pv_reffld.

  CASE ls_fldct-fieldname.
    WHEN 'TRKORR'.
      ls_fldct-outputlen = 12.
    WHEN 'PGMID'.
      ls_fldct-outputlen = 6.
    WHEN 'OBJ_NAME'.
      ls_fldct-outputlen = 45.
    WHEN OTHERS.
  ENDCASE.

  APPEND ls_fldct TO t_fldcat.
  CLEAR ls_fldct.
ENDFORM.                    "catset1

*&---------------------------------------------------------------------*
*&  选择界面保存默认值
*&---------------------------------------------------------------------*
FORM set_scr_para_def USING pv_dynnr pv_method.
  DATA lt_rsscr TYPE TABLE OF rsscr WITH HEADER LINE.
  DATA lt_paras TYPE TABLE OF char10 WITH HEADER LINE.
  DATA lv_strfd TYPE bf4indx-strfd.
  DATA lv_subrc TYPE sy-subrc.
  DATA lv_fnumb TYPE i.
  DATA lv_tnumb TYPE i.
  DATA lv_fsstr TYPE string.
  DATA ls_scr   TYPE rsscr.

  lv_fnumb = pv_dynnr * 1000 + 1.
  lv_tnumb = pv_dynnr * 1000 + 999.
  CONCATENATE sy-repid sy-uname sy-mandt INTO lv_strfd.
  PERFORM load_sscr(rsdbrunt) TABLES   lt_rsscr
                              USING    sy-repid
                              CHANGING lv_subrc.
  LOOP AT lt_rsscr WHERE numb BETWEEN lv_fnumb AND lv_tnumb AND
                         kind CA 'PS' AND
                         flag1 NE '20'. "NO-DISPLAY
    READ TABLE lt_rsscr INTO ls_scr WITH KEY miscell = lt_rsscr-name.
    IF sy-subrc = 0.
      lv_fsstr = ls_scr-name.
    ELSE.
      CONCATENATE '%_' lt_rsscr-name '_%_app_%-text' INTO lv_fsstr.
    ENDIF.

    IF lt_rsscr-kind = 'P'.
      lt_paras  = lt_rsscr-name.
    ELSE.
      CONCATENATE lt_rsscr-name '[]' INTO lt_paras.
    ENDIF.
    COLLECT lt_paras.
  ENDLOOP.
  CHECK lt_paras[] IS NOT INITIAL.

  CASE pv_method.
    WHEN 'S'.
      CHECK lt_paras[] IS NOT INITIAL.
      EXPORT (lt_paras) TO DATABASE bf4indx(zs) ID lv_strfd.
      MESSAGE s000(oo) WITH 'Saved'.
    WHEN 'R'.
      TRY .
          IMPORT (lt_paras) FROM DATABASE bf4indx(zs) ID lv_strfd.
        CATCH cx_root.
      ENDTRY.
  ENDCASE.
ENDFORM.                    "set_scr_para_def

*&---------------------------------------------------------------------*
*& 选择屏幕屏蔽按钮
*&---------------------------------------------------------------------*
FORM selscr_exfcode USING pv_status pv_exfcode.
  DATA: lt_exttab TYPE slis_t_extab.

  SPLIT pv_exfcode AT space INTO TABLE lt_exttab.
  CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
    EXPORTING
      p_status  = pv_status
    TABLES
      p_exclude = lt_exttab.
ENDFORM. "selscreen_ext

*&---------------------------------------------------------------------*
*&      Form  button_add_func
*&---------------------------------------------------------------------*
FORM button_add_func USING pr_ctmenu TYPE REF TO cl_ctmenu
                           pv_code pv_text.
  DATA: lv_fcode TYPE ui_func,
        lv_text	TYPE gui_text.

  lv_fcode = pv_code.
  lv_text  = pv_text.
  pr_ctmenu->add_function( EXPORTING icon  = icon_okay
                                     fcode = lv_fcode
                                     text  = lv_text ).
ENDFORM.                    "button_add_func

*&---------------------------------------------------------------------*
*& ALV自带工具栏添加按钮
*&---------------------------------------------------------------------*
FORM add_button USING pr_object TYPE REF TO cl_alv_event_toolbar_set
                      pv_type pv_disa pv_func pv_icon pv_text .
  DATA: ls_toolbar  TYPE stb_button.

  CLEAR ls_toolbar.
  ls_toolbar-butn_type = pv_type.
  ls_toolbar-function  = pv_func.
  ls_toolbar-icon      = pv_icon.
  ls_toolbar-text      = pv_text.
  IF pv_disa = 'X'.
    ls_toolbar-disabled  = gv_released.
  ENDIF.
  APPEND ls_toolbar TO pr_object->mt_toolbar.
ENDFORM.                    "add_button

*&---------------------------------------------------------------------*
*& 刷新ALV
*&---------------------------------------------------------------------*
FORM refresh.
  DATA ls_stable TYPE lvc_s_stbl.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_out
    FROM e071
    WHERE trkorr = gv_trkor ORDER BY PRIMARY KEY.

  ls_stable-row = 'X'.
  ls_stable-col = 'X'.
  CALL METHOD gr_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.
ENDFORM.                    "refresh

*&---------------------------------------------------------------------*
*& 创建副本请求
*&---------------------------------------------------------------------*
FORM create_tr USING pv_target CHANGING cv_trkor.
  DATA ls_header  TYPE trwbo_request_header.

  CALL FUNCTION 'TR_INSERT_REQUEST_WITH_TASKS'
    EXPORTING
      iv_type           = 'T'
      iv_text           = 'Push Object'
      iv_target         = pv_target
    IMPORTING
      es_request_header = ls_header
    EXCEPTIONS
      insert_failed     = 1
      enqueue_failed    = 2
      OTHERS            = 3.
  IF sy-subrc = 0.
    cv_trkor = ls_header-trkorr.
    COMMIT WORK.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4  .
  ENDIF.
ENDFORM.                    "createtr

*&---------------------------------------------------------------------*
*& 请求添加单一类型对象
*&---------------------------------------------------------------------*
FORM insert_obj USING pv_object.
  DATA lt_list  TYPE TABLE OF trobj_name WITH HEADER LINE.
  DATA lt_e071  TYPE TABLE OF e071 WITH HEADER LINE.
  DATA lt_e071k TYPE TABLE OF e071k WITH HEADER LINE.
  DATA lv_title TYPE string.
  DATA lv_mark  TYPE c.
  DATA lv_don   TYPE c.

  IF gv_released IS NOT INITIAL.
    MESSAGE s000(oo) WITH '请求已释放,不能再修改'.
    RETURN.
  ENDIF.

  IF gv_trkor IS INITIAL.
    PERFORM create_tr USING cp_targ CHANGING gv_trkor.
  ENDIF.

  lv_title = pv_object.
  CALL FUNCTION 'ISU_POPUP_TEXT_EDIT'
    EXPORTING
      x_height      = 14
      x_title       = lv_title
    CHANGING
      xy_texttab    = lt_list[]
    EXCEPTIONS
      general_fault = 1
      OTHERS        = 2.
  DELETE lt_list WHERE table_line = ''.
  CHECK lt_list[] IS NOT INITIAL.

  lt_e071-pgmid  = 'R3TR'.
  lt_e071-object = pv_object.
  LOOP AT lt_list.
    TRANSLATE lt_list TO UPPER CASE.
    CONDENSE lt_list.
    lt_e071-obj_name = lt_list.
    APPEND lt_e071.
  ENDLOOP.

  PERFORM append_objects_to_request(saplstrv)
          USING lt_e071[] gv_trkor lv_mark lv_don.
ENDFORM.                    "insert_obj

*&---------------------------------------------------------------------*
*& 请求批量添加不同类型对象
*&---------------------------------------------------------------------*
FORM batch_insert USING pv_default.
  DATA lt_list  TYPE TABLE OF trobj_name WITH HEADER LINE.
  DATA lt_e071  TYPE TABLE OF e071 WITH HEADER LINE.
  DATA lt_e071k TYPE TABLE OF e071k WITH HEADER LINE.
  DATA lv_title TYPE string.
  DATA lv_mark  TYPE c.
  DATA lv_don   TYPE c.

  IF gv_released IS NOT INITIAL.
    MESSAGE s000(oo) WITH '请求已释放,不能再修改'.
    RETURN.
  ENDIF.

  IF gv_trkor IS INITIAL.
    PERFORM create_tr USING cp_targ CHANGING gv_trkor.
  ENDIF.

  IF pv_default = ''.
    lv_title = '对象类型+对象值,可以使用空格、制表符隔开或者不隔'.
    CALL FUNCTION 'ISU_POPUP_TEXT_EDIT'
      EXPORTING
        x_height      = 14
        x_title       = lv_title
      CHANGING
        xy_texttab    = lt_list[]
      EXCEPTIONS
        general_fault = 1
        OTHERS        = 2.
    DELETE lt_list WHERE table_line = ''.
  ELSE.
    LOOP AT cs_pset INTO cs_pset.
      lt_list = cs_pset-low.
      APPEND lt_list.
    ENDLOOP.
  ENDIF.
  CHECK lt_list[] IS NOT INITIAL.

  LOOP AT lt_list.
    REPLACE ALL OCCURRENCES OF %_horizontal_tab IN lt_list WITH ''.
    TRANSLATE lt_list TO UPPER CASE.
    CONDENSE lt_list(10) NO-GAPS.
    lt_e071-pgmid    = lt_list(4).
    lt_e071-object   = lt_list+4(4).
    lt_e071-obj_name = lt_list+8.
    APPEND lt_e071.
  ENDLOOP.

  PERFORM append_objects_to_request(saplstrv)
          USING lt_e071[] gv_trkor lv_mark lv_don.
ENDFORM.                    "batch_insert

*&---------------------------------------------------------------------*
*& 复制请求/任务条目
*&---------------------------------------------------------------------*
FORM copy_tr.
  IF gv_trkor IS INITIAL.
    PERFORM create_tr USING cp_targ CHANGING gv_trkor.
  ENDIF.

  CHECK s_trkor[] IS NOT INITIAL.
  LOOP AT s_trkor.
    CALL FUNCTION 'TR_COPY_COMM'
      EXPORTING
        wi_dialog                = ''
        wi_trkorr_from           = s_trkor-low
        wi_trkorr_to             = gv_trkor
        wi_without_documentation = 'X'
      EXCEPTIONS
        db_access_error          = 1
        trkorr_from_not_exist    = 2
        trkorr_to_is_repair      = 3
        trkorr_to_locked         = 4
        trkorr_to_not_exist      = 5
        trkorr_to_released       = 6
        user_not_owner           = 7
        no_authorization         = 8
        wrong_client             = 9
        wrong_category           = 10
        object_not_patchable     = 11.
    IF sy-subrc NE 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.
  COMMIT WORK.
  CALL FUNCTION 'TR_SORT_AND_COMPRESS_COMM'
    EXPORTING
      iv_trkorr = gv_trkor
    EXCEPTIONS
      OTHERS    = 5.
  COMMIT WORK.
ENDFORM.                    "copy_tr

*&---------------------------------------------------------------------*
*& 删除请求的行
*&---------------------------------------------------------------------*
FORM delete_row.
  DATA lt_srows TYPE lvc_t_roid WITH HEADER LINE.

  IF gv_released IS NOT INITIAL.
    MESSAGE s000(oo) WITH '请求已释放,不能再修改'.
  ELSE.
    gr_grid->get_selected_rows( IMPORTING et_row_no = lt_srows[] ).
    LOOP AT lt_srows.
      READ TABLE gt_out INDEX lt_srows-row_id.
      DELETE FROM e071 WHERE trkorr = gt_out-trkorr AND
                             as4pos = gt_out-as4pos.
    ENDLOOP.
  ENDIF.
ENDFORM.                    "delete_row

*&---------------------------------------------------------------------*
*& 释放请求
*&---------------------------------------------------------------------*
FORM release_tr.
  DATA: ls_retn TYPE bapiret2.

  CALL FUNCTION 'TRINT_RELEASE_REQUEST'
    EXPORTING
      iv_trkorr                = gv_trkor
      iv_dialog                = ''
      iv_as_background_job     = ''
      iv_success_message       = 'X'
      iv_without_objects_check = 'X'
      iv_without_locking       = 'X'
      iv_display_export_log    = ''
    EXCEPTIONS
      OTHERS                   = 18.
  IF sy-subrc = 0.
    DO 20 TIMES.
      WAIT UP TO 1 SECONDS.
      SELECT SINGLE * FROM e070
        WHERE trkorr = gv_trkor AND
              trstatus IN ('R','N').
      IF sy-subrc = 0.
        EXIT.
      ENDIF.
    ENDDO.
    gv_released = 'X'.
    MESSAGE s000(oo) WITH '已释放'.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4  .
  ENDIF.
ENDFORM.                    "release_tr

*&---------------------------------------------------------------------*
*& 传输请求
*&---------------------------------------------------------------------*
FORM trans_tr USING pv_ucomm.
  DATA lv_tabix TYPE sy-tabix.
  DATA lv_rdest TYPE rfcdest.
  DATA lv_trdir TYPE char255.
  DATA lv_lfile TYPE char255.
  DATA lv_cfile TYPE xstring.
  DATA lv_dfile TYPE xstring.
  DATA lv_rcode TYPE stpa-retcode.

  IF gt_out[] IS INITIAL.
    MESSAGE s000(oo) WITH '列表为空'.
    RETURN.
  ENDIF.

  IF gv_released = ''.
    PERFORM release_tr.
  ENDIF.

  lv_tabix = pv_ucomm+4.
  READ TABLE cs_dest INDEX lv_tabix.
  lv_rdest = cs_dest-low.

  CALL FUNCTION 'RSPO_R_SAPGPARAM'
    EXPORTING
      name   = 'DIR_TRANS'
    IMPORTING
      value  = lv_trdir
    EXCEPTIONS
      error  = 1
      OTHERS = 0.
  IF lv_trdir IS INITIAL.
    MESSAGE e000(oo) WITH 'DIR_TRANS目录未找到'.
  ENDIF.

  CONCATENATE lv_trdir '/data/R ' gv_trkor+4 '.' gv_trkor(3) INTO lv_lfile.
  OPEN DATASET lv_lfile FOR INPUT IN BINARY MODE.
  IF sy-subrc = 0.
    READ DATASET lv_lfile INTO lv_dfile.
    CLOSE DATASET lv_lfile.
  ELSE.
    MESSAGE e000(oo) WITH '读取Data文件失败'.
  ENDIF.

  CONCATENATE lv_trdir '/cofiles/K ' gv_trkor+4 '.' gv_trkor(3) INTO lv_lfile.
  OPEN DATASET lv_lfile FOR INPUT IN BINARY MODE.
  IF sy-subrc = 0.
    READ DATASET lv_lfile INTO lv_cfile.
    CLOSE DATASET lv_lfile.
  ELSE.
    MESSAGE e000(oo) WITH '读取控制文件失败'.
  ENDIF.

  READ TABLE gt_log WITH KEY table_line = lv_rdest.
  IF sy-subrc NE 0.
    APPEND lv_rdest TO gt_log.
  ENDIF.

  PERFORM create_rfclink(zremotelogin) CHANGING lv_rdest.
  CALL FUNCTION 'ZTRANSFER_REQUEST' DESTINATION lv_rdest
    EXPORTING
      trkorr         = gv_trkor
      defbf          = cp_delt
      srcsystem      = cp_srcs
      cofile         = lv_cfile
      datafile       = lv_dfile
    IMPORTING
      ev_tp_ret_code = lv_rcode.
  PERFORM delete_rfclink(zremotelogin) USING lv_rdest.
  IF lv_rcode LE 4.
    MESSAGE s000(oo) WITH '成功'.
  ELSE.
    MESSAGE s000(oo) WITH '失败' DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.                    " TRANS_TR

*&---------------------------------------------------------------------*
*& 传输日志
*&---------------------------------------------------------------------*
FORM trans_log USING pv_ucomm.
  DATA lv_tabix TYPE sy-tabix.
  DATA lv_rdest TYPE rfcdest.

  CHECK gv_trkor IS NOT INITIAL.

  lv_tabix = pv_ucomm+4.
  READ TABLE gt_log INDEX lv_tabix.
  lv_rdest = gt_log.

  PERFORM create_rfclink(zremotelogin) CHANGING lv_rdest.
  CALL FUNCTION 'ZTRANSFER_VIEW_LOG' DESTINATION lv_rdest
    EXPORTING
      iv_trokr = gv_trkor.
  PERFORM delete_rfclink(zremotelogin) USING lv_rdest.
ENDFORM.                    "trans_log

*&---------------------------------------------------------------------*
*& 删除请求
*&---------------------------------------------------------------------*
FORM delete_tr.
  CHECK gv_trkor IS NOT INITIAL.

  UPDATE e070 SET trstatus = 'D'
    WHERE trkorr = gv_trkor.
  COMMIT WORK.

  CALL FUNCTION 'TR_DELETE_COMM'
    EXPORTING
      wi_dialog = ''
      wi_trkorr = gv_trkor
    EXCEPTIONS
      OTHERS    = 1.
  IF sy-subrc = 0.
    MESSAGE s000(oo) WITH gv_trkor '已删除'.
  ELSE.
    MESSAGE s000(oo) WITH gv_trkor '删除失败' DISPLAY LIKE 'W'.
  ENDIF.
ENDFORM.                    "delete_tr

目标系统需要创建两个RFC函数:

代码语言:javascript
复制
FUNCTION ztransfer_request.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(TRKORR) TYPE  TRKORR
*"     VALUE(MANDT) TYPE  MANDT OPTIONAL
*"     VALUE(DEFBF) TYPE  CHAR01 OPTIONAL
*"     VALUE(TRANSMIT) TYPE  CHAR01 OPTIONAL
*"     VALUE(SRCSYSTEM) TYPE  CHAR01 OPTIONAL
*"     VALUE(COFILE) TYPE  XSTRING OPTIONAL
*"     VALUE(DATAFILE) TYPE  XSTRING OPTIONAL
*"  EXPORTING
*"     VALUE(EV_TP_RET_CODE) LIKE  STPA-RETCODE
*"     VALUE(EV_TP_ALOG) LIKE  STPA-FILE
*"     VALUE(EV_TP_SLOG) LIKE  STPA-FILE
*"     VALUE(EV_TP_PID) LIKE  STPA-PID
*"     VALUE(EV_TPSTAT_KEY) TYPE  TMSTPKEY
*"     VALUE(ES_EXCEPTION) LIKE  STMSCALERT STRUCTURE  STMSCALERT
*"----------------------------------------------------------------------
  DATA: system LIKE tmscsys-sysnam .
  DATA: et_tp_imports TYPE stms_tp_imports.
  DATA: lt_sys TYPE TABLE OF tmscsys WITH HEADER LINE.
  DATA: ls_tp_trque  TYPE stms_tp_trque,
        ls_tp_remque TYPE stms_tp_remque.
  DATA: lv_tran_dir TYPE text255.
  DATA: lv_appfile  TYPE text255.

  IF mandt IS INITIAL.
    mandt = sy-mandt.
  ENDIF.

  IF cofile IS NOT INITIAL.
    CALL FUNCTION 'RSPO_R_SAPGPARAM'
      EXPORTING
        name   = 'DIR_TRANS'
      IMPORTING
        value  = lv_tran_dir
      EXCEPTIONS
        error  = 1
        OTHERS = 0.
    IF lv_tran_dir IS INITIAL.
      ev_tp_ret_code = 8.
      RETURN.
    ENDIF.

    CONCATENATE lv_tran_dir '/cofiles/' trkorr+3 '.' trkorr(3) INTO lv_appfile.
    OPEN DATASET lv_appfile FOR OUTPUT IN BINARY MODE.
    IF sy-subrc NE 0.
      ev_tp_ret_code = 8.
      RETURN.
*      MESSAGE e000(oo) WITH '文件写入服务器失败' applfile.
    ELSE.
      TRANSFER cofile TO lv_appfile.
      CLOSE DATASET lv_appfile.
    ENDIF.
  ENDIF.

  IF datafile IS NOT INITIAL.
    CONCATENATE lv_tran_dir '/data/R' trkorr+4 '.' trkorr(3) INTO lv_appfile.
    OPEN DATASET lv_appfile FOR OUTPUT IN BINARY MODE.
    IF sy-subrc NE 0.
      ev_tp_ret_code = 8.
      RETURN.
*      MESSAGE e000(oo) WITH '文件写入服务器失败' applfile.
    ELSE.
      TRANSFER datafile TO lv_appfile.
      CLOSE DATASET lv_appfile.
    ENDIF.
  ENDIF.

  system = sy-sysid.
  CALL FUNCTION 'TMS_MGR_FORWARD_TR_REQUEST'
    EXPORTING
      iv_request      = trkorr
      iv_target       = system
      iv_tardom       = ''
      iv_tarcli       = ''
      iv_source       = system
      iv_srcdom       = ''
      iv_import_again = 'X'
      iv_monitor      = 'X'
      iv_verbose      = ''
    EXCEPTIONS
      OTHERS          = 99.

  IF transmit = 'X'.
    CALL FUNCTION 'TMS_CFG_READ_CONFIGURATION'
      EXPORTING
        iv_local_domain       = 'X'
        iv_local_non_abap_sys = 'X'
      TABLES
        tt_sys                = lt_sys
      EXCEPTIONS
        OTHERS                = 99.
    READ TABLE lt_sys WITH KEY sysnam = system.

    CALL FUNCTION 'TMS_MGR_TRANSMIT_TR_QUEUE'
      EXPORTING
        iv_tar_sys         = system
        iv_ext_grp         = ''
        iv_monitor         = ''
      CHANGING
        cs_tp_trque        = ls_tp_trque
      EXCEPTIONS
        read_config_failed = 1
        OTHERS             = 99.
    LOOP AT ls_tp_trque-remque INTO ls_tp_remque.
      IF ls_tp_remque-alert-id <> ''.
        DELETE ls_tp_trque-remque.
      ENDIF.
    ENDLOOP.

    IF ls_tp_trque-requests <> 0.
      CALL FUNCTION 'TMS_MGR_TRANSMIT_TR_QUEUE'
        EXPORTING
          iv_tar_sys         = system
          iv_tar_dom         = lt_sys-domnam
          iv_read_only       = ''
          iv_use_list        = 'X'
          iv_monitor         = ''
          iv_verbose         = ''
        CHANGING
          cs_tp_trque        = ls_tp_trque
        EXCEPTIONS
          read_config_failed = 1
          OTHERS             = 99.
    ENDIF.
  ENDIF.

  CALL FUNCTION 'TMS_MGR_IMPORT_TR_REQUEST'
    EXPORTING
      iv_system                  = system
      iv_request                 = trkorr
      iv_client                  = mandt
      iv_overtake                = 'X'
      iv_import_again            = 'X'
      iv_ignore_originality      = 'X'
      iv_ignore_repairs          = 'X'
      iv_ignore_transtype        = 'X'
      iv_ignore_tabletype        = 'X'
      iv_ignore_predec           = 'X'
      iv_subset                  = 'X'
      iv_offline                 = ''
    IMPORTING
      ev_tp_ret_code             = ev_tp_ret_code
      ev_tp_alog                 = ev_tp_alog
      ev_tp_slog                 = ev_tp_slog
      ev_tp_pid                  = ev_tp_pid
      ev_tpstat_key              = ev_tpstat_key
      es_exception               = es_exception
      et_tp_imports              = et_tp_imports
    EXCEPTIONS
      read_config_failed         = 1
      table_of_requests_is_empty = 2
      OTHERS                     = 3.

  IF defbf = 'X' AND ev_tp_ret_code <= 4.
    CALL FUNCTION 'TMS_MGR_MAINTAIN_TR_QUEUE'
      EXPORTING
        iv_command = 'DELFROMBUFFER'
        iv_system  = system
        iv_domain  = ''
        iv_request = trkorr
        iv_tarcli  = ''
        iv_monitor = 'X'
        iv_verbose = ''
      EXCEPTIONS
        OTHERS     = 99.
  ENDIF.

  IF srcsystem = 'X'.
    UPDATE tadir SET srcsystem = sy-sysid
      WHERE EXISTS ( SELECT * FROM e071
                       WHERE trkorr = trkorr AND
                             pgmid  = tadir~pgmid AND
                             object = tadir~object AND
                             obj_name = tadir~obj_name ).
  ENDIF.
ENDFUNCTION.
代码语言:javascript
复制
FUNCTION ztransfer_view_log.
*"----------------------------------------------------------------------
*"*"局部接口:
*"  IMPORTING
*"     VALUE(IV_TROKR) TYPE  TRKORR
*"----------------------------------------------------------------------
  SELECT SINGLE trkorr INTO iv_trokr
    FROM e070 WHERE trkorr = iv_trokr.
  CHECK sy-subrc = 0 AND iv_trokr IS NOT INITIAL.

  CALL FUNCTION 'TMS_UI_SHOW_TRANSPORT_LOGS'
    EXPORTING
      iv_request                 = iv_trokr
    EXCEPTIONS
      show_transport_logs_failed = 1
      OTHERS                     = 2.

ENDFUNCTION.

版权归原作者所有,如有侵权请联系删除。

免责声明:本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,我们将根据您提供的证明材料确认版权并按国家标准支付稿酬或立即删除内容!本文内容为原作者观点,并不代表本公众号赞同其观点和对其真实性负责。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ERP全球顾问云平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档