【问题标题】:Build a transport request manually in SAP-ABAP在 SAP-ABAP 中手动构建传输请求
【发布时间】:2022-09-25 18:49:39
【问题描述】:

我开发了一个在 5 个自定义表中插入记录的程序,我需要手动构建一个传输请求。 我已经使用功能模块 TRINT_ORDER_CHOICE 和 TR_APPEND_TO_COMM_OBJS_KEYS 尝试过这个,毕竟,在 SE09 中查看 TR 一切看起来都不错,我可以看到所有 5 个表的所有条目及其键,但是当我在需要的客户端中运行 SCC1 时这些数据,它只是获取第一个表的 1 条记录。 我还尝试为每个表执行 SM30 的批量输入,但它不会在传输请求中插入任何记录。使用 DISMODE = N 或 DISMODE = A 进行批量输入。 对于我的第一种方法,我写了一个类,在这里我分享代码,希望有人可以帮助我。 这里是生成去传输请求的类的完整源代码。

CLASS ZCL_INT_CREATE_TR DEFINITION
PUBLIC
CREATE PUBLIC .

PUBLIC SECTION.
    CONSTANTS GC_CUSTOMIZING_ORDER_TYPE type TRFUNCTION value \'W\' ##NO_TEXT.
    CONSTANTS GC_WORKBENCH_ORDER_TYPE type TRFUNCTION value \'K\' ##NO_TEXT.
    CONSTANTS GC_CUSTOMIZING_TASK_TYPE type TRFUNCTION value \'Q\' ##NO_TEXT.
    CONSTANTS GC_WORKBENCH_TASK_TYPE type TRFUNCTION value \'S\' ##NO_TEXT.
    CONSTANTS GC_CUSTOMIZING_ORDER_CATEGORY type TRCATEG value \'CUST\' ##NO_TEXT.
    CONSTANTS GC_WORKBENCH_ORDER_CATEGORY type TRCATEG value \'SYST\' ##NO_TEXT.

    DATA GV_ORDER type TRKORR read-only .
    DATA GV_TASK type TRKORR read-only .

    METHODS CONSTRUCTOR
        importing
           !IV_ORDER_TYPE type TRFUNCTION
           !IV_TASK_TYPE type TRFUNCTION
           !IV_CATEGORY type E070-KORRDEV .

    METHODS ADD_TABLE
        importing
           !IR_DATA type ref to DATA .

    METHODS CREATE .
PROTECTED SECTION.
PRIVATE SECTION.

   types:
      BEGIN OF lty_tables,
         table TYPE REF TO data,
      END OF lty_tables .

   types: ltty_tables TYPE STANDARD TABLE OF lty_tables .

   data GO_BDC type ref to ZCL_UTL_BDC .
   data GT_TABLES type LTTY_TABLES .
   data GT_E71 type TT_E071 .
   data GT_E71K type TRN_REG_TRANS_KEYS .
   data GV_ORDER_TYPE type TRFUNCTION .
   data GV_TASK_TYPE type TRFUNCTION .
   data GV_CATEGORY type E070-KORRDEV .

   methods CALL_TR_DIALOG .
   methods FILL_E071 .
   methods FILL_E071N
       importing
          !IS_E070 type E071
          !IT_DATA type STANDARD TABLE
          !IO_STRDSCR type ref to CL_ABAP_STRUCTDESCR .
   methods TR_APPEND_TO_COMM_OBJS_KEYS .
ENDCLASS.

CLASS ZCL_INT_CREATE_TR IMPLEMENTATION.

    method ADD_TABLE.
        APPEND INITIAL LINE TO me->gt_tables ASSIGNING FIELD-SYMBOL(<lfs_table>).
        <lfs_table>-table = ir_data.
    endmethod.

    METHOD call_tr_dialog.
       CALL FUNCTION \'TRINT_ORDER_CHOICE\'
          EXPORTING
             wi_order_type          = me->gv_order_type
             wi_task_type           = me->gv_task_type
             wi_category            = me->gv_category
          IMPORTING
             we_order               = me->gv_order
             we_task                = me->gv_task
          TABLES
             wt_e071                = me->gt_e71
             wt_e071k               = me->gt_e71k.
    ENDMETHOD.

    method CONSTRUCTOR.
       me->gv_order_type = iv_order_type.
       me->gv_task_type = iv_task_type.
       me->gv_category = iv_category.
    endmethod.

    METHOD create.
       me->call_tr_dialog( ).
       me->fill_e071( ).
       me->tr_append_to_comm_objs_keys( ).
    ENDMETHOD.

    METHOD FILL_E071.

       DATA: lo_strucdescr TYPE REF TO cl_abap_structdescr.
       DATA: lo_tabledescr TYPE REF TO cl_abap_tabledescr.
       FIELD-SYMBOLS: <lfs_tab> TYPE STANDARD TABLE.

       LOOP AT me->gt_tables INTO DATA(ls_table).
          TRY.
             ASSIGN ls_table-table->* TO <lfs_tab>.
             IF <lfs_tab> IS ASSIGNED.
                lo_tabledescr ?= cl_abap_elemdescr=>describe_by_data_ref( ls_table-table ).
                lo_strucdescr ?= lo_tabledescr->get_table_line_type( ).

                DATA(ls_header) = lo_strucdescr->get_ddic_header( ).

                APPEND INITIAL LINE TO me->gt_e71 ASSIGNING FIELD-SYMBOL(<lfs_e71>).
                <lfs_e71>-pgmid = \'R3TR\'.
                <lfs_e71>-object = \'TABU\'.
                <lfs_e71>-obj_name = ls_header-tabname.
                <lfs_e71>-objfunc = \'K\'.
                <lfs_e71>-as4pos = lines( me->gt_e71 ).
                <lfs_e71>-lang = sy-langu.

                me->fill_e071n( EXPORTING is_e070    = <lfs_e71>
                                          it_data    = <lfs_tab>
                                          io_strdscr = lo_strucdescr ).
             ENDIF.
          CATCH cx_sy_move_cast_error .
       ENDTRY.
    ENDLOOP.
  ENDMETHOD.

  METHOD fill_e071n.

      DATA(lt_tab_fields) = io_strdscr->get_ddic_field_list( ).

      LOOP AT it_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
          APPEND INITIAL LINE TO me->gt_e71k ASSIGNING FIELD-SYMBOL(<lfs_e071k>).
          <lfs_e071k>-pgmid      = is_e070-pgmid.
          <lfs_e071k>-object     = is_e070-object.
          <lfs_e071k>-objname    = is_e070-obj_name.
          <lfs_e071k>-mastertype = is_e070-object.
          <lfs_e071k>-mastername = <lfs_e071k>-objname.
          <lfs_e071k>-lang       = sy-langu.\" <lfs_e071k>-lang.
          LOOP AT lt_tab_fields INTO DATA(ls_field) WHERE keyflag = \'X\'.
              ASSIGN COMPONENT ls_field-fieldname OF STRUCTURE <lfs_data> TO FIELD-SYMBOL(<lfs_value>).
              <lfs_e071k>-tabkey     = <lfs_e071k>-tabkey && <lfs_value>.
          ENDLOOP.
      ENDLOOP.
  ENDMETHOD.

  METHOD tr_append_to_comm_objs_keys.
      CALL FUNCTION \'TR_APPEND_TO_COMM_OBJS_KEYS\'
          EXPORTING
              wi_trkorr                      = me->gv_task
          TABLES
              wt_e071                        = me->gt_e71
              wt_e071k                       = me->gt_e71k.
  ENDMETHOD.

ENDCLASS.

    

这里是如何使用这个类的示例。我不会使用我使用的相同代码,因为要创建 5 个 Z 表,所以我将使用一些虚拟代码。让我们假设那些 ztdummy1...ztdummy5 正在定制表。它应该适用于任何定制表。

DATA: lo_tr TYPE REF TO zcl_int_create_tr.
SELECT * FROM ztdummy1 INTO TABLE @data(ltdummy1) WHERE id_dummy =  7.
SELECT * FROM ztdummy2 INTO TABLE @data(ltdummy2) WHERE id_dummy =  7.
SELECT * FROM ztdummy3 INTO TABLE @data(ltdummy3) WHERE id_dummy =  7.
SELECT * FROM ztdummy4 INTO TABLE @data(ltdummy4) WHERE id_dummy =  7.
SELECT * FROM ztdummy5 INTO TABLE @data(ltdummy5) WHERE id_dummy =  7.

CREATE OBJECT lo_tr
  EXPORTING
    iv_order_type = zcl_int_create_tr=>gc_customizing_order_type
    iv_task_type  = zcl_int_create_tr=>gc_customizing_task_type
    iv_category   = zcl_int_create_tr=>gc_customizing_order_category.

lo_tr->add_table( REF #( ltdummy1 ) ).
lo_tr->add_table( REF #( ltdummy2 ) ).
lo_tr->add_table( REF #( ltdummy3 ) ).
lo_tr->add_table( REF #( ltdummy4 ) ).
lo_tr->add_table( REF #( ltdummy5 ) ).

lo_tr->create( ).

有人可以帮我吗?

此致。

罗纳尔多·维埃拉

  • 您的代码无法编译。您可以稍微重写一下,使其成为minimal reproducible example。谢谢你。
  • @SandraRossi,我很抱歉这个帖子。现在,我相信编译代码是可能的。

标签: abap


【解决方案1】:

您是否在 e071 和 E071k 中设置了所有必填字段?

在 E071/E071k 中 trkorr 怎么样? 为什么 as4pos 只设置为 E071 ? 我不使用这些功能,我直接写到表格中。 当我检查我的代码时,我发现两个表中都特别注意 as4pos。 并且 Trkorr 也设置了。

我记得当我第一次编写代码时,一个不正确的 as4pos value/s 解释了你描述的行为。

他是我已经使用了一段时间的示例代码。

METHODS add_tabu_entries
  IMPORTING
    i_trkorr      TYPE trkorr
    i_tablename   TYPE e071-obj_name
    i_tabkey      TYPE any 
    i_with_client TYPE flag.

 

METHOD add_tabu_entries.


    DATA: ls_e071  TYPE e071,
          ls_e071k TYPE e071k,
          l_max    TYPE ddposition,
          l_as4pos TYPE  ddposition,
          l_max_k TYPE ddposition.

    IF i_trkorr IS INITIAL.
      RETURN.
    ENDIF.

    SELECT SINGLE as4pos FROM e071 INTO l_as4pos
        WHERE trkorr = i_trkorr
        AND pgmid = 'R3TR'
        AND object = 'TABU'
        AND obj_name = i_tablename.

    IF sy-subrc <> 0.
      SELECT  MAX( as4pos ) FROM e071 INTO l_max
              WHERE trkorr = i_trkorr.

      l_as4pos =  l_max + 1.

    ENDIF.

    ls_e071-trkorr  = i_trkorr.
    ls_e071-as4pos = l_as4pos.
    ls_e071-pgmid = 'R3TR'.
    ls_e071-object = 'TABU'.
    ls_e071-obj_name = i_tablename.
    ls_e071-objfunc = 'K'.

    modify e071 FROM ls_e071.   

    ls_e071k-trkorr = i_trkorr.
    ls_e071k-pgmid = 'R3TR'.
    ls_e071k-object = 'TABU'.
    ls_e071k-objname = i_tablename.
    ls_e071k-mastertype = 'TABU'.
    ls_e071k-mastername = i_tablename.

    IF i_tabkey IS NOT INITIAL.

      l_max_k = get_max_as4pos( ls_e071k ).
 
      ls_e071k-as4pos = l_max_k + 1.

      IF i_with_client = 'X'.
        CONCATENATE sy-mandt i_tabkey INTO  ls_e071k-tabkey .
      ELSE.
        ls_e071k-tabkey = i_tabkey.
      ENDIF.

      modify e071k FROM ls_e071k.

      RETURN.

    ENDIF.
   
endmethod. 


 METHOD get_max_as4pos.
    SELECT   MAX( as4pos ) FROM e071k INTO r_result
          WHERE trkorr = is_e071k-trkorr
          and pgmid = is_e071k-pgmid " 'R3TR'
          and object = is_e071k-object  "'TABU'
          and objname = is_e071k-objname " i_tablename
          and mastertype = is_e071k-mastertype    "'TABU'
          and mastername = is_e071k-mastername. "  i_tablename.

  ENDMETHOD.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多