点击此处---> 群内免费提供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
这是一篇博客文章...
一周热门 更多>