Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
vimal
Active Participant
This blog is to help those who are looking for some exits for interfaces. We are trying to collate number of exits which can help in interfaces.

  1. MATMAS - Outbound idoc

    1. EXIT_SAPLMV01_002 - This can help in Outbound idocs where we have to modify values as per requirement. example code below:




DATA: ls_E1MARAM  TYPE e1maram,
ls_ZE1AUSP TYPE ze1ausp,
ls_ZE1MARAM TYPE ze1maram,
ls_EDIDD TYPE edidd,
ls_ZE1MVKEM TYPE ze1mvkem,
ls_E1MVKEM TYPE e1mvkem
.
CONSTANTS: lc_ZE1AUSP TYPE char7 VALUE 'ZE1AUSP',
lc_ZE1MARAM TYPE char8 VALUE 'ZE1MARAM',
lc_ZMATEXT TYPE char7 VALUE 'ZMATEXT',
lc_ZE1MVKEM TYPE char8 VALUE 'ZE1MVKEM'
.
idoc_cimtype = lc_ZMATEXT.
CASE segment_name.
WHEN 'E1MARAM'.
ls_E1MARAM = idoc_data-sdata.
"Fetch data from AUSP and add to custom fields
SELECT * INTO TABLE @DATA(lt_ausp) FROM ausp WHERE objek = @f_mara-matnr.
IF sy-subrc IS INITIAL.
idoc_cimtype = lc_ZMATEXT.
LOOP AT lt_ausp ASSIGNING FIELD-SYMBOL(<fs_ausp>).
ls_zE1AUSP-objek = <fs_ausp>-objek.
CALL FUNCTION 'CONVERSION_EXIT_ATINN_OUTPUT'
EXPORTING
input = <fs_ausp>-atinn
IMPORTING
output = ls_zE1AUSP-atinn.

* ls_zE1AUSP-atinn = <fs_ausp>-atinn.
ls_zE1AUSP-atwrt = <fs_ausp>-atwrt.
ls_edidd-segnam = lc_ZE1AUSP.
MOVE ls_zE1AUSP TO ls_edidd-sdata.
"Append to final table
APPEND ls_edidd TO idoc_data.
CLEAR:ls_edidd.
ENDLOOP.
ENDIF
ENDCASE.
ENDIF.

 

2) Good movement Interface(WMMBXY) : This  EXIT_SAPLLMDE_002 can help you with Goods movement inbound idoc.

3) Invoice idoc(EXIT_SAPLVEDF_002) : This EXIT_SAPLVEDF_002 can help you with INVOIC02 outbound idoc.

4) BADI ME_BAPI_PO_CUST - For PO inbound idocs. There are different methods for inbound and outbound . This can help you with changing values for PO. Sample code below for inbound idocs:

Below code is changing few values and also ensuring if ref. PO field is available then new PO gets created with ref. PO:

 
    "Initialization
CONSTANTS: lc_zbp1 TYPE char4 VALUE 'ZBP1'.
DATA: lt_ret TYPE STANDARD TABLE OF bapiret2,
lt_con TYPE STANDARD TABLE OF bapimepocond,
ls_con TYPE bapimepocond,
ls_conx TYPE bapimepocondx
.
"Refersh all variables
CLEAR: lt_ret, lt_con,
ls_con, ls_conx
.
"If vendor is not initial
IF ch_poheader-vendor IS NOT INITIAL.
"Do the conversion
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = ch_poheader-vendor
IMPORTING
output = ch_poheader-vendor.

* "Select from BUT000 based on ext. number and BU Group
SELECT SINGLE partner FROM but000 INTO @DATA(lv_partn1) WHERE bpext = @ch_poheader-vendor
AND bu_group = @lc_zbp1
.
IF sy-subrc IS INITIAL.
"Change LIFNR
ch_poheader-vendor = lv_partn1.
ENDIF.
ENDIF.
"look for PO, if it exists!
CALL FUNCTION 'BAPI_PO_GETDETAIL'
EXPORTING
purchaseorder = ch_poheader-po_number
TABLES
return = lt_ret
* pocond = lt_con
.
IF lt_ret IS NOT INITIAL.
* Create new PO case
LOOP AT ch_itemcond ASSIGNING FIELD-SYMBOL(<fs_cond>).
IF <fs_cond>-cond_type IS NOT INITIAL.
IF <fs_cond>-cond_type EQ 'PBXX'.
<fs_cond>-change_id = 'U'.
ELSE.
<fs_cond>-change_id = 'I'.
ENDIF.
ENDIF.
ENDLOOP.
ELSE.
"Commenting below FM would take away dump
* CALL FUNCTION 'BAPI_PO_GETDETAIL1'
* EXPORTING
* purchaseorder = ch_poheader-po_number
* TABLES
* return = lt_ret
* pocond = lt_con.
"Fetch conditon records !
SELECT SINGLE ebeln,
knumv INTO ( @DATA(lv_ebeln), @DATA(lv_knumv) )
FROM ekko WHERE ebeln = @ch_poheader-po_number.
IF sy-subrc IS INITIAL.
SELECT * FROM prcd_elements INTO TABLE @DATA(lt_prcd)
WHERE knumv = @lv_knumv
AND kposn = '1'
.
ENDIF.
* "Sort records
SORT ch_itemcond BY cond_type.
SORT lt_prcd BY kschl.
SORT ch_itemcondx BY cond_type.
"There are 3 scenerios:
* i) Update existing entries from idoc
* ii) Insert new entries from idoc
* iii) Delete existing entries which does not exist in PO
"Modification of existing PO case
LOOP AT ch_itemcond ASSIGNING FIELD-SYMBOL(<fs_cond2>).
IF <fs_cond2>-cond_type IS NOT INITIAL.
READ TABLE ch_itemcondx ASSIGNING FIELD-SYMBOL(<fs_condx>)
WITH KEY condition_no = <fs_cond2>-condition_no
itm_number = <fs_cond2>-itm_number
cond_st_no = <fs_cond2>-cond_st_no
BINARY SEARCH
.
* <No need of SY-SUBRC>
READ TABLE lt_prcd INTO DATA(ls_prcd)
WITH KEY kschl = <fs_cond2>-cond_type
BINARY SEARCH
.
IF sy-subrc IS INITIAL .
* Modify scenerio
<fs_cond2>-condition_no = ls_prcd-knumv. " Condition no.
<fs_cond2>-itm_number = ls_prcd-kposn. " item number
<fs_cond2>-cond_st_no = ls_prcd-stunr. " line no.
<fs_cond2>-change_id = 'U'.
"Pass X
<fs_condx>-condition_no = ls_prcd-knumv.
<fs_condx>-itm_number = ls_prcd-kposn.
<fs_condx>-cond_st_no = ls_prcd-stunr.
"abap_true
<fs_condx>-condition_nox = abap_true.
<fs_condx>-itm_numberx = abap_true.
<fs_condx>-change_id = abap_true.
<fs_condx>-cond_st_nox = abap_true.
ELSE.
READ TABLE lt_prcd INTO DATA(ls_prcd2) INDEX 1.
"Insert scenerio
<fs_cond2>-condition_no = ls_prcd2-knumv.
<fs_cond2>-itm_number = <fs_cond2>-itm_number.
<fs_cond2>-cond_st_no = <fs_cond2>-cond_st_no. " line no.
<fs_cond2>-change_id = 'I'.
"Pass X
<fs_condx>-condition_no = ls_prcd2-knumv.
<fs_condx>-itm_number = <fs_cond2>-itm_number.
<fs_condx>-cond_st_no = <fs_cond2>-cond_st_no.
<fs_condx>-condition_nox = abap_true.
<fs_condx>-itm_numberx = abap_true.
<fs_condx>-change_id = abap_true.
<fs_condx>-cond_st_nox = abap_true.
ENDIF.
ENDIF.
ENDLOOP.
"Delete scenerio
SORT lt_prcd BY kschl.
SORT ch_itemcond BY cond_type.

LOOP AT lt_prcd ASSIGNING FIELD-SYMBOL(<fs_del>).
IF <fs_del>-kschl IS NOT INITIAL.
READ TABLE ch_itemcond TRANSPORTING NO FIELDS
WITH KEY cond_type = <fs_del>-kschl
BINARY SEARCH.
IF sy-subrc IS NOT INITIAL.
"Delete scenerio
ls_con-condition_no = <fs_del>-knumv.
ls_con-cond_no = <fs_del>-knumh.
ls_con-itm_number = <fs_del>-kposn.
ls_con-cond_st_no = <fs_del>-stunr.
ls_con-cond_count = <fs_del>-zaehk."condition count
* ls_con-cond
ls_con-cond_type = <fs_del>-kschl."condition type
* ls_con-COND_VALUE = <fs_del>-KWERT."condition value
ls_con-CURRENCY = <fs_del>-WAERS.
* ls_con-CURRENCY_ISO = <fs_del>-WAERS.
ls_con-COND_UNIT = <fs_del>-kmein.
* ls_con-COND_P_UNT = <fs_del>-KPEIN.
ls_con-APPLICATIO = <fs_del>-kappl.
ls_con-CONPRICDAT = <fs_del>-kdatu.
ls_con-CALCTYPCON = <fs_del>-krech.
ls_con-CONBASEVAL = <fs_del>-kawrt.
ls_con-CONEXCHRAT = <fs_del>-kkurs.
ls_con-NUMCONVERT = <fs_del>-KUMZA.
ls_con-DENOMINATO = <fs_del>-KUMNE.
ls_con-CONDTYPE = <fs_del>-kntyp.
ls_con-CONDORIGIN = <fs_del>-KHERK.
ls_con-GROUPCOND = <fs_del>-KGRPE.
* ls_con-COND_UPDAT
ls_con-ACCESS_SEQ = <fs_del>-KOLNR.
ls_con-CONDCOUNT = <fs_del>-ZAEHK.
ls_con-CONDCLASS = <fs_del>-KOAID.
* ls_con-COND_UPDAT = 'X'.
ls_con-change_id = 'D'.
APPEND ls_con TO ch_itemcond.
SORT ch_itemcond BY cond_type.
CLEAR : ls_con.
"Pass X
ls_conx-condition_no = <fs_del>-knumv.
ls_conx-itm_number = <fs_del>-kposn.
ls_conx-cond_st_no = <fs_del>-stunr.
ls_conx-condition_nox = abap_true.
ls_conx-cond_type = abap_true.
ls_conx-itm_numberx = abap_true.
* ls_conx-cond_value = abap_true.
ls_conx-change_id = abap_true.
ls_conx-cond_st_nox = abap_true.
ls_conx-cond_count = abap_true.
ls_conx-condcntrl = abap_true.
ls_conx-condisacti = abap_true.
ls_conx-condclass = abap_true.
ls_conx-factbasval = abap_true.
ls_conx-scalebasin = abap_true.
ls_conx-scalbasval = abap_true.
ls_conx-unitmeasur = abap_true.
ls_conx-unitmeasur_iso = abap_true.
ls_conx-currenckey = abap_true.
ls_conx-currenckey_iso = abap_true.
ls_conx-condincomp = abap_true.
ls_conx-condconfig = abap_true.
ls_conx-condchaman = abap_true.
ls_conx-cond_no = abap_true.
ls_conx-change_id = abap_true.
ls_conx-vendor_no = abap_true.
APPEND ls_conx TO ch_itemcondx.
CLEAR: ls_conx.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.

Will keep updating this post. Please let me know if any questions.

 

Thanks,

Vimal