Как-то так...
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.