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.