Автор Тема: Программка для создания записи оценки в MBEW по приходам.  (Прочитано 7117 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 762
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
В общем-то на самом деле программа сделана для автоматизации решения создания записей оценки MBEW для материалов, в том случае если запасы приходуются и перемещаются в запасах проектов. При этом возникает ошибка при создании документов резервирования на такие запасы. Вообще-то, я в свое время гнездо не поборол, чтобы они исправили это для резервирований. Так что как обычно пришлось затыкать эту дырку самому.

Собственно подробнее об использовании и причинах написано тут: You are not allowed to view links. Register or Login

Работает или при запуске из диалога, тогда просто подставляем документ материала в котором есть интересующие нас записи материалов или из фона по событию. Если запись оценки для материала есть, то такой материал пропускается. По умолчанию операция выполняется для завода из ссылочного документа материала. Но если задать завод на экране выбора, то операция пройдет для заданного завода. Для работы требуется отдельный вид движения созданный на основе стандартного 561 вида движения материала.

А собственно сам текст программы:
Код: You are not allowed to view links. Register or Login
*&**********************************************************************
*& Comments    : Создание пустой записи оценки для материалов в таблице
*&               MBEW. Вызов возможне как из события так и в диалоге
*& Platform    : SAP R/3 V4.6С or later
*& Autor       :
*& Date create : 06.09.2007
*& Date change : 06.09.2007
*&**********************************************************************
REPORT ytov_autocreate_mbew MESSAGE-ID yy.
TABLES: mkpf, mseg.

************************************************************************
PARAMETERS: p_mblnr LIKE mkpf-mblnr,
            p_mjahr LIKE mkpf-mjahr.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_bwart LIKE mseg-bwart DEFAULT 'Z61' OBLIGATORY,
            p_werks LIKE mseg-werks,
            p_lgort LIKE mseg-lgort.
************************************************************************
DATA: BEGIN OF t_mseg OCCURS 10,
  sel(1) TYPE c,
  bldat LIKE mkpf-bldat,
  budat LIKE mkpf-budat,
  matnr LIKE mseg-matnr,
  werks LIKE mseg-werks,
  lgort LIKE mseg-lgort,
  charg LIKE mseg-charg,
  bwtar LIKE mseg-bwtar,
  meins LIKE mseg-meins,
  bwkey LIKE t001w-bwkey,
END OF t_mseg.

DATA: l_error(1) TYPE c,
      event_id LIKE tbtco-eventid,
      eventparm LIKE tbtco-eventparm.

DATA: goodsmvt_code LIKE bapi2017_gm_code,
      l_mmdoc LIKE bapi2017_gm_head_ret,
      l_candoc LIKE bapi2017_gm_head_ret,
      goodsmvt_header LIKE bapi2017_gm_head_01,
      goodsmvt_item LIKE bapi2017_gm_item_create
                    OCCURS 0 WITH HEADER LINE,
      l_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.

************************************************************************
START-OF-SELECTION.

* Вызов программы по событию 'Y_POSTMM_EVENT'
  IF sy-batch = 'X' AND ( p_mblnr = space OR p_mjahr = space ).
    CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
         IMPORTING
              eventid         = event_id
              eventparm       = eventparm
         EXCEPTIONS
              no_runtime_info = 1.
    IF sy-subrc = 0.
*     Номер документа из параметров
      p_mblnr = eventparm(10).
      p_mjahr = eventparm+10(4).
    ELSE.
*     Ошибка получения данных параметров для события
      MESSAGE e298 WITH 'Y_POSTMM_EVENT'.
    ENDIF.
  ENDIF.

* Проверим есть такой докмент уже в базе или нет
  l_mmdoc-mat_doc = p_mblnr.
  l_mmdoc-doc_year = p_mjahr.
  PERFORM wait_update_process USING l_mmdoc
                              CHANGING l_error.
  CHECK l_error = space.

* Прочитать документ материала
  PERFORM read_document TABLES t_mseg
                        USING p_mblnr p_mjahr.

* Провести поступление запаса для создания записи в MBEW
  PERFORM post_document TABLES t_mseg
                        CHANGING l_mmdoc.

* Если проводка успешно прошла тогда отсторнировать проведенный документ
  IF l_mmdoc-mat_doc <> space.
    PERFORM cancel_document USING l_mmdoc
                            CHANGING l_candoc.
  ENDIF.

************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR: p_mblnr.
  DATA: flag(1) TYPE c.

  flag  = 'X'.
  EXPORT flag TO MEMORY ID 'MB51_FLAG'.
  CALL TRANSACTION 'MB51'.
  GET PARAMETER ID 'MBN' FIELD p_mblnr.
  GET PARAMETER ID 'MJA' FIELD p_mjahr.

************************************************************************
************************************************************************
*&---------------------------------------------------------------------*
*&      Form  read_document
*&---------------------------------------------------------------------*
*       Прочитать документ с данными для обработки
*----------------------------------------------------------------------*
*      <-- PT_MSEG  - Список позиций материала для обработки
*      --> P_MBLNR  - Номер документа ММ
*      --> P_MJAHR  - Год документа ММ
*----------------------------------------------------------------------*
FORM read_document TABLES pt_mseg STRUCTURE t_mseg
                   USING  p_mblnr
                          p_mjahr.
  DATA l_mbew LIKE mbew.

* Позиции документа ММ
  SELECT mk~bldat
         mk~budat
         ms~matnr
         ms~werks
         ms~lgort
         ms~charg
         ms~bwtar
         ms~meins
         tw~bwkey
  INTO CORRESPONDING FIELDS OF TABLE pt_mseg
  FROM mkpf AS mk
     JOIN mseg AS ms ON ms~mblnr = mk~mblnr AND
                        ms~mjahr = mk~mjahr
     JOIN t001w AS tw ON tw~werks = ms~werks
  WHERE mk~mblnr = p_mblnr AND mk~mjahr = p_mjahr AND
        ms~xauto = space.
  CHECK sy-subrc = 0.

* Проверить какие виды оценки не существуют в MBEW
  LOOP AT pt_mseg.
    SELECT SINGLE *  INTO l_mbew
    FROM mbew WHERE matnr = pt_mseg-matnr AND
                    bwkey = pt_mseg-bwkey AND
                    bwtar = pt_mseg-bwtar.
    IF sy-subrc <> 0. pt_mseg-sel = 'X'. ENDIF.
    IF p_werks <> space AND p_lgort <> space.
      pt_mseg-werks = p_werks.
      pt_mseg-lgort = p_lgort.
    ENDIF.
    MODIFY pt_mseg.
  ENDLOOP.
ENDFORM.                    " read_document
*&---------------------------------------------------------------------*
*&      Form  post_document
*&---------------------------------------------------------------------*
*       Проводка документа материала начального поступления
*----------------------------------------------------------------------*
*      --> PT_MSEG - Позиции для обработки
*      <-- P_MMDOC - Номер и год проведенного документа
*----------------------------------------------------------------------*
FORM post_document TABLES   pt_mseg STRUCTURE t_mseg
                   CHANGING p_mmdoc STRUCTURE bapi2017_gm_head_ret.
  DATA: lp_testrun LIKE bapi2017_gm_gen-testrun.

  CLEAR: p_mmdoc, goodsmvt_item, goodsmvt_header, l_return.
  REFRESH: goodsmvt_item, l_return.

* Позиции документа
  LOOP AT pt_mseg WHERE sel = 'X'.
    goodsmvt_item-move_type = p_bwart.         "Вид движения
    goodsmvt_item-material = pt_mseg-matnr.    "Код материала

    goodsmvt_item-plant = pt_mseg-werks.           "Завод
    goodsmvt_item-stge_loc = pt_mseg-lgort.        "Склад
    goodsmvt_item-batch = pt_mseg-charg.           "Партия
    goodsmvt_item-val_type = pt_mseg-bwtar.        "Вид оценки

    goodsmvt_item-entry_qnt = '1'.                 "Количество = 1
    goodsmvt_item-entry_uom = pt_mseg-meins.       "ЕдИзм

    APPEND goodsmvt_item.
  ENDLOOP.
  CHECK sy-subrc = 0.

* Заголовок документа
  goodsmvt_header-pstng_date = pt_mseg-budat.  "Дата проводки
  goodsmvt_header-doc_date = pt_mseg-bldat.    "Дата документа
  goodsmvt_header-pr_uname = sy-uname.         "Имя пользователя
  CONCATENATE p_mblnr '/' p_mjahr INTO goodsmvt_header-ref_doc_no.
  goodsmvt_header-header_txt = 'Create MBEW'.
  goodsmvt_code = '05'.

  lp_testrun = space.
  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
       EXPORTING
            goodsmvt_header  = goodsmvt_header
            goodsmvt_code    = goodsmvt_code
            testrun          = lp_testrun
       IMPORTING
            goodsmvt_headret = p_mmdoc
       TABLES
            goodsmvt_item    = goodsmvt_item
            return           = l_return
       EXCEPTIONS
            OTHERS           = 1.

* Проверим как прошло сохранение документа
  IF sy-subrc <> 0.
    CLEAR: p_mmdoc.
    l_return-type = 'E'.
    l_return-message = 'FM internal error on BAPI_GOODSMVT_CREATE'.
    ROLLBACK WORK.
  ELSE.
    LOOP AT l_return WHERE type = 'E' OR type = 'A'.
      CLEAR: p_mmdoc.
      MESSAGE ID l_return-id TYPE l_return-type NUMBER l_return-number
                           WITH l_return-message_v1 l_return-message_v2
                                l_return-message_v3 l_return-message_v4.
    ENDLOOP.
    IF sy-subrc = 4. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF.
  ENDIF.
ENDFORM.                    " post_document
*&---------------------------------------------------------------------*
*&      Form  cancel_document
*&---------------------------------------------------------------------*
*       Сторнировать документ
*----------------------------------------------------------------------*
*      --> P_MMDOC  - Номер и год проведенного документа
*      <-- P_CANDOC - Номер и год сторнированного документа
*----------------------------------------------------------------------*
FORM cancel_document USING p_mmdoc STRUCTURE bapi2017_gm_head_ret
                     CHANGING p_candoc STRUCTURE bapi2017_gm_head_ret.
  DATA: p_error(1) TYPE c.

  PERFORM wait_update_process USING p_mmdoc
                              CHANGING p_error.
  CHECK p_error = space.

  CALL FUNCTION 'BAPI_GOODSMVT_CANCEL'
       EXPORTING
            materialdocument = p_mmdoc-mat_doc
            matdocumentyear  = p_mmdoc-doc_year
       IMPORTING
            goodsmvt_headret = p_candoc
       TABLES
            return           = l_return.

* Проверим как прошло сохранение документа
  IF sy-subrc <> 0.
    CLEAR: p_candoc.
    l_return-type = 'E'.
    l_return-message = 'FM internal error on BAPI_GOODSMVT_CANCEL'.
    ROLLBACK WORK.
  ELSE.
    LOOP AT l_return WHERE type = 'E' OR type = 'A'.
      CLEAR: p_candoc.
      MESSAGE ID l_return-id TYPE l_return-type NUMBER l_return-number
                           WITH l_return-message_v1 l_return-message_v2
                                l_return-message_v3 l_return-message_v4.
    ENDLOOP.
    IF sy-subrc = 4. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF.
  ENDIF.
ENDFORM.                    " cancel_document
*&---------------------------------------------------------------------*
*&      Form  wait_update_process
*&---------------------------------------------------------------------*
*       Подождать пока пройдут все процессы обновления документа
*----------------------------------------------------------------------*
*      --> P_MMDOC  - Номер и год проведенного документа
*----------------------------------------------------------------------*
FORM wait_update_process USING p_mmdoc STRUCTURE bapi2017_gm_head_ret
                         CHANGING p_error.

  CALL FUNCTION 'ENQUEUE_EMMKPF'
       EXPORTING
            mblnr          = p_mmdoc-mat_doc
            mjahr          = p_mmdoc-doc_year
            _wait          = 'X'
       EXCEPTIONS
            foreign_lock   = 1
            system_failure = 2
            OTHERS         = 3.
  IF sy-subrc <> 0.
    p_error = 'X'.
    MESSAGE e269 WITH p_mmdoc-mat_doc p_mmdoc-doc_year.
  ELSE.
    p_error = space.
    CALL FUNCTION 'DEQUEUE_EMMKPF'
         EXPORTING
              mblnr = p_mmdoc-mat_doc
              mjahr = p_mmdoc-doc_year.
  ENDIF.
ENDFORM.                    " wait_update_process

И тексты критериев выбора:
Код: You are not allowed to view links. Register or Login
P_BWART Вид движения
P_LGORT Склад
P_MBLNR Документ материала
P_MJAHR Год документа материала
P_WERKS Завод
« Последнее редактирование: Сентябрь 06, 2007, 03:49:52 pm от Uukrul »