Тут вот понадобилось обновить массово данные по заводам (Ритейл, WB02).
Использовать LSMW c пакетным вводом не получилось (по непонятным причинам, система сразу за wb02 вызывала последовательно XK02 и XD02, при этом в XD02 данные пакетного ввода не передавались).
Решил написать небольшую программку, см. ниже.
Пару особенностей:
Если использовать стандартный вызов:
CALL TRANSACTION 'WB02' USING gt_bdctable MODE 'E' UPDATE 'A'.
То получаем, ту же ситуацию - вызов XK02 и XD02.
В ходе экспериментов в SHDB, было выявлено, что необходимо вызывать пакетник с параметрами UPDATE 'L' (Local) + без режима пакетного ввода см. рис. 1. (видимо если SY-BINPT не пустой, то система, автоматом вызывает связанные транзакции.
SY-BINPT=SPACE при CALL TRANSACTION USING... )
В таком случае, при вызове транзакции в коде, необходимо использовать OPTIONS FROM opt (тип - ctu_params), вместо MODE 'E' UPDATE 'A'.
*&---------------------------------------------------------------------*
*& Report ZMM_UPDATE_WERKS
*&---------------------------------------------------------------------*
REPORT zmm_update_werks.
TABLES: ekko.
INCLUDE zmm_functions.
TYPE-POOLS: truxs, slis.
TYPES: BEGIN OF gs_buffer.
TYPES: col1(30) TYPE c. " код
TYPES: col2(30) TYPE c. " название
TYPES: col3(30) TYPE c. " улица
TYPES: col4(30) TYPE c. " город
TYPES: END OF gs_buffer.
SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE text-011.
PARAMETERS: p_fname LIKE rlgrap-filename DEFAULT 'c:\UPD_HEADER.xls'.
SELECTION-SCREEN END OF BLOCK 10.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_fname.
START-OF-SELECTION.
PERFORM read_data.
FORM read_data.
DATA: str_temp TYPE string.
DATA: it_raw TYPE truxs_t_text_data.
DATA: i_strlen TYPE i.
DATA: gt_buffer TYPE STANDARD TABLE OF gs_buffer.
DATA: ls_buffer LIKE LINE OF gt_buffer.
DATA: werks TYPE werks_d.
DATA: name TYPE string.
DATA: street TYPE string.
DATA: city TYPE string.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X'
i_tab_raw_data = it_raw
i_filename = p_fname
TABLES
i_tab_converted_data = gt_buffer[]
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
LOOP AT gt_buffer INTO ls_buffer.
werks = ls_buffer-col1.
name = ls_buffer-col2.
street = ls_buffer-col3.
city = ls_buffer-col4.
PERFORM do_update_werks USING werks name street city.
ENDLOOP.
ENDFORM.
FORM do_update_werks
USING zwerks TYPE werks_d
zname TYPE string
zstreet TYPE string
zcity TYPE string.
DATA: opt TYPE ctu_params OCCURS 10 WITH HEADER LINE.
DATA: txt TYPE string.
DATA: str TYPE string.
CONCATENATE 'Завод' zwerks INTO txt SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = 0 text = txt.
CLEAR gt_bdctable.
REFRESH gt_bdctable.
PERFORM bdcpro USING:
'X' 'SAPMWBE3' '0102',
' ' 'BDC_CURSOR' 'WR02D-LOCNR',
' ' 'BDC_OKCODE' '/00',
' ' 'WR02D-LOCNR' zwerks.
PERFORM bdcpro USING:
'X' 'SAPMWBE3' '0401',
' ' 'BDC_OKCODE' '=5200',
' ' 'BDC_SUBSCR' 'SAPMWBE3 5100SUB1',
' ' 'BDC_SUBSCR' 'SAPMWBE3 2100ORGA'.
PERFORM bdcpro USING:
'X' 'SAPMWBE3' '0401',
' ' 'BDC_OKCODE' '=UPDA',
' ' 'BDC_SUBSCR' 'SAPMWBE3 5200SUB1',
' ' 'BDC_CURSOR' 'ADDR1_DATA-CITY1',
' ' 'ADDR1_DATA-NAME1' zwerks,
' ' 'ADDR1_DATA-SORT1' zwerks,
' ' 'ADDR1_DATA-SORT2' zwerks,
' ' 'ADDR1_DATA-STREET' zstreet,
' ' 'ADDR1_DATA-CITY1' zcity.
CLEAR opt.
REFRESH opt.
opt-nobinpt = 'X'.
opt-updmode ='L'.
opt-dismode = 'E'.
APPEND opt.
CALL TRANSACTION 'WB02' USING gt_bdctable OPTIONS FROM opt. "'A'.
"CALL TRANSACTION 'WB02' USING gt_bdctable MODE 'E' UPDATE 'A'. " Так не работает
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. " do_update_werks