EWM打包拣配收货入库--事务码 /SCWM/PRDO

TIPS:执行EWM事务码时前面需要加/N再加事务码/SCWM/PRDO

执行的流程有打包,收货,创建仓库任务并确认仓库任务

1.检查交货单有没有传到EWM

DATA O_RETURN TYPE  ZST_FM_EXPMSG.
DATA lv_num TYPE i.

    DO  .
      SELECT  *
          FROM /scdl/db_refdoc
         WHERE refdocno  = @v_wa_in-vbeln " 根据交货单取值
*         AND substring( refitemno,5,6 ) EQ @v_wa_in-POSNR
           AND refdoccat = 'ERP' INTO TABLE @DATA(gt_refdoc).
      IF sy-subrc EQ 0  AND gt_refdoc IS NOT INITIAL.
        SORT gt_refdoc BY refdocno refitemno.
        DATA(v_wa_refdoc) = gt_refdoc[ 1 ].
        o_return-zzmessage_v1 = lv_num.
        CONDENSE o_return-zzmessage_v1 .
        EXIT.
      ELSE.
        IF lv_num GE '1200'.
          o_return-zztype = 'E'.
          o_return-zzmessage = |{ lv_num  } 交货单( { v_wa_in-vbeln }) 传EWM时超时! |." 
          RETURN .
        ENDIF.
      ENDIF.
      ADD 1 TO lv_num .
      WAIT UP TO '0.1' SECONDS .
    ENDDO.
2.创建HU条码,并绑定物料信息 --- 代码就是执行如下界面操作

 
 DATA:lo_dlv_pack TYPE REF TO /scwm/cl_dlv_pack_ibdl,
      wa_huhdr    TYPE /scwm/s_huhdr_int,
      iv_pmat     TYPE /scwm/de_matid.

 DATA(lo_pack) = NEW /scwm/cl_pack( ).
 /scwm/cl_tm=>cleanup( iv_lgnum = iv_lgnum )."仓库号
 CREATE OBJECT lo_dlv_pack."实例化

*   数据初始化
    CALL METHOD lo_dlv_pack->init
      EXPORTING
        iv_lgnum      = iv_lgnum
        it_docid      = VALUE /scwm/tt_docid( ( docid = v_wa_refdoc-docid ) )
        iv_doccat     = 'PDI'
        iv_no_refresh = 'X'
        iv_lock_dlv   = 'X'.
* 启用检查
/scwm/cl_dlv_pack_ibdl=>gv_online = 'X'.
* 检查条码是否存在
      SELECT COUNT(*) FROM /scwm/huhdr
        WHERE huident = v_wa_hu-huident .
      IF sy-subrc = 0.
        CONTINUE .
      ENDIF.
*     条码物料转换
      CALL FUNCTION 'CONVERSION_EXIT_MDLPD_INPUT'
        EXPORTING
          input  = 'BOX'
        IMPORTING
          output = iv_pmat.
*    创建HU
      CLEAR:wa_huhdr.
      CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~create_hu
        EXPORTING
          iv_pmat    = iv_pmat
          iv_huident = v_wa_hu-huident
        RECEIVING
          es_huhdr   = wa_huhdr
        EXCEPTIONS
          error      = 1
          OTHERS     = 2.

      IF sy-subrc EQ 0 OR ( sy-msgno EQ '017' AND sy-msgid EQ '/SCWM/HU_WM' ).

        APPEND VALUE #( huident = wa_huhdr-huident guid_hu = wa_huhdr-guid_hu ) TO gt_guid .

      ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
        o_return-zztype = 'E'.
        o_return-zzmessage =  |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })创建HU({ v_wa_hu-huident })失败!原因:{ lv_msg }|." '交货单( ' && v_wa_in-vbeln && ' )无法进行打包!'.
        RETURN .
      ENDIF.

    DATA wa_mat TYPE /scwm/s_pack_stock.
    DATA wa_pg  TYPE /scwm/s_quan."评估数量
    DATA lv_guid TYPE /scwm/guid_hu.
    DATA wa_quan TYPE /scwm/s_quan.
    SORT gt_guid BY huident .
*   绑定物料信息
      SELECT SINGLE marm~meinh
        FROM lips JOIN marm ON marm~matnr = lips~matnr
         WHERE lips~vbeln = @v_wa_hu-vbeln
           AND lips~posnr = @v_wa_hu-posnr
          AND marm~ty2tq EQ 'B' INTO @DATA(lv_meinh).
      IF sy-subrc EQ 0.
        DATA(lv_status) = 'A'.
        wa_pg-quan = v_wa_hu-menge.
        wa_pg-unit = v_wa_hu-meins.
        wa_quan-quan = 1.
        wa_quan-unit = lv_meinh.
      ELSE.
        wa_quan-quan = v_wa_hu-menge.
        wa_quan-unit = v_wa_hu-meins.
      ENDIF.

      READ TABLE gt_refdoc INTO DATA(v_wa_id) WITH  KEY refdocno = v_wa_hu-vbeln refitemno = v_wa_hu-posnr.
      IF sy-subrc EQ 0.
        wa_mat-qdocid = v_wa_id-docid.
        wa_mat-qitmid = v_wa_id-itemid.
      ENDIF.


      READ TABLE gt_guid INTO DATA(v_wa_guid) WITH  KEY huident = v_wa_hu-zbqbm .
      IF sy-subrc = 0.
        lv_guid = v_wa_guid-guid_hu .
      ELSE.
        CONTINUE .
      ENDIF.

      CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~pack_stock
        EXPORTING
          iv_dest_hu   = lv_guid
          is_material  = wa_mat
          is_quantity  = wa_quan
          is_valuation = wa_pg
          iv_cwexact   = lv_status
        IMPORTING
          es_quantity  = wa_quan
        EXCEPTIONS
          error        = 1
          OTHERS       = 2.

      IF sy-subrc NE 0 .
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                INTO lv_msg
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        o_return-zztype = 'E'.
        o_return-zzmessage =  |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })—执行打包时出现错误,物料包装失败,原因:{ lv_msg }|." '交货单( ' && v_wa_in-vbeln && ' )无法进行打包!'.
        RETURN .
      ELSE.
        o_return-zztype = 'S'.
      ENDIF.
 IF o_return-zztype NE 'E'.
      CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~save
        EXPORTING
          iv_commit = 'X'
          iv_wait   = 'X'
        EXCEPTIONS
          error     = 1
          OTHERS    = 2.
IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg.
        o_return-zztype = 'E'.
        o_return-zzmessage =  |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })—执行打包时出现错误,物料包装失败,原因:{ lv_msg }|.
        RETURN .
      ELSE.
        o_return-zztype = 'S'.
        o_return-zzmessage =  | { o_return-zzmessage }交货单:({ v_wa_in-vbeln })打包成功!|."
      ENDIF.
ENDIF.



3.收货过账
  DATA:eo_message     TYPE REF TO /scdl/cl_dm_message,
       lo_message_box TYPE REF TO /scdl/cl_sp_message_box,
       lo_sp_prd      TYPE REF TO /scdl/cl_sp_prd_out,
       lo_sp_prd_in   TYPE REF TO /scdl/cl_sp_prd_inb,
       lv_rejected    TYPE boole_d,
       lt_mes         TYPE /scdl/dm_message_tab.
  DATA it_hu TYPE /scwm/t_gm_hu .
  DATA it_dlv TYPE /scwm/dlv_docid_item_tab .

  TRY.
      CREATE OBJECT lo_message_box.
  ENDTRY.

  /scwm/cl_goods_movement=>cleanup( )."初始化
  /scwm/cl_tm=>cleanup( )."删除事务数据缓冲区

*  DN按行项目收货
  CASE v_flag.
    WHEN 'A'.
      /scwm/cl_goods_movement=>post_dlv(
  EXPORTING
    it_dlv      = it_dlv
    iv_gmcat    = /scwm/if_docflow_c=>sc_gr
  IMPORTING
     eo_message = eo_message ).
    WHEN 'H'.
*    按条码收货
      TRY.
          CALL METHOD /scwm/cl_goods_movement=>post_hu
            EXPORTING
              it_hu      = it_hu
              iv_gmcat   = /scwm/if_docflow_c=>sc_gr
*             iv_post_part =
            IMPORTING
              eo_message = eo_message.
      ENDTRY.
  ENDCASE.

  IF eo_message IS BOUND.

    lt_mes = eo_message->get_messages( )."获取返回消息

    IF NOT line_exists( lt_mes[ msgty = 'E'] ) AND NOT line_exists( lt_mes[ msgty = 'A'] ) .

      CASE /scwm/if_docflow_c=>sc_gr."收货

        WHEN /scwm/if_docflow_c=>sc_gr OR /scwm/if_docflow_c=>sc_grr.

          CREATE OBJECT lo_sp_prd_in
            EXPORTING
              io_message_box = lo_message_box
              iv_doccat      = /scdl/if_dl_doc_c=>sc_doccat_inb_prd
              iv_mode        = /scdl/cl_sp=>sc_mode_classic.

          CALL METHOD lo_sp_prd_in->save
            IMPORTING
              rejected = lv_rejected.
      ENDCASE.
      COMMIT WORK AND WAIT.
      IF iv_vbeln IS NOT INITIAL.
        DO 10 TIMES .
          SELECT SINGLE * FROM matdoc WHERE vbeln_im = @iv_vbeln AND bwart NE  '103'
            INTO @DATA(v_wa_mseg) .
          IF sy-subrc EQ 0.
            o_return-zvalue4 = v_wa_mseg-mblnr .
            o_return-zvalue5 = v_wa_mseg-mjahr .
            EXIT .
          ELSE.
            WAIT UP TO  '0.1' SECONDS .
          ENDIF.
        ENDDO.

      ENDIF.

      o_return-zztype = 'S'.
      o_return-zzmessage = |交货单收货成功--物料凭证({ o_return-zvalue4 })|." && lv_msg.

    ELSE.
      DATA(wa_msg) = lt_mes[ msgty = 'E' ].
      MESSAGE ID wa_msg-msgid TYPE wa_msg-msgty NUMBER wa_msg-msgno
          WITH wa_msg-msgv1 wa_msg-msgv2 wa_msg-msgv3 wa_msg-msgv4 INTO DATA(lv_msg).
      o_return-zztype = 'E'.
      o_return-zzmessage = |交货单收货失败,原因:{ lv_msg }| .
    ENDIF.

    /scwm/cl_goods_movement=>cleanup( ).

    IF lo_sp_prd_in IS BOUND .
      CALL METHOD lo_sp_prd_in->cleanup(
        EXPORTING
          reason = lo_sp_prd_in->sc_cleanup_commit ).
    ENDIF.
  ENDIF.



4. 创建|确认仓库任务----更新资源号
DATA iv_lgnum       TYPE /scwm/lgnum .
  DATA iv_process     TYPE /scwm/de_to_whr_proc .
  DATA iv_mve_hu      TYPE /scwm/de_whr_mve_hu .
  DATA it_create_whr  TYPE /scwm/tt_to_prep_whr_int .
  DATA it_crea_hu     TYPE /scwm/tt_to_prep_hu_int .
  DATA ev_tanum       TYPE /scwm/tanum .
  DATA et_ltap_vb     TYPE /scwm/tt_ltap_vb .
  DATA et_bapiret     TYPE  bapirettab.
  DATA ev_severity    TYPE  bapi_mtype.

  iv_lgnum = gt_in[ 1 ]-lgnum.
  CHECK iv_lgnum NE space .
  DATA(v_gt_in) = gt_in[].

  SELECT b~huident,b~guid_hu
    FROM @v_gt_in AS a
    JOIN /scwm/huhdr AS b ON b~huident =    a~zbqbm
    INTO TABLE @DATA(v_gt_hu).
  CHECK v_gt_hu IS  NOT INITIAL .

*LOOP AT v_gt_in INTO .
*
*ENDLOOP.
  DATA(v_wa_in) = v_gt_in[ 1 ].
  DATA p_squit TYPE  /scwm/rl03tsquit .
  CLEAR:p_squit .
*IF IV_SQUIT .
*
*ENDIF.

  CASE iv_flag.

    WHEN 'S'.

        p_squit = 'X' .
    WHEN 'C'."创建仓库任务
      CLEAR:p_squit .
    WHEN 'M'."创建仓库任务
      p_squit = 'X' .
    WHEN OTHERS .
      RETURN .
  ENDCASE.

  SELECT c~docid,c~itemid,c~doccat,a~zbqbm AS huident,a~vbeln,a~posnr,a~lgpla,d~status_value
    FROM @v_gt_in AS a
   JOIN /scdl/db_refdoc      AS c ON c~refdocno = a~vbeln AND substring( c~refitemno ,5,6 )  = a~posnr AND c~refdoccat EQ 'ERP'
   JOIN /scdl/db_status      AS d ON c~docid = d~docid AND c~itemid = d~itemid AND  d~status_type = 'DGR'
    INTO TABLE @DATA(v_gt_refdoc).


  DELETE v_gt_refdoc WHERE status_value NE '9'.
  IF sy-subrc = 0.
    o_return-zztype = 'E' .
    o_return-zzmessage = '未完全收货,无法确认仓库任务!' .
    RETURN .
  ENDIF.

  SORT v_gt_refdoc BY vbeln  posnr .

  LOOP AT v_gt_refdoc INTO DATA(v_wa_ret) GROUP BY ( vbeln = v_wa_ret-vbeln  posnr = v_wa_ret-posnr ) .
    CLEAR:it_create_whr,et_ltap_vb,et_bapiret,ev_severity,ev_tanum.

    it_create_whr = VALUE #( BASE it_create_whr FOR wa_ref IN v_gt_refdoc WHERE ( vbeln = v_wa_ret-vbeln AND  posnr = v_wa_ret-posnr )
    ( rdoccat  = wa_ref-doccat
      rdocid   = wa_ref-docid
       ritmid  =  wa_ref-itemid
       vlpla   =  wa_ref-lgpla
*    vlenr = wa_ref-huident nlenr = wa_ref-huident
    )
    ).

    DELETE ADJACENT DUPLICATES FROM it_create_whr COMPARING ALL FIELDS .
    CALL FUNCTION '/SCWM/TO_CREATE_WHR'
      EXPORTING
        iv_lgnum       = iv_lgnum
        iv_process     = '1'
        iv_mve_hu      = 'X'
*       iv_mve_mat     = 'X'
*       iv_mve_hu_mult = 'X'
        iv_squit       = p_squit "确认仓库任务
*       IV_FULL_PICK   =
*       IV_TO_INIT     = 'X'
        iv_bname       = sy-uname
*       IV_WTCODE      = ' '
*       IV_FILTER_HU   = ' '
*       IS_PARAM       =
*       IS_RFC_QUEUE   =
        it_create_whr  = it_create_whr
*       it_crea_hu     = it_crea_hu
*       IV_UPDATE_TASK = ' '
        iv_commit_work = 'X'
      IMPORTING
        ev_tanum       = ev_tanum
        et_ltap_vb     = et_ltap_vb
        et_bapiret     = et_bapiret
        ev_severity    = ev_severity.
    IF ev_severity = 'E'.
      DATA(v_wa_msg) = et_bapiret[  type = 'E' ].
      o_return-zztype = 'E' .
      IF iv_squit = 'X'.
        o_return-zzmessage = |仓库任务创建或确认时失败,原因:{ v_wa_msg-message }| .
      ELSE.
        o_return-zzmessage = |仓库任务创建失败,原因:{ v_wa_msg-message }| .
      ENDIF.
      APPEND o_return TO t_return .
      RETURN .
*    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
*    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*        wait = 'X'.
*    DATA(v_wa_vb) = et_ltap_vb[  tapos = '0000' ].
      IF et_ltap_vb IS NOT INITIAL.
        DATA(v_wa_vb) = et_ltap_vb[  1 ].
        o_return-zztype = 'S' .

        IF p_squit = 'X'.
          o_return-zzmessage = |仓库任务创建且确认成功!| .
        ELSE.
          o_return-zzmessage = |仓库任务创建成功!| .
        ENDIF.
        o_return-zvalue1 = v_wa_vb-who.
        o_return-zvalue2 = v_wa_vb-tanum.
        o_return-zvalue3 = v_wa_vb-nlpla.
        APPEND o_return TO t_return .
      ENDIF.

*   更新资源号
      DATA v_gt_in_up TYPE TABLE OF zpdas_dn_by_po .
      v_gt_in_up = VALUE #( BASE v_gt_in_up FOR wa IN et_ltap_vb
        WHERE ( who IS NOT INITIAL )
              ( lgnum =    wa-lgnum
               who =    wa-who
              rsrc = v_wa_in-rsrc
              uname = v_wa_in-uname
             )
           ).
  DATA ls_who TYPE /scwm/s_who_int.
  DATA lt_who TYPE TABLE OF /scwm/s_who_int.
  DATA(v_gt_in) = gt_in[] .
  SORT v_gt_in BY lgnum who .
  DELETE ADJACENT DUPLICATES FROM v_gt_in COMPARING lgnum who  .
  LOOP AT v_gt_in INTO DATA(v_wa_in) GROUP BY ( who = v_wa_in-who lgnum = v_wa_in-lgnum  ).
    "更新资源
    CALL FUNCTION '/SCWM/WHO_GET'
      EXPORTING
        iv_lgnum      = v_wa_in-lgnum
        iv_whoid      = v_wa_in-who "WHO number
      IMPORTING
        es_who        = ls_who
      EXCEPTIONS
        /scwm/cx_core = 1
        OTHERS        = 2.
    IF sy-subrc EQ 0.
*          SELECT COUNT(*)  FROM  /scwm/ordim_o WHERE who EQ ls_who-who.
*          IF sy-subrc EQ 0.
*            ls_who-status = 'D'.
*          ELSE.
*            ls_who-status = 'C'.
*          ENDIF.
      ls_who-updkz = 'U'."change indicator: D-delete.I-insert,U-update
      GET TIME STAMP FIELD ls_who-confirmed_at.
*            ls_who-confirmed_by = v_in-uname.
      ls_who-rsrc = v_wa_in-rsrc.
      APPEND ls_who TO lt_who.
      CLEAR:ls_who .
    ENDIF.
  ENDLOOP .

  IF lt_who IS NOT INITIAL.
    CALL FUNCTION '/SCWM/WHO_DB_UPDATE'
      EXPORTING
        it_who = lt_who.
    CLEAR:lt_who,ls_who .
    COMMIT WORK AND WAIT.
  ENDIF.



    ENDIF.

  ENDLOOP.

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/SCWM/L3034是SAP的事务,用于执行库存转储的相关操作。根据引用中提到的需求,可以通过该事务进行修改数量,从而产生WT(工作任务)。使用步骤1中提到的事务/SCWM/CHM_LOG可以显示和分析检查日志,以便进一步处理相关问题。请注意,Scwm引用中提到的是一个窗口管理器,并与SAP事务/SCWM/L3034没有直接关联。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ABAP EWM模拟 /SCWM/ADGI过账更改HU数量](https://blog.csdn.net/weixin_44911062/article/details/123718365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SAP EWM /SCWM/CHM_LOG - 显示及分析检查日志](https://blog.csdn.net/weixin_43899798/article/details/130567923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Scwm-开源](https://download.csdn.net/download/weixin_42116681/18678510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值