Автор Тема: Обертка для транзакции MR22 (MR21)  (Прочитано 13491 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 761
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Обертка для транзакции MR22 (MR21)
« : Июнь 19, 2007, 02:52:12 pm »
В общем для систем ниже 4.6C и возможно даже 4.7 при использовании регистра материала существует проблема отсутствия какого-либо модуля для реализации дооценки/уценки запаса материала, тоже что выполняет стандартная транзакция MR22. В принципе предложенную ниже программу можно довольно просто модифицировать так же и для вызова изменения цены запасов MR21. Программа оформлена в виде функционального модуля. Оценка выполняется по трем валютам. Опять же если у вас одна валюта или две это легко модифицируется.

Код: You are not allowed to view links. Register or Login
Структура 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 Базовый тариф совокупный

Вспомогательные структуры для пакетного ввода
Код: You are not allowed to view links. Register or Login
* Данные для проводки пакетных вводов
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.

Собственно сам код функционального модуля, комментарии по ходу текста.
Код: You are not allowed to view links. Register or Login
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.

Вспомогательная процедурка
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*&      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.

Greed

  • Гость
Re: Обертка для транзакции MR22 (MR21)
« Ответ #1 : Октябрь 30, 2012, 11:51:14 am »
Добрый день.
Интересная тема. Есть ситуация, когда очень нужно дооценить запас. Возникла ошибка: № сообщения M7308 Стоимость и объем запаса несовместимы: 0,01- / 0,000.
Так уж получилось, что ссц больше нуля, кол-во ноль, а стоимость запаса -0,01. Отсторнировать документы, либо провести что-либо по данному артикулу не получается. Смотрел ноте, есть где предлагают изменить ФМ DYNAMIC_PRICECHANGE_PROPOSE. Изменения о которых пишут - есть. Что еще можно сделать - не знаю.
Можете подсказать, данная реализация может исправить мою ситуацию или может сталкивались с данной проблемой и знаете как еще ее можно решить?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 761
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Обертка для транзакции MR22 (MR21)
« Ответ #2 : Октябрь 30, 2012, 12:14:53 pm »
You are not allowed to view links. Register or Login
Можете подсказать, данная реализация может исправить мою ситуацию или может сталкивались с данной проблемой и знаете как еще ее можно решить?
Нет это просто обертка вокруг MR22, так что если она не работает то и эта реализация тоже не работает. Если кол-во нулевое, а стоимость запаса есть, то похоже вам быстрее всего выставить сообщение в SAP, так как это надо помоему уже на низком уровне таблицы править будет.

Greed

  • Гость
Re: Обертка для транзакции MR22 (MR21)
« Ответ #3 : Октябрь 30, 2012, 01:02:08 pm »
спасибо.
Я об таком исходе предупредил начальнига, а он не верил, говорит самми справимся :)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 761
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Обертка для транзакции MR22 (MR21)
« Ответ #4 : Октябрь 30, 2012, 01:10:51 pm »
You are not allowed to view links. Register or Login
Я об таком исходе предупредил начальнига, а он не верил, говорит самми справимся :)
Ну тут два варианта или справитесь или нет, если не справитесь, то хотя бы копию сохраните того с чего начали справляться, а то завалите дальше системные таблицы после чего вам и SAP может не помочь.

PS:  В свое время как-то упало у нас немножко продуктива, но мы об этом узнали не сразу, что привело к некоторым проблемам в таблицах регистра материала. Ну скажу что до того момент когда поняли как исправлять, неделю рихтовали таблицы и смотрели на результат.