*/ Program Name: Creation of ORDRSP IDocs from file E020
*/ Description : This program reads in external file E020 containing
* order confirmation data from internal vendors and
* creates one ORDRSP IDoc per PO.
*/ Transaction : n/a - run from job Z_ccc_S7B_Dnnnnn,
* where 'ccc' = 3-digit client and 'nnnnn' = zero-filled
* sequence number.
*______________________________________________________________________
tables: lfa1,
e1edk01,
e1edk02,
e1edp01,
e1edp19,
e1edp20,
e1edp02,
e1eds01,
zst7f_ty_vendors.
parameters: p_path like PATH-PATHEXTERN default '/ftp/atac/in/'.
data: INFILE LIKE PATH-PATHEXTERN,
back_path(7) type c value 'backup/',
info_no like ekpo-infnr,
offset like sy-fdpos,
p01_ctr like sy-index,
seg_num like sy-index.
data: OUTFILE LIKE PATH-PATHEXTERN,
today(8) type c,
outfile_err(1) type c.
data: begin of uty_vendors occurs 10,
lifnr like lfa1-lifnr,
name_abbr like zst7f_ty_vendors-name_abbr,
site_code like zst7f_ty_vendors-site_code,
ship_days like zst7f_ty_vendors-ship_days,
end of uty_vendors.
data: iZSS7B20 like ZSS7B20.
data: idocdata like edi_dd occurs 5 with header line.
data: iedidc like edi_dc occurs 1 with header line.
data: begin of ie020 occurs 10,
lifnr like lfa1-lifnr,
ship_days like zst7f_ty_vendors-ship_days,
po_number(10) type n,
po_lineno(5) type n,
slip_number like e1edp02-belnr,
sched_date like e1edp02-datum, "char 8
sched_qty like e1edp20-wmeng,
cust_partno like e1edp19-idtnr,
vendor_partno like e1edp19-mfrpn,
sched_deliv_date like e1edp20-edatu, "format OK - ccyymmdd
uom like e1edp01-menee,
qty_ordered like e1edp01-menge,
end of ie020.
data: save_po like ie020-po_number,
save_line like ie020-po_lineno,
save_vend_part like ie020-vendor_partno,
save_cust_part like ie020-cust_partno.
*------------------------------------------------------------------
* MAIN PROCESSING LOOP
*------------------------------------------------------------------
START-OF-SELECTION.
today = sy-datlo.
* find all internal vendors
select a~lifnr
b~name_abbr b~site_code b~ship_days
into corresponding fields of table uty_vendors
from lfa1 as a
inner join zst7f_ty_vendors as b
on a~lifnr = b~lifnr
where a~ktokk = 'ZZTY' and
b~ship_code = ' '.
concatenate 'SAP' sy-sysid(3) into iedidc-sndpor.
* initialize control record:
move: '2' to iedidc-direct,
'ORDERS01' to iedidc-doctyp,
'ORDRSP' to iedidc-mestyp,
'F' to iedidc-std,
'E020' to iedidc-stdmes,
'LS' to iedidc-sndprt,
'TY_VENDORS' to iedidc-sndprn,
sy-datlo to iedidc-credat,
sy-timlo to iedidc-cretim.
append iedidc.
e1edk01-action = '000'.
loop at uty_vendors.
clear ie020. refresh ie020.
if not uty_vendors-name_abbr is initial.
* datafiles are received with naming convention:
* E020_<customer name abbreviation>_UTY
concatenate p_path 'E020_' uty_vendors-name_abbr '_UTY'
into infile.
if not sy-subrc is initial. "pathname too long
* Filename too long: &
message w016 with infile.
continue.
endif.
condense infile.
OPEN DATASET INFILE FOR INPUT IN TEXT MODE.
if not sy-subrc is initial.
*'Cannot open dataset & on &'
message i013 with infile sy-datum.
else. "successful file open
concatenate p_path back_path 'E020_'
uty_vendors-name_abbr '_UTY' today
into outfile.
if not sy-subrc is initial. "pathname too long
* Filename too long: &
message w016 with outfile.
continue.
endif.
condense outfile.
OPEN DATASET OUTFILE FOR OUTPUT IN TEXT MODE.
* if the timestamped file cannot be created, do not process the
* input file, because the input file is deleted after processing,
* and there would be no record of the data.
if not sy-subrc is initial.
*'ERROR opening file & for output'
close dataset infile.
message i033 with outfile.
continue. "process next vendor's file
endif.
do.
read dataset infile into izss7b20.
case sy-subrc.
when 0.
transfer izss7b20 to outfile.
if izss7b20-datacode = 'T'. "trailer rec
perform process_one_vendor using infile.
exit. "process next vendor's file
endif.
check izss7b20-datacode = 'D'. "data rec
move-corresponding uty_vendors to ie020.
move-corresponding izss7b20 to ie020.
perform convert_po_no using izss7b20-pono_poline
changing ie020-po_number
ie020-po_lineno.
perform convert_date using izss7b20-sched_date
izss7b20-sched_type
izss7b20-ship_method
changing ie020-sched_date
ie020-ship_days
ie020-sched_deliv_date.
perform convert_quantities
using izss7b20-uom
izss7b20-sched_qty
izss7b20-qty_ordered
changing ie020-uom
ie020-sched_qty
ie020-qty_ordered.
append ie020.
when 4. "EOF
perform process_one_vendor using infile.
exit. "process next vendor's file
when others.
*ERROR reading dataset & on &
message w015 with infile sy-datum.
exit. "discontinue file reads
endcase.
enddo.
close dataset: infile, outfile.
delete dataset infile.
endif.
endif.
endloop. "UTY_VENDORS
*&---------------------------------------------------------------------*
*& Form process_one_vendor
*&---------------------------------------------------------------------*
* Records from one vendor file are now in the internal table
* ie020.
*----------------------------------------------------------------------*
FORM process_one_vendor using value(infile).
sort ie020 by po_number po_lineno.
loop at ie020.
if sy-tabix > 1.
if ( ie020-po_number <> save_po or
ie020-po_lineno <> save_line ).
perform idoc_mat_seg.
endif.
endif.
if ie020-po_number <> save_po.
if sy-tabix > 1.
perform post_prev_idoc.
endif.
perform idoc_header_segs.
endif.
if ( ie020-po_number <> save_po or
ie020-po_lineno <> save_line ).
if sy-tabix > 1.
perform idoc_item_segs.
endif.
endif.
perform idoc_sched_segs.
save_po = ie020-po_number.
save_line = ie020-po_lineno.
save_vend_part = ie020-vendor_partno.
save_cust_part = ie020-cust_partno.
endloop.
perform idoc_mat_seg.
perform post_prev_idoc.
* File successfully processed: &
message s035 with infile.
ENDFORM. " process_one_vendor
*&---------------------------------------------------------------------*
*& Form convert_po_no
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM convert_po_no using value(infield)
changing po_number like ie020-po_number
po_line like ie020-po_lineno.
data: cpos like sy-fdpos,
lpos like sy-fdpos,
cline(6) type c.
* if the infield contains a hyphen, assume that the preceding characters
* represent the po number, if they are numeric. The po line number is
* assumed to be all numeric characters after the hyphen.
if infield ca '-'.
if infield(sy-fdpos) co ' 0123456789'. "numeric
po_number = infield(sy-fdpos).
cpos = sy-fdpos + 1.
endif.
else. "no hyphen - PTY
if infield(2) = '71'. "SAP number range
cpos = 10.
else. "SyteLine number
cpos = 6.
endif.
if infield(cpos) co ' 0123456789'. "numeric
po_number = infield(cpos).
endif.
endif.
if not po_number is initial.
while infield+cpos(1) co '0123456789'.
cline+lpos(1) = infield+cpos(1).
lpos = lpos + 1.
cpos = cpos + 1.
endwhile.
shift cline left deleting leading '0'.
if not cline is initial.
po_line = cline.
endif.
endif.
* Put out a warning in the job log, but create the IDoc to save the data
if ( po_number is initial or
po_line is initial ).
* PO number - line item conversion failed: &
message w016 with infield.
endif.
ENDFORM. " convert_po_no
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
* Convert yymmdd to ccyymmdd for SAP and
* convert ship date to delivery date
*----------------------------------------------------------------------*
FORM convert_date USING value(DATE6)
value(DATE_TYPE)
value(i_ship_code)
CHANGING DATE8 like IE020-SCHED_DATE
SHIP_DAYS like ie020-ship_days
DELIVERY_DATE like ie020-sched_deliv_date.
data: cent(2) type c,
d_date type d.
* add century to schedule date
check date6 cn ' /0'.
if date6(2) < '90'.
cent = '20'.
else.
cent = '19'.
endif.
concatenate cent date6 into date8.
* convert ship date to delivery date (if necessary)
if date_type <> 'ETA'. " delivery date not sent
if not i_ship_code is initial. "ship method sent
select single ship_days from zst7f_ty_vendors
into ship_days
where lifnr = ie020-lifnr
and ship_code = i_ship_code.
endif.
* defaut ship_days are passed in and will be changed only
* if a number specific to the shipping method is found in
* the select above
if ( ship_days > 0 and
not delivery_date is initial ).
* put the date into a date field, so SAP will do date math
d_date = delivery_date.
d_date = d_date + ship_days.
delivery_date = d_date.
shift delivery_date left deleting leading ' '.
endif.
endif.
ENDFORM. " convert_date
*&---------------------------------------------------------------------*
*& Form quantity_conversion
*&---------------------------------------------------------------------*
* The quantities in the input file are implied 3-decimal,
* so need to be converted into a "real" number.
* Also, the unit of measure may be 'KP' indicating that the qty
* is given in thousands.
*----------------------------------------------------------------------*
FORM convert_quantities USING value(i_UOM)
value(i_confirm_qty)
value(i_QTY_ORDERED)
CHANGING o_uom like iE020-UOM
o_confirm_qty like IE020-SCHED_QTY
o_qty_ordered like IE020-QTY_ORDERED.
constants: thou type p decimals 3 value '1000'.
data: n_confirm_qty like ekpo-menge,
n_qty_ordered like ekpo-menge.
if ( i_confirm_qty co ' 0123456789' and
i_confirm_qty cn ' 0' ).
n_confirm_qty = i_confirm_qty.
n_confirm_qty = n_confirm_qty / thou.
endif.
if ( i_qty_ordered co ' 0123456789' and
i_qty_ordered cn ' 0' ).
n_qty_ordered = i_qty_ordered.
n_qty_ordered = n_qty_ordered / thou.
endif.
o_uom = 'PCE'.
if not n_confirm_qty is initial.
o_confirm_qty = n_confirm_qty.
shift o_confirm_qty left deleting leading space.
else.
clear o_confirm_qty.
endif.
if not n_qty_ordered is initial.
o_qty_ordered = n_qty_ordered.
shift o_qty_ordered left deleting leading space.
else.
clear o_qty_ordered.
endif.
ENDFORM. " convert_quantities
*&---------------------------------------------------------------------*
*& Form idoc_header_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO header segments:
* E1EDK01
* E1EDK02
*----------------------------------------------------------------------*
FORM idoc_header_segs.
*&---------------------------------------------------------------------*
*& Form idoc_sched_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO item schedule segments:
* E1EDP20
*----------------------------------------------------------------------*
FORM idoc_sched_segs.
*&---------------------------------------------------------------------*
*& Form idoc_mat_seg
*&---------------------------------------------------------------------*
* create internal table entries for PO item material no. segments:
* E1EDP19
*----------------------------------------------------------------------*
FORM idoc_mat_seg.
clear e1edp19.
select single matnr from ekpo into e1edp19-idtnr
where ebeln = save_po and
ebelp = save_line.
if not e1edp19-idtnr is initial.
idocdata-segnam = 'E1EDP19'.
e1edp19-qualf = '001'.
idocdata-sdata = e1edp19.
perform append_idoc_rec.
endif.
ENDFORM. " idoc_mat_seg
***********************************************************************
*& Form post_prev_idoc
*&---------------------------------------------------------------------*
* create a database idoc from the idocdata table and clear table.
*----------------------------------------------------------------------*
FORM post_prev_idoc.
*&---------------------------------------------------------------------*
*& Form append_idoc_rec
*&---------------------------------------------------------------------*
* add a data record to the IDoc internal table
*----------------------------------------------------------------------*
FORM append_idoc_rec.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.