此博客为原创博客,都是个人工作经历所得,转载请注明出处

参照UB单创建DN并过账

*&---------------------------------------------------------------------*
*& Form FRM_DN_POST
*&---------------------------------------------------------------------*
*& text 参照UB单创建DN 并发货过账
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_dn_post .
  DATA:lt_stock_items TYPE TABLE OF bapidlvreftosto.
  DATA:ls_stock_items TYPE bapidlvreftosto.
  DATA:lt_created_items TYPE TABLE OF bapidlvitemcreated.
  DATA:ls_created_items TYPE bapidlvitemcreated.
  DATA:lv_delivery TYPE bapishpdelivnumb-deliv_numb.
  DATA:lv_vstel TYPE vstel.
  DATA:lv_ledat TYPE ledat.
  DATA:lt_return TYPE TABLE OF bapiret2.
  DATA:ls_header_data LIKE bapiobdlvhdrchg.
  DATA:ls_header_ctrl LIKE bapiobdlvhdrctrlchg.
  DATA:lt_item_data LIKE TABLE OF bapiobdlvitemchg.
  DATA:ls_item_data LIKE bapiobdlvitemchg.
  DATA:lt_item_data_spl LIKE TABLE OF /spe/bapiobdlvitemchg.
  DATA:ls_item_data_spl LIKE /spe/bapiobdlvitemchg.
  DATA:lt_item_control LIKE TABLE OF bapiobdlvitemctrlchg.
  DATA:ls_item_control LIKE bapiobdlvitemctrlchg.

  DATA:lt_vbpok_tab TYPE TABLE OF vbpok.
  DATA:ls_vbpok_tab TYPE vbpok.
  DATA:ls_techn_control TYPE bapidlvcontrol.
  DATA:ls_header_control TYPE bapiobdlvhdrctrlchg.
  DATA:ls_vbkok TYPE vbkok.
  DATA:lt_prot TYPE TABLE OF prott.

  DATA:lv_flag     TYPE c,
       lv_message  TYPE string,
       lv_message1 TYPE string,
       lv_mblnr    TYPE mkpf-mblnr,
       lv_mjahr    TYPE mkpf-mjahr.


**取到选中的订单号
  LOOP AT gt_doc ASSIGNING <gf_doc> WHERE sel = 'X' AND zstatus <> 'S'.
    gs_key-ebeln = <gf_doc>-ebeln.
    COLLECT gs_key INTO gt_key.
  ENDLOOP.

**通过订单号处理
  LOOP AT gt_key INTO gs_key.


**s1.根据UB创建DN

**清变量
    CLEAR: lv_message,lv_flag,
           lv_delivery,
           ls_stock_items,lt_stock_items,
           ls_created_items,lt_created_items,
           lt_return.

**参数赋值
    LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
      ls_stock_items-ref_doc = <gf_doc>-ebeln. "参考凭证
      ls_stock_items-ref_item = <gf_doc>-ebelp."参考项
      APPEND ls_stock_items TO lt_stock_items.

      ls_created_items-ref_doc = <gf_doc>-ebeln. "参考凭证
      ls_created_items-ref_item = <gf_doc>-ebelp."参考项
      ls_created_items-material = <gf_doc>-zmatnr."物料编号
      ls_created_items-material_long = <gf_doc>-zmatnr."物料编号
      APPEND ls_created_items TO lt_created_items.
    ENDLOOP.

*  DATA(lv_flag) = 'Y'.
*  EXPORT lv_flag TO  MEMORY ID 'ZPOS_LGORT_FLAG'.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
      EXPORTING
        ship_point        = lv_vstel
        due_date          = lv_ledat
      IMPORTING
        delivery          = lv_delivery
      TABLES
        stock_trans_items = lt_stock_items
        created_items     = lt_created_items
        return            = lt_return.
    FREE MEMORY ID 'ZPOS_LGORT_FLAG'.

    DELETE lt_return WHERE type = 'E' AND id = 'BAPI' AND number = '001'.
    LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E'.
      lv_flag = 'E'.
      CONCATENATE lv_message  ls_return-message INTO lv_message  SEPARATED BY '/'.
    ENDLOOP.


    IF lv_flag = 'E'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
        <gf_doc>-cldat = sy-datum.
        <gf_doc>-cltim = sy-uzeit.
        <gf_doc>-clnam = sy-uname.
*      IF lv_flag = 'E'.
        <gf_doc>-zstatus = 'E'.
        <gf_doc>-zmessage = lv_message.
        <gf_doc>-icon  = '@5C@'.
*      ELSE.
*        <gf_doc>-zstatus = '1'.
*        <gf_doc>-zmessage = 'DN创建成功'.
**        <gf_doc>-ICON = '@5B@'.
*        <gf_doc>-vbeln = lv_delivery.
**        <gf_doc>-posnr = lv_mjahr.
*      ENDIF.
        PERFORM frm_update_db.
      ENDLOOP.

    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
**s2.修改DN
      CLEAR:lv_mblnr,lv_mjahr,
            ls_header_data,ls_header_ctrl,
            ls_item_data,lt_item_data,
            ls_item_data_spl,lt_item_data_spl,
            ls_item_control,lt_item_control.

**参数赋值
      ls_header_data-deliv_numb = lv_delivery.
      ls_header_ctrl-deliv_numb = lv_delivery.

**记录DN创建结果
      LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
        <gf_doc>-cldat = sy-datum.
        <gf_doc>-cltim = sy-uzeit.
        <gf_doc>-clnam = sy-uname.

        <gf_doc>-zstatus = '1'.
        <gf_doc>-zmessage = 'DN创建成功'.
**        <gf_doc>-ICON = '@5B@'.
        <gf_doc>-vbeln = lv_delivery.

        DATA: ls_lips LIKE lips.
**通过VGBEL  VGPOS
        CLEAR: ls_lips.
        SELECT SINGLE *"posnr INTO <gf_doc>-posnr
          INTO ls_lips
          FROM lips
         WHERE vgbel = <gf_doc>-ebeln
           AND vgpos = <gf_doc>-ebelp.
        <gf_doc>-posnr = ls_lips-posnr.
        PERFORM frm_update_db.

**要修改:存储地点  数量  批次
        ls_item_data-deliv_numb      = lv_delivery."交货
        ls_item_data-deliv_item      = ls_lips-posnr."交货项目
        ls_item_data-material        = ls_lips-matnr."物料编号
        ls_item_data-dlv_qty         = <gf_doc>-zlfimg."数量
*        ls_item_data-batch          = lips-charg."批次
        ls_item_data-fact_unit_nom   = ls_lips-umvkz.
        ls_item_data-fact_unit_denom = ls_lips-umvkn.
        APPEND ls_item_data TO lt_item_data.
        CLEAR:ls_item_data.

        ls_item_data_spl-deliv_numb = ls_lips-vbeln."交货单
        ls_item_data_spl-deliv_item = ls_lips-posnr."交货单行项目
        ls_item_data_spl-stge_loc = <gf_doc>-zlgort. "库存地点
        APPEND ls_item_data_spl TO lt_item_data_spl.
        CLEAR:ls_item_data_spl.

        ls_item_control-deliv_numb = ls_lips-vbeln."交货单
        ls_item_control-deliv_item = ls_lips-posnr."交货单行项目
        ls_item_control-chg_delqty = 'X'.
        APPEND ls_item_control TO lt_item_control.
        CLEAR:ls_item_control.
      ENDLOOP.


      IF lt_item_data IS NOT INITIAL.
        CLEAR:lt_return.

        CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
          EXPORTING
            header_data    = ls_header_data
            header_control = ls_header_ctrl
            delivery       = lv_delivery
          TABLES
            item_data      = lt_item_data
            item_data_spl  = lt_item_data_spl
            item_control   = lt_item_control
            return         = lt_return.

        READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
        IF sy-subrc <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          <gf_doc>-zmessage = 'DN修改成功'.

**记录DN修改结果
          LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
            <gf_doc>-cldat = sy-datum.
            <gf_doc>-cltim = sy-uzeit.
            <gf_doc>-clnam = sy-uname.

            <gf_doc>-zstatus = '2'.
            <gf_doc>-zmessage = 'DN修改成功'.
**        <gf_doc>-ICON = '@5B@'.

            PERFORM frm_update_db.
          ENDLOOP.


**s3.DN过账
**清变量
          CLEAR:lv_mblnr,lv_mjahr,
                ls_vbkok,lv_flag,
                lt_prot,
                ls_vbpok_tab,lt_vbpok_tab.
          SELECT *
            FROM lips
            INTO TABLE @DATA(lt_lips)
           WHERE vbeln = @lv_delivery.

          LOOP AT lt_lips  ASSIGNING FIELD-SYMBOL(<fs_lips>).
            CLEAR:ls_vbpok_tab.
            ls_vbpok_tab-vbeln_vl = <fs_lips>-vbeln. "交货.
            ls_vbpok_tab-posnr_vl = <fs_lips>-posnr."原行项目
            ls_vbpok_tab-vbeln    = <fs_lips>-vbeln. "交货.
            ls_vbpok_tab-posnn    = <fs_lips>-posnr."交货项目
            ls_vbpok_tab-matnr    = <fs_lips>-matnr."物料编号
            ls_vbpok_tab-charg    = <fs_lips>-charg."批号
            ls_vbpok_tab-lfimg    = <fs_lips>-lfimg.
            ls_vbpok_tab-meins    = <fs_lips>-meins.
            ls_vbpok_tab-werks    = <fs_lips>-werks ."库存地点
            ls_vbpok_tab-lgort    = 9000 .           "库存地点
            ls_vbpok_tab-kzlgo    = 'X'.             "库存地点可修改
            ls_vbpok_tab-pikmg    = <fs_lips>-lfimg."捡配数量
            ls_vbpok_tab-lgmng    = <fs_lips>-lfimg."交货量
            APPEND ls_vbpok_tab TO lt_vbpok_tab.

            CLEAR:ls_item_data_spl.
            ls_item_data_spl-deliv_numb = <fs_lips>-vbeln."交货
            ls_item_data_spl-deliv_item = <fs_lips>-posnr."原行项目
            ls_item_data_spl-stge_loc   = 9000.       "库存地点
            APPEND ls_item_data_spl TO lt_item_data_spl.

          ENDLOOP.

          ls_header_data-deliv_numb     = lv_delivery."交货
          ls_techn_control-upd_ind      = 'U'.
          ls_header_control-deliv_numb  = lv_delivery."交货
          lv_delivery                   = lv_delivery."交货

          ls_vbkok-vbeln_vl             = lv_delivery.
          ls_vbkok-wabuc                = 'X'.
          ls_vbkok-wadat_ist            = sy-datum.


          CALL FUNCTION 'WS_DELIVERY_UPDATE'
            EXPORTING
              vbkok_wa                  = ls_vbkok
              delivery                  = lv_delivery
              update_picking            = 'X'
            IMPORTING
              ef_error_in_goods_issue_0 = lv_flag
            TABLES
              prot                      = lt_prot
              vbpok_tab                 = lt_vbpok_tab
            EXCEPTIONS
              error_message             = 1
              OTHERS                    = 2.



          LOOP AT lt_prot INTO DATA(ls_prot) WHERE msgty = 'E'.
            lv_flag = 'E'.

            CLEAR:lv_message1.
            MESSAGE ID ls_prot-msgid
                  TYPE ls_prot-msgty
                NUMBER ls_prot-msgno
                  WITH ls_prot-msgv1 ls_prot-msgv2 ls_prot-msgv3 ls_prot-msgv4
                  INTO lv_message1.
            CONCATENATE lv_message lv_message1 INTO lv_message SEPARATED BY '/'.
          ENDLOOP.

          IF lv_flag = 'E'.
            "创建失败
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
**状态跟新+回写落地表
            LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
              <gf_doc>-cldat = sy-datum.
              <gf_doc>-cltim = sy-uzeit.
              <gf_doc>-clnam = sy-uname.
              <gf_doc>-zstatus = 'E'.
              <gf_doc>-zmessage = 'DN过账失败:' && lv_message.
              <gf_doc>-icon  = '@5C@'.
              PERFORM frm_update_db.
            ENDLOOP.

          ELSE.
            "创建成功
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.
            SELECT SINGLE mblnr mjahr INTO (lv_mblnr,lv_mjahr)
              FROM mseg WHERE vbeln_im = lv_delivery.

            LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
              <gf_doc>-cldat = sy-datum.
              <gf_doc>-cltim = sy-uzeit.
              <gf_doc>-clnam = sy-uname.

              <gf_doc>-mblnr = lv_mblnr.
              <gf_doc>-mjahr = lv_mjahr.
              <gf_doc>-zstatus = 'S'.
              <gf_doc>-zdjzt = 'X'.
*              <gf_doc>-zmessage = 'DN过账失败:' && lv_message.
              <gf_doc>-icon  = '@5B@'.
              PERFORM frm_update_db.
            ENDLOOP.
          ENDIF.

***状态跟新+回写落地表
*          LOOP AT gt_doc ASSIGNING <gf_doc> WHERE ebeln = gs_key-ebeln.
*            <gf_doc>-cldat = sy-datum.
*            <gf_doc>-cltim = sy-uzeit.
*            <gf_doc>-clnam = sy-uname.
*            IF lv_flag = 'E'.
*              <gf_doc>-zstatus = 'E'.
*              <gf_doc>-zmessage = 'DN过账失败:' && lv_message.
*              <gf_doc>-icon  = '@5C@'.
*            ELSE.
*              <gf_doc>-zstatus = 'S'.
*              <gf_doc>-zmessage = 'DN过账成功'.
*              <gf_doc>-icon = '@5B@'.
***怎么取凭证号
*              <gf_doc>-mblnr = lv_delivery.
*              <gf_doc>-mjahr = lv_mjahr.
*            ENDIF.
*
*            PERFORM frm_update_db.
*
*          ENDLOOP.

        ELSE.
          "修改失败
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          <gf_doc>-zmessage = '交货单修改失败'.
        ENDIF.

      ENDIF.

    ENDIF.
  ENDLOOP.


*  "获取采购订单数据-行项目数据
*  SELECT *
*    FROM ekpo
*    INTO TABLE @DATA(lt_ekpo)
*   WHERE ebeln = @iv_ebeln."采购订单
*  LOOP AT lt_ekpo INTO DATA(ls_ekpo).
*
*    ls_stock_items-ref_doc = ls_ekpo-ebeln."参考凭证
*    ls_stock_items-ref_item = ls_ekpo-ebelp."参考项
*    APPEND ls_stock_items TO lt_stock_items.
*    ls_created_items-ref_doc = ls_ekpo-ebeln."参考凭证
*    ls_created_items-ref_item = ls_ekpo-ebelp."参考项
*    ls_created_items-material = ls_ekpo-matnr."物料编号
*    ls_created_items-material_long = ls_ekpo-matnr."物料编号
*    APPEND ls_created_items TO lt_created_items.
*  ENDLOOP.
*
**  DATA(lv_flag) = 'Y'.
**  EXPORT lv_flag TO  MEMORY ID 'ZPOS_LGORT_FLAG'.
*  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
*    EXPORTING
*      ship_point        = lv_vstel
*      due_date          = lv_ledat
*    IMPORTING
*      delivery          = lv_delivery
*    TABLES
*      stock_trans_items = lt_stock_items
*      created_items     = lt_created_items
*      return            = lt_return.
*  FREE MEMORY ID 'ZPOS_LGORT_FLAG'.
*
*  DELETE lt_return WHERE type = 'E' AND id = 'BAPI' AND number = '001'.
*
*  LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E'.
*    CONCATENATE o_return-message ls_return-message INTO o_return-message SEPARATED BY '/'.
*  ENDLOOP.
*
*  IF sy-subrc = 0.
*
*    "创建失败
*    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*
*    o_return-type = 'E'.
*    CONCATENATE '交货单创建失败:' o_return-message INTO o_return-message.
*
*  ELSE.
*
*    "创建成功
*    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*        wait = 'X'.
*
*    o_return-zdjh = lv_delivery."交货单
*    o_return-type = 'S'.
*    o_return-message = '交货单创建成功'.
*
*    ls_header_data-deliv_numb = lv_delivery.
*    ls_header_ctrl-deliv_numb = lv_delivery.
*
*    SELECT *
*      FROM lips
*      INTO TABLE @DATA(lt_lips)
*     WHERE vbeln = @lv_delivery.
*
*    LOOP AT lt_lips INTO DATA(ls_lips).
*      ls_item_data-deliv_numb      = ls_lips-vbeln."交货
*      ls_item_data-deliv_item      = ls_lips-posnr."交货项目
*      ls_item_data-material        = ls_lips-matnr."物料编号
*      ls_item_data-dlv_qty         = ''."越库业务:创建DN时,数量都变为0
*      ls_item_data-fact_unit_nom   = ls_lips-umvkz.
*      ls_item_data-fact_unit_denom = ls_lips-umvkn.
*      APPEND ls_item_data TO lt_item_data.
*      CLEAR:ls_item_data.
*
*      ls_item_data_spl-deliv_numb = ls_lips-vbeln."交货单
*      ls_item_data_spl-deliv_item = ls_lips-posnr."交货单行项目
*      ls_item_data_spl-stge_loc = ls_lips-lgort. "库存地点
*      APPEND ls_item_data_spl TO lt_item_data_spl.
*      CLEAR:ls_item_data_spl.
*
*      ls_item_control-deliv_numb = ls_lips-vbeln."交货单
*      ls_item_control-deliv_item = ls_lips-posnr."交货单行项目
*      ls_item_control-chg_delqty = 'X'.
*      APPEND ls_item_control TO lt_item_control.
*      CLEAR:ls_item_control.
*
*    ENDLOOP.
*
*    IF lt_item_data IS NOT INITIAL.
*      CLEAR:lt_return.
*
*      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
*        EXPORTING
*          header_data    = ls_header_data
*          header_control = ls_header_ctrl
*          delivery       = lv_delivery
*        TABLES
*          item_data      = lt_item_data
*          item_data_spl  = lt_item_data_spl
*          item_control   = lt_item_control
*          return         = lt_return.
*
*      READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'.
*      IF sy-subrc <> 0.
*        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*          EXPORTING
*            wait = 'X'.
*        o_return-message = '交货单创建成功/交货单修改成功'.
*      ELSE.
*        "修改失败
*        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*        o_return-message = '交货单创建成功/交货单修改失败'.
*      ENDIF.
*
*    ENDIF.
*
*  ENDIF.

ENDFORM.

 

posted @ 2019-06-12 14:11  Rainystuday  阅读(315)  评论(0编辑  收藏  举报