Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE38 - ABAP Редактор => Тема начата: Uukrul от Июль 09, 2008, 04:40:24 pm

Название: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: Uukrul от Июль 09, 2008, 04:40:24 pm
Тут по случаю надо было быстро накидать пример программки, которая по документу ММ, для поступившего материала делает перемещение всего поступившего запаса на другой завод/склад. В общем за склетик можно использовать, запас поступивший по документу ММ вроде как перемещает куда скажешь. Можно допиливать и даже нужно, например проверку на получение серийных номеров и документа ММ (там может быть не SER03, а другая табличка, зависит от профиля серийных номеров), потом опять же можно добить если это особые запасы и т.д, да и много чего другого...
Код: You are not allowed to view links. Register or Login
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.
Название: Re: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: e.gorscov от Март 27, 2012, 03:39:51 pm
You are not allowed to view links. Register or Login
Тут по случаю надо было быстро накидать пример программки, которая по документу ММ, для поступившего материала делает перемещение всего поступившего запаса на другой завод/склад. В
День добрый. Я еще совсем новичек и У меня такая проблемка... Начальство  задало сделать  загрузочку остатков модуля ММ в САП,  но  поля не предоставили, сказали  только  транзакцию МВ1С по 561 ВДвиж и через "БАБИХУ" работать... Помогите советом... как подступиться... может  есть  какой шаблончик ...  :'( :'( :'( :'(


PS: Uukrul, ну цитировать то предыдущее сообщение было излишним...
Название: Re: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: Uukrul от Март 27, 2012, 03:56:15 pm
Что касается вопроса.. то тут даже не знаю кроме как за вас написать программу больше ничего не видится, потому что предложенного примера должно хватить что бы начинать разбираться. Я честно даже не знаю что вам сказать типа с чего начинать. Ну скажем так MB1C отношения к этой BAPI не имеет в принципе.
Название: Re: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: e.gorscov от Март 27, 2012, 04:26:37 pm
 :( Понял... просто  мне посоветовал комсультант по  АВАР работать  через ФМ BAPI... Чтож, простите за беспокойство, буду что-нибудь пытаться сделать...
PS: я так понимаю, вы бы не использовали БАПи для решения моей задачи ? ???
Название: Re: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: Uukrul от Март 27, 2012, 07:09:25 pm
You are not allowed to view links. Register or Login
PS: я так понимаю, вы бы не использовали БАПи для решения моей задачи ? ???
Выложенный выше пример и есть как это сказать пример использования BAPI, все что нужно сделать вам, это правильно передать параметры в данную BAPI-функцию и она вам сделает поступление материала аналогичное транзакции MB1C.
Название: Re: Небольшой примерчик по BAPI_GOODSMVT_CREATE
Отправлено: Uukrul от Март 27, 2012, 11:03:12 pm
Из подсказки, запускать нужно с параметрами:
Код: You are not allowed to view links. Register or Login
GMCODE - Тип движения материала = 05
KZBEW - Индикатор движения = space
Таблица позиций, по минимуму должна быть заполнена так:
Код: You are not allowed to view links. Register or Login
MATERIAL_NO – Код материала = <Код>
PLANT – Код завода = <Завод>
SLOC – Код склада = <Склад>
VENDOR – Код поставщика = <Поставщик>, если нужен можно и без него.
MOV_TYPE – Код вида движения = 561
QTY – Количество поступающего материала = <Кол-во>