Да братан... чего-то ты тут накрутил, сам черт ногу сломает... вообще все кажется гораздо проще. Вот рабочий пример для конкретного документа контракта:
REPORT ytov_test_mk31k .
DATA: l_im_agreement_header LIKE bapioahead,
l_im_agreement_header_x LIKE bapioaheax,
lt_imt_agreement_items LIKE bapioaitem OCCURS 1 WITH HEADER LINE,
lt_imt_agreement_items_x LIKE bapioaitex OCCURS 1 WITH HEADER LINE,
lt_return LIKE bapiret2 OCCURS 1 WITH HEADER LINE.
CLEAR: l_im_agreement_header, l_im_agreement_header_x,
lt_imt_agreement_items, lt_imt_agreement_items_x, lt_return,
lt_imt_agreement_items[], lt_imt_agreement_items_x[],
lt_return[].
* Параметры для обработки (номер документа, типа документа контракт -
* можно чиать из таблицы если это изменение для создания надо задать,
* код валюты - ну в 4.6 почему-то требует заполнения этого поля, иначе
* говорит, что ошибка валюта не определена, надо читать из таблицы EKKO
* ну если это изменение, а иначе заполняем).
l_im_agreement_header-agmt_no = '4600000001'.
l_im_agreement_header-doc_cat = 'K'.
l_im_agreement_header-currency = 'UAH'.
* Изменяемые поля заголовка (Для примера группа закупок)
l_im_agreement_header-pur_group = '004'.
l_im_agreement_header_x-pur_group = 'X'.
* Параметры для обработки (номер изменяемой строки/позиции договора)
lt_imt_agreement_items-agrmt_item = '00010'.
lt_imt_agreement_items_x-agrmt_item = '00010'.
* Изменяемы позиции контракта (Для примера количество)
lt_imt_agreement_items-target_qty = '12'.
lt_imt_agreement_items_x-target_qty = 'X'.
APPEND: lt_imt_agreement_items, lt_imt_agreement_items_x.
CALL FUNCTION 'BAPI_AGREEMENT_MAINTAIN'
EXPORTING
im_agreement_header = l_im_agreement_header
im_agreement_header_x = l_im_agreement_header_x
im_all_items_passed = space
TABLES
ext_return = lt_return
imt_agreement_items = lt_imt_agreement_items
imt_agreement_items_x = lt_imt_agreement_items_x.
LOOP AT lt_return WHERE type = 'A' OR type = 'E'.
MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number
WITH lt_return-message_v1 lt_return-message_v2
lt_return-message_v3 lt_return-message_v4.
ENDLOOP.
Опять же в структуру l_im_agreement_header_x, как и для lt_imt_agreement_items_x включаем галки только для полей которые меняем. Если поле не меняется, из примера это код валюты, то в эту структуру для поля валюты галку ставить не нужно.
Кстати по значению поля l_im_agreement_header-doc_cat, оно определяет тип транзакции которую следует вызвать для обработки документа. Вариантов там судя по тексту:
CASE im_bstyp.
WHEN 'K'.
IF im_bapi_mode EQ gc_create_mode.
IF sy-saprl(1) EQ '3'.
ch_tcode = 'ME31'.
ELSE.
ch_tcode = 'ME31K'.
ENDIF.
ELSE.
IF sy-saprl(1) EQ '3'.
ch_tcode = 'ME32'.
ELSE.
ch_tcode = 'ME32K'.
ENDIF.
ENDIF.
WHEN 'L'.
IF im_bapi_mode EQ gc_create_mode.
IF sy-saprl(1) EQ '3'.
ch_tcode = 'ME31'.
ELSE.
ch_tcode = 'ME31L'.
ENDIF.
ELSE.
IF sy-saprl(1) EQ '3'.
ch_tcode = 'ME32'.
ELSE.
ch_tcode = 'ME32L'.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
т.е. может быть или K-Контракт или L-Соглашение о поставках, любой другой тип документа закупки проезжает мимо кассы. Ну и типа если система до версии 4, то используется старые транзакции, а если старше, то новые.
PS: Ну и это... тех коде-бокс не просто так присобачен для галочки, так что если текст вставляем, то и оформление делаем соответствующее.