銷售訂單導入+序列號 VA01

*&-----------------------------------------------------------*
*& 程序名: ZSDBI001
*& T-CODE: 
*& 功能描述:訂單導入
*& First Created: 
*&-----------------------------------------------------------*
*& Date        Userid             Reason/Description of Change
*&
*&
*&-----------------------------------------------------------*
REPORT zsdbi001.


TYPE-POOLS slis.

*------------------------------------------------------------*
*   數據聲明 - 開始
*------------------------------------------------------------*

*------------------------------------------------------------*
*   DESC: 表/ 結構 / 視圖的聲明
*------------------------------------------------------------*
TYPES : BEGIN OF ty_vbap,
          sernr     TYPE gernr,
          serail    TYPE serail,
          matnr     TYPE matnr,
          anzsn     TYPE anzsn,
          cuobj     TYPE cuobj,
          vbeln     TYPE vbeln,
          posnr     TYPE posnr,
          kunnr     TYPE kunnr,
          vbtyp     TYPE vbtyp,
          auart     TYPE auart,
          pstyv     TYPE pstyv,
        END OF ty_vbap.

*------------------------------------------------------------*
* DESC:定義所需要的內表
*------------------------------------------------------------*
* 文件表頭/序列號
DATA : BEGIN OF lt_xls1 OCCURS 0,
          bstkd     TYPE vbeln,
          auart     TYPE auart,
          vkorg     TYPE vkorg,
          vtweg     TYPE vtweg,
          spart     TYPE spart,
          kunnr     TYPE kunnr,
          kunwe     TYPE kunwe,
          augru     TYPE augru,
          posnr     TYPE posnr,
          matnr     TYPE matnr,
          kwmeng    TYPE kwmeng,
          werks     TYPE werks_d,
          lgort     TYPE lgort_d,
*          ihrez     TYPE ihrez,
*          remark    TYPE tdline,
        END OF lt_xls1,
        wa_xls1     LIKE LINE OF lt_xls1,
        BEGIN OF lt_xls2 OCCURS 0,
          bstkd     TYPE vbeln,
          posnr     TYPE posnr,
          sernr     TYPE gernr,
        END OF lt_xls2.

* 轉換數據 - 銷售訂單表頭 , 銷售訂單項目 , 序列號
DATA :  BEGIN OF lt_sales OCCURS 0,
          bstkd     TYPE vbeln,
          auart     TYPE auart,
          vkorg     TYPE vkorg,
          vtweg     TYPE vtweg,
          spart     TYPE spart,
          kunnr     TYPE kunnr,
          kunwe     TYPE kunwe,
          augru     TYPE augru,
          zzflag    TYPE c,
          zzso      TYPE vbeln_va,
          zzdn      TYPE vbeln_vl,
          zzpgi     TYPE mblnr,
          zzmsg     TYPE bapi_msg,
       END OF lt_sales,
       BEGIN OF lt_salesitem OCCURS 0,
          bstkd     TYPE vbeln,
          posnr     TYPE posnr,
          matnr     TYPE matnr,
          kwmeng    TYPE kwmeng,
          werks     TYPE werks_d,
          lgort     TYPE lgort_d,
       END OF lt_salesitem,
       BEGIN OF lt_material OCCURS 0,
          bstkd     TYPE bstkd,
          posnr     TYPE posnr,
          werks     TYPE werks_d,
          lgort     TYPE lgort_d,
          matnr     TYPE matnr,
          sernr     TYPE gernr,
       END OF lt_material,
       wa_material  LIKE LINE OF lt_material.

DATA : wa_sales           LIKE LINE OF lt_sales.
DATA : lt_vbap            TYPE ty_vbap OCCURS 0 WITH HEADER LINE.


*------------------------------------------------------------*
*    DESC: BAPI
*------------------------------------------------------------*
*  CREATE SO DECLARE
DATA : lt_so_head         TYPE bapisdhd1 ,
       lt_so_item         TYPE STANDARD TABLE OF bapisditm INITIAL SIZE 0 WITH HEADER LINE,
       lt_so_sch          TYPE STANDARD TABLE OF bapischdl INITIAL SIZE 0 WITH HEADER LINE,
       lt_so_partners     TYPE STANDARD TABLE OF bapiparnr INITIAL SIZE 0 WITH HEADER LINE,
       lt_so_conditions   TYPE STANDARD TABLE OF bapicond INITIAL SIZE 0 WITH HEADER LINE,
       lt_so_text         TYPE STANDARD TABLE OF bapisdtext INITIAL SIZE 0 WITH HEADER LINE.


* CREATE DN DECLARE
DATA : lt_dn_item         TYPE STANDARD TABLE OF bapidlvreftosalesorder INITIAL SIZE 0 WITH HEADER LINE,
       lt_sernr           TYPE STANDARD TABLE OF bapidlvserialnumber INITIAL SIZE 0 WITH HEADER LINE,
       lt_return          TYPE STANDARD TABLE OF bapiret2 INITIAL SIZE 0 WITH HEADER LINE,
       l_dnno             TYPE bapishpdelivnumb-deliv_numb.

* PGI
DATA : wa_mvt             TYPE vbkok,
       lt_vbpok           TYPE STANDARD TABLE OF vbpok INITIAL SIZE 0 WITH HEADER LINE,
       lt_dn_sernr        TYPE shp_sernr_update_t,
       wa_dn_sernr        TYPE shp_sernr_update_s,
       lt_prot            TYPE STANDARD TABLE OF prott INITIAL SIZE 0 WITH HEADER LINE.


DATA : l_sono             TYPE vbeln_va,
       doc_no             TYPE vbeln_va,
       l_dn_no            TYPE vbeln_vl,
       l_error            TYPE c,
       lv_msg             TYPE bapi_msg.

* ALV
DATA: it_fieldcat   TYPE slis_t_fieldcat_alv,
      wa_fieldcat   TYPE slis_fieldcat_alv,
      wa_layout     TYPE slis_layout_alv.



************************************************************************
*        MICRO
************************************************************************
DEFINE de_alvflds.
  clear wa_fieldcat.
  wa_fieldcat-ddictxt = 'M'.
  wa_fieldcat-fieldname = &1. "字段
  wa_fieldcat-seltext_m = &2. "描述
  append wa_fieldcat to it_fieldcat.
END-OF-DEFINITION.

DEFINE de_alpha.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
    exporting
      input  = &1
    importing
      output = &2.
END-OF-DEFINITION.
************************************************************************
*        PARAMETERS
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS     :p_sales     LIKE rlgrap-filename DEFAULT 'C:\SALES.TXT',
                p_serial    LIKE rlgrap-filename DEFAULT 'C:\SERIAL.TXT',
                p_pstdt     LIKE likp-wadat_ist DEFAULT sy-datum OBLIGATORY.

SELECTION-SCREEN SKIP 1 .

PARAMETERS : p_dn TYPE c AS CHECKBOX DEFAULT 'X',
             p_pgi TYPE c AS CHECKBOX DEFAULT 'X'.

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
SELECTION-SCREEN  COMMENT 1(79) comm1.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN  COMMENT 1(79) comm2.
SELECTION-SCREEN END OF BLOCK b2.

INITIALIZATION.
  comm1 = '銷售訂單:訂單號,訂單類型,銷售組織,分銷渠道,產品組,售達方,送達方,訂單原因,項目,物料,數量,工廠,倉庫'.
  comm2 = '序列號  :訂單號,項目,序列號'.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_sales.
  PERFORM frm_req_file USING p_sales.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_serial.
  PERFORM frm_req_file USING p_serial.


************************************************************************
*----------------------------------------------------------------------*
*
*        MAIN PROGRAM
*
*----------------------------------------------------------------------*
************************************************************************
START-OF-SELECTION.
  "文件上載
  PERFORM frm_upload.

  IF lt_xls1[] IS INITIAL OR lt_xls2[] IS INITIAL.
    MESSAGE s001(00) WITH '文件數據爲空'.
    EXIT.
  ENDIF.

  "數據轉換 及處理
  PERFORM frm_process.

  "日誌顯示
  PERFORM frm_display.

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_SALESORDER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_create_salesorder.
  DATA  : lv_itm_number TYPE posnr,
          lv_sched_line TYPE etenr,
          lv_anzsn      TYPE anzsn,
          lv_pstyv      TYPE pstyv,
          lv_serail     TYPE serail,
          lv_qty        TYPE kwmeng.

  CLEAR : lt_so_head,lt_so_item,lt_so_partners,lt_so_conditions,lt_so_text,l_error.
  REFRESH:lt_so_item,lt_so_partners,lt_so_conditions,lt_so_text,lt_return,lt_so_sch,lt_vbap.
*----HEAD
  lt_so_head-doc_type   = wa_sales-auart.        "銷售憑證類型
  lt_so_head-sales_org  = wa_sales-vkorg.
  lt_so_head-distr_chan = wa_sales-vtweg.
  lt_so_head-division   = wa_sales-spart.
  lt_so_head-doc_date   = sy-datum.
*  lt_so_head-ref_1      = ''.        "您的參考
*  lt_so_head-purch_no_c = ''.        "採購單編號補充
*  lt_so_head-purch_date = ''.        "客戶採購訂單日期
  lt_so_head-ord_reason = wa_sales-augru.        "訂單原因

  de_alpha wa_sales-kunnr wa_sales-kunnr.

  lt_so_partners-partn_role = 'AG'.
  lt_so_partners-partn_numb = wa_sales-kunnr.
  APPEND lt_so_partners.
*  lt_so_partners-partn_role = 'RE'.
*  lt_so_partners-partn_numb = wa_sales-kunnr.
*  APPEND lt_so_partners.
*  lt_so_partners-partn_role = 'RG'.
*  lt_so_partners-partn_numb = wa_sales-kunnr.
*  APPEND lt_so_partners.
  lt_so_partners-partn_role = 'WE'.
  lt_so_partners-partn_numb = wa_sales-kunnr.
  APPEND lt_so_partners.
  CLEAR  lt_so_partners.

* Sales item
  LOOP AT lt_salesitem WHERE bstkd = wa_sales-bstkd.
    "出貨點
*    SELECT SINGLE vstel INTO lt_so_item-ship_point
*      FROM tvstz
    SELECT SINGLE vstel INTO lt_so_item-ship_point FROM tvswz WHERE werks = lt_salesitem-werks.
    IF sy-subrc <> 0 .
      lt_so_item-ship_point = lt_salesitem-werks.
    ENDIF.
    "銷售單位
    SELECT SINGLE vrkme INTO lt_so_item-target_qu FROM mvke WHERE vkorg = wa_sales-vkorg AND vtweg = wa_sales-vtweg AND matnr = lt_salesitem-matnr.

    lt_so_item-itm_number = lt_salesitem-posnr.
    lt_so_item-material   = lt_salesitem-matnr.
    lt_so_item-target_qty = lt_salesitem-kwmeng.
*    lt_so_item-target_qu  = 'EA'.
    lt_so_item-plant      = lt_salesitem-werks.
    lt_so_item-store_loc  = lt_salesitem-lgort.
    APPEND lt_so_item.
* SALES SCHLINE
    lt_so_sch-itm_number   = lt_salesitem-posnr.
    lt_so_sch-sched_line   = '0001'.
    lt_so_sch-req_date     = sy-datum.
    lt_so_sch-date_type    = '1'.
    lt_so_sch-req_qty      = lt_salesitem-kwmeng.
    APPEND lt_so_sch.

    "項目類別
    SELECT SINGLE pstyv INTO lv_pstyv FROM t184 WHERE auart = wa_sales-auart.
    "序列號參數文件
    SELECT SINGLE serial INTO lv_serail FROM mara WHERE matnr = lt_salesitem-matnr.

    lv_anzsn = lt_salesitem-kwmeng.

    LOOP AT lt_material WHERE bstkd = lt_salesitem-bstkd AND posnr = lt_salesitem-posnr.
      lt_vbap-sernr = lt_material-sernr.
      lt_vbap-serail = 'ZK01' . "lv_serail.
      lt_vbap-matnr = lt_material-matnr.
      lt_vbap-anzsn = lv_anzsn.
      lt_vbap-cuobj = ''.
      lt_vbap-vbeln = ''.
      lt_vbap-posnr = lt_salesitem-posnr.
      lt_vbap-kunnr = wa_sales-kunnr.
      lt_vbap-vbtyp = 'C'.
      lt_vbap-auart = wa_sales-auart.
      lt_vbap-pstyv = lv_pstyv.
      APPEND lt_vbap.
      CLEAR:lt_material,lt_vbap.
    ENDLOOP.
  ENDLOOP.

* Sales header text
*  lt_so_text-doc_number = l_sono.
*  lt_so_text-text_id    = '0001'.
*  lt_so_text-langu      = sy-langu.
*  lt_so_text-format_col = '*'.
*  lt_so_text-text_line  = wa_sales-remark.
*  APPEND lt_so_text.

* Sales item conditions
*    lt_so_conditions-itm_number = '000010'.
*    lt_so_conditions-cond_type  = 'ZCP0'.
*    lt_so_conditions-cond_value = wa_sales-kbetr.
*    lt_so_conditions-conbaseval = '1'.
*    lt_so_conditions-cond_p_unt = '1'.
*    lt_so_conditions-currency   = wa_sales-waerk.
*    APPEND lt_so_conditions.
*    CLEAR  lt_so_conditions.
*  break hp_abap3.
  CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    EXPORTING
      salesdocumentin     = l_sono
      order_header_in     = lt_so_head
    IMPORTING
      salesdocument       = doc_no
    TABLES
      return              = lt_return
      order_items_in      = lt_so_item
      order_partners      = lt_so_partners
      order_schedules_in  = lt_so_sch
      order_conditions_in = lt_so_conditions
      order_text          = lt_so_text.
  IF doc_no IS INITIAL.
    l_error = 'X'.
  ENDIF.
  IF l_error = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    LOOP AT lt_return WHERE type = 'E' OR  type = 'A'.
      CLEAR lv_msg.
      MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number
      WITH lt_return-message_v1 lt_return-message_v2 lt_return-message_v3 lt_return-message_v4
      INTO lv_msg.
      CONCATENATE wa_sales-zzmsg lv_msg INTO wa_sales-zzmsg.
    ENDLOOP.
  ELSE.

    lt_vbap-vbeln = doc_no.
    MODIFY lt_vbap TRANSPORTING vbeln WHERE vbeln IS INITIAL.

    CALL FUNCTION 'SERIAL_INTTAB_REFRESH'
      EXPORTING
        objects_status_refresh = 'E'.

    PERFORM frm_set_serial.

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.


    wa_sales-zzso = doc_no.
  ENDIF.
ENDFORM.                    "FRM_CREATE_SALESORDER

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_DELIVERY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_create_delivery.
  REFRESH:lt_dn_item , lt_return.
  CLEAR  :lt_dn_item , lt_return , l_dn_no.
  LOOP AT lt_so_item.
    lt_dn_item-ref_doc    = wa_sales-zzso.
    lt_dn_item-ref_item   = lt_so_item-itm_number.
    lt_dn_item-dlv_qty    = lt_so_item-target_qty.
    lt_dn_item-sales_unit = 'EA'.
    APPEND lt_dn_item.
    LOOP AT lt_vbap WHERE vbeln = wa_sales-zzso AND posnr = lt_so_item-itm_number.
      lt_sernr-ref_doc      = wa_sales-zzso.
      lt_sernr-ref_item     = lt_so_item-itm_number.
      lt_sernr-serialno     = lt_vbap-sernr.
      APPEND lt_sernr.
    ENDLOOP.
  ENDLOOP.

  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
    IMPORTING
      delivery          = l_dn_no
    TABLES
      sales_order_items = lt_dn_item
      serial_numbers    = lt_sernr
      return            = lt_return.
  IF l_dn_no IS INITIAL.
    l_error = 'X'.
  ENDIF.

  IF l_error = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
      CLEAR lv_msg.
      MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number
      WITH lt_return-message_v1 lt_return-message_v2 lt_return-message_v3 lt_return-message_v4
      INTO lv_msg.
      CONCATENATE wa_sales-zzmsg lv_msg INTO wa_sales-zzmsg.
    ENDLOOP.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    wa_sales-zzdn = l_dn_no.
  ENDIF.
ENDFORM.                    "FRM_CREATE_DELIVERY

*&---------------------------------------------------------------------*
*&      Form  FRM_DELIVERY_PGI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_delivery_pgi.
  CLEAR   :wa_mvt,lt_return,lt_dn_sernr.
  REFRESH :lt_return , lt_vbpok , lt_prot , lt_dn_sernr.

  wa_mvt-vbeln_vl = wa_sales-zzdn.
  wa_mvt-vbtyp_vl = 'J'.
  wa_mvt-vbeln    = wa_sales-zzso.
  wa_mvt-wabuc    = 'X'.
  wa_mvt-wadat_ist = p_pstdt.    "實際貨物移動日期 --待確認過帳日期


  LOOP AT lt_so_item.
    lt_vbpok-vbeln_vl = wa_sales-zzdn.
    lt_vbpok-posnr_vl = lt_so_item-itm_number.
    lt_vbpok-vbeln    = wa_sales-zzso.
    lt_vbpok-posnn    = lt_so_item-itm_number.
    lt_vbpok-matnr    = lt_so_item-material.
    lt_vbpok-werks    = lt_so_item-plant.
    lt_vbpok-kzlgo    = 'X'.
    lt_vbpok-pikmg    = lt_so_item-target_qty.
    APPEND lt_vbpok.
    LOOP AT lt_sernr.
      wa_dn_sernr-rfbel = wa_sales-zzdn.
      wa_dn_sernr-rfpos = lt_sernr-ref_item.
      wa_dn_sernr-sernr = lt_sernr-serialno.
      APPEND wa_dn_sernr TO lt_dn_sernr.
    ENDLOOP.
  ENDLOOP.
  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      vbkok_wa                    = wa_mvt
      synchron                    = 'X'
*     commit                      = 'X'
      delivery                    = wa_sales-zzdn
      if_error_messages_send_0    = ''
      it_sernr_update             = lt_dn_sernr
*    IMPORTING
*      ef_error_any_0              = l_err01
*      ef_error_in_item_deletion_0 = l_err02
*      ef_error_in_pod_update_0    = l_err03
*      ef_error_in_interface_0     = l_err04
*      ef_error_in_goods_issue_0   = l_err05
*      ef_error_in_final_check_0   = l_err06
*      ef_error_partner_update     = l_err07
*      ef_error_sernr_update       = l_err08
    TABLES
      vbpok_tab                   = lt_vbpok
      prot                        = lt_prot.
*  IF l_err01 = 'X' OR l_err02 = 'X' OR l_err03 = 'X' OR l_err04 = 'X' OR
*     l_err05 = 'X' OR l_err06 = 'X' OR l_err07 = 'X' OR l_err08 = 'X'.
*    l_error = 'X'.
*    wa_sales-zzmsg = 'DN PGI error'.
*  ENDIF.
  LOOP AT lt_prot WHERE msgty = 'A' OR msgty = 'E'.
    MESSAGE ID lt_prot-msgid TYPE lt_prot-msgty NUMBER lt_prot-msgno
            WITH lt_prot-msgv1 lt_prot-msgv2 lt_prot-msgv3 lt_prot-msgv4
            INTO  lv_msg.
    CONCATENATE wa_sales-zzmsg lv_msg INTO wa_sales-zzmsg.
    l_error = 'X'.
  ENDLOOP.

  IF l_error = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    SELECT SINGLE vbeln
      INTO wa_sales-zzpgi
      FROM vbfa
     WHERE vbelv = wa_sales-zzdn
       AND vbtyp_n = 'R'
       AND vbtyp_v = 'J'.
  ENDIF.

ENDFORM.                    "FRM_DELIVERY_PGI



*&---------------------------------------------------------------------*
*&      Form  FRM_SET_SERIAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LS_VBAP    text
*----------------------------------------------------------------------*
FORM frm_set_serial.
  DATA ls_vbap TYPE ty_vbap.
  LOOP AT lt_vbap INTO ls_vbap.
    CALL FUNCTION 'SERNR_ADD_TO_AU'
      EXPORTING
        sernr                 = ls_vbap-sernr  "'LVTDH12A3EB040976'
        profile               = ls_vbap-serail
        material              = ls_vbap-matnr
        quantity              = ls_vbap-anzsn
        cuobj                 = ls_vbap-cuobj
        document              = ls_vbap-vbeln
        item                  = ls_vbap-posnr
        debitor               = ls_vbap-kunnr
        vbtyp                 = ls_vbap-vbtyp
        sd_auart              = ls_vbap-auart
        sd_postyp             = ls_vbap-pstyv
        i_bapi                = 'X'
*    IMPORTING
*      anzsn                 = ls_vbap-anzsn
*      serial_commit         = lv_dataloss
      EXCEPTIONS
        konfigurations_error  = 1
        serialnumber_errors   = 2
        serialnumber_warnings = 3
        OTHERS                = 4.
  ENDLOOP.

  CALL FUNCTION 'SERIAL_LISTE_POST_AU'.
*  TABLES
*    tab_cuobj = lt_dbcuobj.

ENDFORM.                    "FRM_SET_SERIAL


*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_display.
  de_alvflds :'BSTKD'  '訂單序號',
              'AUART' '訂單類型',
              'KUNNR'  '客戶編號',

              'ZZSO'  '銷售訂單號',
              'ZZDN'   '交貨單號',
              'ZZPGI'   '交貨物料憑證',
              'ZZMSG'   '消息'.

  wa_layout-zebra                = 'X'.
  wa_layout-colwidth_optimize    = 'X'.     "優化列寬選項是否設置
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = sy-cprog
*     i_callback_user_command = 'SUB_USER_COMMAND'
      i_default               = 'X'
      i_save                  = 'X'
      is_layout               = wa_layout
      it_fieldcat             = it_fieldcat[]
    TABLES
      t_outtab                = lt_sales[]
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
ENDFORM.                    "FRM_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_upload .
  IF p_sales IS NOT INITIAL.
    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename                = p_sales
        filetype                = 'DAT'
      TABLES
        data_tab                = lt_xls1
      EXCEPTIONS
        conversion_error        = 1
        file_open_error         = 2
        file_read_error         = 3
        invalid_type            = 4
        no_batch                = 5
        unknown_error           = 6
        invalid_table_width     = 7
        gui_refuse_filetransfer = 8
        customer_error          = 9
        no_authority            = 10
        OTHERS                  = 11.
  ENDIF.
  IF p_serial IS NOT INITIAL.
    CALL FUNCTION 'WS_UPLOAD'
      EXPORTING
        filename                = p_serial
        filetype                = 'DAT'
      TABLES
        data_tab                = lt_xls2
      EXCEPTIONS
        conversion_error        = 1
        file_open_error         = 2
        file_read_error         = 3
        invalid_type            = 4
        no_batch                = 5
        unknown_error           = 6
        invalid_table_width     = 7
        gui_refuse_filetransfer = 8
        customer_error          = 9
        no_authority            = 10
        OTHERS                  = 11.
  ENDIF.
ENDFORM.                    " FRM_UPLOAD
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_process .
  DATA : lt_vin   TYPE zsdvin OCCURS 0 WITH HEADER LINE.
  DATA : lv_anzsn TYPE anzsn,
         lv_qty   TYPE kwmeng.


  SORT lt_xls1 BY bstkd posnr.
  SORT lt_xls2 BY bstkd posnr.

  LOOP AT lt_xls1.
    wa_xls1 = lt_xls1.

    CLEAR : lv_qty , lv_anzsn.

    LOOP AT lt_xls2 WHERE bstkd = wa_xls1-bstkd AND posnr = wa_xls1-posnr.
      CLEAR :lt_vin,lt_vin[].
      de_alpha lt_xls2-sernr lt_material-sernr.
      CALL FUNCTION 'ZF_SD_GETVINBYDN'
        EXPORTING
          i_sernr = lt_material-sernr
        TABLES
          et_item = lt_vin.
      READ TABLE lt_vin INDEX 1.
      CHECK lt_vin-lbbsa = '01' AND lt_vin-sobkz = space.

      ADD 1 TO lv_anzsn.
      lt_material-bstkd = wa_xls1-bstkd.
      de_alpha wa_xls1-posnr lt_material-posnr.
      lt_material-matnr = wa_xls1-matnr.
      lt_material-sernr = lt_vin-sernr.
      lt_material-werks = lt_vin-werks.
      lt_material-lgort = lt_vin-lgort.
      APPEND lt_material.
      CLEAR lt_material.
    ENDLOOP.

    lt_salesitem-bstkd = wa_xls1-bstkd.
    de_alpha wa_xls1-posnr lt_salesitem-posnr.
    lt_salesitem-matnr = wa_xls1-matnr.
    lt_salesitem-kwmeng = wa_xls1-kwmeng.
    lv_qty = lv_anzsn.
    IF lt_salesitem-kwmeng NE lv_qty.
      lt_sales-zzflag = 'X'.
      lt_sales-zzmsg = '項目數量與可用序列號數量不一致'.
    ENDIF.
    lt_salesitem-werks = wa_xls1-werks.
    lt_salesitem-lgort = wa_xls1-lgort.
    APPEND lt_salesitem.

    AT END OF bstkd.
      lt_sales-bstkd = wa_xls1-bstkd.
      lt_sales-auart = wa_xls1-auart.
      lt_sales-vkorg = wa_xls1-vkorg.
      de_alpha wa_xls1-vtweg lt_sales-vtweg .
      lt_sales-spart = wa_xls1-spart.
      de_alpha wa_xls1-kunnr lt_sales-kunnr .
      de_alpha wa_xls1-kunwe lt_sales-kunwe .
      lt_sales-augru = wa_xls1-augru.
      APPEND lt_sales.
      CLEAR lt_sales.
    ENDAT.

    CLEAR:wa_xls1,lt_salesitem.
  ENDLOOP.

  FREE:lt_xls1,lt_xls2.

  LOOP AT lt_sales INTO wa_sales WHERE zzflag IS INITIAL.
    PERFORM frm_create_salesorder.
    IF p_dn = 'X' AND l_error IS INITIAL.
      PERFORM frm_create_delivery.
    ENDIF.
    IF p_dn = 'X' AND p_pgi = 'X' AND l_error IS INITIAL.
      PERFORM frm_delivery_pgi.
    ENDIF.
    MODIFY lt_sales FROM wa_sales.
    CLEAR wa_sales.
  ENDLOOP.

  PERFORM frm_free.
ENDFORM.                    " FRM_PROCESS

*&---------------------------------------------------------------------*
*&      Form  FRM_FREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_free.
  CLEAR : lt_so_head,lt_so_item,lt_so_partners,lt_so_conditions,lt_so_text,lt_so_sch.
  REFRESH:lt_so_item,lt_so_partners,lt_so_conditions,lt_so_text,lt_return,lt_so_sch.

  REFRESH:lt_dn_item , lt_return , lt_sernr.
  CLEAR  :lt_dn_item , lt_return , l_dn_no.

  CLEAR   :wa_mvt,lt_return,lt_dn_sernr.
  REFRESH :lt_return , lt_vbpok , lt_prot , lt_dn_sernr.

  REFRESH :lt_material , lt_vbap .
ENDFORM.                    "FRM_FREE


*&---------------------------------------------------------------------*
*&      Form  sub_req_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FILE     text
*----------------------------------------------------------------------*
FORM frm_req_file  USING    p_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_filename     = 'Sales.txt'
      def_path         = 'C:\\'
      mask             = ',*.txt,*.txt,'     "
      mode             = 'O'
      title            = '請選擇要上載的文件'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
ENDFORM.                    "sub_req_file

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章