*&---------------------------------------------------------------------*
*& Progarm : ZPPR006 Author : Jimmy Wong
*& Created : 21 Sep 2012 App : PP
*& Title : Upload PO Data
*& Description : Upload PO Data
*&---------------------------------------------------------------------*
*& Version Author Date description
*& Jimmy 21 Sep 2012 the first version
*& Jimmy 06 Mar 2013 Add Auto generate PO Number & PO Item
*& the last update time 2013.03.06 17:00
*&---------------------------------------------------------------------*
report zppr006 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : rlgrap.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
data:begin of it_record occurs 0,
order type i,
bsart like ekko-bsart, "Order Type
ebeln like ekko-ebeln, "PO
lifnr like ekko-lifnr, "Vendor
lifnr_c like ekko-lifnr, "Vendor
bedat like ekko-bedat, "Doc. Date
bedat_c type c length 10,
zterm like ekko-zterm, "Payment Terms
inco1 like ekko-inco1, "Incoterms
waers like ekko-waers, "currency
ekorg like ekko-ekorg, "Purchasing Org
ekgrp like ekko-ekgrp, "Purchasing Group
bukrs like ekko-bukrs, "Company Code
ebelp like ekpo-ebelp, "Item Number PO
ebelp_c like ekpo-ebelp, "Item Number PO
pstyp like ekpo-pstyp, "Item category in purchasing document
epstp like t163y-epstp,
matnr like ekpo-matnr, "Material Number
matnr_c type c length 20,
menge like ekpo-menge, "quantity
menge_c type c length 18,
menge_r like ekpo-menge, "quantity
bstrf like marc-bstrf,
meins like ekpo-meins, "Order Unit
meins_c type c length 3,
eindt like eket-eindt, "Delivery date
eindt_c type c length 10,
netpr like ekpo-netpr, "Net Price
netpr_c type c length 17,
waers_d like ekko-waers, "Currency
waers_dc type c length 5,
peinh like ekpo-peinh, "Price unit
peinh_c type c length 5,
werks like ekpo-werks, "Plant
lgort like ekpo-lgort, "Storage location
message type c length 700,
end of it_record.
data: it_err like it_record occurs 0 with header line.
data: it_err2 like it_record occurs 0 with header line.
data: it_err3 like it_record occurs 0 with header line.
types:lv_type type c length 50.
data:begin of itab occurs 0,
bsart type lv_type,
ebeln type lv_type,
lifnr_c type lv_type,
bedat_c type lv_type,
zterm type lv_type,
inco1 type lv_type,
waers type lv_type,
ekorg type lv_type,
ekgrp type lv_type,
bukrs type lv_type,
ebelp_c type lv_type,
epstp type lv_type,
matnr_c type lv_type,
menge_c type lv_type,
meins_c type lv_type,
eindt_c type lv_type,
netpr_c type lv_type,
waers_dc type lv_type,
peinh_c type lv_type,
werks type lv_type,
lgort type lv_type,
end of itab.
data:begin of it_tab occurs 0.
include structure itab.
data: message(700) type c,
end of it_tab.
data:begin of it_ebeln occurs 0,
lifnr like ekko-lifnr, "Vendor
ekgrp like ekko-ekgrp, "Purchasing Group
ebeln like ekko-ebeln,
message type c length 700,
end of it_ebeln.
data:it_ebeln_err like it_ebeln occurs 0 with header line.
data: msg type string,
lv_tabix like sy-tabix,
wa_tabix like sy-tabix.
data: p_header like bapimepoheader , "for pr to po header
p_headerx like bapimepoheaderx .
data: p_item like table of bapimepoitem with header line , "for pr to po item
it_return like table of bapiret2 with header line ,
p_itemx like table of bapimepoitemx with header line ,
p_schedule like table of bapimeposchedule with header line ,
p_schedulex like table of bapimeposchedulx with header line ,
ex_ebeln like bapimepoheader-po_number,
p_cond like table of bapimepocond with header line,
p_condx like table of bapimepocondx with header line,
i_item like table of bapimepoitem with header line,
i_itemx like table of bapimepoitemx with header line .
data: begin of it_down occurs 0,
line(1000) type c,
end of it_down .
data: begin of i_file occurs 0,
line(1000) type c,
end of i_file.
data: gv_file like rlgrap-filename.
data: purchaseorder type bapimmpara-po_number,
po_rel_code1 type bapimmpara-po_rel_cod,
po_rel_code2 type bapimmpara-po_rel_cod,
po_rel_code3 type bapimmpara-po_rel_cod,
po_rel_code4 type bapimmpara-po_rel_cod,
po_rel_code5 type bapimmpara-po_rel_cod.
data:lv_frgsx like ekko-frgsx ,
return type standard table of bapireturn with header line.
include zsapinclude01.
*----------------------------------------------------------------------*
* Parameter & Select-Options *
*----------------------------------------------------------------------*
selection-screen begin of block 1 with frame title text-001.
parameters filename type rlgrap-filename obligatory.
parameters: pr_error like rlgrap-filename default '/usr/sap/tmp'.
parameters: p_test as checkbox .
parameters: p_auto as checkbox .
selection-screen end of block 1.
*-----------------------------------
*----------------------------------------------------------------------*
* Initialize *
*----------------------------------------------------------------------*
initialization.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
at selection-screen on value-request for filename.
perform f4_filename using filename.
at selection-screen on value-request for pr_error.
perform f4_filename using pr_error.
*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
refresh:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
clear:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
perform get_data.
perform get_it_record.
"perform process_data.
perform check_it_record.
if p_auto = 'X'.
perform create_po_autopono.
else.
perform create_po.
endif.
perform display_result.
end-of-selection.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_data .
data: p_subrc like sy-subrc.
if p_test = 'X'.
clear:itab,itab[] .
perform upload_local tables itab using filename changing p_subrc.
if p_subrc ne 0.
clear : msg.
concatenate 'Upload Filename ' filename ' Is Error!' into msg.
message msg type 'I'.
exit.
endif.
else.
clear:i_file,i_file[].
perform upload_server tables i_file using filename changing p_subrc.
if sy-subrc ne 0.
clear : msg.
concatenate 'Upload Filename ' filename ' Is Error!' into msg.
message msg type 'I'.
exit.
endif.
if not i_file[] is initial.
loop at i_file.
split i_file-line at cl_abap_char_utilities=>horizontal_tab
into itab-bsart itab-ebeln
itab-lifnr_c itab-bedat_c itab-zterm itab-inco1
itab-waers itab-ekorg itab-ekgrp itab-bukrs
itab-ebelp_c itab-epstp itab-matnr_c
itab-menge_c itab-meins_c itab-eindt_c itab-netpr_c
itab-waers_dc itab-peinh_c itab-werks itab-lgort .
append itab.
clear:itab.
endloop.
endif.
endif.
endform. " GET_DATA
*&---------------------------------------------------------------------*
*& Form GET_IT_RECORD2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_it_record.
data:lv_order type i.
check not itab[] is initial.
lv_order = 1.
loop at itab.
move-corresponding itab to it_record.
perform add_remove_pre_zero using it_record-lifnr_c ''
changing it_record-lifnr.
perform change_date_format using it_record-bedat_c ''
changing it_record-bedat.
perform add_remove_pre_zero using it_record-ebelp_c ''
changing it_record-ebelp.
perform tranfer_material using it_record-matnr_c ''
changing it_record-matnr.
* perform process_num using it_record-menge_c
* changing it_record-menge.
it_record-menge = it_record-menge_c.
it_record-meins = it_record-meins_c.
perform change_date_format using it_record-eindt_c ''
changing it_record-eindt.
it_record-netpr = it_record-netpr_c.
* perform process_num using it_record-netpr_c
* changing it_record-netpr.
it_record-waers_d = it_record-waers_dc .
* perform process_num using it_record-peinh_c
* changing it_record-peinh.
it_record-peinh = it_record-peinh_c .
it_record-order = lv_order.
append it_record.
lv_order = lv_order + 1.
clear : it_record.
endloop.
endform. " GET_IT_RECORD2
*&---------------------------------------------------------------------*
*& Form CHECK_IT_RECORD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form check_it_record .
data: lv_flag2 type c,
lv_bsart like t161-bsart,
lv_ebeln like ekko-ebeln,
lv_lifnr like lfa1-lifnr,
lv_zterm like t052-zterm,
lv_inco1 like tinc-inco1,
lv_waers like tcurc-waers,
lv_ekorg like t024e-ekorg,
lv_ekgrp like t024-ekgrp,
lv_bukrs like t001-bukrs,
lv_mtart like mara-mtart,
lv_meins like t006-msehi,
lv_werks like t001w-werks,
lv_lgort like t001l-lgort .
clear: lv_flag2.
loop at it_record.
lv_tabix = sy-tabix.
clear:lv_flag2,it_record-message.
" Order Type
select single bsart into lv_bsart
from t161
where bsart = it_record-bsart.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Order Type Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
if p_auto is initial.
" PO NO.
select single ebeln into lv_ebeln
from ekko
where ebeln = it_record-ebeln.
if sy-subrc eq 0.
lv_flag2 = 'X'.
concatenate it_record-message ' PO No. Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
" Vendor Code
select single lifnr into lv_lifnr
from lfa1
where lifnr = it_record-lifnr.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Vendor Code Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Doc. Date
if it_record-bedat = '00000000'.
lv_flag2 = 'X'.
concatenate it_record-message ' Doc. Date Format MM/dd/yyyy.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Payment Terms
if it_record-zterm ne space .
select single zterm into lv_zterm
from t052
where zterm = it_record-zterm.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Payment Terms Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Incoterms
if it_record-inco1 ne space .
select single inco1 into lv_inco1
from tinc
where inco1 = it_record-inco1.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Incoterms Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Currency
if it_record-waers ne space .
select single waers into lv_waers
from tcurc
where waers = it_record-waers.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Currency Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Purchasing Org.
select single ekorg into lv_ekorg
from t024e
where ekorg = it_record-ekorg.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Purchasing Org. Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Purchasing Group
select single ekgrp into lv_ekgrp
from t024
where ekgrp = it_record-ekgrp.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Purchasing Group Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Company Code
select single bukrs into lv_bukrs
from t001
where bukrs = it_record-bukrs.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Company Code Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Item Number
if p_auto is initial.
if it_record-ebelp is initial.
lv_flag2 = 'X'.
concatenate it_record-message ' Item Number Error.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Item category
if it_record-epstp ne space .
select single pstyp into it_record-pstyp
from t163y
where epstp = it_record-epstp.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Item category Not Exists.'
into it_record-message.
endif.
modify it_record index lv_tabix.
endif.
"Material Number
select single mtart into lv_mtart
from mara
where matnr = it_record-matnr.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Material Number Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Quantity
if it_record-menge = 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Quantity = 0 is error.' into it_record-message.
modify it_record index lv_tabix.
elseif it_record-menge < 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Quantity is negative or Quantity not is number.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Order Unit
if it_record-meins ne space .
select single msehi into lv_meins
from t006
where msehi = it_record-meins.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Order Unit Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Delivery date
if it_record-eindt = '00000000'.
lv_flag2 = 'X'.
concatenate it_record-message ' Delivery date Format MM/dd/yyyy.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Net Price
* if IT_RECORD-BSART+3(1) = '1'.
* if IT_RECORD-NETPR = 0.
* LV_FLAG = 'X'.
* LV_FLAG2 = 'X'.
* concatenate IT_RECORD-MESSAGE
* ' Net Price = 0 is error.' into IT_RECORD-MESSAGE.
* modify IT_RECORD index LV_TABIX.
* elseif IT_RECORD-NETPR < 0.
* LV_FLAG = 'X'.
* LV_FLAG2 = 'X'.
* concatenate IT_RECORD-MESSAGE
* ' Net Price is negative or Net Price not is number.'
* into IT_RECORD-MESSAGE.
* modify IT_RECORD index LV_TABIX.
* endif.
* endif.
"Price unit
if it_record-peinh = 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Price unit = 0 is error.' into it_record-message.
modify it_record index lv_tabix.
elseif it_record-peinh < 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Price unit is negative or Net Price not is number.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"plant
select single werks into lv_werks
from t001w
where werks = it_record-werks.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Plant Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Storage location
if it_record-lgort ne space .
select single lgort into lv_lgort
from t001l
where lgort = it_record-lgort
and werks = it_record-werks.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Storage location Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
if lv_flag2 <> 'X'.
it_record-message = ' OK.'.
modify it_record index lv_tabix.
endif.
endloop.
endform. " CHECK_IT_RECORD
*&---------------------------------------------------------------------*
*& Form CREATE_PO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_po .
loop at it_record.
if not it_record-message = ' OK.'.
it_ebeln_err-ebeln = it_record-ebeln.
collect it_ebeln_err.
endif.
it_ebeln-ebeln = it_record-ebeln.
collect it_ebeln.
endloop.
if not it_ebeln_err[] is initial.
loop at it_ebeln_err.
loop at it_record where ebeln = it_ebeln_err-ebeln.
move-corresponding it_record to it_err2.
append it_err2.
clear it_err2.
endloop.
delete it_ebeln where ebeln = it_ebeln_err-ebeln.
endloop.
endif.
sort it_ebeln by ebeln.
delete adjacent duplicates from it_ebeln comparing all fields.
sort it_record by ebeln.
loop at it_ebeln.
lv_tabix = sy-tabix.
clear:it_ebeln-message.
read table it_record with key ebeln = it_ebeln-ebeln binary search.
check sy-subrc eq 0.
p_header-po_number = it_ebeln-ebeln.
p_header-doc_type = it_record-bsart.
p_header-vendor = it_record-lifnr.
p_header-doc_date = it_record-bedat.
p_header-pmnttrms = it_record-zterm.
" p_header-item_intvl = 10. "不可以赋值 赋值就会按它开始 间隔
p_header-incoterms1 = it_record-inco1.
p_header-currency = it_record-waers.
p_header-purch_org = it_record-ekorg.
p_header-pur_group = it_record-ekgrp.
p_header-comp_code = it_record-bukrs.
p_headerx-po_number = 'X'.
p_headerx-doc_type = 'X'.
p_headerx-vendor = 'X'.
p_headerx-doc_date = 'X'.
p_headerx-pmnttrms = 'X'.
p_headerx-item_intvl = 'X'. "控制PO item是否从10 或 1
p_headerx-incoterms1 = 'X'.
p_headerx-currency = 'X'.
p_headerx-purch_org = 'X'.
p_headerx-pur_group = 'X'.
p_headerx-comp_code = 'X'.
loop at it_record where ebeln = it_ebeln-ebeln.
p_item-po_item = it_record-ebelp.
p_item-item_cat = it_record-pstyp.
p_item-material = it_record-matnr.
p_item-quantity = it_record-menge.
p_item-po_unit = it_record-meins.
p_item-orderpr_un = it_record-meins.
p_item-net_price = it_record-netpr.
p_item-price_unit = it_record-peinh.
if it_record-netpr = 0.
p_item-free_item = 'X'.
endif.
p_item-plant = it_record-werks.
p_item-stge_loc = it_record-lgort.
* p_item-EMATERIAL = ''.
append p_item.
p_itemx-po_item = it_record-ebelp.
p_itemx-po_itemx = 'X'.
p_itemx-item_cat = 'X'.
p_itemx-material = 'X'.
p_itemx-quantity = 'X'.
p_itemx-po_unit = 'X'.
p_item-orderpr_un = 'X'.
p_itemx-net_price = 'X'.
p_itemx-price_unit = 'X'.
p_itemx-plant = 'X'.
p_itemx-stge_loc = 'X'.
* p_itemx-EMATERIAL = 'X'.
append p_itemx.
"change
i_item-po_item = it_record-ebelp.
i_item-quantity = it_record-menge.
append i_item.
i_itemx-po_item = it_record-ebelp.
i_itemx-quantity = 'X'.
append i_itemx.
p_schedule-po_item = it_record-ebelp.
p_schedule-sched_line = 10.
p_schedule-delivery_date = it_record-eindt.
p_schedule-quantity = it_record-menge.
append p_schedule.
p_schedulex-po_item = it_record-ebelp.
p_schedulex-sched_line = 10.
p_schedulex-po_itemx = 'X'.
p_schedulex-sched_linex = 'X'.
p_schedulex-delivery_date = 'X'.
p_schedulex-quantity = 'X'.
append p_schedulex.
if it_record-bsart+3(1) = '1'.
p_cond-itm_number = it_record-ebelp.
p_cond-cond_st_no = '001'.
p_cond-cond_count = '01'.
p_cond-cond_type = 'PB00'. "Condition Type
p_cond-cond_value = it_record-netpr. "Amount
p_cond-currency = it_record-waers_d. "Currency
p_cond-cond_p_unt = it_record-peinh . "Per
p_cond-cond_unit = it_record-meins. "Condition Unit
p_cond-change_id = 'U'.
append p_cond.
p_condx-itm_number = it_record-ebelp.
p_condx-cond_st_no = '001'.
p_condx-itm_numberx = 'X'.
p_condx-cond_st_nox = 'X'.
p_condx-cond_count = 'X'.
p_condx-cond_type = 'X'.
p_condx-cond_value = 'X'.
p_condx-currency = 'X'.
p_condx-cond_p_unt = 'X'.
p_condx-cond_unit = 'X'.
p_condx-change_id = 'X'.
append p_condx.
endif.
endloop.
call function 'BAPI_PO_CREATE1'
exporting
poheader = p_header
poheaderx = p_headerx
importing
exppurchaseorder = ex_ebeln
tables
return = it_return
poitem = p_item
poitemx = p_itemx
poschedule = p_schedule
poschedulex = p_schedulex
pocond = p_cond
pocondx = p_condx.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
loop at it_return where type = 'E'.
if it_ebeln-message is initial.
concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
else.
concatenate it_ebeln-message it_return-message into it_ebeln-message.
endif.
endloop.
modify it_ebeln index lv_tabix.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
" wait up to 1 seconds.
concatenate ex_ebeln ' Success.' into it_ebeln-message.
modify it_ebeln index lv_tabix.
refresh: it_return.
clear:it_return .
" change qty
call function 'BAPI_PO_CHANGE'
exporting
purchaseorder = ex_ebeln
tables
return = it_return
poitem = i_item
poitemx = i_itemx.
commit work and wait.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
else.
purchaseorder = ex_ebeln.
select single frgsx into lv_frgsx
from ekko
where ebeln = purchaseorder .
if not purchaseorder is initial.
select single frgc1 frgc2 frgc3 frgc4 frgc5
into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
from t16fs
where frggr = 'PO'
and frgsx = lv_frgsx.
if po_rel_code1 is not initial.
clear:return[],return.
perform approved_po tables return using purchaseorder po_rel_code1.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code2 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code2.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code3 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code3.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code4 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code4.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code5 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code5.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
endif.
endif.
endif.
clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
,return.
refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
endloop.
loop at it_ebeln.
loop at it_record where ebeln = it_ebeln-ebeln.
move-corresponding it_record to it_err.
it_err-message = it_ebeln-message.
append it_err.
clear it_err.
endloop .
endloop.
endform. " CREATE_PO
*&---------------------------------------------------------------------*
*& Form CREATE_PO_AUTOPONO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_po_autopono .
loop at it_record.
if not it_record-message = ' OK.'.
it_ebeln_err-lifnr = it_record-lifnr.
it_ebeln_err-ekgrp = it_record-ekgrp.
collect it_ebeln_err.
endif.
it_ebeln-lifnr = it_record-lifnr.
it_ebeln-ekgrp = it_record-ekgrp.
collect it_ebeln.
endloop.
if not it_ebeln_err[] is initial.
sort it_ebeln_err by lifnr ekgrp .
loop at it_ebeln_err.
loop at it_record where lifnr = it_ebeln_err-lifnr and ekgrp = it_ebeln_err-ekgrp .
move-corresponding it_record to it_err2.
append it_err2.
clear it_err2.
endloop.
delete it_ebeln where lifnr = it_ebeln_err-lifnr and ekgrp = it_ebeln_err-ekgrp .
endloop.
endif.
sort it_ebeln by lifnr ekgrp .
delete adjacent duplicates from it_ebeln comparing all fields.
sort it_record by lifnr ekgrp .
loop at it_ebeln.
lv_tabix = sy-tabix.
clear:it_ebeln-message,it_ebeln-ebeln.
read table it_record with key lifnr = it_ebeln-lifnr ekgrp = it_ebeln-ekgrp .
check sy-subrc eq 0.
* p_header-po_number = it_ebeln-ebeln.
p_header-doc_type = it_record-bsart.
p_header-vendor = it_record-lifnr.
p_header-doc_date = it_record-bedat.
p_header-pmnttrms = it_record-zterm.
" p_header-item_intvl = 10. "不可以赋值 赋值就会按它开始 间隔
p_header-incoterms1 = it_record-inco1.
p_header-currency = it_record-waers.
p_header-purch_org = it_record-ekorg.
p_header-pur_group = it_record-ekgrp.
p_header-comp_code = it_record-bukrs.
* p_headerx-po_number = 'X'.
p_headerx-doc_type = 'X'.
p_headerx-vendor = 'X'.
p_headerx-doc_date = 'X'.
p_headerx-pmnttrms = 'X'.
* p_headerx-item_intvl = 'X'. "控制PO item是否从10 或 1
p_headerx-incoterms1 = 'X'.
p_headerx-currency = 'X'.
p_headerx-purch_org = 'X'.
p_headerx-pur_group = 'X'.
p_headerx-comp_code = 'X'.
wa_tabix = 1.
loop at it_record where lifnr = it_ebeln-lifnr and ekgrp = it_ebeln-ekgrp .
p_item-po_item = wa_tabix * 10.
p_item-item_cat = it_record-pstyp.
p_item-material = it_record-matnr.
p_item-quantity = it_record-menge.
p_item-po_unit = it_record-meins.
p_item-orderpr_un = it_record-meins.
p_item-net_price = it_record-netpr.
p_item-price_unit = it_record-peinh.
if it_record-netpr = 0.
p_item-free_item = 'X'.
endif.
p_item-plant = it_record-werks.
p_item-stge_loc = it_record-lgort.
* p_item-EMATERIAL = ''.
append p_item.
p_itemx-po_item = wa_tabix * 10.
p_itemx-po_itemx = 'X'.
p_itemx-item_cat = 'X'.
p_itemx-material = 'X'.
p_itemx-quantity = 'X'.
p_itemx-po_unit = 'X'.
p_item-orderpr_un = 'X'.
p_itemx-net_price = 'X'.
p_itemx-price_unit = 'X'.
p_itemx-plant = 'X'.
p_itemx-stge_loc = 'X'.
* p_itemx-EMATERIAL = 'X'.
append p_itemx.
"change
i_item-po_item = wa_tabix * 10.
i_item-quantity = it_record-menge.
append i_item.
i_itemx-po_item = wa_tabix * 10.
i_itemx-quantity = 'X'.
append i_itemx.
p_schedule-po_item = wa_tabix * 10.
p_schedule-sched_line = 10.
p_schedule-delivery_date = it_record-eindt.
p_schedule-quantity = it_record-menge.
append p_schedule.
p_schedulex-po_item = wa_tabix * 10.
p_schedulex-sched_line = 10.
p_schedulex-po_itemx = 'X'.
p_schedulex-sched_linex = 'X'.
p_schedulex-delivery_date = 'X'.
p_schedulex-quantity = 'X'.
append p_schedulex.
if it_record-bsart+3(1) = '1'.
p_cond-itm_number = wa_tabix * 10.
p_cond-cond_st_no = '001'.
p_cond-cond_count = '01'.
p_cond-cond_type = 'PB00'. "Condition Type
p_cond-cond_value = it_record-netpr. "Amount
p_cond-currency = it_record-waers_d. "Currency
p_cond-cond_p_unt = it_record-peinh . "Per
p_cond-cond_unit = it_record-meins. "Condition Unit
p_cond-change_id = 'U'.
append p_cond.
p_condx-itm_number = wa_tabix * 10.
p_condx-cond_st_no = '001'.
p_condx-itm_numberx = 'X'.
p_condx-cond_st_nox = 'X'.
p_condx-cond_count = 'X'.
p_condx-cond_type = 'X'.
p_condx-cond_value = 'X'.
p_condx-currency = 'X'.
p_condx-cond_p_unt = 'X'.
p_condx-cond_unit = 'X'.
p_condx-change_id = 'X'.
append p_condx.
endif.
wa_tabix = wa_tabix + 1.
endloop.
call function 'BAPI_PO_CREATE1'
exporting
poheader = p_header
poheaderx = p_headerx
importing
exppurchaseorder = ex_ebeln
tables
return = it_return
poitem = p_item
poitemx = p_itemx
poschedule = p_schedule
poschedulex = p_schedulex
pocond = p_cond
pocondx = p_condx.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
loop at it_return where type = 'E'.
if it_ebeln-message is initial.
concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
else.
concatenate it_ebeln-message it_return-message into it_ebeln-message.
endif.
endloop.
modify it_ebeln index lv_tabix.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
" wait up to 1 seconds.
concatenate ex_ebeln ' Success.' into it_ebeln-message.
it_ebeln-ebeln = ex_ebeln.
modify it_ebeln index lv_tabix.
refresh: it_return.
clear:it_return .
" change qty
call function 'BAPI_PO_CHANGE'
exporting
purchaseorder = ex_ebeln
tables
return = it_return
poitem = i_item
poitemx = i_itemx.
commit work and wait.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
else.
purchaseorder = ex_ebeln.
select single frgsx into lv_frgsx
from ekko
where ebeln = purchaseorder .
if not purchaseorder is initial.
select single frgc1 frgc2 frgc3 frgc4 frgc5
into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
from t16fs
where frggr = 'PO'
and frgsx = lv_frgsx.
if po_rel_code1 is not initial.
clear:return[],return.
perform approved_po tables return using purchaseorder po_rel_code1.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code2 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code2.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code3 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code3.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code4 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code4.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code5 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code5.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
endif.
endif.
endif.
clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
,return.
refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
endloop.
loop at it_ebeln.
loop at it_record where lifnr = it_ebeln-lifnr and ekgrp = it_ebeln-ekgrp .
move-corresponding it_record to it_err.
it_err-ebeln = it_ebeln-ebeln.
it_err-message = it_ebeln-message.
append it_err.
clear it_err.
endloop .
endloop.
endform. " CREATE_PO_AUTOPONO
*&---------------------------------------------------------------------*
*& Form DISPLAY_RESULT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form display_result .
clear it_err3.
refresh it_err3.
append lines of it_err to it_err3.
append lines of it_err2 to it_err3.
sort it_err3 by order ascending.
check not it_err3[] is initial.
perform down_file .
perform get_file using 'PO' pr_error p_test '.txt'
changing gv_file.
if p_test = 'X'.
perform download_local tables it_down using gv_file.
perform write_data.
else.
perform download_server tables it_down using gv_file.
endif.
endform. " DISPLAY_RESULT
*&---------------------------------------------------------------------*
*& Form DOWN_FILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form down_file .
clear:it_down,it_down[].
concatenate
'Order Type'
'Purchase Document No.'
'Vendor Code'
'Doc. Date'
'Payment Terms'
'Incoterms'
'Currency'
'Purchasing Org.'
'Purchasing Group'
'Company Code'
'Item Number'
'Item category'
'Material Number'
'Quantity'
'Order Unit'
'Delivery date'
'Net Price'
'Currency'
'Price unit'
'Plant'
'Storage location'
'Message'
into it_down separated by cl_abap_char_utilities=>horizontal_tab.
append it_down.
loop at it_err3.
move-corresponding it_err3 to it_tab.
concatenate it_tab-bsart it_tab-ebeln
it_tab-lifnr_c it_tab-bedat_c it_tab-zterm it_tab-inco1
it_tab-waers it_tab-ekorg it_tab-ekgrp it_tab-bukrs
it_tab-ebelp_c it_tab-epstp it_tab-matnr_c
it_tab-menge_c it_tab-meins_c it_tab-eindt_c it_tab-netpr_c
it_tab-waers_dc it_tab-peinh_c it_tab-werks it_tab-lgort
it_tab-message
into it_down separated by cl_abap_char_utilities=>horizontal_tab.
condense it_down .
append it_down .
endloop.
endform. " DOWN_FILE
*&---------------------------------------------------------------------*
*& Form WRITE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form write_data .
refresh: fc_hier.
alv_field 'BSART' 'Order Type' '' '' '' '' '' '' .
alv_field 'EBELN' 'Purchase Document No.' '' '' '' '' '' ''.
alv_field 'LIFNR_C' 'Vendor Code' '' '' '' '' '' ''.
alv_field 'BEDAT' 'Doc. Date' '' '' '' '' '' '' .
alv_field 'ZTERM' 'Payment Terms' '' '' '' '' '' '' .
alv_field 'INCO1' 'Incoterms' '' '' '' '' '' '' .
alv_field 'WAERS' 'Currency' '' '' '' '' '' '' .
alv_field 'EKORG' 'Purchasing Org.' '' '' '' '' '' '' .
alv_field 'EKGRP' 'Purchasing Group' '' '' '' '' '' '' .
alv_field 'BUKRS' 'Company Code' '' '' '' '' '' '' .
alv_field 'EBELP_C' 'Item Number' '' '' '' '' '' '' .
alv_field 'EPSTP' 'Item category' '' '' '' '' '' '' .
alv_field 'MATNR_C' 'Material Number' '' '' '' '' '' '' .
alv_field 'MENGE' 'Quantity' '' '' '' '' '' '' .
alv_field 'MEINS' 'Order Unit' '' '' '' '' '' '' .
alv_field 'EINDT' 'Delivery date' '' '' '' '' '' '' .
alv_field 'NETPR' 'Net Price' '' '' '' '' '' '' .
alv_field 'WAERS_D' 'Currency' '' '' '' '' '' '' .
alv_field 'PEINH' 'Price unit' '' '' '' '' '' '' .
alv_field 'WERKS' 'Plant' '' '' '' '' '' '' .
alv_field 'LGORT' 'Storage location' '' '' '' '' '' ''.
alv_field 'MESSAGE' 'Message' '' '100' '' '' '' '' .
perform display_alv tables fc_hier it_err3 using 'A'.
endform. " WRITE_DATA
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form process_data .
data: lv_mod like marc-bstrf,
lv_int type i,
lv_bstrf like marc-bstrf.
loop at it_record.
clear:lv_bstrf,lv_mod,lv_int,it_record-bstrf,it_record-menge_r.
lv_tabix = sy-tabix.
select single bstrf into lv_bstrf
from marc
where matnr = it_record-matnr
and werks = it_record-werks.
if sy-subrc eq 0.
lv_mod = it_record-menge mod lv_bstrf.
lv_int = it_record-menge / lv_bstrf.
if lv_mod ne 0.
lv_int = lv_int + 1.
endif.
it_record-bstrf = lv_bstrf.
it_record-menge_r = lv_int * lv_bstrf.
else.
it_record-menge_r = it_record-menge.
endif.
modify it_record index lv_tabix.
endloop.
endform. " PROCESS_DATA
*& Progarm : ZPPR006 Author : Jimmy Wong
*& Created : 21 Sep 2012 App : PP
*& Title : Upload PO Data
*& Description : Upload PO Data
*&---------------------------------------------------------------------*
*& Version Author Date description
*& Jimmy 21 Sep 2012 the first version
*& Jimmy 06 Mar 2013 Add Auto generate PO Number & PO Item
*& the last update time 2013.03.06 17:00
*&---------------------------------------------------------------------*
report zppr006 no standard page heading.
*&---------------------------------------------------------------------*
* database table
*&---------------------------------------------------------------------*
tables : rlgrap.
*&---------------------------------------------------------------------*
* internal table & variables
*&---------------------------------------------------------------------*
data:begin of it_record occurs 0,
order type i,
bsart like ekko-bsart, "Order Type
ebeln like ekko-ebeln, "PO
lifnr like ekko-lifnr, "Vendor
lifnr_c like ekko-lifnr, "Vendor
bedat like ekko-bedat, "Doc. Date
bedat_c type c length 10,
zterm like ekko-zterm, "Payment Terms
inco1 like ekko-inco1, "Incoterms
waers like ekko-waers, "currency
ekorg like ekko-ekorg, "Purchasing Org
ekgrp like ekko-ekgrp, "Purchasing Group
bukrs like ekko-bukrs, "Company Code
ebelp like ekpo-ebelp, "Item Number PO
ebelp_c like ekpo-ebelp, "Item Number PO
pstyp like ekpo-pstyp, "Item category in purchasing document
epstp like t163y-epstp,
matnr like ekpo-matnr, "Material Number
matnr_c type c length 20,
menge like ekpo-menge, "quantity
menge_c type c length 18,
menge_r like ekpo-menge, "quantity
bstrf like marc-bstrf,
meins like ekpo-meins, "Order Unit
meins_c type c length 3,
eindt like eket-eindt, "Delivery date
eindt_c type c length 10,
netpr like ekpo-netpr, "Net Price
netpr_c type c length 17,
waers_d like ekko-waers, "Currency
waers_dc type c length 5,
peinh like ekpo-peinh, "Price unit
peinh_c type c length 5,
werks like ekpo-werks, "Plant
lgort like ekpo-lgort, "Storage location
message type c length 700,
end of it_record.
data: it_err like it_record occurs 0 with header line.
data: it_err2 like it_record occurs 0 with header line.
data: it_err3 like it_record occurs 0 with header line.
types:lv_type type c length 50.
data:begin of itab occurs 0,
bsart type lv_type,
ebeln type lv_type,
lifnr_c type lv_type,
bedat_c type lv_type,
zterm type lv_type,
inco1 type lv_type,
waers type lv_type,
ekorg type lv_type,
ekgrp type lv_type,
bukrs type lv_type,
ebelp_c type lv_type,
epstp type lv_type,
matnr_c type lv_type,
menge_c type lv_type,
meins_c type lv_type,
eindt_c type lv_type,
netpr_c type lv_type,
waers_dc type lv_type,
peinh_c type lv_type,
werks type lv_type,
lgort type lv_type,
end of itab.
data:begin of it_tab occurs 0.
include structure itab.
data: message(700) type c,
end of it_tab.
data:begin of it_ebeln occurs 0,
lifnr like ekko-lifnr, "Vendor
ekgrp like ekko-ekgrp, "Purchasing Group
ebeln like ekko-ebeln,
message type c length 700,
end of it_ebeln.
data:it_ebeln_err like it_ebeln occurs 0 with header line.
data: msg type string,
lv_tabix like sy-tabix,
wa_tabix like sy-tabix.
data: p_header like bapimepoheader , "for pr to po header
p_headerx like bapimepoheaderx .
data: p_item like table of bapimepoitem with header line , "for pr to po item
it_return like table of bapiret2 with header line ,
p_itemx like table of bapimepoitemx with header line ,
p_schedule like table of bapimeposchedule with header line ,
p_schedulex like table of bapimeposchedulx with header line ,
ex_ebeln like bapimepoheader-po_number,
p_cond like table of bapimepocond with header line,
p_condx like table of bapimepocondx with header line,
i_item like table of bapimepoitem with header line,
i_itemx like table of bapimepoitemx with header line .
data: begin of it_down occurs 0,
line(1000) type c,
end of it_down .
data: begin of i_file occurs 0,
line(1000) type c,
end of i_file.
data: gv_file like rlgrap-filename.
data: purchaseorder type bapimmpara-po_number,
po_rel_code1 type bapimmpara-po_rel_cod,
po_rel_code2 type bapimmpara-po_rel_cod,
po_rel_code3 type bapimmpara-po_rel_cod,
po_rel_code4 type bapimmpara-po_rel_cod,
po_rel_code5 type bapimmpara-po_rel_cod.
data:lv_frgsx like ekko-frgsx ,
return type standard table of bapireturn with header line.
include zsapinclude01.
*----------------------------------------------------------------------*
* Parameter & Select-Options *
*----------------------------------------------------------------------*
selection-screen begin of block 1 with frame title text-001.
parameters filename type rlgrap-filename obligatory.
parameters: pr_error like rlgrap-filename default '/usr/sap/tmp'.
parameters: p_test as checkbox .
parameters: p_auto as checkbox .
selection-screen end of block 1.
*-----------------------------------
*----------------------------------------------------------------------*
* Initialize *
*----------------------------------------------------------------------*
initialization.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
at selection-screen on value-request for filename.
perform f4_filename using filename.
at selection-screen on value-request for pr_error.
perform f4_filename using pr_error.
*&---------------------------------------------------------------------*
* start of process
*&---------------------------------------------------------------------*
start-of-selection.
refresh:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
clear:it_record,it_ebeln,it_ebeln_err,it_err2,it_err.
perform get_data.
perform get_it_record.
"perform process_data.
perform check_it_record.
if p_auto = 'X'.
perform create_po_autopono.
else.
perform create_po.
endif.
perform display_result.
end-of-selection.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_data .
data: p_subrc like sy-subrc.
if p_test = 'X'.
clear:itab,itab[] .
perform upload_local tables itab using filename changing p_subrc.
if p_subrc ne 0.
clear : msg.
concatenate 'Upload Filename ' filename ' Is Error!' into msg.
message msg type 'I'.
exit.
endif.
else.
clear:i_file,i_file[].
perform upload_server tables i_file using filename changing p_subrc.
if sy-subrc ne 0.
clear : msg.
concatenate 'Upload Filename ' filename ' Is Error!' into msg.
message msg type 'I'.
exit.
endif.
if not i_file[] is initial.
loop at i_file.
split i_file-line at cl_abap_char_utilities=>horizontal_tab
into itab-bsart itab-ebeln
itab-lifnr_c itab-bedat_c itab-zterm itab-inco1
itab-waers itab-ekorg itab-ekgrp itab-bukrs
itab-ebelp_c itab-epstp itab-matnr_c
itab-menge_c itab-meins_c itab-eindt_c itab-netpr_c
itab-waers_dc itab-peinh_c itab-werks itab-lgort .
append itab.
clear:itab.
endloop.
endif.
endif.
endform. " GET_DATA
*&---------------------------------------------------------------------*
*& Form GET_IT_RECORD2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_it_record.
data:lv_order type i.
check not itab[] is initial.
lv_order = 1.
loop at itab.
move-corresponding itab to it_record.
perform add_remove_pre_zero using it_record-lifnr_c ''
changing it_record-lifnr.
perform change_date_format using it_record-bedat_c ''
changing it_record-bedat.
perform add_remove_pre_zero using it_record-ebelp_c ''
changing it_record-ebelp.
perform tranfer_material using it_record-matnr_c ''
changing it_record-matnr.
* perform process_num using it_record-menge_c
* changing it_record-menge.
it_record-menge = it_record-menge_c.
it_record-meins = it_record-meins_c.
perform change_date_format using it_record-eindt_c ''
changing it_record-eindt.
it_record-netpr = it_record-netpr_c.
* perform process_num using it_record-netpr_c
* changing it_record-netpr.
it_record-waers_d = it_record-waers_dc .
* perform process_num using it_record-peinh_c
* changing it_record-peinh.
it_record-peinh = it_record-peinh_c .
it_record-order = lv_order.
append it_record.
lv_order = lv_order + 1.
clear : it_record.
endloop.
endform. " GET_IT_RECORD2
*&---------------------------------------------------------------------*
*& Form CHECK_IT_RECORD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form check_it_record .
data: lv_flag2 type c,
lv_bsart like t161-bsart,
lv_ebeln like ekko-ebeln,
lv_lifnr like lfa1-lifnr,
lv_zterm like t052-zterm,
lv_inco1 like tinc-inco1,
lv_waers like tcurc-waers,
lv_ekorg like t024e-ekorg,
lv_ekgrp like t024-ekgrp,
lv_bukrs like t001-bukrs,
lv_mtart like mara-mtart,
lv_meins like t006-msehi,
lv_werks like t001w-werks,
lv_lgort like t001l-lgort .
clear: lv_flag2.
loop at it_record.
lv_tabix = sy-tabix.
clear:lv_flag2,it_record-message.
" Order Type
select single bsart into lv_bsart
from t161
where bsart = it_record-bsart.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Order Type Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
if p_auto is initial.
" PO NO.
select single ebeln into lv_ebeln
from ekko
where ebeln = it_record-ebeln.
if sy-subrc eq 0.
lv_flag2 = 'X'.
concatenate it_record-message ' PO No. Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
" Vendor Code
select single lifnr into lv_lifnr
from lfa1
where lifnr = it_record-lifnr.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Vendor Code Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Doc. Date
if it_record-bedat = '00000000'.
lv_flag2 = 'X'.
concatenate it_record-message ' Doc. Date Format MM/dd/yyyy.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Payment Terms
if it_record-zterm ne space .
select single zterm into lv_zterm
from t052
where zterm = it_record-zterm.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Payment Terms Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Incoterms
if it_record-inco1 ne space .
select single inco1 into lv_inco1
from tinc
where inco1 = it_record-inco1.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Incoterms Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Currency
if it_record-waers ne space .
select single waers into lv_waers
from tcurc
where waers = it_record-waers.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Currency Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Purchasing Org.
select single ekorg into lv_ekorg
from t024e
where ekorg = it_record-ekorg.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Purchasing Org. Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Purchasing Group
select single ekgrp into lv_ekgrp
from t024
where ekgrp = it_record-ekgrp.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Purchasing Group Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Company Code
select single bukrs into lv_bukrs
from t001
where bukrs = it_record-bukrs.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Company Code Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Item Number
if p_auto is initial.
if it_record-ebelp is initial.
lv_flag2 = 'X'.
concatenate it_record-message ' Item Number Error.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Item category
if it_record-epstp ne space .
select single pstyp into it_record-pstyp
from t163y
where epstp = it_record-epstp.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Item category Not Exists.'
into it_record-message.
endif.
modify it_record index lv_tabix.
endif.
"Material Number
select single mtart into lv_mtart
from mara
where matnr = it_record-matnr.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Material Number Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Quantity
if it_record-menge = 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Quantity = 0 is error.' into it_record-message.
modify it_record index lv_tabix.
elseif it_record-menge < 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Quantity is negative or Quantity not is number.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Order Unit
if it_record-meins ne space .
select single msehi into lv_meins
from t006
where msehi = it_record-meins.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Order Unit Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
"Delivery date
if it_record-eindt = '00000000'.
lv_flag2 = 'X'.
concatenate it_record-message ' Delivery date Format MM/dd/yyyy.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Net Price
* if IT_RECORD-BSART+3(1) = '1'.
* if IT_RECORD-NETPR = 0.
* LV_FLAG = 'X'.
* LV_FLAG2 = 'X'.
* concatenate IT_RECORD-MESSAGE
* ' Net Price = 0 is error.' into IT_RECORD-MESSAGE.
* modify IT_RECORD index LV_TABIX.
* elseif IT_RECORD-NETPR < 0.
* LV_FLAG = 'X'.
* LV_FLAG2 = 'X'.
* concatenate IT_RECORD-MESSAGE
* ' Net Price is negative or Net Price not is number.'
* into IT_RECORD-MESSAGE.
* modify IT_RECORD index LV_TABIX.
* endif.
* endif.
"Price unit
if it_record-peinh = 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Price unit = 0 is error.' into it_record-message.
modify it_record index lv_tabix.
elseif it_record-peinh < 0.
lv_flag2 = 'X'.
concatenate it_record-message
' Price unit is negative or Net Price not is number.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"plant
select single werks into lv_werks
from t001w
where werks = it_record-werks.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Plant Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
"Storage location
if it_record-lgort ne space .
select single lgort into lv_lgort
from t001l
where lgort = it_record-lgort
and werks = it_record-werks.
if sy-subrc <> 0.
lv_flag2 = 'X'.
concatenate it_record-message ' Storage location Not Exists.'
into it_record-message.
modify it_record index lv_tabix.
endif.
endif.
if lv_flag2 <> 'X'.
it_record-message = ' OK.'.
modify it_record index lv_tabix.
endif.
endloop.
endform. " CHECK_IT_RECORD
*&---------------------------------------------------------------------*
*& Form CREATE_PO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_po .
loop at it_record.
if not it_record-message = ' OK.'.
it_ebeln_err-ebeln = it_record-ebeln.
collect it_ebeln_err.
endif.
it_ebeln-ebeln = it_record-ebeln.
collect it_ebeln.
endloop.
if not it_ebeln_err[] is initial.
loop at it_ebeln_err.
loop at it_record where ebeln = it_ebeln_err-ebeln.
move-corresponding it_record to it_err2.
append it_err2.
clear it_err2.
endloop.
delete it_ebeln where ebeln = it_ebeln_err-ebeln.
endloop.
endif.
sort it_ebeln by ebeln.
delete adjacent duplicates from it_ebeln comparing all fields.
sort it_record by ebeln.
loop at it_ebeln.
lv_tabix = sy-tabix.
clear:it_ebeln-message.
read table it_record with key ebeln = it_ebeln-ebeln binary search.
check sy-subrc eq 0.
p_header-po_number = it_ebeln-ebeln.
p_header-doc_type = it_record-bsart.
p_header-vendor = it_record-lifnr.
p_header-doc_date = it_record-bedat.
p_header-pmnttrms = it_record-zterm.
" p_header-item_intvl = 10. "不可以赋值 赋值就会按它开始 间隔
p_header-incoterms1 = it_record-inco1.
p_header-currency = it_record-waers.
p_header-purch_org = it_record-ekorg.
p_header-pur_group = it_record-ekgrp.
p_header-comp_code = it_record-bukrs.
p_headerx-po_number = 'X'.
p_headerx-doc_type = 'X'.
p_headerx-vendor = 'X'.
p_headerx-doc_date = 'X'.
p_headerx-pmnttrms = 'X'.
p_headerx-item_intvl = 'X'. "控制PO item是否从10 或 1
p_headerx-incoterms1 = 'X'.
p_headerx-currency = 'X'.
p_headerx-purch_org = 'X'.
p_headerx-pur_group = 'X'.
p_headerx-comp_code = 'X'.
loop at it_record where ebeln = it_ebeln-ebeln.
p_item-po_item = it_record-ebelp.
p_item-item_cat = it_record-pstyp.
p_item-material = it_record-matnr.
p_item-quantity = it_record-menge.
p_item-po_unit = it_record-meins.
p_item-orderpr_un = it_record-meins.
p_item-net_price = it_record-netpr.
p_item-price_unit = it_record-peinh.
if it_record-netpr = 0.
p_item-free_item = 'X'.
endif.
p_item-plant = it_record-werks.
p_item-stge_loc = it_record-lgort.
* p_item-EMATERIAL = ''.
append p_item.
p_itemx-po_item = it_record-ebelp.
p_itemx-po_itemx = 'X'.
p_itemx-item_cat = 'X'.
p_itemx-material = 'X'.
p_itemx-quantity = 'X'.
p_itemx-po_unit = 'X'.
p_item-orderpr_un = 'X'.
p_itemx-net_price = 'X'.
p_itemx-price_unit = 'X'.
p_itemx-plant = 'X'.
p_itemx-stge_loc = 'X'.
* p_itemx-EMATERIAL = 'X'.
append p_itemx.
"change
i_item-po_item = it_record-ebelp.
i_item-quantity = it_record-menge.
append i_item.
i_itemx-po_item = it_record-ebelp.
i_itemx-quantity = 'X'.
append i_itemx.
p_schedule-po_item = it_record-ebelp.
p_schedule-sched_line = 10.
p_schedule-delivery_date = it_record-eindt.
p_schedule-quantity = it_record-menge.
append p_schedule.
p_schedulex-po_item = it_record-ebelp.
p_schedulex-sched_line = 10.
p_schedulex-po_itemx = 'X'.
p_schedulex-sched_linex = 'X'.
p_schedulex-delivery_date = 'X'.
p_schedulex-quantity = 'X'.
append p_schedulex.
if it_record-bsart+3(1) = '1'.
p_cond-itm_number = it_record-ebelp.
p_cond-cond_st_no = '001'.
p_cond-cond_count = '01'.
p_cond-cond_type = 'PB00'. "Condition Type
p_cond-cond_value = it_record-netpr. "Amount
p_cond-currency = it_record-waers_d. "Currency
p_cond-cond_p_unt = it_record-peinh . "Per
p_cond-cond_unit = it_record-meins. "Condition Unit
p_cond-change_id = 'U'.
append p_cond.
p_condx-itm_number = it_record-ebelp.
p_condx-cond_st_no = '001'.
p_condx-itm_numberx = 'X'.
p_condx-cond_st_nox = 'X'.
p_condx-cond_count = 'X'.
p_condx-cond_type = 'X'.
p_condx-cond_value = 'X'.
p_condx-currency = 'X'.
p_condx-cond_p_unt = 'X'.
p_condx-cond_unit = 'X'.
p_condx-change_id = 'X'.
append p_condx.
endif.
endloop.
call function 'BAPI_PO_CREATE1'
exporting
poheader = p_header
poheaderx = p_headerx
importing
exppurchaseorder = ex_ebeln
tables
return = it_return
poitem = p_item
poitemx = p_itemx
poschedule = p_schedule
poschedulex = p_schedulex
pocond = p_cond
pocondx = p_condx.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
loop at it_return where type = 'E'.
if it_ebeln-message is initial.
concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
else.
concatenate it_ebeln-message it_return-message into it_ebeln-message.
endif.
endloop.
modify it_ebeln index lv_tabix.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
" wait up to 1 seconds.
concatenate ex_ebeln ' Success.' into it_ebeln-message.
modify it_ebeln index lv_tabix.
refresh: it_return.
clear:it_return .
" change qty
call function 'BAPI_PO_CHANGE'
exporting
purchaseorder = ex_ebeln
tables
return = it_return
poitem = i_item
poitemx = i_itemx.
commit work and wait.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
else.
purchaseorder = ex_ebeln.
select single frgsx into lv_frgsx
from ekko
where ebeln = purchaseorder .
if not purchaseorder is initial.
select single frgc1 frgc2 frgc3 frgc4 frgc5
into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
from t16fs
where frggr = 'PO'
and frgsx = lv_frgsx.
if po_rel_code1 is not initial.
clear:return[],return.
perform approved_po tables return using purchaseorder po_rel_code1.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code2 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code2.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code3 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code3.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code4 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code4.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code5 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code5.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
endif.
endif.
endif.
clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
,return.
refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
endloop.
loop at it_ebeln.
loop at it_record where ebeln = it_ebeln-ebeln.
move-corresponding it_record to it_err.
it_err-message = it_ebeln-message.
append it_err.
clear it_err.
endloop .
endloop.
endform. " CREATE_PO
*&---------------------------------------------------------------------*
*& Form CREATE_PO_AUTOPONO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_po_autopono .
loop at it_record.
if not it_record-message = ' OK.'.
it_ebeln_err-lifnr = it_record-lifnr.
it_ebeln_err-ekgrp = it_record-ekgrp.
collect it_ebeln_err.
endif.
it_ebeln-lifnr = it_record-lifnr.
it_ebeln-ekgrp = it_record-ekgrp.
collect it_ebeln.
endloop.
if not it_ebeln_err[] is initial.
sort it_ebeln_err by lifnr ekgrp .
loop at it_ebeln_err.
loop at it_record where lifnr = it_ebeln_err-lifnr and ekgrp = it_ebeln_err-ekgrp .
move-corresponding it_record to it_err2.
append it_err2.
clear it_err2.
endloop.
delete it_ebeln where lifnr = it_ebeln_err-lifnr and ekgrp = it_ebeln_err-ekgrp .
endloop.
endif.
sort it_ebeln by lifnr ekgrp .
delete adjacent duplicates from it_ebeln comparing all fields.
sort it_record by lifnr ekgrp .
loop at it_ebeln.
lv_tabix = sy-tabix.
clear:it_ebeln-message,it_ebeln-ebeln.
read table it_record with key lifnr = it_ebeln-lifnr ekgrp = it_ebeln-ekgrp .
check sy-subrc eq 0.
* p_header-po_number = it_ebeln-ebeln.
p_header-doc_type = it_record-bsart.
p_header-vendor = it_record-lifnr.
p_header-doc_date = it_record-bedat.
p_header-pmnttrms = it_record-zterm.
" p_header-item_intvl = 10. "不可以赋值 赋值就会按它开始 间隔
p_header-incoterms1 = it_record-inco1.
p_header-currency = it_record-waers.
p_header-purch_org = it_record-ekorg.
p_header-pur_group = it_record-ekgrp.
p_header-comp_code = it_record-bukrs.
* p_headerx-po_number = 'X'.
p_headerx-doc_type = 'X'.
p_headerx-vendor = 'X'.
p_headerx-doc_date = 'X'.
p_headerx-pmnttrms = 'X'.
* p_headerx-item_intvl = 'X'. "控制PO item是否从10 或 1
p_headerx-incoterms1 = 'X'.
p_headerx-currency = 'X'.
p_headerx-purch_org = 'X'.
p_headerx-pur_group = 'X'.
p_headerx-comp_code = 'X'.
wa_tabix = 1.
loop at it_record where lifnr = it_ebeln-lifnr and ekgrp = it_ebeln-ekgrp .
p_item-po_item = wa_tabix * 10.
p_item-item_cat = it_record-pstyp.
p_item-material = it_record-matnr.
p_item-quantity = it_record-menge.
p_item-po_unit = it_record-meins.
p_item-orderpr_un = it_record-meins.
p_item-net_price = it_record-netpr.
p_item-price_unit = it_record-peinh.
if it_record-netpr = 0.
p_item-free_item = 'X'.
endif.
p_item-plant = it_record-werks.
p_item-stge_loc = it_record-lgort.
* p_item-EMATERIAL = ''.
append p_item.
p_itemx-po_item = wa_tabix * 10.
p_itemx-po_itemx = 'X'.
p_itemx-item_cat = 'X'.
p_itemx-material = 'X'.
p_itemx-quantity = 'X'.
p_itemx-po_unit = 'X'.
p_item-orderpr_un = 'X'.
p_itemx-net_price = 'X'.
p_itemx-price_unit = 'X'.
p_itemx-plant = 'X'.
p_itemx-stge_loc = 'X'.
* p_itemx-EMATERIAL = 'X'.
append p_itemx.
"change
i_item-po_item = wa_tabix * 10.
i_item-quantity = it_record-menge.
append i_item.
i_itemx-po_item = wa_tabix * 10.
i_itemx-quantity = 'X'.
append i_itemx.
p_schedule-po_item = wa_tabix * 10.
p_schedule-sched_line = 10.
p_schedule-delivery_date = it_record-eindt.
p_schedule-quantity = it_record-menge.
append p_schedule.
p_schedulex-po_item = wa_tabix * 10.
p_schedulex-sched_line = 10.
p_schedulex-po_itemx = 'X'.
p_schedulex-sched_linex = 'X'.
p_schedulex-delivery_date = 'X'.
p_schedulex-quantity = 'X'.
append p_schedulex.
if it_record-bsart+3(1) = '1'.
p_cond-itm_number = wa_tabix * 10.
p_cond-cond_st_no = '001'.
p_cond-cond_count = '01'.
p_cond-cond_type = 'PB00'. "Condition Type
p_cond-cond_value = it_record-netpr. "Amount
p_cond-currency = it_record-waers_d. "Currency
p_cond-cond_p_unt = it_record-peinh . "Per
p_cond-cond_unit = it_record-meins. "Condition Unit
p_cond-change_id = 'U'.
append p_cond.
p_condx-itm_number = wa_tabix * 10.
p_condx-cond_st_no = '001'.
p_condx-itm_numberx = 'X'.
p_condx-cond_st_nox = 'X'.
p_condx-cond_count = 'X'.
p_condx-cond_type = 'X'.
p_condx-cond_value = 'X'.
p_condx-currency = 'X'.
p_condx-cond_p_unt = 'X'.
p_condx-cond_unit = 'X'.
p_condx-change_id = 'X'.
append p_condx.
endif.
wa_tabix = wa_tabix + 1.
endloop.
call function 'BAPI_PO_CREATE1'
exporting
poheader = p_header
poheaderx = p_headerx
importing
exppurchaseorder = ex_ebeln
tables
return = it_return
poitem = p_item
poitemx = p_itemx
poschedule = p_schedule
poschedulex = p_schedulex
pocond = p_cond
pocondx = p_condx.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
loop at it_return where type = 'E'.
if it_ebeln-message is initial.
concatenate 'E:PO Create ' it_return-message into it_ebeln-message.
else.
concatenate it_ebeln-message it_return-message into it_ebeln-message.
endif.
endloop.
modify it_ebeln index lv_tabix.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
" wait up to 1 seconds.
concatenate ex_ebeln ' Success.' into it_ebeln-message.
it_ebeln-ebeln = ex_ebeln.
modify it_ebeln index lv_tabix.
refresh: it_return.
clear:it_return .
" change qty
call function 'BAPI_PO_CHANGE'
exporting
purchaseorder = ex_ebeln
tables
return = it_return
poitem = i_item
poitemx = i_itemx.
commit work and wait.
read table it_return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Change error ' it_return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
else.
purchaseorder = ex_ebeln.
select single frgsx into lv_frgsx
from ekko
where ebeln = purchaseorder .
if not purchaseorder is initial.
select single frgc1 frgc2 frgc3 frgc4 frgc5
into (po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5)
from t16fs
where frggr = 'PO'
and frgsx = lv_frgsx.
if po_rel_code1 is not initial.
clear:return[],return.
perform approved_po tables return using purchaseorder po_rel_code1.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code1 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code2 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code2.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code2 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code3 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code3.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code3 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code4 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code4.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code4 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
if po_rel_code5 is not initial.
clear:return[],return.
wait up to 1 seconds.
perform approved_po tables return using purchaseorder po_rel_code5.
read table return with key type = 'E'.
if sy-subrc eq 0.
concatenate 'E:PO Approved ' po_rel_code5 return-message into it_ebeln-message.
modify it_ebeln index lv_tabix.
endif.
endif.
endif.
endif.
endif.
clear:p_header,p_headerx,p_item, p_itemx,p_schedule,p_schedulex,ex_ebeln ,p_cond,i_item,i_itemx
,purchaseorder,lv_frgsx,po_rel_code1,po_rel_code2,po_rel_code3,po_rel_code4,po_rel_code5
,return.
refresh:p_item, p_itemx,p_schedule,p_schedulex,p_cond,i_item,i_itemx,return.
endloop.
loop at it_ebeln.
loop at it_record where lifnr = it_ebeln-lifnr and ekgrp = it_ebeln-ekgrp .
move-corresponding it_record to it_err.
it_err-ebeln = it_ebeln-ebeln.
it_err-message = it_ebeln-message.
append it_err.
clear it_err.
endloop .
endloop.
endform. " CREATE_PO_AUTOPONO
*&---------------------------------------------------------------------*
*& Form DISPLAY_RESULT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form display_result .
clear it_err3.
refresh it_err3.
append lines of it_err to it_err3.
append lines of it_err2 to it_err3.
sort it_err3 by order ascending.
check not it_err3[] is initial.
perform down_file .
perform get_file using 'PO' pr_error p_test '.txt'
changing gv_file.
if p_test = 'X'.
perform download_local tables it_down using gv_file.
perform write_data.
else.
perform download_server tables it_down using gv_file.
endif.
endform. " DISPLAY_RESULT
*&---------------------------------------------------------------------*
*& Form DOWN_FILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form down_file .
clear:it_down,it_down[].
concatenate
'Order Type'
'Purchase Document No.'
'Vendor Code'
'Doc. Date'
'Payment Terms'
'Incoterms'
'Currency'
'Purchasing Org.'
'Purchasing Group'
'Company Code'
'Item Number'
'Item category'
'Material Number'
'Quantity'
'Order Unit'
'Delivery date'
'Net Price'
'Currency'
'Price unit'
'Plant'
'Storage location'
'Message'
into it_down separated by cl_abap_char_utilities=>horizontal_tab.
append it_down.
loop at it_err3.
move-corresponding it_err3 to it_tab.
concatenate it_tab-bsart it_tab-ebeln
it_tab-lifnr_c it_tab-bedat_c it_tab-zterm it_tab-inco1
it_tab-waers it_tab-ekorg it_tab-ekgrp it_tab-bukrs
it_tab-ebelp_c it_tab-epstp it_tab-matnr_c
it_tab-menge_c it_tab-meins_c it_tab-eindt_c it_tab-netpr_c
it_tab-waers_dc it_tab-peinh_c it_tab-werks it_tab-lgort
it_tab-message
into it_down separated by cl_abap_char_utilities=>horizontal_tab.
condense it_down .
append it_down .
endloop.
endform. " DOWN_FILE
*&---------------------------------------------------------------------*
*& Form WRITE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form write_data .
refresh: fc_hier.
alv_field 'BSART' 'Order Type' '' '' '' '' '' '' .
alv_field 'EBELN' 'Purchase Document No.' '' '' '' '' '' ''.
alv_field 'LIFNR_C' 'Vendor Code' '' '' '' '' '' ''.
alv_field 'BEDAT' 'Doc. Date' '' '' '' '' '' '' .
alv_field 'ZTERM' 'Payment Terms' '' '' '' '' '' '' .
alv_field 'INCO1' 'Incoterms' '' '' '' '' '' '' .
alv_field 'WAERS' 'Currency' '' '' '' '' '' '' .
alv_field 'EKORG' 'Purchasing Org.' '' '' '' '' '' '' .
alv_field 'EKGRP' 'Purchasing Group' '' '' '' '' '' '' .
alv_field 'BUKRS' 'Company Code' '' '' '' '' '' '' .
alv_field 'EBELP_C' 'Item Number' '' '' '' '' '' '' .
alv_field 'EPSTP' 'Item category' '' '' '' '' '' '' .
alv_field 'MATNR_C' 'Material Number' '' '' '' '' '' '' .
alv_field 'MENGE' 'Quantity' '' '' '' '' '' '' .
alv_field 'MEINS' 'Order Unit' '' '' '' '' '' '' .
alv_field 'EINDT' 'Delivery date' '' '' '' '' '' '' .
alv_field 'NETPR' 'Net Price' '' '' '' '' '' '' .
alv_field 'WAERS_D' 'Currency' '' '' '' '' '' '' .
alv_field 'PEINH' 'Price unit' '' '' '' '' '' '' .
alv_field 'WERKS' 'Plant' '' '' '' '' '' '' .
alv_field 'LGORT' 'Storage location' '' '' '' '' '' ''.
alv_field 'MESSAGE' 'Message' '' '100' '' '' '' '' .
perform display_alv tables fc_hier it_err3 using 'A'.
endform. " WRITE_DATA
*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form process_data .
data: lv_mod like marc-bstrf,
lv_int type i,
lv_bstrf like marc-bstrf.
loop at it_record.
clear:lv_bstrf,lv_mod,lv_int,it_record-bstrf,it_record-menge_r.
lv_tabix = sy-tabix.
select single bstrf into lv_bstrf
from marc
where matnr = it_record-matnr
and werks = it_record-werks.
if sy-subrc eq 0.
lv_mod = it_record-menge mod lv_bstrf.
lv_int = it_record-menge / lv_bstrf.
if lv_mod ne 0.
lv_int = lv_int + 1.
endif.
it_record-bstrf = lv_bstrf.
it_record-menge_r = lv_int * lv_bstrf.
else.
it_record-menge_r = it_record-menge.
endif.
modify it_record index lv_tabix.
endloop.
endform. " PROCESS_DATA