Как-то так...
Code:
*&---------------------------------------------------------------------*
*& Report ZJDTEST
*&
*&---------------------------------------------------------------------*
*& необходимо обновить поля knvv-vkbur(Sales Office),
*& knvv-vkgrp(Sales Group), knvv-bzirk(Sales District).
*&---------------------------------------------------------------------*
REPORT zjdtest.
CONSTANTS c_update TYPE c VALUE 'U'.
DATA: cst TYPE cmds_ei_extern.
DATA: is_master_data TYPE cmds_ei_main.
DATA: es_master_data_correct TYPE cmds_ei_main,
es_master_data_defective TYPE cmds_ei_main,
es_message_correct TYPE cvis_message,
es_message_defective TYPE cvis_message.
DATA: sales_data TYPE cmds_ei_sales.
DATA: data TYPE cmds_ei_sales_data,
datax TYPE cmds_ei_sales_datax.
DATA: ls_knvv TYPE knvv.
DATA: message_text TYPE text100,
message_defe TYPE bapiret2,
message_inco TYPE bapiret2,
message_count TYPE int1 VALUE 0.
SELECTION-SCREEN BEGIN OF BLOCK object WITH FRAME TITLE object.
PARAMETERS: p_kunnr LIKE kna1-kunnr OBLIGATORY DEFAULT '0000102075',
p_vkorg LIKE knvv-vkorg OBLIGATORY DEFAULT '1003',
p_vtweg LIKE knvv-vtweg OBLIGATORY DEFAULT '10',
p_spart LIKE knvv-spart OBLIGATORY DEFAULT '10'.
SELECTION-SCREEN END OF BLOCK object.
SELECTION-SCREEN BEGIN OF BLOCK data WITH FRAME TITLE modif.
PARAMETERS: p_vkbur LIKE knvv-vkbur,
p_vkgrp LIKE knvv-vkgrp,
p_bzirk LIKE knvv-bzirk.
SELECTION-SCREEN END OF BLOCK data.
INITIALIZATION.
object = 'Данные рынка сбыта'.
modif = 'Обновляемые значения'.
START-OF-SELECTION.
" Выбираем данные для обновления
SELECT SINGLE * FROM knvv INTO ls_knvv
WHERE kunnr = p_kunnr
AND vkorg = p_vkorg
AND vtweg = p_vtweg
AND spart = p_spart.
IF sy-subrc <> 0.
MESSAGE 'Данные рынка сбыта не найдены' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
MOVE-CORRESPONDING ls_knvv TO data.
" Модифицируем
IF p_vkbur IS NOT INITIAL AND p_vkbur <> ls_knvv-vkbur.
data-vkbur = p_vkbur.
datax-vkbur = 'X'.
ENDIF.
IF p_vkgrp IS NOT INITIAL AND p_vkgrp <> ls_knvv-vkgrp.
data-vkgrp = p_vkgrp.
datax-vkgrp = 'X'.
ENDIF.
IF p_bzirk IS NOT INITIAL AND p_bzirk <> ls_knvv-bzirk.
data-bzirk = p_bzirk.
datax-bzirk = 'X'.
ENDIF.
IF data IS INITIAL.
MESSAGE 'Изменений не обнаружено' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
" Изменения есть, заполняем интерфейс
cst-header-object_task = c_update.
cst-header-object_instance-kunnr = p_kunnr.
sales_data-task = c_update.
sales_data-data_key-vkorg = p_vkorg.
sales_data-data_key-vtweg = p_vtweg.
sales_data-data_key-spart = p_spart.
sales_data-datax = datax.
sales_data-data = data.
APPEND sales_data TO cst-sales_data-sales.
cst-sales_data-current_state = 'X'.
APPEND cst TO is_master_data-customers.
CALL METHOD cmd_ei_api=>maintain_bapi
EXPORTING
iv_test_run = space
iv_collect_messages = space
is_master_data = is_master_data
IMPORTING
es_master_data_correct = es_master_data_correct
es_message_correct = es_message_correct
es_master_data_defective = es_master_data_defective
es_message_defective = es_message_defective.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF es_message_defective-is_error IS NOT INITIAL.
CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
TABLES
i_bapiret2_tab = es_message_defective-messages.
ELSEIF es_message_correct-is_error IS NOT INITIAL.
CALL FUNCTION 'C14ALD_BAPIRET2_SHOW'
TABLES
i_bapiret2_tab = es_message_correct-messages.
ENDIF.
ELSE.
ADD 1 TO message_count.
WRITE: / , 'Обнаружена ошибка (cmd_ei_api=>maintain_bapi)'.
EXIT.
ENDIF.