參照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.
相關文章
相關標籤/搜索