В общем для систем ниже 4.6C и возможно даже 4.7 при использовании регистра материала существует проблема отсутствия какого-либо модуля для реализации дооценки/уценки запаса материала, тоже что выполняет стандартная транзакция MR22. В принципе предложенную ниже программу можно довольно просто модифицировать так же и для вызова изменения цены запасов MR21. Программа оформлена в виде функционального модуля. Оценка выполняется по трем валютам. Опять же если у вас одна валюта или две это легко модифицируется.
Структура Y_BAPI_MR22_ITEMS - Содержит список материалов и параметров для выполнения переоценки.
MATNR MATNR CHAR 18 0 Номер материала
BWTAR BWTAR_D CHAR 10 0 Вид оценки
PSPNR PS_POSID CHAR 24 0 Элемент структурного плана проекта (СПП-элемент)
MENGE MENGE_D QUAN 13 3 Количество
COST_10 CKML_PRICE CURR 11 2 Базовый тариф совокупный
COST_20 CKML_PRICE CURR 11 2 Базовый тариф совокупный
COST_50 CKML_PRICE CURR 11 2 Базовый тариф совокупный
Вспомогательные структуры для пакетного ввода
* Данные для проводки пакетных вводов
DATA: BEGIN OF bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF bdcdata.
* Результаты проводки пакетного ввода
DATA BEGIN OF itab OCCURS 10.
INCLUDE STRUCTURE bdcmsgcoll.
DATA END OF itab.
Собственно сам код функционального модуля, комментарии по ходу текста.
FUNCTION y_bapi_mr22.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(PI_DATE_POST) LIKE MR21HEAD-BUDAT DEFAULT SY-DATUM
*" VALUE(PI_BUKRS) LIKE MR21HEAD-BUKRS
*" VALUE(PI_WERKS) LIKE MR21HEAD-WERKS
*" VALUE(PI_XBLNR) LIKE MR21HEAD-XBLNR DEFAULT 'YCOMMON'
*" VALUE(PI_BKTXT) LIKE MR21HEAD-BKTXT DEFAULT 'BAPI MR22'
*" EXPORTING
*" REFERENCE(PO_BELNR) LIKE MLHD-BELNR
*" REFERENCE(PO_KJAHR) LIKE MLHD-KJAHR
*" VALUE(PO_RETURN) LIKE BAPIRET2 STRUCTURE BAPIRET2
*" TABLES
*" PT_ITEM STRUCTURE Y_BAPI_MR22_ITEMS
*"----------------------------------------------------------------------
DATA: f_run(1) TYPE c,
call_error(1) TYPE c,
n_col(17) TYPE n,
sum_10(17) TYPE c,
sum_20(17) TYPE c,
sum_50(17) TYPE c,
l_count LIKE sy-tabix,
date_post(10) TYPE c.
* Записать заголовок транзакции
CLEAR: po_return.
* Проверить есть ли позиции для обработки
DESCRIBE TABLE pt_item LINES l_count.
IF l_count = 0.
po_return-type = 'S'.
po_return-message = 'Нет позиции для обработки'.
EXIT.
ENDIF.
REFRESH: bdcdata, itab.
WRITE: pi_date_post TO date_post.
PERFORM dynpro USING:
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_CURSOR' 'MR21HEAD-BKTXT',
' ' 'BDC_OKCODE' '=ENTR',
' ' 'MR21HEAD-BUDAT' date_post,
' ' 'MR21HEAD-BUKRS' pi_bukrs,
' ' 'MR21HEAD-WERKS' pi_werks,
' ' 'MR21HEAD-XBLNR' pi_xblnr,
' ' 'MR21HEAD-BKTXT' pi_bktxt,
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_'.
* Заполним позиции материалами для общего формирования документа
LOOP AT pt_item.
PERFORM dynpro USING:
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_OKCODE' '=BOTT',
' ' 'BDC_CURSOR' 'CKI_MR22_0250-MATNR(01)',
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_',
' ' 'CKI_MR22_0250-MATNR(01)' pt_item-matnr,
' ' 'CKI_MR22_0250-BWTAR(01)' pt_item-bwtar,
' ' 'CKI_MR22_0250-PSPNR(01)' pt_item-pspnr,
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_OKCODE' '=DOWN',
' ' 'BDC_CURSOR' 'CKI_MR22_0250-MATNR(01)',
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_'.
ENDLOOP.
* Вернуться на первую позицию документа на первый материал
PERFORM dynpro USING:
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_OKCODE' '=TOP',
' ' 'BDC_CURSOR' 'CKI_MR22_0250-MATNR(01)',
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_',
* Выделить все и оставить курсов на перовой позиции материала
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_OKCODE' '=ALL',
' ' 'BDC_CURSOR' 'CKI_MR22_0250-MATNR(01)',
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_',
* Перейти на позицию подробно для ввода сумм
'X' 'SAPRCKM_MR22' '0201',
' ' 'BDC_OKCODE' '=DAIL',
' ' 'BDC_CURSOR' 'CKI_MR22_0250-MATNR(01)',
' ' 'MR21HEAD-SCREEN_VARIANT' 'ALLE MATERIALIEN - OHNE BWKEY_'.
* Ввести суммы и количество на которые выполняется дооценка
LOOP AT pt_item.
WRITE: pt_item-menge TO n_col,
pt_item-cost_10 TO sum_10,
pt_item-cost_20 TO sum_20,
pt_item-cost_50 TO sum_50.
PERFORM dynpro USING:
'X' 'SAPRCKM_MR22' '0300',
' ' 'BDC_OKCODE' '=NEXT',
' ' 'BDC_CURSOR' 'CKI_MR22_INPUT-MENGE',
' ' 'CKI_MR22_INPUT-MENGE' n_col,
' ' 'CKI_MR22_0300-ZUUMB(01)' sum_10,
' ' 'CKI_MR22_0300-ZUUMB(02)' sum_20,
' ' 'CKI_MR22_0300-ZUUMB(03)' sum_50.
ENDLOOP.
* Сохранить документ
PERFORM dynpro USING:
'X' 'SAPRCKM_MR22' '0300',
' ' 'BDC_OKCODE' '=SAVE',
' ' 'BDC_CURSOR' 'CKI_MR22_INPUT-MENGE'.
* Вызвать транзакцию
f_run = 'E'.
CALL TRANSACTION 'MR22' USING bdcdata MODE f_run UPDATE 'S'
MESSAGES INTO itab.
* Проверить как прошел вызов
call_error = space.
LOOP AT itab WHERE msgtyp = 'E' OR msgtyp = 'A' OR msgid = '00'.
call_error ='X'.
EXIT.
ENDLOOP.
IF call_error ='X'.
po_return-type = itab-msgtyp.
po_return-id = itab-msgid.
po_return-number = itab-msgnr.
po_return-message_v1 = itab-msgv1.
po_return-message_v2 = itab-msgv2.
po_return-message_v3 = itab-msgv3.
po_return-message_v4 = itab-msgv4.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = po_return-id
msgnr = po_return-number
msgv1 = po_return-message_v1
msgv2 = po_return-message_v2
msgv3 = po_return-message_v3
msgv4 = po_return-message_v4
IMPORTING
message_text_output = po_return-message.
ELSE.
po_return-type = 'S'.
* Прочитать номер проведенного документа
READ TABLE itab WITH KEY msgtyp = 'S'
msgid = 'CKPRCH'
msgnr = '019'.
WRITE: itab-msgv1 TO po_belnr,
pi_date_post(4) TO po_kjahr.
ENDIF.
ENDFUNCTION.
Вспомогательная процедурка
*&---------------------------------------------------------------------*
*& Form DYNPRO
*&---------------------------------------------------------------------*
* Генерация полей для BATCH-INPUT
*----------------------------------------------------------------------*
FORM dynpro USING dynbegin name value.
IF dynbegin = 'X'.
CLEAR bdcdata.
MOVE: name TO bdcdata-program,
value TO bdcdata-dynpro,
'X' TO bdcdata-dynbegin.
APPEND bdcdata.
ELSE.
CLEAR bdcdata.
MOVE: name TO bdcdata-fnam,
value TO bdcdata-fval.
APPEND bdcdata.
ENDIF.
ENDFORM.