Adding segment to Idoc
Hello Guys,
I have an inbound Idoc in my system with 'N' segments. If I need an 'N+1' segment in the idoc, is it possible to add the new segment using the BADI HRALE00INBOUND_IDOC?
regards,
Gergo
Hi,
It depens of type of IDOC. Check Note 753153 - FAQ: Customer-functions in IDOC_INPUT_ORDERS for instance for IDOC ORDERSXX.
Regards,
Eduardo
Similar Messages
-
Hi,
i have a requirement where based on a condition i need to add a new segment dynamically in Inbound IDOC.
I have written the code in the user exit of the inbound FM. Its adding new segments and process it perfectly.
But when i see the IDOC in we02 or we19, i am not able to see the newly added segment.
Will the newly added segment in FM appear in the We02?
PS: i have changed the idoc_control-maxsegnum.
Regards,
NiyazHi Niyaz,
Check out the below program ....Similar to your requirement
IDoc creation from inbound file
REPORT ZS7BM000006 message-id ZS7.
*/ Program Name: Creation of DESADV & INVOIC IDocs from file E021
*/ Description : This program reads in external file E021 containing
* shipping and invoice data from internal vendors and
* creates one DESADV and one INVOIC IDoc per invoice.
*/ Transaction : n/a - run from job Z_ccc_S7B_Annnnn, where
* 'ccc' = 3-digit client and 'nnnnn' = zero-filled
* sequence number matching the scheduled job for E020.
tables: lfa1,
lfm1,
ekpo,
eine,
e1edk01,
e1edk02,
e1edk07,
e1edk08,
e1edk06,
e1edk03,
e1edka1,
e1edka2,
e1edp07,
e1edp09,
e1edp19,
e1edp01,
e1edp02,
e1edp26,
e1edp04,
e1eds01,
e1eds02,
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/',
offset like sy-fdpos,
p07_ctr like sy-index,
invoice_total type p decimals 3,
d_seg_num like sy-index,
i_seg_num like sy-index.
data: OUTFILE LIKE PATH-PATHEXTERN,
today(8) type c.
data: begin of uty_vendors occurs 10,
lifnr like lfa1-lifnr,
waers like lfm1-waers,
name_abbr like zst7f_ty_vendors-name_abbr,
ship_days like zst7f_ty_vendors-ship_days,
end of uty_vendors.
data: iZSS7B21 like ZSS7B21.
data: desadvdata like edi_dd occurs 5 with header line.
data: invoicdata like edi_dd occurs 5 with header line.
data: dedidc like edi_dc occurs 1 with header line.
data: iedidc like edi_dc occurs 1 with header line.
data: begin of ie021 occurs 10,
lifnr like lfa1-lifnr,
ship_days like zst7f_ty_vendors-ship_days,
invoice_no like e1edk08-vbeln,
stat like e1edk01-action,
po_number(10) type n,
po_lineno(5) type n,
slip_number like e1edp09-vbeln,
shipto_id like e1edka1-partn,
vendor_id like e1edka1-partn,
endcust_name like e1edka1-name1,
cust_partno like e1edp09-kdmat, "char 35
vendor_partno like e1edp09-matnr, "char 35
invoice_qty like e1edp09-lfimg,
qty_uom like e1edp01-menee,
unit_price like e1edp01-vprei,
price_uom like e1edp01-pmene,
price_qty like e1edp01-peinh,
line_amount like e1edp26-betrg,
currency like e1edk01-curcy,
etd like e1edk06-datum, "ship date
eta like e1edk06-datum, "delivery date
ship_id like e1edk08-traid,
ship_method like e1edk08-traty,
create_date like e1edk03-datum,
plant like ekpo-werks,
end of ie021.
data: save_po like ie021-po_number,
save_line like ie021-po_lineno,
save_stat like ie021-stat,
save_invoice like ie021-invoice_no.
constants: hun_thou type p decimals 5 value '100000',
thou type p decimals 3 value '1000'.
*& DEFINITION: append_idoc_rec
* add a data record to the IDoc internal table
define append_idoc_rec.
&1-tabnam = &1-segnam.
&2_seg_num = &2_seg_num + 1.
&1-segnum = &2_seg_num.
shift &1-segnum left deleting leading space.
append &1.
clear &1.
end-of-definition. " append_idoc_rec
* MAIN PROCESSING LOOP
START-OF-SELECTION.
today = sy-datum.
* find all internal vendors
select a~lifnr
b~waers
c~name_abbr c~ship_days
into corresponding fields of table uty_vendors
from lfa1 as a
inner join lfm1 as b
on a~lifnr = b~lifnr
inner join zst7f_ty_vendors as c
on a~lifnr = c~lifnr
where a~ktokk = 'ZZTY' and
b~ekorg = '7100' and
c~ship_code = ' '.
perform init_desadv.
perform init_invoic.
concatenate 'SAP' sy-sysid(3) into: iedidc-sndpor, dedidc-sndpor.
loop at uty_vendors.
clear ie021. refresh ie021.
if not uty_vendors-name_abbr is initial.
* datafiles are received with naming convention:
* E020_<customer name abbreviation>_UTY
concatenate p_path 'E021_' uty_vendors-name_abbr '_UTY'
into infile.
if not sy-subrc is initial. "pathname too long
* Filename too long: &
message i016 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.
continue.
else.
concatenate p_path back_path 'E021_'
uty_vendors-name_abbr '_UTY' today
into outfile.
if not sy-subrc is initial. "pathname too long
* Filename too long: &
message i016 with outfile.
continue.
endif.
condense outfile.
OPEN DATASET OUTFILE FOR OUTPUT IN TEXT MODE.
* if the datestamped 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 izss7b21.
case sy-subrc.
when 0.
transfer izss7b21 to outfile.
if izss7b21-datacode = 'T'. "trailer rec
perform process_one_vendor using infile.
exit. "process next vendor's file
endif.
check: izss7b21-datacode = 'A'. "data rec
case izss7b21-status.
when ' '. "new
ie021-stat = '000'.
when 'M'. "modification
ie021-stat = '002'.
when 'D'. "deletion
ie021-stat = '003'.
endcase.
move-corresponding uty_vendors to ie021.
move-corresponding izss7b21 to ie021.
perform convert_po_no using izss7b21-pono_poline
changing ie021-po_number
ie021-po_lineno.
perform convert_dates using ie021-lifnr
izss7b21-etd
izss7b21-eta
izss7b21-ship_method
izss7b21-create_date
changing ie021-eta
ie021-ship_days.
perform quantity_conversion
using izss7b21-qty_uom
izss7b21-invoice_qty
izss7b21-unit_price
changing ie021-qty_uom
ie021-invoice_qty
izss7b21-line_amount.
perform money_conversion
using izss7b21-currency
izss7b21-unit_price
izss7b21-price_uom
izss7b21-line_amount
changing ie021-currency
ie021-price_uom
ie021-price_qty
ie021-unit_price
ie021-line_amount.
perform SAP_vendor_partno
changing ie021-cust_partno.
append ie021.
when 4. "EOF
perform process_one_vendor using infile.
exit. "process next vendor's file
when others.
*ERROR reading dataset & - &
message i015 with infile sy-datum.
exit.
endcase.
enddo.
close dataset: infile, outfile.
delete dataset infile.
endif.
endif.
endloop. "UTY_VENDORS
*& Form process_one_vendor
* Pre-processed records from one vendor file are now in the
* internal table ie021 - ready to create IDocs
FORM process_one_vendor using value(infile).
sort ie021 by invoice_no stat po_number po_lineno.
loop at ie021.
if ( ie021-invoice_no <> save_invoice or
ie021-stat <> save_stat ).
if sy-tabix > 1.
perform post_idocs using ie021-stat.
endif.
perform idoc_header_segs using ie021-stat.
endif.
if ( ie021-stat <> save_stat or
ie021-po_number <> save_po or
ie021-po_lineno <> save_line or
ie021-invoice_no <> save_invoice ).
if ( sy-tabix > 1 and
ie021-stat = '000' ).
perform idoc_poheader_segs.
endif.
endif.
perform idoc_item_segs using ie021-stat.
save_po = ie021-po_number.
save_line = ie021-po_lineno.
save_invoice = ie021-invoice_no.
save_stat = ie021-stat.
endloop.
perform post_idocs using ie021-stat.
* File successfully processed: &
message s035 with infile.
ENDFORM. " process_one_vendor
*& Form convert_po_no
* Break the PO number & line field into separate fields
FORM convert_po_no using value(infield)
changing po_number like ie021-po_number
po_line like ie021-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 i034 with infield.
endif.
ENDFORM. " convert_po_no
*& Form convert_dates
* Convert ship date to delivery date, if necessary
FORM convert_dates using value(vendor_no)
value(i_ship_date)
value(i_delivery_date)
value(i_ship_code)
value(i_create_date)
changing o_delivery_date
ship_days.
data: ship_date type d.
* if delivery date not sent, calculate it from ship date plus
* ship days.
* Note that this logic could leave delivery date blank,
* if ship date is not numeric.
if ( i_delivery_date is initial or
i_delivery_date co ' 0' ). "no delivery date sent
if ( i_ship_date co ' 0123456789' and
i_ship_date cn ' 0' ). "ship date sent
* move the ship date into a date field to add days
ship_date = i_ship_date.
elseif ( i_create_date co ' 0123456789' and
i_create_date cn ' 0' ).
ship_date = i_create_date.
endif.
if not i_ship_code is initial.
select single ship_days from zst7f_ty_vendors
into ship_days
where lifnr = vendor_no
and ship_code = i_ship_code.
endif.
if not ship_date is initial.
if ship_days > 0.
ship_date = ship_date + ship_days.
o_delivery_date = ship_date.
shift o_delivery_date left deleting leading ' '.
endif.
endif.
else. "delivery date sent
o_delivery_date = i_delivery_date.
endif.
ENDFORM. " convert_dates
*& 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 quantity_conversion USING value(i_UOM)
value(i_invoice_qty)
value(i_unit_price)
CHANGING o_uom like iE021-qty_UOM
o_invoice_qty like IE021-INVOICE_QTY
c_LINE_AMOUNT like izss7b21-line_amount.
data: f_invoice_qty type f.
data: n_invoice_qty like lips-kcmeng.
data: f_unit_price type f.
data: f_line_amt type f.
data: n_line_amt0 type p decimals 0.
if ( i_invoice_qty co ' 0123456789' and
i_invoice_qty cn ' 0' ).
f_invoice_qty = i_invoice_qty.
* if no extended price is sent, calculate it
if c_line_amount is initial.
* the qty is implied 3-dec, the price is still implied
* 5-dec, and line amount should be implied 3-dec.
f_unit_price = i_unit_price.
f_line_amt = ( f_invoice_qty * f_unit_price ) / 100000.
n_line_amt0 = f_line_amt.
c_line_amount = n_line_amt0.
shift c_line_amount left deleting leading space.
endif.
* if the invoice qty is per 1000, the implied 3-dec times 1000 equals
* the unconverted value. Otherwise, divide by 1000 to get the PCE qty
if i_uom = 'KP'.
n_invoice_qty = f_invoice_qty.
else.
n_invoice_qty = f_invoice_qty / thou.
endif.
endif.
o_uom = 'PCE'.
if not n_invoice_qty is initial.
o_invoice_qty = n_invoice_qty.
shift o_invoice_qty left deleting leading space.
else.
clear o_invoice_qty.
endif.
ENDFORM. " quantity_conversion
*& Form money_conversion
* Add the implied decimals and store price-per qty, if
* price per 1,000 is sent.
FORM money_conversion USING value(I_CURR)
value(i_UNIT_PRICE)
value(i_UOM)
value(i_LINE_AMOUNT)
CHANGING o_CURRENCY like ie021-currency
o_PRICE_UOM like ie021-price_uom
o_PRICE_QTY like ie021-price_qty
o_UNIT_PRICE like ie021-unit_price
o_LINE_AMOUNT like ie021-line_amount.
data: n_unit_price type p decimals 5,
n_line_amount type p decimals 3.
* not all of the vendors send the currency code, so use the vendor
* master default
case i_curr(2).
when 'US'.
o_currency = 'USD'.
when 'JP'.
o_currency = 'JPY'.
when others.
o_currency = uty_vendors-waers.
endcase.
* unit price is implied 5-dec
if ( i_unit_price cn ' 0' and
i_unit_price co ' 0123456789' ).
n_unit_price = i_unit_price.
n_unit_price = n_unit_price / hun_thou.
endif.
* line price is implied 3-dec
if ( i_line_amount co ' 0123456789' and
i_line_amount cn ' 0' ).
n_line_amount = i_line_amount.
n_line_amount = n_line_amount / thou.
endif.
* 'KP' = price per thousand
if i_uom = 'KP'.
o_price_qty = '1000'.
else.
o_price_qty = '1'.
endif.
o_price_uom = 'PCE'.
if not n_unit_price is initial.
o_unit_price = n_unit_price.
shift o_unit_price left deleting leading space.
else.
clear o_unit_price.
endif.
if not n_line_amount is initial.
o_line_amount = n_line_amount.
shift o_line_amount left deleting leading space.
else.
clear o_line_amount.
endif.
ENDFORM. " money_conversion
*& Form SAP_vendor_partno
* replace UTY part number sent by vendor with SAP material no.
* from PO line item.
FORM SAP_vendor_partno changing cust_partno like ie021-cust_partno.
tables: makt.
data: partno_sent like makt-maktx.
partno_sent = cust_partno.
clear: makt, cust_partno.
select single matnr from ekpo into cust_partno
where ebeln = ie021-po_number and
ebelp = ie021-po_lineno.
if sy-subrc is initial.
*compare material description to part number sent by vendor
select single maktx from makt into makt-maktx
where matnr = cust_partno.
if partno_sent <> makt-maktx.
* 'Part No. Mismatch: PO & - &, Part sent &, SAP mat.no. &'
message i031 with ie021-po_number ie021-po_lineno
partno_sent makt-maktx.
endif.
else. "PO line not found
*try to find SAP material number using 20-char catalog no. sent
select single matnr from makt into cust_partno
where maktx = partno_sent.
if not sy-subrc is initial.
* 'SAP material no. not found for & - PO & - &'
message i032 with partno_sent ie021-po_number ie021-po_lineno.
endif.
endif.
*if not found, IDoc will go to workflow for missing material no.
ENDFORM. " SAP_vendor_partno
*& Form idoc_header_segs
* create internal table entries for header segments.
* DESADV:
* E1EDK07
* E1EDKA1
* E1EDK03
* E1EDK08
* E1EDKA2
* E1EDK06
* INVOIC:
* E1EDK01
* E1EDKA1(s)
* E1EDK02
* E1EDK03(s)
FORM idoc_header_segs using value(desadv_ok).
* INVOIC
clear i_seg_num.
invoicdata-segnam = 'E1EDK01'.
e1edk01-action = ie021-stat.
if ie021-currency(2) = 'US'.
e1edk01-curcy = 'USD'.
else.
e1edk01-curcy = 'JPY'.
endif.
invoicdata-sdata = e1edk01.
append_idoc_rec invoicdata i.
clear e1edka1.
invoicdata-segnam = 'E1EDKA1'.
e1edka1-parvw = 'RE'.
e1edka1-partn = ie021-shipto_id.
invoicdata-sdata = e1edka1.
append_idoc_rec invoicdata i.
clear e1edka1.
invoicdata-segnam = 'E1EDKA1'.
e1edka1-parvw = 'LF'.
e1edka1-partn = ie021-lifnr.
e1edka1-lifnr = ie021-shipto_id.
invoicdata-sdata = e1edka1.
append_idoc_rec invoicdata i.
if not ie021-endcust_name is initial.
clear e1edka1.
invoicdata-segnam = 'E1EDKA1'.
e1edka1-parvw = 'WE'.
e1edka1-name1 = ie021-endcust_name.
invoicdata-sdata = e1edka1.
append_idoc_rec invoicdata i.
endif.
clear e1edk02.
invoicdata-segnam = 'E1EDK02'.
e1edk02-qualf = '009'.
e1edk02-belnr = ie021-invoice_no.
invoicdata-sdata = e1edk02.
append_idoc_rec invoicdata i.
clear e1edk03.
invoicdata-segnam = 'E1EDK03'.
e1edk03-iddat = '012'.
e1edk03-datum = ie021-create_date.
invoicdata-sdata = e1edk03.
append_idoc_rec invoicdata i.
invoicdata-segnam = 'E1EDK03'.
e1edk03-iddat = '024'.
invoicdata-sdata = e1edk03.
append_idoc_rec invoicdata i.
check desadv_ok = '000'.
* DESADV
clear d_seg_num.
desadvdata-segnam = 'E1EDK07'.
e1edk07-action = ie021-stat.
e1edk07-bolnr = ie021-invoice_no.
desadvdata-sdata = e1edk07.
append_idoc_rec desadvdata d.
clear e1edka1.
desadvdata-segnam = 'E1EDKA1'.
desadvdata-sdata = e1edka1.
append_idoc_rec desadvdata d.
clear e1edk03.
desadvdata-segnam = 'E1EDK03'.
desadvdata-sdata = e1edk03.
append_idoc_rec desadvdata d.
clear e1edk08.
desadvdata-segnam = 'E1EDK08'.
e1edk08-vbeln = ie021-invoice_no.
e1edk08-traid = ie021-ship_id.
e1edk08-traty = ie021-ship_method.
desadvdata-sdata = e1edk08.
append_idoc_rec desadvdata d.
clear e1edka2.
desadvdata-segnam = 'E1EDKA2'.
desadvdata-sdata = e1edka2.
append_idoc_rec desadvdata d.
clear e1edk06.
desadvdata-segnam = 'E1EDK06'.
e1edk06-iddat = '025'. "document date
e1edk06-datum = ie021-create_date.
desadvdata-sdata = e1edk06.
append_idoc_rec desadvdata d.
if not ie021-eta is initial.
clear e1edk06.
desadvdata-segnam = 'E1EDK06'.
e1edk06-iddat = '001'. "delivery date
e1edk06-datum = ie021-eta.
desadvdata-sdata = e1edk06.
append_idoc_rec desadvdata d.
endif.
if not ie021-etd is initial.
clear e1edk06.
desadvdata-segnam = 'E1EDK06'.
e1edk06-iddat = '010'. "ship date
e1edk06-datum = ie021-etd.
desadvdata-sdata = e1edk06.
append_idoc_rec desadvdata d.
endif.
ENDFORM. " idoc_header_segs
*& Form idoc_poheader_segs
* create internal table entries for DESADV PO/item segments
* E1EDP07
FORM idoc_poheader_segs.
*DESADV
clear e1edp07.
desadvdata-segnam = 'E1EDP07'.
e1edp07-bstnk = ie021-po_number.
e1edp07-posex = ie021-po_lineno.
desadvdata-sdata = e1edp07.
append_idoc_rec desadvdata d.
p07_ctr = p07_ctr + 1.
ENDFORM. " idoc_poheader_segs
*& Form idoc_item_segs
* create internal table entries for PO item segments:
* DESADV: E1EDP09
* INVOIC: E1EDP01 Qtys
* E1EDP02 ref nos. (PO number / line)
* E1EDP19 part numbers
* E1EDP26 amounts
* E1EDP04 taxes
FORM idoc_item_segs using value(desadv_ok).
data: n_line_amt type p decimals 3.
*INVOIC
clear e1edp01.
invoicdata-segnam = 'E1EDP01'.
e1edp01-menee = ie021-qty_uom.
e1edp01-menge = ie021-invoice_qty.
e1edp01-vprei = ie021-unit_price.
e1edp01-pmene = ie021-price_uom.
e1edp01-peinh = ie021-price_qty.
e1edp01-netwr = ie021-line_amount.
invoicdata-sdata = e1edp01.
append_idoc_rec invoicdata i.
clear e1edp02.
invoicdata-segnam = 'E1EDP02'.
e1edp02-qualf = '001'.
e1edp02-belnr = ie021-po_number.
e1edp02-zeile = ie021-po_lineno.
invoicdata-sdata = e1edp02.
append_idoc_rec invoicdata i.
clear e1edp19.
invoicdata-segnam = 'E1EDP19'.
e1edp19-qualf = '001'.
e1edp19-idtnr = ie021-cust_partno.
invoicdata-sdata = e1edp19.
append_idoc_rec invoicdata i.
clear e1edp19.
invoicdata-segnam = 'E1EDP19'.
e1edp19-qualf = '002'.
e1edp19-idtnr = ie021-vendor_partno.
invoicdata-sdata = e1edp19.
append_idoc_rec invoicdata i.
clear e1edp26.
invoicdata-segnam = 'E1EDP26'.
e1edp26-qualf = '003'.
e1edp26-betrg = ie021-line_amount.
invoicdata-sdata = e1edp26.
append_idoc_rec invoicdata i.
* dummy tax seg
clear e1edp04.
invoicdata-segnam = 'E1EDP04'.
e1edp04-msatz = '0.00'.
invoicdata-sdata = e1edp04.
append_idoc_rec invoicdata i.
n_line_amt = ie021-line_amount.
invoice_total = invoice_total + n_line_amt.
check desadv_ok = '000'.
*DESADV
clear e1edp09.
desadvdata-segnam = 'E1EDP09'.
e1edp09-vbeln = ie021-slip_number.
e1edp09-matnr = ie021-vendor_partno.
e1edp09-vrkme = ie021-qty_uom.
e1edp09-lfimg = ie021-invoice_qty.
desadvdata-sdata = e1edp09.
append_idoc_rec desadvdata d.
ENDFORM. " idoc_item_segs
*& Form post_idocs
* create database IDocs from the idocdata tables and clear tables.
FORM post_idocs using value(desadv_ok).
*INVOIC
clear e1eds01.
invoicdata-segnam = 'E1EDS01'.
e1eds01-sumid = '010'.
e1eds01-summe = invoice_total.
e1eds01-waerq = ie021-currency.
shift e1eds01-summe left deleting leading space.
invoicdata-sdata = e1eds01.
append_idoc_rec invoicdata i.
CALL FUNCTION 'INBOUND_IDOC_PROCESS'
TABLES
IDOC_CONTROL = iedidc
IDOC_DATA = invoicdata.
commit work.
*DESADV
if desadv_ok = '000'.
clear e1eds02.
desadvdata-segnam = 'E1EDS02'.
e1eds02-sumid = '001'.
e1eds02-summe = p07_ctr.
shift e1eds02-summe left deleting leading space.
desadvdata-sdata = e1eds02.
append_idoc_rec desadvdata d.
CALL FUNCTION 'INBOUND_IDOC_PROCESS'
TABLES
IDOC_CONTROL = dedidc
IDOC_DATA = desadvdata.
commit work.
endif.
refresh: desadvdata,
invoicdata.
clear:
desadvdata,
invoicdata,
p07_ctr,
invoice_total,
save_stat,
save_po,
save_line,
save_invoice.
ENDFORM. " post_idocs
*& Form init_desadv
* add a DESDAV control record and initialize fields
FORM init_desadv.
clear dedidc. refresh dedidc.
* initialize control record:
move: '2' to dedidc-direct,
'DESADV01' to dedidc-doctyp,
'DESADV' to dedidc-mestyp,
'F' to dedidc-std,
'E021' to dedidc-stdmes,
'LS' to dedidc-sndprt,
'TY_VENDORS' to dedidc-sndprn,
sy-datlo to dedidc-credat,
sy-timlo to dedidc-cretim.
append dedidc.
ENDFORM. " init_desadv
*& Form init_invoic
* add a INVOIC control record and initialize fields
FORM init_invoic.
clear iedidc. refresh iedidc.
* initialize control record:
move: '2' to iedidc-direct,
'INVOIC01' to iedidc-doctyp,
'INVOIC' to iedidc-mestyp,
'MM' to iedidc-mescod,
'F' to iedidc-std,
'E021' to iedidc-stdmes,
'LS' to iedidc-sndprt,
'TY_VENDORS' to iedidc-sndprn,
sy-datlo to iedidc-credat,
sy-timlo to iedidc-cretim.
append iedidc.
ENDFORM. " init_invoic
REWARD POINTS IF HELPFUL
Lakshmiraj.A -
Adding new segment to IDoc type DELVRY03
Hello everybody!
I just got a request to add two new segments to an Idoc (type DELVRY03) under the segment E1EDL24. (E1EDL43 and E1EDL41).
They told me to use the userexit EXIT_SAPLV55K_004 to add the new segments using the table IDOC_CONTROL since it is standard. But the problem is that the changes are not been saved.
I realised that by the time that this exit is called the standard already stored the information on EDID4.
I appreciate any help!
Thanks in advance!Hi Kumar,
If we change EDBAS table data and modify my idoc type by adding segment.
after completing process have to move my object to production.
Hope it ll through an error... because it will check with table data also for validation.
could you please justify your answer kumar?
Thanks for your helpful information.
Regards,
BALAJI. -
How to generate a new segment in IDoc for multiple occurance of Control Num
Hi Experts,
In my scenario, i need to generate a new segment in IDoc(Target Structure) based on Control Number Field in the Source Structure.
The segment need to be created for multiple occurance of the Control Number.
Ex:
Control Number - 100 appears 5 times in Source Structure.This control Number is mapped to one of the Field in the Segment of IDoc.
Now my requirement is to generate the Segment 5 times with respective to this Control Number.
please help me out to resolve this issue.
Thanks,
Kish.Hi,
Here is the XML Structure of my Source:
<?xml version="1.0" encoding="UTF-8"?>
<ns0:GoodsReceipt_MT xmlns:ns0="urn:WOL-com:XI:data:HJ:10">
<row>
<CONTROL_NUMBER>111</CONTROL_NUMBER>
<LINE_NUMBER>1111</LINE_NUMBER>
<CONTROL_NUMBER_2/>
<OUTSIDE_ID/>
<WH_ID>111111</WH_ID>
<LOCATION_ID/>
<HU_ID>11111</HU_ID>
<NUM_ITEMS/>
<ITEM_NUMBER>111111</ITEM_NUMBER>
<CONTROL_NUMBER_3>LR</CONTROL_NUMBER_3>
<LOT_NUMBER>11111</LOT_NUMBER>
<UOM>11111</UOM>
</row>
<row>
<CONTROL_NUMBER>111</CONTROL_NUMBER>
<LINE_NUMBER>12222</LINE_NUMBER>
<CONTROL_NUMBER_2/>
<OUTSIDE_ID/>
<WH_ID>12222</WH_ID>
<LOCATION_ID/>
<HU_ID>1222</HU_ID>
<NUM_ITEMS/>
<ITEM_NUMBER>112222</ITEM_NUMBER>
<TRAN_QTY>112222</TRAN_QTY>
<CONTROL_NUMBER_3>LR</CONTROL_NUMBER_3>
<LOT_NUMBER>12222</LOT_NUMBER>
<UOM>1122222</UOM>
</row>
<row>
<CONTROL_NUMBER>222</CONTROL_NUMBER>
<LINE_NUMBER>2222</LINE_NUMBER>
<CONTROL_NUMBER_2/>
<OUTSIDE_ID/>
<WH_ID>22222</WH_ID>
<LOCATION_ID/>
<HU_ID>222222</HU_ID>
<NUM_ITEMS/>
<ITEM_NUMBER>2222222</ITEM_NUMBER>
<TRAN_QTY>22222222</TRAN_QTY>
<LOCATION_ID_2>33333333</LOCATION_ID_2>
<CONTROL_NUMBER_3>LR</CONTROL_NUMBER_3>
<LOT_NUMBER>22222</LOT_NUMBER>
<UOM>22222</UOM>
</row>
<row>
<CONTROL_NUMBER>333</CONTROL_NUMBER>
<LINE_NUMBER>3333</LINE_NUMBER>
<CONTROL_NUMBER_2/>
<OUTSIDE_ID/>
<WH_ID>33333</WH_ID>
<LOCATION_ID/>
<HU_ID>33333</HU_ID>
<NUM_ITEMS/>
<ITEM_NUMBER>333333</ITEM_NUMBER>
<TRAN_QTY>33333333</TRAN_QTY>
<CONTROL_NUMBER_3>LR</CONTROL_NUMBER_3>
<LOT_NUMBER>33333</LOT_NUMBER>
<UOM>333333</UOM>
</row>
</ns0:GoodsReceipt_MT>
Now Control_Number 111 occurs 2 times, 222 & 333 occurs 1 time.
Now one IDoc for 111,222 & 333 should be generated.
But Control_number 111 appears 2 times.
Now the data in the 2 rows should be passed to Single IDoc by repeating the segments inside the IDoc.
As u said i changed the Occurance of IDoc to 0...unbound and imported as External Definition. I have done upto Generating IDoc for each unique Control_Number.
I stuck up at repeating the Segments in the IDoc.
So please help me out.
Thanks,
Kish. -
How to isolate error with a record/segment in IDOC with multiple records
I have an IDOC with multiple records/segments (typically 1000 records/segments). Sometime XI can not process the IDOC because of some control characters in data.
1. How can I pre-processed the IDOC to remove those control characters?
Can I use XPATH expression/Java class to do it? How can I configure the XPATH expression/Java class in XI to pre-process the file?
2. Until I have answer to 1st question. I would like to find out the error is exactly for which record? What configuration can I do in XI to isolate the error is with which record/segment in IDOC?
Thanks in advance.Split the IDoc.
with in the UDF, after the validations if every thing fine, pass as successful records to success_MT and pass it to target system using Branching in BPM.
if errors found in the record, then store the error records in Hash table with in UDF, get the IDoc number, frame as a string and raise alert.
U have to do this in the context of IDoc.
If U wanna get the IDoc Number, Segment Name and field name for every failure, U can pass the expected error field name as constant to UDF, frame the sentence in the UDF like -> <b>IDoc 1234321 segment SEG001 field FLD03 has a special character *</b>.
If U wanna pass this string to source/target, U can do in error messages branch in BPM.
U must use BPM for splitting the IDoc, since it is multi-mapping.
reg.,
Yallabandi. -
How can create SEGMENTS and IDOC TYPE in BADI in ECC 6.0 version
Hi All,
Can any one help, how to create SEGMENTS and IDOC TYPE in BADI in ECC 6.0 version.This is my task.
Given BADI name was----VENDOR_ADD_DATA_BI .
ThanksAnil,
look at this thread ..may be this helps you.
Re: 824 IDOC and BADI/User Exit
sateesh. -
In exit EXIT_SAPLKD01_001 populate custom segment of idoc ext. cremas05
Hi,
I am using EXIT_SAPLKD01_001 where I need to populate 2 custom segments for idoc extension cremas05.
I have created a function module separately where I have populated the 2 structures that is of same type as the segment structure.
In the exit I have called the function module where the structures are populated.
Now my question is how to populate the custom segments from the function module structures directly in the exit.
Thanks and Regards
PHi
Now I'm able to do this.... closing the thread. -
E1EDKT1 segment in Idoc INVOIC02
Hi,
Im getting the following error when sending an INVOIC02 Idoc to ECC:
"Error: Segment 'E1EDKT1', segmentnumber '000010' not correct in structure INVOIC02"
I already refreshed the IDoc metadata and I see the segment in the repository and IDX2. The connection to the backend works fine: when I remove this segment the Idoc is processed succesful. What could be causing this problem?Hi Iddo Rijsdijk,
It solved my issue as well. Thanks.
- Netrey -
How do Optional segments in Idocs gets triggered ? Iam generating Idocs on R/3 Side and optional segments seems to be not getting created when I see on WE05 Tcode.
My Question is does these segments will be created automatically if there is a data ?
Please clarifyHi Ram,
There needs to a specific coding for filling the segments be it optional or anyother. I believe the filling of the segment is being done in SAP R/3 and there might not be a code to fill these optional segments.
Just simply write a code where you are filling other segmemts for the IDoc in case it's not there and it should work.
Hope this helps.
Nishant
Message was edited by: Nishant Rustagi -
Hello all,
I am working on idoc to idoc scenario, i have to map a segment to idoc, exact requirement is
" If there are 10 "E1P12" segments in the inbound IDOC then we need to create 10 outbound Delins IDOCs, each with 1 E1EDP10 segment.
Can anyone provide me the steps to follow in this scenario.
Thanks for all your help.one more
For every Idoc generated on the target side the header data is populated frm source Idoc.(i.e) the same header repeated 4r all idocs right???
In order to do tat u need to write a simple udf
public void Test(String[] a,String[] b,ResultList result,Container container)
//write your code here
for (int i=0; i<a.length;i++)
result.addValue(b[0]);
use this udf under all header element(eg.element1 under header tgt side)
then mapping ll be
E1EP12----->
Test-------->Split By Value---->element1
src element----> -
Segment to idoc..
Hello all,
I am working on the scenario where i need to mapp a segment to idoc.
means if i am having 10 segments then 10 idocs should get created.
If there are 10 EDP10 segments in the inbound IDOC then we need to create 10 outbound Delins IDOCs, each with 1 EDP10 segment.
I have to display the header part from other segment with each idoc created.
Please explain in detail.
Thanks for all your help.Hi siddhesh,
Try the below logics...
It will working fine for me in Orders IDOC.
If you have a Multiple E1EDPO1 for each E1EDPO1 need to create a
Each IDOC.
and also Each IDOC have Only one E1EDPO1.
But Header segments Like EIEDKO1 comes only one time.
This also should be enable each IDOC in the Receiver.
First for Multiple IDOC:
E1EDPO1Remove ContextSplitByValue(Each)Collapse ContextIDOC
Second for enable each E1EDPO1 for each IDOC:
E1EDPO1SplitByValue(Each)E1EDPO1
other elements need to simple map.
Like..
Posex--Posex
Action--Action
Third For header need to use Each IDOC:
EIEDKO1(Context IDOC) ---
E1EDPO1(Change the context to IDOC)---UseOneAsMany-E1EDKO1
E1EDPO1 ---
Other elements also need to map like above.
Consider the field ACTION
ACTION(Context IDOC) ---
E1EDPO1(Change the context to IDOC)---UseOneAsMany-ACTION
E1EDPO1 ---
In useoneasmany we need to keep first and second node context should be same.
Regards,
Prakasu -
How can i check the segment in idoc.
hi gurus,
how can i check the segment in idoc.please help me asHi Rohit,
In WE02/05 U can view the IDocs.
Since u r having the IDoc with u, Double click the Idoc no. and it will take you to screen where it will show you all the segments of IDoc. Here you can check which segment is giving error.
Go to WE60/63 which shows the detailed documentation in the MySAP environments if u have been using the old 4.6c systems. In 6.10 since the documentation is not available ,modify your personal settings to show the documentation by default; In 6.10 in transactions WE60 and WE63, documentation is no longer generated by default for the segment fields when the documentation is generated. To activate the generation of the documentation from the corresponding data elements, proceed as follows: WE60/WE63. > Goto > User settings. Here you must set the indicator for 'Display of the documentation' under 'Display attributes for IDOC types' and then save the change. Now the documentation is also displayed for the segment fields when WE60/WE63 is executed.
**Reward points if u find this useful.
Thanks & Regards,
gyanaraj -
Limit the no of segments per IDOC to less than the current default value
Hi friends,
please help me in the following issue.
The possibility to limit the number
of segments per IDOC to less than the current default value.
Purpose is to limit the traffic of IDOCs between systems.
How to solve this issue to avoid traffic
Thanks in advance.
Regards
SandeepHi Kiran,
Actually we are using standard ones at that time we are getting prolems. When using custom developed ALE's
we are putting segment size is less.To decrease segment size is there any filtering at the sender side? To change segment size may be nedd to take help form SAP.
But if have filtering at any level from sender side need to confirm before consult SAP.
Regards
Sandeep -
Filling up segments of Idoc of Invoice List
Hi!
Invoices and Invoice List are beeing created... everything would be fine, but some fields are missing in the Invoice List while existing in Invoices.
I guess I need to find the code where these fields are filled up for Invoices and to add this code to appropriate place for Invoice List. How to do this?
I think that needed segments are existing for Invoice List, just not filled up...
By the way, how to find out Idoc number of Invoice List? If I have it, I could compare segments with Idocs of Invoices.
Any ideas?
Will reward,
Mindaugas.I saw the Function module -
Please look at code at :
Include program : LVEDFF0R
FORM REDUCTION_TABLE_CREATE.
PERFORM IDOC_SEGMENTS_READ.
PERFORM IDOC_ACTIVE_SEGMENTS_SET.
ENDFORM. " REDUCTION_TABLE_CREATE
Keep the break point at form routine and debug the the function module
If you do not know how to do debugging then use following way :
keep the break point in form routine above as i said
Create invoice or invoice list
when you maintain output type in invoice or invoice list -
Now click on Further data ->select peridoc scheduling-> back and save it.
Run RSNAST00 Program
Output application : V3
Object key : Invoice or invoice list number
Output type : RD00 or LR00
Medium = 6(EDI) ,A (ALE)
when you execute the program and it will goto debugging.
Thanks
Seshu -
Adding lines to segment of Idoc in User Exit ZXEDFU02
Hi!
do I need to maintain Idoc in WE30 if I need to add some lines to one segment in User Exit ZXEDFU02?
Here is my sample code placed in ZXEDFU02 for adding a line, but it is not making an effect:
WHEN 'E1EDP01'.
CLEAR E1EDP26.
E1EDP26-QUALF = '003'.
E1EDP26-BETRG = 777.
or maybe it depends on Idoc that I use in We19?
For example, if Idoc that I use in WE19 for testing my User Exit does not has qualifier 003 in segment E1EDP26... could it be a reason?
Will reward,
Mindaugas.Hi,
Saple Code:
INCLUDE ZXEDFU02 *
data: ls_ka1 like e1edka1,
ls_edidd like edidd,
l_lines type i.
describe table int_edidd lines l_lines.
check l_lines ne 0.
read table int_edidd into ls_edidd index l_lines.
check ls_edidd-segnam eq 'E1EDKA1' and
ls_edidd-sdata(2) eq 'RS'.
ls_ka1-parvw = 'ZC'.
case xvbdkr-bukrs.
when '1000'.
ls_ka1-lifnr = '41010005823845840'.
when others.
exit.
endcase.
ls_edidd-sdata = ls_ka1.
append ls_edidd to int_edidd.
Regards
Maybe you are looking for
-
How do I create a new Itunes account for my external HD?
Hi. I am a graduate student with a huge amount of music files for academia. I store the academia music files on my external HD, since it will just take up too much space on my computer. I wanted to create a separate Itunes account just for my exter
-
Podcast - Download when Sync'ing iTunes say no longer exist
I decided to try and download Podcasts after getting a wee bit bored of them in the past. I went to the iTunes Store podcast section Selected Chris Moyles (non-enhanced) Russel Brand They both downloaded fine and are sat on my iTunes library. However
-
Help me choose between a G4 867 DP or 1.33 G4 Mac mini
What would be better to use for me? I do simple desktop publishing with Indesign and Photoshop CS, I need to choose between a MDD Dual 867 with 2 gig of ram, ATI 8500 video card, airport card and two SATA hard drives with a total of 360 GB of storage
-
Dear All, How to migrate/use the 3.5 macro code in BI 7 workbook environment...wats the function used to call macros.. in 3.5 we will use SAPBEx on Refresh.. what abt in BI 7. By Reddy
-
Have a solution to publish success
Ok sorry about my english. I try to publish my project with a Blog and have message all the time Error bla bla bla. Very fustration because i thing a lot people have a same stupid problem. Now i can publish perfeclty temporary my project iWeb 8 ,when