在调用这个HU_CREATE_GOODS_MOVEMENT bapi做转储的时候总是出现意想不到的问题,将解决方案记录下来,以供参考。
1.在做循环调用bapi的时候,需要清除输入和输出的数据,不然当第二次循环的时候,只产生一个凭证,第二次也不报错,也不生成凭证。
源代码中输出表中有数据会EXIT退出。(一位不知名大佬debug找的)
2.报这个" 不能执行功能模块 MB_CREATE_GOOS_MOBEMENT "错误时,在第生成了第一个凭证时,除了需要调用以下函数清除数据
CALL FUNCTION 'HU_PACKING_REFRESH'. CALL FUNCTION 'SERIAL_INTTAB_REFRESH'. CALL FUNCTION 'L_SAPLL03A_INIT_INT'.
还需要在第一个凭证产生后进行提交COMMIT WORK AND WAIT.
3.系统程序:/ISDFPS/STOCK_CHANGE_WERKS_LGO 可以参考这个程序写代码
提取业务中的主要代码:
data:begin of gt_itab occurs 0, werks type UMWRK, lgort type UMLGO, matnr type UMMAT, maktx type maktx, bestq type BESTQ, "库存类别 bestq_txt type val_text, "库存类别描述 charg type UMCHA, "批号 lgnum type LGNUM, "仓库号 lgtyp type lgtyp, "仓储类型 LGPLA TYPE LGPLA, "仓位 lenum type lenum , "仓储单位编号/hu letyp type lvs_letyp, "hu类型 verme type lqua_verme, "可用库存 meins type MSEHI, "meins MSEH3 TYPE MSEH3, wdatu type lvs_wdatu, "收货日期 sobkz type sobkz, "特殊库存标识 SONUM TYPE LVS_SONUM, "特殊库存编号 MBLNR TYPE MBLNR, "物料凭证编号 MSGV1 TYPE SYMSGV, "错误信息 end of gt_itab. DATA:gt_itab1 LIKE TABLE OF gt_itab WITH HEADER LINE. data:if_event type huwbevent, is_imkpf type imkpf, it_move_to type hum_data_move_to_t, is_move_to type hum_data_move_to, it_internal_id type hum_venum_t with header line, it_external_id type hum_exidv_t with header line, es_emkpf type emkpf, es_message type huitem_messages, et_messages type huitem_messages_t, ls_messages type huitem_messages, ef_posted type sysubrc. LOOP At gt_lgnums. "同一仓库号生成同一凭证 clear:it_external_id[],it_move_to,is_imkpf,es_emkpf,ef_posted,es_message,et_messages. clear:ls_vepo,ls_vekp,ls_hu_items. loop at gt_itab1 WHERE lgnum = gt_lgnums-lgnum. CLEAR:is_move_to,ls_hu_items,it_external_id. SELECT SINGLE * FROM vekp INTO ls_vekp WHERE exidv = gt_itab1-lenum. it_external_id-exidv = ls_vekp-exidv. APPEND IT_EXTERNAL_ID. SELECT * FROM vepo INTO ls_vepo WHERE venum = ls_vekp-venum. * create header data IF sy-dbcnt = 1. is_move_to-huwbevent = if_event. is_move_to-matnr = gt_itab1-matnr. is_move_to-charg = gt_itab1-charg. is_move_to-werks = gt_itab1-werks. is_move_to-lgort = gt_itab1-lgort. is_move_to-bestq = gt_itab1-bestq. is_move_to-lgnum = gt_itab1-lgnum. is_move_to-sobkz = gt_itab1-sobkz. is_move_to-sobkz = gt_itab1-sonum. * is_move_to-bwart = '349'. ENDIF. * create item data ls_hu_items-venum = ls_vepo-venum. ls_hu_items-vepos = ls_vepo-vepos. APPEND ls_hu_items TO is_move_to-hu_items. ENDSELECT. APPEND is_move_to to it_move_to. ENDLOOP. CALL FUNCTION 'HU_PACKING_REFRESH'. CALL FUNCTION 'SERIAL_INTTAB_REFRESH'. CALL FUNCTION 'L_SAPLL03A_INIT_INT'. CALL FUNCTION 'HU_CREATE_GOODS_MOVEMENT' EXPORTING IF_EVENT = IF_EVENT * IF_SIMULATE = ' ' * IF_COMMIT = 'X' IF_TCODE = 'HUMO' "HUMO IS_IMKPF = IS_IMKPF IT_MOVE_TO = It_MOVE_TO * IT_INTERNAL_ID = IT_EXTERNAL_ID = IT_EXTERNAL_ID[] IMPORTING EF_POSTED = ef_posted ES_MESSAGE = es_message ET_MESSAGES = et_messages ES_EMKPF = es_emkpf. IF NOT ef_posted = 1. ROLLBACK WORK. CALL FUNCTION 'HU_PACKING_REFRESH'. CALL FUNCTION 'SERIAL_INTTAB_REFRESH'. ELSEif es_emkpf-mblnr <> ''. COMMIT WORK AND WAIT. ENDIF. ENDLOOP.