HU_CREATE_GOODS_MOVEMENT HU转储过账

在调用这个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.

 

posted @ 2020-12-01 17:56  肆意点  阅读(257)  评论(0编辑  收藏  举报