- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的雇主希望对外部供应商的某些产品执行自动文件批量处理,我正在尝试找出如何通过定制和 ABAP 进行设置。
在我看来,纪录片批处理只能通过 MIGO 使用 - 无论如何,我无法找到合适的解决方案来以编程方式分配它们,并且我能想到的任何破解方案似乎都不够并且不稳定。
我有哪些途径可以解决这个问题?
我可以通过诸如BAPI_GOODSMVT_CREATE
之类的东西来做到这一点吗?
我还特别需要它通过 PPPI 进行消费消息传递,并且我认为构建在标准消息目标 PI04
、FM COCI_CONFIRM_MATERIAL_CONS
之上。
此 FM 创建 Material 文档,但不通过 BAPI_GOODSMVT_CREATE
FM。
但是它确实使用了MB_CREATE_GOODS_MOVMENT
。
我为一个区域制作了黑客解决方案,我观察了 MIGO 执行了哪些表更新以及使用了哪些数据(通过 FM 的 VB_INSERT_BATCH
和 VB_BATCH_WHERE_USED_LIST
),然后填充手动找出这些结构。
但是,提供所有所需的信息对于其他实现领域来说是不可行的,因为它们没有所有可用的必要值,并且它不涵盖可能需要其他参数的不可预见的情况。
我尝试监视 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 维护批处理。
这是我的破解解决方案的外观。同样,这不是解决该问题的可行方法,因为其他实现领域无法立即获得最终的 Material 文档:
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 快照执行,但不一定涵盖所有情况。
它仅适用于采购文档,不涵盖其他情况,例如订单和销售订单。
此外,我只有必要的日期,因为上面立即创建了 Material 文档,这对于所有实现案例都是不可能的。
我想知道是否有一种预期的方法可以从自定义代码执行文档批量处理。
最佳答案
引用自the documentation :
If you work with RFID or TRM functions, or call IDocs/BAPIs, you can only book in documentarybatches by calling up the RFC-capable function module VBDBDM_DATA_MAINTAIN_RFCbeforehand or incorporating it into the process.
那么也许这个功能模块是关键?然而,您似乎并不是第一个经历这种痛苦的人。该文档的评论如下:
Documentary Batch has a lot of constraints and it seems to be a semifinished product of SAP, since is missing a lot of features of real batches.
Be prepared to make a lot of custom enhancements...
来自社区的附录:以下是在该答案两天后从原始发帖者中获取的解决方案,远离了他的问题。
采购订单收货调用示例
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
关于abap - 使用 BAPI_GOODSMVT_CREATE 以编程方式创建文档批处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58626204/
我经常通过论坛、github 等分享 ABAP 代码,这些代码通常适用于任何 ABAP-based system .不幸的是,经常发生我使用的一些对象(数据库表、类型等)只存在于我正在使用的解决方案中
出于好奇,我尝试创建一个名称为 object 的 ABAP 接口(interface)。编译器给出错误消息 “OBJECT”是 protected 类型名称,因此不能用于用户自己的类型定义。 虽然此检
ABAP 是否有定义的评估顺序?例如,在表达式 foo( ) + bar( ) 中,是否可以保证方法 foo( ) 和 bar( )首先评估/执行?在 ABAP 关键字文档中找不到此类信息。 最佳答案
如何在 ABAP 中进行冒烟和猴子测试?有工具吗? 最佳答案 冒烟测试可以通过使用 eCATT 实现自动化.请注意,创建 eCATT 测试非常耗时,因此您应该事先进行成本效益分析。 我不知道有任何用于
可以在 ABAP 中完成文件操作,例如创建文件吗? 最佳答案 是的,这是可以做到的。您可以使用“打开数据集”/“传输”/“关闭数据集”语句在 ABAP 中进行编码,以在应用程序服务器上创建文件。 您还
假设我有一个包含数据类型名称的变量 (char30),我想创建该数据类型的另一个变量。 例子: lv_type = 'BU_PARTNER' data: rt_value type range of
我有一个 UPDATE声明于 ABAP 看起来像: UPDATE zicstt099 FROM TABLE lt_zicstt099 每次更新都会失败 sy-subrc eq 4 . 数据库表ZICS
我正在寻找 ABAP 开发的标准时间估计表或列表,根据开发团队、项目的复杂性等在某些变量中可定制的东西...... 类似于: Simple Module Pool -> 10 hours Comple
多年来,我用各种语言和环境编写了代码,但有一个不变的似乎是关于断言使用的共识。据我了解,当您想要识别“不可能”的错误和其他情况时,它们就在开发过程中,您的第一 react 是“这不可能是正确的”并且无
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
有人可以解释等号前的问号是什么意思吗? lo_obj ?= . 最佳答案 ?= 用于显式向下转换。虽然它不是字符类型所必需的,但建议用于其他数据类型以避免任何意外的短转储。 最好的方法是检查数据元素是
如何在不使用消息类的情况下在消息语句中显示变量? IF acct_bal ', acct_bal TYPE 'E'. ENDIF. 我的程序有语法错误,因为系统不允许 acct_bal 进入消息语句。
西北 ABAP 7.0在 SU01 中,您可以将用户日期格式设置为日语。示例格式 7 在代码中,这在用户运行时有效。 " user date format set to JAPANESE DATF
我在 SE24 中开发了一个 ABAP 类,它被锁定在已经传输到客户端的传输请求 TR1 中。 现在我在另一个request TR2中对这个类做一些修改,这个TR要9月份才能传给client。 但与此
在 ABAP 中,我有一个非常大的内部表,比如 31,000 行。将其拆分为固定大小的多个较小表(比如每个表 1,000 行)的最短且最有效的方法是什么? 天真的方式是: DATA lt_next_p
我有大约 10 个类要导出到另一个系统。传输不是一种选择,我想知道是否有更快的方法来复制类。手动创建和填充类将花费很长时间。 关于这个主题的大多数问题都来自 5 年多以前,我想知道最好的方法是什么。我
大型项目中的一些功能在开发系统上被破坏了。 很确定它在几个小时前就成功了。 我怎么知道最近更改了哪些 ABAP 对象?(如果有帮助,我想我可以猜出包含零钱的运输工具和包裹) 我找到的最接近的答案是表
为什么声明 BREAK-POINT 'my username'. 不仅影响我,也影响其他用户?我疯了吗?也许这是权限问题或任何其他原因?有人可以解释我吗? 该语句位于实现 BAdI 的类中的方法体中
如何阻止 ABAP 扩展程序检查 (SLIN) 报告我可能没有写入权限的包含库中的错误? 我喜欢留下尽可能少的错误和警告的扩展检查,通常当我故意以可能导致警告的方式使用某些东西时,我使用伪注释(“#E
我有一个内部表,它被写入文件,然后作为数据源拉入 BW。有时,不可打印的字符会使其进入文件输出并将导入过程中断到 BW。下面是我的代码示例。由于 itab 不是类型 c 或字符串,我无法在其上使用查找
我是一名优秀的程序员,十分优秀!