簡體   English   中英

使用 BAPI_GOODSMVT_CREATE 以編程方式創建紀錄片批次?

[英]Creating documentary batches programmatically with BAPI_GOODSMVT_CREATE?

問題總結

通過自定義 ABAP 代碼自動處理跟單批次

我的雇主希望對來自外部供應商的一些產品執行自動文檔批處理,我正在嘗試通過定制和 ABAP 來設置它。

在我看來,紀錄片批次只能通過 MIGO 使用——無論如何,我都無法找到合適的解決方案來以編程方式分配它們,而且我能想出的任何破解在一起的解決方案似乎都不夠且不穩定。

我有什么途徑可以解決這個問題?

增強 BAPI_GOODSMVT_CREATE?

我可以通過BAPI_GOODSMVT_CREATE之類的東西以某種方式做到這一點嗎?

增強 PPPI 消息目的地?

我還特別需要它來通過 PPPI 進行消費消息傳遞,並且我想建立在標准 Message Destination PI04 FM COCI_CONFIRM_MATERIAL_CONS

此 FM 通過BAPI_GOODSMVT_CREATE FM 創建物料文檔,但不會 go。

但是它確實使用MB_CREATE_GOODS_MOVEMENT

我已經嘗試過的

基於 MIGO 快照的一次性黑客解決方案

我為一個領域制定了破解解決方案,在那里我觀察了 MIGO 執行了哪些表更新以及使用了哪些數據(通過 FM 的VB_INSERT_BATCHVB_BATCH_WHERE_USED_LIST ),然后手動填寫了這些結構。

但是,提供所有需要的信息對於其他實現領域是不可行的,因為它們沒有所有可用的必要值,並且它不包括可能需要其他參數的不可預見的情況。

通讀 BAPI_GOODSMVT_CREATE 代碼

我試過監視BAPI_GOODSMVT_CREATE是否執行相同的 FM,但只發現它訪問VB_BATCH_WHERE_USED_LIST

似乎可以通過控制 Memory ID Documentary Batch #1 , Documentary Batch #2 , Documentary Batch #3Documentary Batch #5來激活此功能(參見 FM VBDBDM_DATA_POST_IM ),但這需要填寫很多數據,包括結構命名為DOCUBATCH_SCREEN_FIELDS ,這再次讓人覺得這可能不是正確的方法。

無論如何,這仍然不允許我通過表 MCHA 和 MCH1 維護批處理。

基於 MIGO 快照的hacked together 解決方案

這是我被黑的解決方案的外觀。 同樣,這不是 go 關於問題的可行方法,因為其他實施領域沒有立即可用的生成材料文檔:

    FUNCTION zproxy_mdr_goodsreceipt.
    *"----------------------------------------------------------------------
    *"*"Local Interface:
    *"  IMPORTING
    *"     VALUE(IS_GOODSRECEIPT_HEAD) TYPE  ZPROXY_GOODSREC_HEAD
    *"     VALUE(IT_GOODSRECEIPT_ITEM) TYPE  ZPROXY_GOODSREC_ITEM_T
    *"     REFERENCE(I_CREATE_TO_FROM_REQUIREMENTS) TYPE  FLAG DEFAULT '-'
    *"  EXPORTING
    *"     REFERENCE(E_GOODSMVT_MSG_IDNO) TYPE  CHAR23
    *"     REFERENCE(E_MBLNR) TYPE  MBLNR
    *"     REFERENCE(E_TO_CREATION_SUBRC) TYPE  SY-SUBRC
    *"     REFERENCE(E_LGNUM_ERROR) TYPE  LGNUM
    *"     REFERENCE(E_TBNUM_ERROR) TYPE  TBNUM
    *"     REFERENCE(E_DOCBATCH_SUBRC) TYPE  SY-SUBRC
    *"     REFERENCE(E_DOCBATCH_MSG_IDNO) TYPE  CHAR23
    *"     REFERENCE(E_CLASSNUM) TYPE  BAPI1003_KEY-CLASSNUM
    *"     REFERENCE(E_OBJKEY) TYPE  BAPI1003_KEY-OBJECT
    *"  EXCEPTIONS
    *"      GOODSMVT_FAILED
    *"      NO_TRANSFER_REQUIREMENTS
    *"      TRANSFER_ORDER_CREATION_ERROR
    *"----------------------------------------------------------------------

      FIELD-SYMBOLS: <return>         TYPE bapiret2,
                     <goods_rec_item> TYPE zproxy_goodsrec_item,
                     <mseg>           TYPE mseg,
                     <char_char>      TYPE bapi1003_alloc_values_char,
                     <ltap_creat>     TYPE LTAP_CREAT.

      DATA: ls_header   TYPE bapi2017_gm_head_01,
            ls_code     TYPE bapi2017_gm_code,
            ls_item     TYPE bapi2017_gm_item_create,
            lt_item     TYPE STANDARD TABLE OF bapi2017_gm_item_create,
            lt_return   TYPE STANDARD TABLE OF bapiret2,
            ls_headret  TYPE bapi2017_gm_head_ret,
            l_mblnr     LIKE bapi2017_gm_head_ret-mat_doc,
            l_docubatch TYPE charg_d,
            l_subrc     TYPE sy-subrc,
            lt_mseg     TYPE STANDARD TABLE OF mseg.

      CLEAR l_subrc.


    *     ############################## Create goods movement ##############################
    *     Build structures
      MOVE-CORRESPONDING is_goodsreceipt_head TO ls_header.
      ls_code-gm_code = '01'.

      LOOP AT it_goodsreceipt_item ASSIGNING <goods_rec_item>.
        MOVE-CORRESPONDING <goods_rec_item> TO ls_item.
        APPEND ls_item TO lt_item.
      ENDLOOP.

    *     BAPI call
      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
          goodsmvt_header  = ls_header
          goodsmvt_code    = ls_code
        IMPORTING
          goodsmvt_headret = ls_headret
          materialdocument = l_mblnr
        TABLES
          goodsmvt_item    = lt_item
          return           = lt_return.
    *     Check errors
      READ TABLE lt_return ASSIGNING <return> WITH KEY type = 'E'.
      IF sy-subrc = 0.
        e_goodsmvt_msg_idno = <return>-id && <return>-number.
        ROLLBACK WORK.
        RAISE goodsmvt_failed.
      ELSE.
        e_mblnr = l_mblnr.
        COMMIT WORK AND WAIT. "Wait for TO requirements to be created
      ENDIF.

    *     Only proceede if Material Document has been successfully posted
      CHECK l_subrc = 0 AND l_mblnr IS NOT INITIAL.

    *     ############################## Update with Documentary Batch ###################################

      DATA: lt_chvw      TYPE STANDARD TABLE OF chvw,
            ls_chvw      TYPE chvw,
            lt_mch1      TYPE STANDARD TABLE OF mch1,
            ls_mch1      TYPE mch1,
            lt_mcha      TYPE STANDARD TABLE OF mcha,
            ls_mcha      TYPE mcha,
            lt_mchb      TYPE STANDARD TABLE OF mchb,
            lt_mska      TYPE STANDARD TABLE OF mska,
            lt_mspr      TYPE STANDARD TABLE OF mspr,
            lt_char_num  TYPE STANDARD TABLE OF bapi1003_alloc_values_num,
            lt_char_char TYPE STANDARD TABLE OF bapi1003_alloc_values_char,
            lt_char_curr TYPE STANDARD TABLE OF bapi1003_alloc_values_curr,
            l_objkey     TYPE bapi1003_key-object,
            l_classnum   TYPE bapi1003_key-classnum,
            l_atnam      TYPE atnam.

      REFRESH lt_chvw.

    *     Get material document items
      SELECT *
          FROM mseg
          INTO TABLE lt_mseg
          WHERE mblnr = l_mblnr.

    *     Perpare docubatch registration data
      LOOP AT it_goodsreceipt_item ASSIGNING <goods_rec_item>.
    *       Generate class num and atnam from plant
        CONCATENATE 'PI_' <goods_rec_item>-plant INTO l_classnum.
        CONCATENATE 'Z_DOC_BATCH_' <goods_rec_item>-plant INTO l_atnam.

    *       Get material docubatch usage characteristic
        REFRESH: lt_return,
                 lt_char_num,
                 lt_char_char,
                 lt_char_curr.

        l_objkey(18) = <goods_rec_item>-material.
        CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
          EXPORTING
            objectkey       = l_objkey
            objecttable     = 'MARA'
            classnum        = l_classnum
            classtype       = '001'
          TABLES
            allocvaluesnum  = lt_char_num
            allocvalueschar = lt_char_char
            allocvaluescurr = lt_char_curr
            return          = lt_return.
        LOOP AT lt_return ASSIGNING <return> WHERE type = 'E'. "Check for errors
    *         Couldn't read characteristic, assume no docubatch handling
          e_docbatch_subrc = '1'.
          e_docbatch_msg_idno = <return>-id && <return>-number.
          e_classnum = l_classnum.
          e_objkey = l_objkey.
          CONTINUE.
        ENDLOOP.

        READ TABLE lt_char_char ASSIGNING <char_char> WITH KEY charact = l_atnam.
        IF sy-subrc <> 0 OR <char_char>-value_neutral = 0.
    *         No docubatch value
          CONTINUE.
        ENDIF.



    *       Get associated material document item
        READ TABLE lt_mseg ASSIGNING <mseg>
              WITH KEY mblnr = ls_headret-mat_doc
                       mjahr = ls_headret-doc_year
                       bwart = <goods_rec_item>-move_type
                       matnr = <goods_rec_item>-material
                       werks = <goods_rec_item>-plant
                       menge = <goods_rec_item>-entry_qnt
                       meins = <goods_rec_item>-entry_uom
                       hsdat = <goods_rec_item>-prod_date
                       kzbew = <goods_rec_item>-mvt_ind
                       lgort = <goods_rec_item>-stge_loc.
        IF sy-subrc <> 0.
    *         No associated material document item
          CONTINUE.
        ENDIF.

    *       Check docubatch type
        IF <char_char>-value_neutral <> 0.
    *         Perform basic docubatch actions (MCHA and MCH1)
    *         Verify that docubatch nr is assigned
          IF <goods_rec_item>-vendrbatch IS INITIAL.
    *            !!!!!!!!!!!!! Venderbatch not filled even though material is docubatch managed, what to do? !!!!!!!!!!!!!!!
            CONTINUE.
          ENDIF.

    *         Prepare data for docubatch registration
          CLEAR: ls_mch1,
                 ls_mcha.

          ls_mch1-matnr = <goods_rec_item>-material.
          ls_mch1-charg = <goods_rec_item>-vendrbatch.
          ls_mch1-ersda = sy-datum.
          ls_mch1-ernam = sy-uname.
          ls_mch1-ersda_tmstp = sy-datum && sy-uzeit.
          ls_mch1-ersda_tz_sys = sy-tzone.
          ls_mch1-ersda_tz_usr = sy-zonlo.

          MOVE-CORRESPONDING ls_mch1 TO ls_mcha. "Same fields from MCH1 are included in MCHA
          ls_mcha-werks = <goods_rec_item>-plant.

          APPEND: ls_mch1 TO lt_mch1,
                  ls_mcha TO lt_mcha.
        ENDIF.

        IF <char_char>-value_neutral = 2. "Also include batch where-used
    *         Perpare data for batch where-used registration
          CLEAR ls_chvw.
          ls_chvw-matnr = <goods_rec_item>-material.
          ls_chvw-werks = <goods_rec_item>-plant.
          ls_chvw-charg = <goods_rec_item>-vendrbatch.
          ls_chvw-ebeln = <goods_rec_item>-po_number.
          ls_chvw-ebelp = <goods_rec_item>-po_item.
          ls_chvw-mblnr = ls_headret-mat_doc.
          ls_chvw-mjahr = ls_headret-doc_year.
          ls_chvw-zeile = <mseg>-zeile.
          ls_chvw-budat = is_goodsreceipt_head-pstng_date.
          ls_chvw-shkzg = 'S'. "??? VALUE ???
          ls_chvw-bwart = <goods_rec_item>-move_type.
          ls_chvw-kzbew = <goods_rec_item>-mvt_ind. "Goods Movement for Purchase Order
          ls_chvw-menge = <goods_rec_item>-entry_qnt.
          ls_chvw-meins = <goods_rec_item>-entry_uom.
          APPEND ls_chvw TO lt_chvw.
        ENDIF.
      ENDLOOP.

    *     Perform batch registration
      CALL FUNCTION 'VB_INSERT_BATCH'
        TABLES
          zmch1         = lt_mch1
          zmcha         = lt_mcha
          zmchb         = lt_mchb
          zmska         = lt_mska
          zmspr         = lt_mspr
                .

    *     Perform batch where-used registration
      CALL FUNCTION 'VB_BATCH_WHERE_USED_LIST'
        TABLES
          xchvw = lt_chvw.

為什么這還不夠好,我需要什么

這作為配置了文檔批處理的 MIGO 的快照執行,但不一定涵蓋所有情況。

它僅適用於采購文檔的上下文,不包括其他情況,例如訂單和銷售訂單。

此外,我只有必要的日期,因為材料文檔是在上面創建的,這對於所有實施案例都是不可能的。

我想知道是否有一種從自定義代碼執行文檔批處理的預期方法。

引用文檔

如果您使用 RFID 或 TRM 功能,或調用 IDocs/BAPI,則只能通過預先調用支持 RFC 的 function 模塊 VBDBDM_DATA_MAINTAIN_RFC 或將其合並到流程中來批量預訂。

那么也許這個 function 模塊是關鍵? 但是,您似乎不是第一個經歷這種痛苦的人。 對該文檔的評論如下:

Documentary Batch 有很多限制,它似乎是 SAP 的半成品,因為它缺少很多真實批次的功能。

准備好進行大量自定義增強...

來自社區的附錄:以下是在此答案兩天后從原始海報中獲取的解決方案,遠離他的問題。

解決方案

采購訂單收貨示例調用

  LOOP AT it_goodsreceipt_item ASSIGNING <goods_rec_item>.

    CALL FUNCTION 'VBDBDM_DATA_MAINTAIN_RFC'
      EXPORTING
        i_matnr            = <goods_rec_item>-material
        i_werks            = <goods_rec_item>-plant
        i_quantity         = <goods_rec_item>-entry_qnt
        i_uom              = <goods_rec_item>-entry_uom
        i_docubatch_charg  = <goods_rec_item>-vendrbatch
*       IT_DOCUBATCHES     =
        i_process_id       = '01' "Goods Receipt for External Procurement
*       I_REPLACE_EXISTING_DATA       =
        i_ebeln            = <goods_rec_item>-po_number
        i_ebelp            = <goods_rec_item>-po_item
*       I_AUFNR            =
*       I_AUFPS            =
*       I_RSNUM            =
*       I_RSPOS            =
*       I_RSART            =
*       I_VBELN            =
*       I_POSNR            =
*       IS_DOCUBATCH_COM   =
*       I_LINE_ID          =
*       I_LGNUM            =
*       I_TANUM            =
*       I_TAPOS            =
      EXCEPTIONS
        parameter_error    = 1
        process_not_active = 2.
  ENDLOOP.

* Follow up by creating Material Document, for example through BAPI_GOODSMVT_CREATE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM