Небольшой примерчик по BAPI_GOODSMVT_CREATE

Автор Uukrul, Липень 09, 2008, 04:40:24 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Uukrul

Тут по случаю надо было быстро накидать пример программки, которая по документу ММ, для поступившего материала делает перемещение всего поступившего запаса на другой завод/склад. В общем за склетик можно использовать, запас поступивший по документу ММ вроде как перемещает куда скажешь. Можно допиливать и даже нужно, например проверку на получение серийных номеров и документа ММ (там может быть не SER03, а другая табличка, зависит от профиля серийных номеров), потом опять же можно добить если это особые запасы и т.д, да и много чего другого...

REPORT yuuk_move_materials .
TABLES: mseg.

SELECT-OPTIONS: p_mblnr FOR mseg-mblnr OBLIGATORY MEMORY ID mbn.
PARAMETERS p_mjahr LIKE mseg-mjahr OBLIGATORY MEMORY ID mja.

SELECTION-SCREEN BEGIN OF BLOCK block001 WITH FRAME TITLE text-001.
PARAMETERS: p_bwart LIKE mseg-bwart DEFAULT '301' OBLIGATORY,
            p_umwrk LIKE mseg-umwrk OBLIGATORY MEMORY ID wrk,
            p_umlgo LIKE mseg-umlgo OBLIGATORY MEMORY ID lag.
SELECTION-SCREEN END OF BLOCK block001.
************************************************************************

DATA: l_goodsmvt_header LIKE bapi2017_gm_head_01,
      l_goodsmvt_headret LIKE bapi2017_gm_head_ret,
      lt_goodsmvt_item LIKE bapi2017_gm_item_create
                    OCCURS 0 WITH HEADER LINE,
      lt_goodsmvt_serialnumber LIKE bapi2017_gm_serialnumber
                            OCCURS 0 WITH HEADER LINE,
      lt_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.

DATA: l_count LIKE sy-tabix,
      sy_tabix LIKE sy-tabix,
      l_marc LIKE marc,
      l_testrun LIKE bapi2017_gm_gen-testrun,
      lt_mkpf LIKE mkpf OCCURS 1 WITH HEADER LINE,
      lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE,
      lt_sernr LIKE objk OCCURS 1 WITH HEADER LINE.
************************************************************************

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_mkpf
FROM mkpf WHERE mblnr IN p_mblnr AND
                mjahr = p_mjahr.
IF sy-subrc <> 0. EXIT. ENDIF.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_mseg
FROM mseg WHERE mblnr IN p_mblnr AND
                mjahr = p_mjahr AND
                xauto <> 'X'.

CLEAR: l_goodsmvt_header,
       lt_goodsmvt_item[], lt_goodsmvt_serialnumber[], lt_return[].

SORT lt_mkpf BY budat DESCENDING.
READ TABLE lt_mkpf INDEX 1.
DESCRIBE TABLE lt_mkpf LINES l_count.

* Заполнить заголовок документа
l_goodsmvt_header-pstng_date = lt_mkpf-budat.  "Дата проводки
l_goodsmvt_header-doc_date = lt_mkpf-budat.    "Дата документа
l_goodsmvt_header-pr_uname = sy-uname.         "Имя пользователя
IF l_count = 1.
  CONCATENATE lt_mkpf-mblnr lt_mkpf-mjahr
  INTO l_goodsmvt_header-ref_doc_no SEPARATED BY '/'.
ELSE.
  l_goodsmvt_header-ref_doc_no = 'no referens'.
ENDIF.
l_goodsmvt_header-gr_gi_slip_no = space.
l_goodsmvt_header-ver_gr_gi_slip = '3'.      "Версия печати
l_goodsmvt_header-header_txt = 'EXTMOVE'.

LOOP AT lt_mseg.
  sy_tabix = sy-tabix.
  CLEAR: lt_goodsmvt_item.

  lt_goodsmvt_item-move_type = p_bwart.             "Вид движения
  lt_goodsmvt_item-spec_stock = lt_mseg-sobkz.      "Код особого запаса
  lt_goodsmvt_item-material = lt_mseg-matnr.        "Код материала

  lt_goodsmvt_item-plant = lt_mseg-werks.           "Завод отпуска
  lt_goodsmvt_item-stge_loc = lt_mseg-lgort.        "Склад отпуска
  lt_goodsmvt_item-batch = lt_mseg-charg.           "Партия отпуска

  lt_goodsmvt_item-move_plant = p_umwrk.         "Принимающий завод
  lt_goodsmvt_item-move_stloc = p_umlgo.         "Принимающий склад
  lt_goodsmvt_item-move_batch = lt_mseg-charg.   "принимающая партия

  lt_goodsmvt_item-entry_qnt = lt_mseg-menge.    "Количество
  lt_goodsmvt_item-entry_uom = lt_mseg-meins.    "ЕдИзм
  CONCATENATE lt_mseg-mblnr lt_mseg-mjahr lt_mseg-zeile
  INTO lt_goodsmvt_item-item_text SEPARATED BY '/'.

* Определиться с серийными номерами для позиции материала
  SELECT SINGLE * INTO l_marc
  FROM marc WHERE matnr = lt_mseg-matnr AND
                  werks = lt_mseg-werks.
  IF l_marc-sernp <> space.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_sernr
    FROM ser03 AS sr
         JOIN objk AS ob ON sr~obknr = ob~obknr
    WHERE sr~mblnr = lt_mseg-mblnr AND
          sr~mjahr = lt_mseg-mjahr AND
          sr~zeile = lt_mseg-zeile.
    lt_goodsmvt_serialnumber-matdoc_itm = sy_tabix.
    LOOP AT lt_sernr.
      lt_goodsmvt_serialnumber-serialno = lt_sernr-sernr.
      APPEND lt_goodsmvt_serialnumber.
    ENDLOOP.
  ENDIF.
  APPEND lt_goodsmvt_item.
ENDLOOP.

l_testrun = space.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
     EXPORTING
          goodsmvt_header       = l_goodsmvt_header
          goodsmvt_code         = '04'
          testrun               = l_testrun
     IMPORTING
          goodsmvt_headret      = l_goodsmvt_headret
     TABLES
          goodsmvt_item         = lt_goodsmvt_item
          goodsmvt_serialnumber = lt_goodsmvt_serialnumber
          return                = lt_return
     EXCEPTIONS
          OTHERS                = 1.

* Проверим как прошло сохранение документа
IF sy-subrc <> 0.
  ROLLBACK WORK.      "Неизвестная ошибка
  EXIT.
ENDIF.
LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
  ROLLBACK WORK.
  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.
  EXIT.
ENDLOOP.
IF l_testrun = space.
  COMMIT WORK AND WAIT.
* Номер проведенного документа в l_goodsmvt_headret
ENDIF.

e.gorscov

#1
Цитата: Uukrul від Липень 09, 2008, 04:40:24 ПП
Тут по случаю надо было быстро накидать пример программки, которая по документу ММ, для поступившего материала делает перемещение всего поступившего запаса на другой завод/склад. В
День добрый. Я еще совсем новичек и У меня такая проблемка... Начальство  задало сделать  загрузочку остатков модуля ММ в САП,  но  поля не предоставили, сказали  только  транзакцию МВ1С по 561 ВДвиж и через "БАБИХУ" работать... Помогите советом... как подступиться... может  есть  какой шаблончик ...  :'( :'( :'( :'(


PS: Uukrul, ну цитировать то предыдущее сообщение было излишним...
Все пройдет, пройдет и это...

Uukrul

Что касается вопроса.. то тут даже не знаю кроме как за вас написать программу больше ничего не видится, потому что предложенного примера должно хватить что бы начинать разбираться. Я честно даже не знаю что вам сказать типа с чего начинать. Ну скажем так MB1C отношения к этой BAPI не имеет в принципе.

e.gorscov

 :( Понял... просто  мне посоветовал комсультант по  АВАР работать  через ФМ BAPI... Чтож, простите за беспокойство, буду что-нибудь пытаться сделать...
PS: я так понимаю, вы бы не использовали БАПи для решения моей задачи ? ???
Все пройдет, пройдет и это...

Uukrul

Цитата: e.gorscov від Березень 27, 2012, 04:26:37 ПП
PS: я так понимаю, вы бы не использовали БАПи для решения моей задачи ? ???
Выложенный выше пример и есть как это сказать пример использования BAPI, все что нужно сделать вам, это правильно передать параметры в данную BAPI-функцию и она вам сделает поступление материала аналогичное транзакции MB1C.

Uukrul

Из подсказки, запускать нужно с параметрами:

GMCODE - Тип движения материала = 05
KZBEW - Индикатор движения = space

Таблица позиций, по минимуму должна быть заполнена так:

MATERIAL_NO – Код материала = <Код>
PLANT – Код завода = <Завод>
SLOC – Код склада = <Склад>
VENDOR – Код поставщика = <Поставщик>, если нужен можно и без него.
MOV_TYPE – Код вида движения = 561
QTY – Количество поступающего материала = <Кол-во>