正确地以编程方式创建文档批处理的方式(如何使用BAPI_GOODSMVT_CREATE?)

2020-08-31 01:58发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中) 更好的stackoverf...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


更好的stackoverflow格式: https://stackoverflow.com/questions/58626204/proper-way-to-create-documentary-batches-programatically-how-to-to-use-bapi-goodsm


底部的解决方案

问题摘要

通过自定义ABAP代码自动处理文献批处理

我的雇主希望对来自外部供应商的某些产品执行自动文档批处理,我正在尝试找出如何通过Customizing和ABAP进行设置。 在我看来,Documentary Batchs仅打算通过MIGO使用-在任何情况下,我都无法找到合适的解决方案以编程方式分配它们,并且我能想到的任何黑手党解决方案似乎都是不够稳定的。 我必须通过什么途径解决此问题?

要增强BAPI_GOODSMVT_CREATE吗?

我可以通过BAPI_GOODSMVT_CREATE之类的方式来做到这一点吗?

增强PPPI消息目标?

我还特别需要它来通过PPPI进行消费消息传递,并且我认为应该在标准消息目标" PI04",FM" COCI_CONFIRM_MATERIAL_CONS"的基础上进行构建。 该FM创建物料凭证,但不通过'BAPI_GOODSMVT_CREATE'FM。 但是,它确实使用了" MB_CREATE_GOODS_MOVEMENT"。

我已经尝试过的内容

基于MIGO Snapshot的一次性使用黑客解决方案

我为一个区域制定了解决方案,在那里我观察了MIGO执行了哪些表更新以及使用了哪些数据(通过FM的" VB_INSERT_BATCH"和" VB_BATCH_WHERE_USED_LIST"),然后手动填写了这些结构。 但是,提供所有所需的信息对于其他实施领域是不可行的,因为它们没有可用的所有必要值,并且无法涵盖可能需要其他参数的无法预料的情况。

通过BAPI_GOODSMVT_CREATE代码读取

我尝试监视BAPI_GOODSMVT_CREATE是否执行相同的FM,但仅发现它正在访问" VB_BATCH_WHERE_USED_LIST"。 通过控制内存ID'Documentary Batch#1','Documentary Batch#2','Documentary Batch#3'和'Documentary Batch#5',似乎可以激活此功能(请参阅FM'VBDBDM_DATA_POST_IM'),但这 需要填写很多数据,包括结构名称'DOCUBATCH_SCREEN_FIELDS',这又使它似乎不是正确的方法。

无论如何,这仍然不允许我通过表MCHA和MCH1维护批处理。

基于MIGO快照的综合解决方案

这是我被黑的解决方案的外观。 再次,这不是解决该问题的可行方法,因为其他实施领域没有立即提供最终的材料文档:

功能zproxy_mdr_goodsreceipt。
 *" ------------------------------------------------  ----------------------
 *" *"本地接口:
 *"正在导入
 *" VALUE(IS_GOODSRECEIPT_HEAD)TYPE ZPROXY_GOODSREC_HEAD
 *" VALUE(IT_GOODSRECEIPT_ITEM)TYPE ZPROXY_GOODSREC_ITEM_T
 *" REFERENCE(I_CREATE_TO_FROM_REQUIREMENTS)类型标志默认值'-'
 *"汇出
 *" REFERENCE(E_GOODSMVT_MSG_IDNO)TYPE CHAR23
 *" REFERENCE(E_MBLNR)TYPE MBLNR
 *" REFERENCE(E_TO_CREATION_SUBRC)类型SY-SUBRC
 *" REFERENCE(E_LGNUM_ERROR)TYPE LGNUM
 *" REFERENCE(E_TBNUM_ERROR)TYPE TBNUM
 *"参考(E_DOCBATCH_SUBRC)类型SY-SUBRC
 *" REFERENCE(E_DOCBATCH_MSG_IDNO)TYPE CHAR23
 *" REFERENCE(E_CLASSNUM)类型BAPI1003_KEY-CLASSNUM
 *" REFERENCE(E_OBJKEY)类型BAPI1003_KEY-OBJECT
 *"例外情况
 *" GOODSMVT_FAILED
 *" NO_TRANSFER_REQUIREMENTS
 *" TRANSFER_ORDER_CREATION_ERROR
 *" ------------------------------------------------  ----------------------


   FIELD-SYMBOLS:<返回> TYPE bapiret2,
                   TYPE zproxy_goodsrec_item,
                   TYPE mseg,
                  类型bapi1003_alloc_values_char,
                   TYPE LTAP_CREAT。

   数据:ls_header类型bapi2017_gm_head_01,
         ls_code类型bapi2017_gm_code,
         ls_item类型bapi2017_gm_item_create,
         lt_item bapi2017_gm_item_create的标准类型表,
         lt_return bapiret2的标准类型表,
         ls_headret类型bapi2017_gm_head_ret,
         l_mblnr像bapi2017_gm_head_ret-mat_doc,
         l_docubatch TYPE charg_d,
         l_subrc TYPE sy-subrc,
         lt_mseg类型标准表。

   清除l_subrc。

 * ############################创建货物移动################  ##############
 *构建结构
   MOVE-CORRESPONDING is_goodsreceipt_head到ls_header。
   ls_code-gm_code ='01'。

   循环到it_goodsreceipt_item ASSIGNING 。
     将对应的移动到ls_item。
     追加ls_item至lt_item。
   结局。

 * BAPI调用
   通话功能'BAPI_GOODSMVT_CREATE'
     出口
       goodsmvt_header = ls_header
       goodsmvt_code = ls_code
     输入
       goodsmvt_headret = ls_headret
       materialdocument = l_mblnr
     桌子
       goodsmvt_item = lt_item
       return = lt_return。
 *检查错误
   读取表lt_return ASSIGNING ,其键类型='E'。
   如果sy-subrc = 0。
     e_goodsmvt_msg_idno = <返回> -id && <返回>-编号。
     回滚工作。
     RAISE goodsmvt_failed。
   其他。
     e_mblnr = l_mblnr。
     提交工作并等待。  "等待创建TO需求
   万一。

 *仅在已成功过帐重大凭证的情况下进行
   检查l_subrc = 0并且l_mblnr不是INITIAL。

 * #############################跟文档批更新###############  ####################

   数据:chvw的lt_chvw类型标准表,
         ls_chvw TYPE chvw,
         lt_mch1 mch1的标准表,
         ls_mch1 TYPE mch1,
         lt_mcha mcha的类型标准表,
         ls_mcha TYPE mcha,
         lt_mchb mchb类型标准表,
         lt_mska mska类型标准表,
         lt_mspr mspr的类型标准表,
         lt_char_num bapi1003_alloc_values_num类型标准表,
         lt_char_char bapi1003_alloc_values_char类型标准表,
         lt_char_curr bapi1003_alloc_values_curr类型标准表,
         l_objkey TYPE bapi1003_key-object,
         l_classnum TYPE bapi1003_key-classnum,
         l_atnam TYPE atnam。

   刷新lt_chvw。

 *获取重要凭证项目
   选择 *
       从mseg
       进入表lt_mseg
       mblnr = l_mblnr。

 *填写注册资料
   循环到it_goodsreceipt_item ASSIGNING 。
 *从工厂生成num和atnam类
     CONCATENATE'PI_'-工厂INTO l_classnum。
     CONCATENATE'Z_DOC_BATCH_'-工厂INTO l_atnam。

 *获取材料使用说明
     刷新:lt_return,
              lt_char_num,
              lt_char_char,
              lt_char_curr。

     l_objkey(18)= <商品记录项目>-材料。
     通话功能'BAPI_OBJCL_GETDETAIL'
       出口
         objectkey = l_objkey
         objecttable ='MARA'
         classnum = l_classnum
         classtype ='001'
       桌子
         allocvaluesnum = lt_char_num
         allocvalueschar = lt_char_char
         allocvaluescurr = lt_char_curr
         return = lt_return。
     在lt_return ASSIGNING 类型为'E'的地方循环。  "检查错误
 *无法读取特征,假设不进行任何处理
       e_docbatch_subrc ='1'。
       e_docbatch_msg_idno = <返回> -id && <返回>-编号。
       e_classnum = l_classnum。
       e_objkey = l_objkey。
       继续。
     结局。

     使用键charact = l_atnam读取表lt_char_char ASSIGNING 。
     如果sy-subrc <> 0或 -value_neutral = 0。
 *无附加值
       继续。
     万一。


 *获取相关的物料凭证项目
     读取表lt_mseg分配
           使用密钥mblnr = ls_headret-mat_doc
                    mjahr = ls_headret-doc_year
                    bwart = <商品记录项> -move_type
                    matnr = <商品记录项目>-材料
                    werks = <商品记录项目>-工厂
                    menge = <商品记录项> -entry_qnt
                    meins =  -entry_uom
                    hsdat = <商品记录项>-产品日期
                    kzbew = <商品记录项> -mvt_ind
                    lgort = <商品记录项> -stge_loc。
     如果sy-subrc <> 0。
 *没有相关的物料凭证项目
       继续。
     万一。

 *检查厕所类型
     如果 -value_neutral <> 0。
 *执行基本的暂停操作(MCHA和MCH1)
 *确认已分配docubatch nr
       如果 -vendrbatch是INITIAL。
 * !!!!!!!!!!!!! 即使材料已经过托管,供应商批次仍未填充,该怎么办?  !!!!!!!!!!!!!!!!!!
         继续。
       万一。

 *准备数据进行注册
       清除:ls_mch1,
              ls_mcha。

       ls_mch1-matnr = <商品记录项目>-材料。
       ls_mch1-charg = <商品记录项> -vendrbatch。
       ls_mch1-ersda = sy数据。
       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。

       将ls_mch1移动到ls_mcha。  " MCHA中包含了来自MCH1的相同字段
       ls_mcha-werks = <商品记录项目>-工厂。


       附录:ls_mch1至lt_mch1,
               ls_mcha至lt_mcha。
     万一。

     IF  -value_neutral =2。"还包括批处理位置
 *为批量使用登记的数据做准备
       清除ls_chvw。
       ls_chvw-matnr = <商品记录项目>-材料。
       ls_chvw-werks = <商品记录项目>-工厂。
       ls_chvw-charg = <商品记录项> -vendrbatch。
       ls_chvw-ebeln = <商品记录项> -po_number。
       ls_chvw-ebelp = <商品记录项> -po_item。
       ls_chvw-mblnr = ls_headret-mat_doc。
       ls_chvw-mjahr = ls_headret-doc_year。
       ls_chvw-zeile =  -zeile。
       ls_chvw-budat = is_goodsreceipt_head-pstng_date。
       ls_chvw-shkzg ='S'。  " ??? VALUE ???
       ls_chvw-bwart = <商品记录项> -move_type。
       ls_chvw-kzbew = <商品记录项> -mvt_ind。  "采购订单的货物移动
       ls_chvw-menge = <商品记录项> -entry_qnt。
       ls_chvw-meins = <商品记录项> -entry_uom。
       附加ls_chvw到lt_chvw。
     万一。
   结局。

 *进行批量注册
   通话功能'VB_INSERT_BATCH'
     桌子
       zmch1 = lt_mch1
       zmcha = lt_mcha
       zmchb = lt_mchb
       zmska = lt_mska
       zmspr = lt_mspr
             。

 *进行批量使用注册
   通话功能'VB_BATCH_WHERE_USED_LIST'
     桌子
       xchvw = lt_chvw。

 结束功能。
 

为什么这样做不够好以及我需要什么的摘要

这是配置了文档批处理的MIGO的快照,但不一定涵盖所有情况。 它仅在采购凭证的上下文中起作用,而不适用于其他情况,例如订单和销售订单。 另外,由于材料文档是在上方创建的,因此我只有必要的日期,这并不是在所有实施情况下都可以实现的。

我想知道是否有一种自定义代码来执行Documentary Batch处理的方法。

解决方案

采购订单收货示例呼叫

在it_goodsreceipt_item ASSIGNING 处循环播放。

     通话功能'VBDBDM_DATA_MAINTAIN_RFC'
       出口
         i_matnr = <商品记录项目>-材料
         i_werks = <商品记录项目>-工厂
         i_quantity = <商品记录项> -entry_qnt
         i_uom = <商品记录项> -entry_uom
         i_docubatch_charg = <商品记录项> -vendrbatch
 * IT_DOCUBATCHES =
         i_process_id ='01'"外部采购的收货
 * I_REPLACE_EXISTING_DATA =
         i_ebeln = <商品记录项> -po_number
         i_ebelp = <商品记录项> -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 =
       例外情况
         parameter_error = 1
         process_not_active = 2。
   结局。

 *通过创建材料文档来跟进,例如通过BAPI_GOODSMVT_CREATE