[英]Build a transport request manually in SAP-ABAP
I developed an program that inserts records in 5 customizing tables and I need to build manually a transport request.我开发了一个在 5 个自定义表中插入记录的程序,我需要手动构建一个传输请求。 I've try this using function module TRINT_ORDER_CHOICE and TR_APPEND_TO_COMM_OBJS_KEYS and after all, looking into a TR in SE09 everything looks good, I can see all entries of all 5 tables with his keys, but when I run SCC1 in the client where I need those data, it's just fetch 1 record of the fisrt table.
我已经使用 function 模块 TRINT_ORDER_CHOICE 和 TR_APPEND_TO_COMM_OBJS_KEYS 尝试了这个,毕竟,在 SE09 中查看 TR 一切看起来都很好,我可以看到所有 5 个表的所有条目和他的键,但是当我在需要这些键的客户端中运行 SCC1 时数据,它只是获取第一个表的 1 条记录。 I'm also tried to do a batch input of SM30 for each table but it's do not insert any record into the transport request.
我还尝试为每个表执行 SM30 的批量输入,但它不会在传输请求中插入任何记录。 It was uselles do the batch input with DISMODE = N or DISMODE = A. For my first approach I worte a class and here I share the code with a hope somebody can help me.
使用 DISMODE = N 或 DISMODE = A 进行批量输入是有用的。对于我的第一种方法,我写了一个 class ,在这里我分享代码,希望有人能帮助我。 Here the full source code of the class that generate de transport request.
这里是生成 de 传输请求的 class 的完整源代码。
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.
Here a sample of how to use this class.这里是如何使用这个 class 的示例。 I will not use the same code I used because there are 5 Z tables to create, so I will use some dummy code.
我不会使用我使用的相同代码,因为要创建 5 个 Z 表,所以我将使用一些虚拟代码。 Let's supose that those ztdummy1...ztdummy5 are customizing table.
假设那些 ztdummy1...ztdummy5 正在定制表。 It's should work with any customizing table.
它应该适用于任何定制表。
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( ).
Could someone please help me?有人可以帮我吗?
Best regards.此致。
Ronaldo S. Vieira罗纳尔多·维埃拉
Are you setting all required fields in e071 and E071k?您是否在 e071 和 E071k 中设置了所有必填字段?
In both E071/E071k What about trkorr?在 E071/E071k 中 trkorr 怎么样? Why is as4pos only set with E071?
为什么 as4pos 只用 E071 设置? I dont use the functions, I write direct to the tables.
我不使用这些功能,我直接写到表格中。 When I check my code, I see special attention to as4pos in both tables.
当我检查我的代码时,我发现两个表中都特别注意 as4pos。 And Trkorr is also set.
并且 Trkorr 也设置了。
I remember when I first wrote the code, an Incorrect as4pos value/s explains the behaviour you describe.我记得当我第一次编写代码时,一个不正确的 as4pos value/s 解释了你描述的行为。
He is a sample piece of code i've been using for some time.他是我已经使用了一段时间的示例代码。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.