採購訂單批導

TYPE-POOLS truxs.
DATA: xlstab TYPE truxs_t_text_data,
      f_size TYPE i .
PARAMETERS: filename LIKE rlgrap-filename ,
            p_doc_ty  LIKE ekko-bsart DEFAULT 'YNB',
            p_doc_da LIKE  bapimepoheader-doc_date DEFAULT sy-datum,
            p_unit LIKE bapimepoitem-price_unit DEFAULT '10'.
PARAMETERS p_price AS CHECKBOX.

DATA : lv_cancel(1) TYPE c.
DATA error TYPE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF itb_input OCCURS 0,                            " 導入表結構
       comp_code LIKE bapimepoheader-comp_code,               "公司代碼
       purch_org LIKE bapimepoheader-purch_org,               "採購組織
       pur_group LIKE bapimepoheader-pur_group,               "採購組
       vendor LIKE bapimepoheader-vendor,                     "供應商
       material LIKE bapimepoitem-material,                   "物料
       plant LIKE bapimepoitem-plant,                         "工廠
       stge_loc LIKE bapimepoitem-stge_loc,                   "庫存地
       quantity LIKE bapimepoitem-quantity,                   "數量
       net_price(16) TYPE c,                                  "價格
       delivery_date LIKE bapimeposchedule-delivery_date,     "交貨日期
*       short_text LIKE bapimepoitem-short_text,               "文本
END OF itb_input.
TYPES:BEGIN OF ty_item,
       material LIKE bapimepoitem-material,                   "物料
       plant LIKE bapimepoitem-plant,                         "工廠
       stge_loc LIKE bapimepoitem-stge_loc,                   "庫存地
       quantity LIKE bapimepoitem-quantity,                   "數量
       net_price LIKE bapimepoitem-net_price,                 "價格
       delivery_date LIKE bapimeposchedule-delivery_date,     "交貨日期
*       short_text LIKE bapimepoitem-short_text,               "文本
END OF ty_item.
DATA:BEGIN OF itb_err OCCURS 0.
        INCLUDE STRUCTURE bapiret2.
DATA:END OF itb_err.
DATA flag TYPE i.
DATA: BEGIN OF itb_po OCCURS 0,
       comp_code LIKE bapimepoheader-comp_code,               "公司代碼
       purch_org LIKE bapimepoheader-purch_org,               "採購組織
       pur_group LIKE bapimepoheader-pur_group,               "採購組
       vendor LIKE bapimepoheader-vendor,                     "供應商
       item TYPE ty_item OCCURS 0,
END OF itb_po.
DATA itb_po2 LIKE itb_po OCCURS 0 WITH HEADER LINE.
DATA hd_item TYPE ty_item.
DATA zindex LIKE sy-tabix.
DATA testrun LIKE bapiflag-bapiflag.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
  PERFORM get_pc_filename.


START-OF-SELECTION.
  PERFORM upload_file TABLES itb_input.  "上傳文件
  PERFORM convert.                       "轉換爲header-item模式
  testrun = 'X'.                         "測試運行
  flag = 0.
  PERFORM runbapi.

  LOOP AT itb_err.
    SKIP.
    WRITE : AT  3(2) itb_err-type,AT 5(150) itb_err-message.

  ENDLOOP.

  CLEAR itb_err.
  REFRESH itb_err.

END-OF-SELECTION.
  IF flag = 0.
    SET PF-STATUS 'COMMAND'.
  ENDIF.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN '&RUN'.
      IF flag = 0.
        testrun = ''.                         "正式運行
        PERFORM runbapi.
        COMMIT WORK.
        MESSAGE  '導入成功!' TYPE 'I'.
        LOOP AT itb_err.
          IF itb_err-type = 'S'.
            SKIP.
            WRITE : AT  3(2) itb_err-type,AT 5(50) itb_err-message.
          ENDIF.
        ENDLOOP.
        SET PF-STATUS 'DEFAULT' IMMEDIATELY .


      ELSE.
        MESSAGE  '導入失敗!請覈查錯誤!' TYPE 'E'.


      ENDIF.
    WHEN '&CAN'.
      EXIT.
  ENDCASE.

*&---------------------------------------------------------------------*
*&      Form  upload_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FTAB       text
*----------------------------------------------------------------------*
FORM upload_file TABLES ftab.


  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 0
      text       = '轉換Ing。。'.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_tab_raw_data       = xlstab
      i_filename           = filename
    TABLES
      i_tab_converted_data = ftab
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.
  IF sy-subrc <> 0.
    MESSAGE '轉換Excel表有錯誤發生!' TYPE 'E' .
  ENDIF.


ENDFORM.                    " UPLOAD_FILE
*&--------------------------------------------------------------------*
*&      Form  get_pc_filename
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM get_pc_filename.
  CALL FUNCTION 'WS_FILENAME_GET'
      EXPORTING
*         def_filename     = PAY_FILE
*         DEF_PATH         = ' '
*          mask             = ',*.XLS ,*.XLS.'
          mode             = '0'
          title            = 'Get the import file name'
     IMPORTING
          filename         = filename
*         RC               =
     EXCEPTIONS
          inv_winsys       = 1
          no_batch         = 2
          selection_cancel = 3
          selection_error  = 4
          OTHERS           = 5.
  IF sy-subrc <> 0.
*    MESSAGE 'ERROR' TYPE 'E' .
  ENDIF.
ENDFORM.                    " GET_PC_FILENAME
*&---------------------------------------------------------------------*
*&      Form  convert
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM convert.
  DATA count TYPE i.
  DATA line TYPE i.
  LOOP AT itb_input.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = itb_input-material
      IMPORTING
        output = itb_input-material.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = itb_input-vendor
      IMPORTING
        output = itb_input-vendor.
    MODIFY itb_input INDEX sy-tabix.
  ENDLOOP.
*********************************************************轉換爲表頭和錶行結構
  LOOP AT itb_input.
    CLEAR hd_item.
    CLEAR itb_po.
    READ TABLE itb_po WITH KEY comp_code = itb_input-comp_code
                               purch_org = itb_input-purch_org
                               pur_group = itb_input-pur_group
                               vendor  = itb_input-vendor.
    IF sy-subrc = 0.
      zindex = sy-tabix.
      MOVE-CORRESPONDING itb_input TO hd_item.

      APPEND hd_item TO itb_po-item.
      MODIFY itb_po INDEX zindex.
    ELSE.
      MOVE-CORRESPONDING itb_input TO itb_po.

      MOVE-CORRESPONDING itb_input TO hd_item.

      APPEND hd_item TO itb_po-item.
      APPEND itb_po.
    ENDIF.
  ENDLOOP.
******************************************************** 拆分,最大行項目爲300
  LOOP AT itb_po.
    DESCRIBE TABLE itb_po-item LINES  line.
    IF line <= 300.
      MOVE-CORRESPONDING itb_po TO itb_po2.
      APPEND itb_po2.
    ELSE.
      LOOP AT itb_po-item INTO hd_item.
        APPEND hd_item TO itb_po2-item.
        count = count + 1.
        IF count = 300 OR count = line.
          itb_po2-comp_code = itb_po-comp_code     .
          itb_po2-purch_org = itb_po-purch_org     .
          itb_po2-pur_group = itb_po-pur_group     .
          itb_po2-vendor  = itb_po-vendor      .

          APPEND itb_po2.
          line = line - count.
          CLEAR itb_po2.
          CLEAR count.

        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "convert
*&---------------------------------------------------------------------*
*&      Form  runbapi
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM runbapi.
  DATA string(220) TYPE c.
  DATA itemno TYPE i.  "行項目號定義
  DATA line TYPE i.
  DATA poheader TYPE bapimepoheader.  "PO表頭信息
  DATA poheaderx TYPE bapimepoheaderx. "PO表頭信息傳輸字段
  DATA poitem TYPE bapimepoitem OCCURS 0 WITH HEADER LINE."PO行項目信息
  DATA poitemx TYPE bapimepoitemx OCCURS 0 WITH HEADER LINE."PO行項目信息傳輸字段
  DATA poschedule TYPE bapimeposchedule OCCURS 0 WITH HEADER LINE."計劃行信息
  DATA poschedulex TYPE bapimeposchedulx OCCURS 0 WITH HEADER LINE."計劃行信息傳輸字段
  DATA pocond TYPE bapimepocond OCCURS 0 WITH HEADER LINE.
  DATA pocondx TYPE bapimepocondx OCCURS 0 WITH HEADER LINE.
  LOOP AT itb_po2.
    CLEAR poheader.
    CLEAR poheaderx.

    REFRESH poitem.

    REFRESH poitemx.

    REFRESH poschedule.

    REFRESH poschedulex.

    REFRESH pocond.

    REFRESH pocondx.
    CLEAR itemno.
    MOVE-CORRESPONDING itb_po2 TO poheader.
    poheader-doc_date = p_doc_da.
*    poheader-currency = 'CNY'.
    poheader-doc_type = p_doc_ty.
    poheaderx-doc_type = 'X'.
    poheaderx-comp_code = 'X'.
    poheaderx-purch_org = 'X'.
    poheaderx-pur_group = 'X'.
    poheaderx-doc_date = 'X'.

*    poheaderx-currency = 'X'.
    poheaderx-vendor = 'X'.
    LOOP AT itb_po2-item INTO hd_item.
      CLEAR poitem.
      CLEAR poitemx.
      CLEAR poschedule.
      CLEAR poschedulex.
      CLEAR pocond.
      CLEAR pocondx.
      itemno = itemno + 10.

      MOVE-CORRESPONDING hd_item TO poitem.
      poitem-price_unit = p_unit.
      poitem-po_item = itemno.
      APPEND poitem.

      MOVE-CORRESPONDING hd_item TO poschedule.
      poschedule-po_item = itemno.
      APPEND poschedule.

      poitemx-po_item = itemno.
      poitemx-po_itemx = 'X'.
      poitemx-price_unit = 'X'.
*      poitemx-short_text = 'X'.
      poitemx-material = 'X'.
      poitemx-plant = 'X'.
      poitemx-stge_loc = 'X'.
      poitemx-quantity = 'X'.
      IF p_price = 'X'.
        poitemx-net_price = 'X'.
      ENDIF.
      APPEND poitemx.

      poschedulex-po_itemx = 'X'.
      poschedulex-quantity = 'X'.
      poschedulex-delivery_date = 'X'.
      poschedulex-po_item = itemno.
      APPEND poschedulex.

      pocond-itm_number = itemno.
      pocond-cond_type = 'ZP00'.
      pocond-cond_value = hd_item-net_price.
      pocond-conbaseval = hd_item-net_price.
      APPEND pocond.

      pocondx-itm_number = itemno.
*      pocondx-itm_number = 'X'.
      pocondx-cond_value = 'X'.
      pocondx-cond_type = 'X'.
      pocondx-conbaseval = 'X'.
      APPEND pocondx.
    ENDLOOP.

    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        poheader                     = poheader
        poheaderx                    = poheaderx
*       POADDRVENDOR                 =
        testrun                      = testrun
*       MEMORY_UNCOMPLETE            =
*       MEMORY_COMPLETE              =
*       POEXPIMPHEADER               =
*       POEXPIMPHEADERX              =
*       VERSIONS                     =
*       NO_MESSAGING                 =
*       NO_MESSAGE_REQ               =
*       NO_AUTHORITY                 =
*        NO_PRICE_FROM_PO             = 'X'
*     IMPORTING
*       EXPPURCHASEORDER             =
*       EXPHEADER                    =
*       EXPPOEXPIMPHEADER            =
      TABLES
        return                       = error
        poitem                       = poitem
        poitemx                      = poitemx
*       POADDRDELIVERY               =
        poschedule                   = poschedule
        poschedulex                  = poschedulex
*       POACCOUNT                    =
*       POACCOUNTPROFITSEGMENT       =
*       POACCOUNTX                   =
*       POCONDHEADER                 =
*       POCONDHEADERX                =
*        pocond                       = pocond
*        pocondx                      = pocondx
*       POLIMITS                     =
*       POCONTRACTLIMITS             =
*       POSERVICES                   =
*       POSRVACCESSVALUES            =
*       POSERVICESTEXT               =
*       EXTENSIONIN                  =
*       EXTENSIONOUT                 =
*       POEXPIMPITEM                 =
*       POEXPIMPITEMX                =
*       POTEXTHEADER                 =
*       POTEXTITEM                   =
*       ALLVERSIONS                  =
*       POPARTNER                    =
              .
    itb_err-type = 'C'.
    CONCATENATE '供應商'  poheader-vendor '採購組' poheader-pur_group INTO string.
    itb_err-message = string.
    APPEND itb_err.
    LOOP AT error.
      MOVE-CORRESPONDING error TO itb_err.
      APPEND itb_err.
      IF error-type = 'E'.
        flag = 1.
      ENDIF.
    ENDLOOP.

  ENDLOOP.
 

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