Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

IDOC_INPUT_ORDERS segment E1EDKA1 is inheriting values from default

Former Member
0 Kudos

I'm trying to use a user exit in IDOC_INPUT_ORDERS ... function group VEDA.

What I want to do is clear the WE (ship to) DXVBADR segment and fill it with a diferent destination.

My problem is that some of the fields are overwritten by the customer address settings when it was created with transaction XD01.I can't seem to get any control over many of them. When I examine the code in IDOC_INPUT_ORDERS, I can see why. Many fields, example HAUSN aren't checked. They just get over-written by the default customer settings from XD01.

EXIT_SAPLVEDA_001 and EXIT_SAPLVEDA_002 don't seem to work.

If I could get control over EXIT_SAPLVEDA_002, I could modify the bdc lines for the ship to party. But, that seems very error prone to me.

Has anyone else encountered this problem?

7 REPLIES 7

Former Member
0 Kudos

I found a way to do handle this in IDOC_INPUT_ORDERS

0 Kudos

Hi Ed,

I'm facing the same problem. If you still remember your solution could you please describe it shortly.

Thanks

Stephan

0 Kudos

I couldn't find any "official" way to do it. So, I used EXIT_SAPLVEDA_002 to blow away all of the fields on the ship to address screen and rebuild it. This probably isn't the most elegant way to do it. But, it works for me and has been stable in my production system.

P.S.

I can't get my code pasting to format correctly.

I'm surrounding it by

 

but it isn't working today.

You may need to claw your way through this mess.


* FUNCTION EXIT_SAPLVEDA_002.
*&--------------------------------------------------------------
*&  Include           ZXVEDU04
*&--------------------------------------------------------------
*{   INSERT         ES1K900037                                  
*"--------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(DXVBAK) OPTIONAL
*"             VALUE(DVTCOMAG) OPTIONAL
*"             VALUE(DLAST_DYNPRO) OPTIONAL
*"             VALUE(DXMESCOD) LIKE  EDIDC-MESCOD OPTIONAL
*"       TABLES
*"              DXBDCDATA STRUCTURE  BDCDATA OPTIONAL
*"              DXVBAP OPTIONAL
*"              DXVBEP OPTIONAL
*"              DYVBEP OPTIONAL
*"              DXVBADR OPTIONAL
*"              DYVBADR OPTIONAL
*"              DXVBPA STRUCTURE  VBPAVB OPTIONAL
*"              DXVBUV OPTIONAL
*"              DIDOC_DATA STRUCTURE  EDIDD OPTIONAL
*"              DXKOMV OPTIONAL
*"              DXVEKP OPTIONAL
*"              DYVEKP OPTIONAL
*"       EXCEPTIONS
*"              USER_ERROR
*"--------------------------------------------------------------
*&==============================================================
*&                         MODIFICATION LOG
*&==============================================================
*&--------------------------------------------------------------
*& Developer    : Ed Baker (ebaker)
*& Date         : 5 November 2009
*& Change Marker: ejb091105
*& CTS request  : 800899
*& Transport    : DE1K980565
*& Description
*& -------------------------------------------------------------
*& Added:
*&  [1] Protection for NAME4 segments to preserve previous
*&      user exit functionality
*&  [2] Added insert of NAME3 segment
*& -------------------------------------------------------------

" EXIT_SAPLVEDA_002
data: ta_bdcdata            like bdcdata occurs 0.
data: ts_bdcdata            like bdcdata.
*>>>>>>>>>> Save NAME4 segment ejb091105 <<<<<<<<<<<START<
*"05.11.2009 06:57:13
* Holding table for NAME4 segments
* these need to be preserved for compatability with
* previous user ext.
data: ta_bdcdata_name4      like bdcdata occurs 0.
data: ts_bdcdata_name4      like bdcdata .
*>>>>>>>>>> Save NAME4 segments ejb091105 <<<<<<<<<<<END<
data: ta_idoc_data          like edidd occurs 0 .
data: ts_idoc_data          like edidd.
data: tmp_data              like bdcdata.
data: v_we_index            like sy-tabix.
data: v_v09c_index          like sy-tabix.
data: v_addr1_begin         like sy-tabix.
data: v_addr1_end           like sy-tabix.
data: v_index               like sy-tabix.
data: v_lines               type i.
data: v_string              type string.
data: v_sich_found          type c.
data: st_e1edka1            like e1edka1.
data: st_vbak               like vbak.

data: ra_vkorg like RANGE OF tvko-vkorg.
data: rs_vkorg like LINE OF ra_vkorg.

*& Build range table of allowed sales orgs
refresh ra_vkorg[].
rs_vkorg-sign = 'I'.
rs_vkorg-option = 'EQ'.
rs_vkorg-low = '0010'.
rs_vkorg-high = space.
APPEND rs_vkorg to ra_vkorg.

rs_vkorg-sign = 'I'.
rs_vkorg-option = 'EQ'.
rs_vkorg-low = '0020'.
rs_vkorg-high = space.
APPEND rs_vkorg to ra_vkorg.

rs_vkorg-sign = 'I'.
rs_vkorg-option = 'EQ'.
rs_vkorg-low = '0070'.
rs_vkorg-high = space.
APPEND rs_vkorg to ra_vkorg.

st_vbak = dxvbak.

*>>>>>>>>>> Wrapper for NAME4 check ejb091105 <<<<<<<<<<<START<
*"05.11.2009 08:25:40
"check st_vbak-vkorg in ra_vkorg .
if st_vbak-vkorg in ra_vkorg.
*>>>>>>>>>> Wrapper for NAME4 check ejb091105 <<<<<<<<<<<END<
  " VKORG check passed. Go ahead and convert the inputs
  " to internal tables with structures.
  ta_bdcdata[] = DXBDCDATA[].
  ta_idoc_data[] = DIDOC_DATA[].

  " Get the ship to address information
  READ TABLE ta_idoc_data into ts_idoc_data
    with key segnam = 'E1EDKA1'
             sdata+0(2) = 'WE'.
  IF sy-subrc = 0.
    st_e1edka1 = ts_idoc_data-sdata.
  ENDIF.

  " If the NAME1 field is blank, the default ship to address
  " is the same as the customer. Don't do anything. Just leave.
  check st_e1edka1-name1 ne space.

  " Wait until the SICH (SAVE) code is reached before doing
  " anything with the TA_BDCDATA table
  LOOP AT  ta_bdcdata into ts_bdcdata .
    if ts_bdcdata-fnam = 'BDC_OKCODE'
      and ts_bdcdata-FVAL = 'SICH'.
      v_sich_found = 'X'.
    endif.
  ENDLOOP .

  " the ta_bdcdata itab is stable once the SICH ok_code is found
  " you can go ahead and
  " process it and not have to worry about looping through it
  " multiple times
  IF v_sich_found = 'X'.

*  >>>>>>>>>> Preserve NAME4 segment ejb091105 <<<<<<<<<<<START<
*  "05.11.2009 07:01:15
  " Preserve any NAME4 segment for compatability
  " with previous user exit.
      LOOP AT ta_bdcdata into ts_bdcdata
        where fnam = 'NAME4'.
        ts_bdcdata_name4 = ts_bdcdata.
      ENDLOOP.
*  >>>>>>>>>> Preserve NAME4 segment ejb091105 <<<<<<<<<<<END<

  " First: find the line that says WE ship-to information is nex
      LOOP AT ta_bdcdata into ts_bdcdata .
        IF ts_bdcdata-program = 'SAPLV09C'.
          v_index = sy-tabix + 1 .
          read table ta_bdcdata INTO tmp_data
            index v_index .
          IF sy-subrc = 0.
            v_we_index = v_index .
            exit.
          ENDIF.
        ENDIF.
      ENDLOOP.

  " Second: find the line where the addr1_data segments start
  LOOP AT ta_bdcdata into ts_bdcdata .
    if sy-tabix > v_we_index.
      IF ts_bdcdata-program = 'SAPLV09C'.
        v_addr1_begin = sy-tabix + 1.
        exit.
      ENDIF.
    ENDIF.
  ENDLOOP.

  " Third: find the BDC_OKCODE for the last addr1_data
  LOOP AT ta_bdcdata into ts_bdcdata .
    IF sy-tabix > v_addr1_begin.
      IF  ts_bdcdata-fnam = 'BDC_OKCODE'
      and ts_bdcdata-fval = 'ENT1'.
        v_addr1_end = sy-tabix - 1 .
      ENDIF.
    ENDIF.
  ENDLOOP.

  " Fourth: delete all of the ADDR1_DATA lines
  " program SAPLV09C and screen 5000
  if v_addr1_begin > 0.

   " v_addr1_end
    delete ta_bdcdata
     from v_addr1_begin to v_addr1_end.
*  &============================================================
*  &============================================================
  " Fifth: build up whatever you want
*  &============================================================
*  &============================================================
      clear ts_bdcdata.
      ts_bdcdata-dynpro = '0000'.

      ts_bdcdata-fnam   = 'ADDR1_DATA-NAME1'.
      ts_bdcdata-fval   = st_e1edka1-name1.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      if st_e1edka1-name2 is initial.
        ts_bdcdata-fnam   = 'ADDR1_DATA-NAME2'.
        ts_bdcdata-fval   = ''.
      else.
        ts_bdcdata-fnam   = 'ADDR1_DATA-NAME2'.
        ts_bdcdata-fval   = st_e1edka1-name2 .
      endif.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

*  >>>>>>>>>> Add the NAME3 segment ejb091105 <<<<<<<<<<<START<
*  "05.11.2009 07:41:58
*  & Add the NAME3 segment. It's used sometimes
      if st_e1edka1-name3 is initial.
        ts_bdcdata-fnam   = 'ADDR1_DATA-NAME3'.
        ts_bdcdata-fval   = ''.
      else.
        ts_bdcdata-fnam   = 'ADDR1_DATA-NAME3'.
        ts_bdcdata-fval   = st_e1edka1-name3 .
      endif.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.
*  >>>>>>>>>> Add the NAME3 segment ejb091105 <<<<<<<<<<<END<

*  >>>>>>>>>>> Preserve NAME4 segment ejb091105 <<<<<<<<<<<<STAR
*  "05.11.2009 07:10:29
*  & Insert the preserved NAME4 segment
      IF not ts_bdcdata_name4 is initial.
        ts_bdcdata-fnam = 'ADDR1_DATA-NAME4'.
        ts_bdcdata-fval = ''.
      else.
        ts_bdcdata-fnam = 'ADDR1_DATA-NAME4'.
        ts_bdcdata-fval = ts_bdcdata_name4-fval.
      ENDIF.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.
*  >>>>>>>>>>> Preserve NAME4 segment ejb091105 <<<<<<<<<<<<END<

      ts_bdcdata-fnam   = 'ADDR1_DATA-STREET'.
      ts_bdcdata-fval   = st_e1edka1-stras.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

     if st_e1edka1-land1 = 'US'.
      ts_bdcdata-fnam   = 'ADDR1_DATA-HOUSE_NUM1'.
      ts_bdcdata-fval   = st_e1edka1-hausn.
     else.
      ts_bdcdata-fnam   = 'ADDR1_DATA-HOUSE_NUM1'.
      ts_bdcdata-fval   = ''.
     endif.
     insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
     add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'ADDR1_DATA-CITY1'.
      ts_bdcdata-fval   = st_e1edka1-ort01.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'ADDR1_DATA-CITY2'.
      ts_bdcdata-fval   = st_e1edka1-ort02 .  " implement county
                                              " ejb091118
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      if st_e1edka1-land1 = 'US'.
        ts_bdcdata-fnam   = 'ADDR1_DATA-REGION'.
        ts_bdcdata-fval   = st_e1edka1-regio.
      else.
        ts_bdcdata-fnam   = 'ADDR1_DATA-REGION'.
        ts_bdcdata-fval   = ''.
      endif.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      if st_e1edka1-land1 ne 'US'.
        ts_bdcdata-fnam   = 'ADDR1_DATA-TAXJURCODE'.
        ts_bdcdata-fval   = '' .
      endif.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'ADDR1_DATA-TIME_ZONE'.
      ts_bdcdata-fval   = ''.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'ADDR1_DATA-POST_CODE1' .
      ts_bdcdata-fval   = st_e1edka1-pstlz.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'ADDR1_DATA-COUNTRY'.
      ts_bdcdata-fval   = st_e1edka1-land1.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      IF st_e1edka1-telf1 ne space.
        ts_bdcdata-fnam   = 'SZA1_D0100-TEL_NUMBER'.
        ts_bdcdata-fval   = st_e1edka1-telf1 .
      else.
        ts_bdcdata-fnam   = 'SZA1_D0100-TEL_NUMBER'.
        ts_bdcdata-fval   = ''.
      ENDIF.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      ts_bdcdata-fnam   = 'SZA1_D0100-TEL_EXTENS'.
      ts_bdcdata-fval   = ''.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.

      if st_e1edka1-PFACH ne space.
       ts_bdcdata-fnam   = 'ADDR1_DATA-PO_BOX'.
       ts_bdcdata-fval   = st_e1edka1-PFACH.
      else.
        ts_bdcdata-fnam   = 'ADDR1_DATA-PO_BOX'.
        ts_bdcdata-fval   = ''.
      endif.
      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
      add 1 to v_addr1_begin.
*
*
*
*  " all remaining fields on the ship to screen will be blank.
*  *    ts_bdcdata-fnam = 'EXTENSION1'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'EXTENSION2'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'PO_BOX_CTY'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'PO_BOX_LOC'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'PO_BOX_REG'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'POST_CODE2'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'POST_CODE3'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'REMARK'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam = 'TIME_ZONE'.
*  *    ts_bdcdata-fval = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
*  " Fill in all of the SZA1_D0100 fields
*      IF st_e1edka1-telf1 ne space.
*        ts_bdcdata-fnam   = 'SZA1_D0100-TEL_NUMBER'.
*        ts_bdcdata-fval   = st_e1edka1-telf1 .
*      else.
*        ts_bdcdata-fnam   = 'SZA1_D0100-TEL_NUMBER'.
*        ts_bdcdata-fval   = ''.
*      ENDIF.
*      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*      add 1 to v_addr1_begin.
*
*      ts_bdcdata-fnam   = 'SZA1_D0100-MOB_NUMBER'.
*      ts_bdcdata-fval   = ''.
*      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*      add 1 to v_addr1_begin.
*
*      ts_bdcdata-fnam   = 'SZA1_D0100-FAX_NUMBER'.
*      ts_bdcdata-fval   = ''.
*      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*      add 1 to v_addr1_begin.
*
*      ts_bdcdata-fnam   = 'SZA1_D0100-FAX_NUMBER'.
*      ts_bdcdata-fval   = ''.
*      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*      add 1 to v_addr1_begin.
*
*      ts_bdcdata-fnam   = 'SZA1_D0100-SMTP_ADDR'.
*      ts_bdcdata-fval   = ''.
*      insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*      add 1 to v_addr1_begin.
*
*  *    ts_bdcdata-fnam   = 'SZA1_D0100-DEFLT_COMM'.
*  *    ts_bdcdata-fval   = ''.
*  *    insert ts_bdcdata into ta_bdcdata index v_addr1_begin .
*  *    add 1 to v_addr1_begin.
*
  endif.
  DXBDCDATA[] = ta_bdcdata[]. "restore the passed parameter
  ENDIF.
endif. " end of st_vbak test


*}   INSERT

loop at DXBDCDATA where FNAM = 'ADDR1_DATA-NAME4'.

  DXBDCDATA-FNAM = 'ADDR1_DATA-STR_SUPPL1'.
  Modify DXBDCDATA.

endloop.

0 Kudos

Pasting code doesn't seem to work here.

I know we can't post email addresses.

But, my name is edward baker and i work at thermofisher. Thermo is a commercial company.

Ed

0 Kudos

Use the Exit EXIT_SAPLVEDA_002 and read the ship to party from DXVBAK structure and modify with u r data and update using BDC...

Sample code is below...

IF dlast_dynpro = '4001'." Here u have to use screen number for ship-to party

CHECK l_vbak_added IS INITIAL.

  • Ok code for addition B Screen.

ls_vbak = dxvbak.

dxbdcdata-fnam = 'BDC_OKCODE'.

dxbdcdata-fval = '=KZKU'.

APPEND dxbdcdata.

CLEAR: dxbdcdata.

  • Additional data B screen

dxbdcdata-program = 'SAPMV45A'.

dxbdcdata-dynpro = '4002'.

dxbdcdata-dynbegin = 'X'.

APPEND dxbdcdata.

CLEAR: dxbdcdata.

  • Populate data." the below is custom fields data which are added in Additional TabA

dxbdcdata-fnam = 'ZSDSTRC_VBAK-ZZAWBNO1'.

dxbdcdata-fval = ls_vbak-ZZAWBNO1.

APPEND dxbdcdata.

CLEAR: dxbdcdata.

dxbdcdata-fnam = 'BDC_OKCODE'.

dxbdcdata-fval = '/EBACK'.

APPEND dxbdcdata.

CLEAR: dxbdcdata.

l_vbak_added = 'X'.

ENDIF.

Let me know still u r facing any issue..

Regards,

DSK

0 Kudos

Hi DS,

I'm not trying to start a flame war here. But, I don't think you're correct.

You can, indeed, change a given field with the EXIT_SAPLVEDA_002. But, and this is very important, it will only change the EXPLICIT field you program. All of the other fields from the default trading partner settings will bleed through.

This is default SAP behaviour. Try this. Start VA01 and popup the partner ship to address and start modifying it. You'll notice that you START with the default address information from the sold to party. You can change any field you want on the popup screens. But, the ones you don't touch will remain the same. You can wind up with a city/state/zip for the US becoming non-sense for another country.

i.e. "123 Main Street, Wilmington, DE, US" can become "12 Coventry, London, DE, GB" . In this case, I didn't blank the DE and wound up with a non-sensical address.

IDOC processing does the same thing.

If you want to completely erase the ship to address, and put in all new fields, you have to blank all of the existing fields that came with the ship to popup.

0 Kudos

Hi Ed,

Could you please explain how the issue was solved? We still have bizarre ship to addresses which are a mix of old and new fields. (I couldn't get much info from the code as 'bdcdata' is not filled in any of the exits during inbound idoc processing)

Cheers,

KC