<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Adding new segment in IDOC in Application Development and Automation Discussions</title>
    <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697291#M890185</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;       i have a requirement where based on a condition i need to add a new segment dynamically in Inbound IDOC.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have written the code in the user exit of the inbound FM. Its adding new segments and process it perfectly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But when i see the IDOC in we02 or we19, i am not able to see the newly added segment. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Will the newly added segment in FM appear in the We02?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PS: i have changed the idoc_control-maxsegnum.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Niyaz&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 04 Apr 2008 03:19:22 GMT</pubDate>
    <dc:creator>Former Member</dc:creator>
    <dc:date>2008-04-04T03:19:22Z</dc:date>
    <item>
      <title>Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697291#M890185</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;       i have a requirement where based on a condition i need to add a new segment dynamically in Inbound IDOC.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have written the code in the user exit of the inbound FM. Its adding new segments and process it perfectly.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But when i see the IDOC in we02 or we19, i am not able to see the newly added segment. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Will the newly added segment in FM appear in the We02?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;PS: i have changed the idoc_control-maxsegnum.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Niyaz&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 03:19:22 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697291#M890185</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-04T03:19:22Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697292#M890186</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi there,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Enter transaction WE30 (ALE-&amp;gt;Extension-&amp;gt; IDOC types-&amp;gt;Maintain Idoc type)&lt;/P&gt;&lt;P&gt;- Type in your name of the extended IDOC type (usually starting with 'Z') and click on the Basic IDoc type, click the create icon. &lt;/P&gt;&lt;P&gt;- Click on Create new and enter a description and press enter.&lt;/P&gt;&lt;P&gt;- Click on ZIDOCTYPE01 and then on the Create icon.&lt;/P&gt;&lt;P&gt;- Enter ZIDOCTYPE as the segment type, click on Segment Editor.&lt;/P&gt;&lt;P&gt;- Enter a description for your segment type and create.&lt;/P&gt;&lt;P&gt;- Enter a description for your segment, enter each field required in your IDoc and press enter to validate.&lt;/P&gt;&lt;P&gt;- Save and generate, press back&lt;/P&gt;&lt;P&gt;- To release the segment choose Goto, Release from the menu.&lt;/P&gt;&lt;P&gt;- Check the box on the line of your segment.&lt;/P&gt;&lt;P&gt;- Save, back and enter.&lt;/P&gt;&lt;P&gt;- Your Idoc type structure should be displayed with your new segment.&lt;/P&gt;&lt;P&gt;- Save and back.&lt;/P&gt;&lt;P&gt;- To release the Idoc type choose Extras, Release type from the menu and Yes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Do reward if helpful and get back if u require any other help.&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 03:31:21 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697292#M890186</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-04T03:31:21Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697293#M890187</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Prem,&lt;/P&gt;&lt;P&gt;                   Thanks for ur reply. i need to create a std segment and fill it with values dynamically. not a custom segment.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 03:55:01 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697293#M890187</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-04T03:55:01Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697294#M890188</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope this helps ...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;CREATING AN IDOC&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;* Creating records
clear e1edp20.
idocdata-segnam = 'E1EDP20'.
e1edp20-edatu = ie020-sched_deliv_date.
e1edp20-wmeng = ie020-sched_qty.
idocdata-sdata = e1edp20.

idocdata-tabnam = idocdata-segnam.
seg_num = seg_num + 1.
idocdata-segnum = seg_num.
shift idocdata-segnum left deleting leading space.
append idocdata.
clear idocdata.

* Once IDoc detail is created
  CALL FUNCTION 'INBOUND_IDOC_PROCESS'
    TABLES
      IDOC_CONTROL       =  iedidc
      IDOC_DATA          =  idocdata.

  commit work.&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Reward points if helpful.&lt;/P&gt;&lt;P&gt;~&lt;SUB&gt;Lakshmiraj&lt;/SUB&gt;~&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 03:57:50 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697294#M890188</guid>
      <dc:creator>abapdeveloper20</dc:creator>
      <dc:date>2008-04-04T03:57:50Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697295#M890189</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Lakshmiraj,&lt;/P&gt;&lt;P&gt;                         I have done the same code. i have done it in my inbound FM user exit. so i cant call the 'INBOUND_IDOC_PROCESS' FM.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 04:05:28 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697295#M890189</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-04T04:05:28Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697296#M890190</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Niyaz,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Check out the below program ....Similar to your requirement&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;IDoc creation from inbound file&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;REPORT ZS7BM000006 message-id ZS7.
*______________________________________________________________________

*/ Program Name: Creation of DESADV &amp;amp; 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'.

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      DEFINITION:  append_idoc_rec
*&amp;amp;---------------------------------------------------------------------*
*       add a data record to the IDoc internal table
*----------------------------------------------------------------------*
define append_idoc_rec.

&amp;amp;1-tabnam = &amp;amp;1-segnam.
&amp;amp;2_seg_num = &amp;amp;2_seg_num + 1.
&amp;amp;1-segnum = &amp;amp;2_seg_num.
shift &amp;amp;1-segnum left deleting leading space.
append &amp;amp;1.
clear &amp;amp;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_&amp;lt;customer name abbreviation&amp;gt;_UTY
    concatenate p_path 'E021_' uty_vendors-name_abbr '_UTY'
        into infile.
    if not sy-subrc is initial.  "pathname too long
* Filename too long: &amp;amp;
      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 &amp;amp; on &amp;amp;'
      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: &amp;amp;
        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 &amp;amp; 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 &amp;amp; - &amp;amp;
            message i015 with infile sy-datum.
            exit.
        endcase.
      enddo.
      close dataset: infile, outfile.
      delete dataset infile.
    endif.
  endif.
endloop. "UTY_VENDORS

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  process_one_vendor
*&amp;amp;---------------------------------------------------------------------*
*       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 &amp;lt;&amp;gt; save_invoice or
         ie021-stat &amp;lt;&amp;gt; save_stat ).
      if sy-tabix &amp;gt; 1.
        perform post_idocs using ie021-stat.
      endif.
      perform idoc_header_segs using ie021-stat.
    endif.
    if ( ie021-stat &amp;lt;&amp;gt; save_stat or
         ie021-po_number &amp;lt;&amp;gt; save_po or
         ie021-po_lineno &amp;lt;&amp;gt; save_line or
         ie021-invoice_no &amp;lt;&amp;gt; save_invoice ).
      if ( sy-tabix &amp;gt; 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: &amp;amp;
  message s035 with infile.

ENDFORM.                    " process_one_vendor

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  convert_po_no
*&amp;amp;---------------------------------------------------------------------*
*       Break the PO number &amp;amp; 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: &amp;amp;
    message i034 with infield.
  endif.
ENDFORM.                    " convert_po_no

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  convert_dates
*&amp;amp;---------------------------------------------------------------------*
*       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 &amp;gt; 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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  quantity_conversion
*&amp;amp;---------------------------------------------------------------------*
*       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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  money_conversion
*&amp;amp;---------------------------------------------------------------------*
*       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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  SAP_vendor_partno
*&amp;amp;---------------------------------------------------------------------*
*       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 &amp;lt;&amp;gt; makt-maktx.
* 'Part No. Mismatch: PO &amp;amp; - &amp;amp;, Part sent &amp;amp;, SAP mat.no. &amp;amp;'
      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 &amp;amp; - PO &amp;amp; - &amp;amp;'
      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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  idoc_header_segs
*&amp;amp;---------------------------------------------------------------------*
*       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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  idoc_poheader_segs
*&amp;amp;---------------------------------------------------------------------*
*       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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  idoc_item_segs
*&amp;amp;---------------------------------------------------------------------*
*       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


***********************************************************************
*&amp;amp;    Form  post_idocs
*&amp;amp;---------------------------------------------------------------------*
*     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


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  init_desadv
*&amp;amp;---------------------------------------------------------------------*
*       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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  init_invoic
*&amp;amp;---------------------------------------------------------------------*
*       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&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;REWARD POINTS IF HELPFUL&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Lakshmiraj.A&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 04:12:32 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697296#M890190</guid>
      <dc:creator>abapdeveloper20</dc:creator>
      <dc:date>2008-04-04T04:12:32Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697297#M890191</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;       i need to add new segments in the inbound FM. i cant use edi_dd structure.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 04 Apr 2008 04:43:06 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697297#M890191</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-04T04:43:06Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697298#M890192</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Niyaz&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have also a similar requirement. Did you find any solution? I need to add sales order line item.. Please fwd me the code if possible.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 24 Apr 2008 11:55:43 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697298#M890192</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-24T11:55:43Z</dc:date>
    </item>
    <item>
      <title>Re: Adding new segment in IDOC</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697299#M890193</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;        you can add new segments in the IDOC. but the newly added segments wont be reflected in the original IDOC. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;regards,&lt;/P&gt;&lt;P&gt;Niyaz&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 24 Apr 2008 12:03:09 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/adding-new-segment-in-idoc/m-p/3697299#M890193</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2008-04-24T12:03:09Z</dc:date>
    </item>
  </channel>
</rss>

