68
Custom BAPI creation - Step-by-step Procedure By Raghava Vakada, Mouri Tech Solutions Scenario: Step-by-step creation of a BAPI to retrieve fields from table T001. Procedure: Go to transaction SE11 and create a structure as shown or as per your requirement. Give the name in the Data type field and click create. In the pop-up that comes up, select the radio button “ structure”.

Custom BAPI Creation

Embed Size (px)

Citation preview

Page 1: Custom BAPI Creation

Custom BAPI creation - Step-by-step Procedure

By Raghava Vakada, Mouri Tech Solutions

Scenario: Step-by-step creation of a BAPI to retrieve fields from table T001.

Procedure: Go to transaction SE11 and create a structure as shown or as per your requirement.

Give the name in the Data type field and click create. 

 

 

In the pop-up that comes up, select the radio button “ structure”. 

Page 2: Custom BAPI Creation

In the components tab of the structure, give the different fields and their corresponding field types and press enter to check the compatibility and corrective ness.

 

Do not forget to save it in a package. You can even save it as a local object. For my example, I save it in a package. 

Page 3: Custom BAPI Creation

 

Check the structure (ctrl + F2) and activate (ctrl + F3) the structure. 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Now we are done with the creation of a Structure.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Go to transaction SE37 where you create function modules. Click on create after you enter the name of the Function module. 

Page 4: Custom BAPI Creation

A screen as shown above would pop-up where you mention the function group to save the function module and also provide some short text describing your function module. 

 

In the next pop-up that follows, click on continue as shown above. 

Page 5: Custom BAPI Creation

 

The function module screen would look like the one above. 

 

Go to the Attributes tab and select the radio button reading “remote-enabled module”. Come back to the imports tab and provide the import parameters as shown or as per your requirement. 

Page 6: Custom BAPI Creation

 

Now in the Export tab, provide the export parameters as shown or as per your requirement.  TYPE - BAPIRET2

 

In the tables tab, provide the information as shown or as per your requirement. 

 

The next screen you visit is the source code. It would look like this.

Page 7: Custom BAPI Creation

 

In the source code tab, write the following code in order to pick the data based on the input you provide. 

 

Now, save and check the code and activate the function module.

After successful activation, Go to the attributes tab. Go to Function moduleReleaseRelease. 

Page 8: Custom BAPI Creation

 

+++++++++++++++++++++++++++++++++++++++++++++++

Now we are done with the creation of a Function Module.

+++++++++++++++++++++++++++++++++++++++++++++++

Go to transaction SWO1 and enter the name of the BAPI you would like to create or as shown in the screen and click the create button. 

 

Give the name of the BAPI as above and click on create. 

Page 9: Custom BAPI Creation

 

Give the above-mentioned details and click on the continue icon. 

 

Save in a package. 

The resulting screen is as follows. 

Page 10: Custom BAPI Creation

 

Click on object type

Page 11: Custom BAPI Creation

Now click on the methods to drop down and see what methods are provided by default. There would be two methods, showing in red color which come by default while creating the BAPI.

Page 12: Custom BAPI Creation

 

 

Click or select the method as shown above and go to the path “UtilitiesAPI methodsAdd methods”. 

On the screen that follows, provide the function module name and click on the continue icon.

Page 13: Custom BAPI Creation

 

 

In the ultimate pop-up, click the next step icon. We observe that the information is predefined in the fields.

This is the next screen where you would just click on the “next” icon. 

Page 14: Custom BAPI Creation

 

 

Click on Yes. You can see an information message reading “ ZBAPIFMT001” inserted.

Now save after you add the method. Select & Double click on the API method.

Page 15: Custom BAPI Creation

Go to Tab: ABAP Check 'API Function'. 

 

 

The above screen is displayed. Go to the ABAP tab as shown below. 

Page 16: Custom BAPI Creation

 

Select the Radio button reading “API Function” as already said above. 

Page 17: Custom BAPI Creation

 

click on the continue icon to proceed further. 

Now select the Object “ZBAPI_T001” as shown below. 

 

Go to : EditChange Release StatusObject type To Modeled. 

Page 18: Custom BAPI Creation

 

The above shown screen will be displayed. Click on yes.

The message shows, The object type status set to modeled. (or already modeled) 

Go to : EditChange Release StatusObject type To Implemented.

Page 19: Custom BAPI Creation

 

You can see a message reading “Object type status set to implemented” 

Now, go to: EditChange Release StatusObjectTo Released.

 

There would be two pop ups coming up. Click continue on the Pop Ups. 

Keep the cursor on the 'Method'. 

Go to: EditChange Release StatusObject type componentTO Modeled. 

Page 20: Custom BAPI Creation

 

You can see the message reading “ status for method ‘zbapifmt001’ set to modeled”. 

Now, go to: EditChange Release StatusObject type component TO Implemented 

 

You can see the message reading “ status for method ‘zbapifmt001’ set to implemented”. 

Now go to: EditChange Releasse Status Object type component To Released 

Page 21: Custom BAPI Creation

 

You can see the message reading “ status for method ‘zbapifmt001’ set to Released”. 

Click on Generate Button. (the red ball kind of button is the Generate button) 

 

After clicking on the generate button, you can see the message reading “Object type 'ZBAPI_T001' generated successfully”.

Now go to BAPI Tcode (BOR) there we can find the BAPI (our BAPI) 

The BAPI browser would look like the screen below. 

Page 22: Custom BAPI Creation

 

You can click on the Alphabetical tab so that you can browse the BAPI’s in an alphabetical order. Find your BAPI as shown. 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Now we are done with the creation of a BAPI.

Page 23: Custom BAPI Creation

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Test Your BAPI. 

 

Enter the name of your BAPI in the transaction SWO1 and click on ‘Test’. 

 

The above screen is displayed. Click on the Execute icon against the BAPI as shown. 

Page 24: Custom BAPI Creation

 

 

The above screen is displayed where you would require entering the data against the empty input fields. 

 

Page 25: Custom BAPI Creation

We have entered some data in the Field. 

After entering the data, click on the execute icon as shown below. 

 

The following screen is displayed which has some values as is indicated by the ITEMTAB. 

 

Click on the Edit table icon as shown below. 

Page 26: Custom BAPI Creation

 

The results as per our input are as shown below. 

 

By this, we would get it confirmed that our BAPI is working properly. 

We can even check it by passing different values again. Come back to the input and execution screen. 

Page 27: Custom BAPI Creation

 

After executing the BAPI based on the input provided, we get the following screen. 

 

Hit on the execute icon.

Page 28: Custom BAPI Creation

 

In the above shown screen, hit on the edit table icon. 

 

The above is the output we get from the input we provided. 

======================================================================

Automatic Vendor Debit Posting

Submitted by Vikram

Please note that there are some custom fields added in the VBAP table, custom message class and custom include program used in this program. Unfortunately, the contributor couldn't provide us with the functional/technical specifications for this program.

REPORT ZAUTO_DEBIT_VENDOR NO STANDARD PAGE HEADING LINE-SIZE 250

Page 29: Custom BAPI Creation

LINE-COUNT 65(2) MESSAGE-ID ZSCM. ************************************************************************* Program name : ZAUTO_DEBIT_VENDOR* Type : Report* Description : Automatic Vendor Dedit Postings************************************************************************

*---------------------------------------------------------------------** TABLES*---------------------------------------------------------------------*TABLES: VBAK, ADR6, TRDYSE01CM. *---------------------------------------------------------------------** INCLUDE*---------------------------------------------------------------------*INCLUDE ZZUTI_STD_HEADER_FOOTER. "Standard header and footer *----------------------------------------------------------------------** TYPES DECLARATION*----------------------------------------------------------------------*TYPES: BEGIN OF T_CRMEMO, VBELN TYPE VBAK-VBELN, POSNR TYPE VBAP-POSNR, ERDAT TYPE VBAK-ERDAT, AUART TYPE VBAK-AUART, AUGRU TYPE VBAK-AUGRU, WAERK TYPE VBAK-WAERK, VKORG TYPE VBAK-VKORG, VTWEG TYPE VBAK-VTWEG, SPART TYPE VBAK-SPART, VDATU TYPE VBAK-VDATU, BSTNK TYPE VBAK-BSTNK, BSARK TYPE VBAK-BSARK, BSTDK TYPE VBAK-BSTDK, AEDAT TYPE VBAK-AEDAT, BUKRS_VF TYPE VBAK-BUKRS_VF, MATNR TYPE VBAP-MATNR, ZMENG TYPE VBAP-ZMENG, ZIEME TYPE VBAP-ZIEME, END OF T_CRMEMO,  BEGIN OF T_CRMEMO_CHANGE, VBELN(90) TYPE C, POSNR TYPE VBAP-POSNR, ERDAT TYPE VBAK-ERDAT, AUART TYPE VBAK-AUART, AUGRU TYPE VBAK-AUGRU, WAERK TYPE VBAK-WAERK, VKORG TYPE VBAK-VKORG, VTWEG TYPE VBAK-VTWEG, SPART TYPE VBAK-SPART, VDATU TYPE VBAK-VDATU,

Page 30: Custom BAPI Creation

BSTNK TYPE VBAK-BSTNK, BSARK TYPE VBAK-BSARK, BSTDK TYPE VBAK-BSTDK, AEDAT TYPE VBAK-AEDAT, BUKRS_VF TYPE VBAK-BUKRS_VF, MATNR TYPE VBAP-MATNR, ZMENG TYPE VBAP-ZMENG, ZIEME TYPE VBAP-ZIEME, END OF T_CRMEMO_CHANGE,  BEGIN OF T_MVKE, MATNR TYPE MVKE-MATNR, VKORG TYPE MVKE-VKORG, VTWEG TYPE MVKE-VTWEG, MTPOS TYPE MVKE-MTPOS, END OF T_MVKE,  BEGIN OF T_ORDERS, VBELV TYPE VBFA-VBELV, POSNV TYPE VBFA-POSNV, VBELN TYPE VBFA-VBELN, POSNN TYPE VBFA-POSNN, VBTYP_N TYPE VBFA-VBTYP_N, END OF T_ORDERS,  BEGIN OF T_EKPO, EBELN TYPE EKKO-EBELN, EBELP TYPE EKPO-EBELP, WAERS TYPE EKKO-WAERS, MENGE TYPE EKPO-MENGE, MEINS TYPE EKPO-MEINS, NETPR TYPE EKPO-NETPR, PEINH TYPE EKPO-PEINH, mwskz TYPE EKPO-mwskz, TXJCD TYPE EKPO-TXJCD, END OF T_EKPO,  BEGIN OF T_EKBE, EBELN TYPE EKBE-EBELN, EBELP TYPE EKBE-EBELP, ZEKKN TYPE EKBE-ZEKKN, VGABE TYPE EKBE-VGABE, GJAHR TYPE EKBE-GJAHR, BELNR TYPE EKBE-BELNR, BUZEI TYPE EKBE-BUZEI, END OF T_EKBE,  BEGIN OF T_RBKP, BELNR TYPE RBKP-BELNR, GJAHR TYPE RBKP-GJAHR, BLDAT TYPE RBKP-BLDAT, BUDAT TYPE RBKP-BUDAT, XBLNR TYPE RBKP-XBLNR, LIFNR TYPE RBKP-LIFNR, RMWWR TYPE RBKP-RMWWR, WMWST1 TYPE RBKP-WMWST1, XRECH TYPE RBKP-XRECH,

Page 31: Custom BAPI Creation

STBLG TYPE RBKP-STBLG, END OF T_RBKP,  BEGIN OF T_CDHDR, OBJECTCLAS TYPE CDHDR-OBJECTCLAS, OBJECTID TYPE CDHDR-OBJECTID, CHANGENR TYPE CDHDR-CHANGENR, UDATE TYPE CDHDR-UDATE, UTIME TYPE CDHDR-UTIME, END OF T_CDHDR,  BEGIN OF T_CDPOS, OBJECTCLAS TYPE CDHDR-OBJECTCLAS, OBJECTID TYPE CDHDR-OBJECTID, CHANGENR TYPE CDHDR-CHANGENR, TABNAME TYPE CDPOS-TABNAME, TABKEY TYPE CDPOS-TABKEY, FNAME TYPE CDPOS-FNAME, CHNGIND TYPE CDPOS-CHNGIND, VALUE_NEW TYPE CDPOS-VALUE_NEW, VALUE_OLD TYPE CDPOS-VALUE_OLD, END OF T_CDPOS,  BEGIN OF T_CHANGE_DOCS, OBJECTCLAS TYPE CDHDR-OBJECTCLAS, OBJECTID TYPE CDHDR-OBJECTID, CHANGENR TYPE CDHDR-CHANGENR, UDATE TYPE CDHDR-UDATE, UTIME TYPE CDHDR-UTIME, TABNAME TYPE CDPOS-TABNAME, TABKEY TYPE CDPOS-TABKEY, FNAME TYPE CDPOS-FNAME, CHNGIND TYPE CDPOS-CHNGIND, VALUE_NEW TYPE CDPOS-VALUE_NEW, VALUE_OLD TYPE CDPOS-VALUE_OLD, END OF T_CHANGE_DOCS,  BEGIN OF T_SUCCESS, crmemo TYPE VBAK-vbeln, cmemo TYPE VBAK-vbeln, orders TYPE VBAK-vbeln, po TYPE VBAK-vbeln, miro_no TYPE VBAK-vbeln, text(20) TYPE C, END OF T_SUCCESS,  BEGIN OF T_ERROR, crmemo TYPE VBAK-vbeln, cmemo TYPE VBAK-vbeln, orders TYPE VBAK-vbeln, po TYPE VBAK-vbeln, miro_no TYPE VBAK-vbeln, text(100) TYPE C, END OF T_ERROR. *----------------------------------------------------------------------** WORKAREA DECLARATION

Page 32: Custom BAPI Creation

*----------------------------------------------------------------------*DATA: WA_CRMEMO TYPE T_CRMEMO, WA_CRMEMO_CHANGE TYPE T_CRMEMO_CHANGE, WA_MVKE TYPE T_MVKE, WA_ORDERS TYPE T_ORDERS, WA_CMEMO TYPE T_ORDERS, WA_PO TYPE T_ORDERS, WA_EKPO TYPE T_EKPO, WA_EKBE TYPE T_EKBE, WA_EKBE_TEMP TYPE T_EKBE, WA_RBKP TYPE T_RBKP, WA_RBKP_TMP TYPE T_RBKP, WA_CDHDR TYPE T_CDHDR, WA_CDPOS TYPE T_CDPOS, WA_CHANGE_DOCS TYPE T_CHANGE_DOCS, WA_CRMEMO_MR8M TYPE T_CRMEMO, WA_SUCCESS TYPE T_SUCCESS, WA_ERROR TYPE T_ERROR, WA_SUCCESS_MR8M TYPE T_SUCCESS, WA_ERROR_MR8M TYPE T_ERROR. *--Work area for all the internal tables used for Sending MailDATA : WA_OBJPACK TYPE SOPCKLSTI1, WA_OBJHEAD TYPE SOLISTI1, WA_OBJBIN TYPE SOLISTI1, WA_OBJTXT TYPE SOLISTI1, WA_RECLIST TYPE SOMLRECI1 . DATA:*-- Structure to hold Invoice Header Data x_docheader LIKE bapi_incinv_create_header,*-- Structure to hold Reversal Posting Data x_rev_post LIKE BAPI_INCINV_FLD. *----------------------------------------------------------------------** INTERNAL TAABLE DECLARATION*----------------------------------------------------------------------*DATA: IT_CRMEMO TYPE STANDARD TABLE OF T_CRMEMO WITH HEADER LINE, IT_CRMEMO_CHANGE TYPE STANDARD TABLE OF T_CRMEMO_CHANGE WITH HEADER LINE, IT_MVKE TYPE STANDARD TABLE OF T_MVKE WITH HEADER LINE, IT_CRMEMO_MIRO TYPE STANDARD TABLE OF T_CRMEMO WITH HEADER LINE, IT_CRMEMO_MR8M TYPE STANDARD TABLE OF T_CRMEMO WITH HEADER LINE, IT_ORDERS TYPE STANDARD TABLE OF T_ORDERS WITH HEADER LINE, IT_CMEMO TYPE STANDARD TABLE OF T_ORDERS WITH HEADER LINE, IT_PO TYPE STANDARD TABLE OF T_ORDERS WITH HEADER LINE, IT_EKPO TYPE STANDARD TABLE OF T_EKPO WITH HEADER LINE, IT_EKBE TYPE STANDARD TABLE OF T_EKBE WITH HEADER LINE, IT_EKBE_TEMP TYPE STANDARD TABLE OF T_EKBE WITH HEADER LINE, IT_RBKP TYPE STANDARD TABLE OF T_RBKP WITH HEADER LINE, IT_CDHDR TYPE STANDARD TABLE OF T_CDHDR WITH HEADER LINE, IT_CDPOS TYPE STANDARD TABLE OF T_CDPOS WITH HEADER LINE, IT_CHANGE_DOCS TYPE STANDARD TABLE OF T_CHANGE_DOCS WITH HEADER LINE, IT_SUCCESS TYPE STANDARD TABLE OF T_SUCCESS WITH HEADER LINE, IT_ERROR TYPE STANDARD TABLE OF T_ERROR WITH HEADER LINE,

Page 33: Custom BAPI Creation

IT_SUCCESS_MR8M TYPE STANDARD TABLE OF T_SUCCESS WITH HEADER LINE, IT_ERROR_MR8M TYPE STANDARD TABLE OF T_ERROR WITH HEADER LINE.  *-- Internal table to hold Invoice Item DataDATA:BEGIN OF it_itemdata OCCURS 0. INCLUDE STRUCTURE bapi_incinv_create_item.DATA:END OF it_itemdata. *-- Internal table to hold Invoice Acct Assignment DataDATA:BEGIN OF it_ACCOUNTingdata OCCURS 0. INCLUDE STRUCTURE BAPI_INCINV_CREATE_ACCOUNT.DATA:END OF it_accountingdata. *-- Internal table to hold BAPI return dataDATA: BEGIN OF it_return OCCURS 0. INCLUDE STRUCTURE bapiret2. "Return Parameter.DATA: END OF it_return. *-- Internal table to hold BAPI return dataDATA: BEGIN OF it_return_mr8m OCCURS 0. INCLUDE STRUCTURE bapiret2. "Return Parameter.DATA: END OF it_return_mr8m. *--MAIL related Internal tablesDATA: X_DOC_CHNG TYPE SODOCCHGI1, " document attributes IT_OBJPACK TYPE STANDARD TABLE OF SOPCKLSTI1, " attachment table IT_OBJHEAD TYPE STANDARD TABLE OF SOLISTI1, " object header table IT_OBJBIN TYPE STANDARD TABLE OF SOLISTI1, " binary table IT_OBJTXT TYPE STANDARD TABLE OF SOLISTI1, " object text IT_RECLIST TYPE STANDARD TABLE OF SOMLRECI1, " mail recipients it_compressed_list TYPE STANDARD TABLE OF SOLI, it_pdf_list TYPE STANDARD TABLE OF TLINE, it_pdf TYPE tline OCCURS 10 WITH HEADER LINE, it_html TYPE solisti1 OCCURS 10 WITH HEADER LINE,*-- Internal table for MIME data (in CHAR format) it_temp TYPE bapiqcmime OCCURS 10 WITH HEADER LINE,*-- Internal table for storing data it_mime(255) TYPE c OCCURS 10 WITH HEADER LINE. *----------------------------------------------------------------------** GLOBAL VARIABLES **----------------------------------------------------------------------*DATA: V_PGM_ID TYPE SY-REPID, " Program id v_zterm TYPE lfb1-zterm, " Payment Terms v_text(75) TYPE c, " To store error or success text v_itemno(6) TYPE n, " To Increment Item No. for BAPI v_docnr LIKE bapi_incinv_fld-inv_doc_no, " For MIRO document number v_year1 LIKE bapi_incinv_fld-fisc_year, " For MIRO Fiscal year v_spono type TSP01-RQIDENT, " For Spool No. v_type type SOODK-OBJTP, " For Spool Type V_CRMEMO_QTY TYPE VBAP-ZMENG, " For CR Memo Qty. V_LINE_AMOUNT TYPE EKPO-NETPR, " For CR Memo Item Qty. V_GROSSAMT TYPE EKPO-NETPR, " For CR Memo Grand Qty.

Page 34: Custom BAPI Creation

v_tax_per(3) type n, " For CR Memo Tax amount % v_tax_amt TYPE EKPO-NETPR, " For CR Memo Tax amount v_flag(1) type c, " Flag to process fruther v_tot_s_mr8m TYPE i, " For MR8M Success Records v_tot_e_mr8m TYPE i, " For MR8M Error Records V_DATE TYPE SY-DATUM, " For Sel. Screen Date V_DATE2(10) TYPE C, " For EMail Date V_TIME(10) TYPE C, " For EMail Time V_TIME2(10) TYPE C, " For EMail Time V_INFO(100) TYPE C, " For EMail Body Text V_TABLE_LINES TYPE SY-TABIX, " To Increment Email Count V_TEXT2 TYPE STRING , " For EMail Id text v_lines TYPE i, " To Store PDF Lines v_temp(500) TYPE c, " To Convert to 255 char format v_offset TYPE p, " To Convert to 255 char format v_lineslen TYPE i, " To Convert to 255 char format v_mimelen TYPE i, " To Convert to 255 char format v_tabix type sy-tabix. " To Convert to 255 char format *----------------------------------------------------------------------** CONSTANTS **----------------------------------------------------------------------*CONSTANTS: C_X(1) TYPE C VALUE 'X', " Constant X or Flag C_E(1) TYPE C VALUE 'E', " For Error check c_v(1) TYPE C VALUE 'V', " For PO Docs c_o(1) TYPE C VALUE 'O', " For Order Docs c_c(1) TYPE C VALUE 'C', " For Credit Memo Docs c_k(1) TYPE C VALUE 'K', " For CR Memo Docs c_u(1) TYPE C VALUE 'U', " For Change tables Update c_ali(3) TYPE C VALUE 'ALI', " For ALI Format c_vbak(4) TYPE C VALUE 'VBAK', " For Change docs table C_01(2) TYPE C VALUE '01', " For Serial No. & Reversal Reason C_02(2) TYPE C VALUE '02', " For Reversal Reason c_blart TYPE bkpf-blart VALUE 'RE', " Document type C_MTPOS TYPE MVKE-MTPOS VALUE 'BANS', " Item Category group C_AUGRU(5) TYPE C VALUE 'AUGRU', " Reason Code C_0000500205(10) TYPE C VALUE '0000500205', " GL Account # C_VERKBELEG(9) TYPE C VALUE 'VERKBELEG'. " For Object Class *-- Horizontal tab & line feed constantsCLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.CONSTANTS: C_TAB TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB, C_CR_LF TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF . 

Page 35: Custom BAPI Creation

*----------------------------------------------------------------------** SELECTION SCREEN*----------------------------------------------------------------------**-- Select OptonsSELECTION-SCREEN: BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: S_AUART FOR VBAK-AUART OBLIGATORY NO INTERVALS, " Sales Document Type S_AUGRU FOR VBAK-AUGRU OBLIGATORY NO INTERVALS, " Order reason S_ERDAT FOR VBAK-ERDAT OBLIGATORY. " Date on which the record was createdSELECTION-SCREEN: END OF BLOCK B01. *-- Mail Sending OptionsSELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-004. PARAMETERS:P_EMAIL AS CHECKBOX DEFAULT SPACE USER-COMMAND V_COM . PARAMETERS : P_MODE TYPE SO_ESCAPE default 'U' MODIF ID US1. SELECT-OPTIONS: S_EMAIL FOR ADR6-SMTP_ADDR NO INTERVALS MODIF ID US2.* SELECT-OPTIONS: S_EMAIL FOR TRDYSE01CM-USERNAME* NO INTERVALS MODIF ID US2.  SELECTION-SCREEN: BEGIN OF LINE. SELECTION-SCREEN: COMMENT 55(40) TEXT-019 MODIF ID US2. SELECTION-SCREEN: END OF LINE. SELECTION-SCREEN END OF BLOCK B2. *----------------------------------------------------------------------** WORK AREA for SELECT-OPTIONS*----------------------------------------------------------------------*DATA : X_EMAIL LIKE S_EMAIL. "Work area for EMAIL select-options *----------------------------------------------------------------------** INITIALIZATION*----------------------------------------------------------------------*INITIALIZATION.*-- Default values for Sales Document Type CLEAR S_AUART[]. S_AUART-SIGN = 'I'. S_AUART-OPTION = 'EQ'. S_AUART-LOW = 'CR'. APPEND S_AUART. CLEAR S_AUART. *-- Default values for Date on which the record was created V_DATE = ( SY-DATUM - 1 ). CLEAR S_ERDAT[]. S_ERDAT-SIGN = 'I'. S_ERDAT-OPTION = 'EQ'. S_ERDAT-LOW = SY-DATUM. S_ERDAT-HIGH = SY-DATUM. APPEND S_ERDAT. CLEAR S_ERDAT. *----------------------------------------------------------------------** TOP OF PAGE *

Page 36: Custom BAPI Creation

*----------------------------------------------------------------------*TOP-OF-PAGE.*-- Displaying standard header. PERFORM std_top_of_page USING sy-title. *----------------------------------------------------------------------** A T S E L E C T I O N S C R E E N O U T P U T*----------------------------------------------------------------------**-- For modifying the selection screen layoutAT SELECTION-SCREEN OUTPUT. PERFORM F_MODIFY_SCREEN. *----------------------------------------------------------------------** AT SELECTION SCREEN. **----------------------------------------------------------------------*AT SELECTION-SCREEN.*-- Subroutine to Validate selection screen fields PERFORM f_validate. *----------------------------------------------------------------------** START-OF-SELECTION **----------------------------------------------------------------------*START-OF-SELECTION.*-- Fetch the Credit Memo Requests documents PERFORM F_GET_CREDIT_MEMO_REQUEST.  IF NOT IT_CRMEMO[] IS INITIAL.*-- Fetch Item Category Group PERFORM F_GET_MVKE_DOCS. *-- Fetch Sales Order documents, PO Documents and Credit Memos PERFORM F_GET_SO_PO_DOCS. ENDIF. *-- If Credit memo request internal table have an change records then* fetch the change documents from CDHDR and CDPOS IF NOT IT_CRMEMO_CHANGE[] IS INITIAL.*-- Fetch Change Documents for CR Memos from CDHDR and CDPOS tables PERFORM F_GET_CHANGED_DOCS. ENDIF. *-- Fetch Purchasing Document Item Details IF NOT IT_PO[] IS INITIAL. PERFORM F_GET_EKPO. ENDIF. *-- Fetch MIRO Vendor based on the PO Details IF NOT IT_EKPO[] IS INITIAL. PERFORM F_GET_VENDOR. ENDIF. *----------------------------------------------------------------------** END-OF-SELECTION **----------------------------------------------------------------------* if v_flag is initial.*-- Process Vendor Debit Postings PERFORM F_PROCESS_MIRO.

Page 37: Custom BAPI Creation

 *-- Process Reversal Postings of Vendor Automatic Debits using TCODE MR8M PERFORM F_PROCESS_MR8M. *-- Send mail,if user enters Email id's and Email Mode is not initial IF P_EMAIL = C_X AND P_MODE IS NOT INITIAL AND S_EMAIL[] IS NOT INITIAL. *-- Get spool id perform f_spool_id. *-- EMail Logic PERFORM F_MAIL_LOGIC. ENDIF. *-- display the EMail RSCONN01 and Sussess and Error records of MIRO and MR8M perform f_display_report.  else.*-- Else exit the process exit. endif. *&---------------------------------------------------------------------**& Form F_MODIFY_SCREEN*&---------------------------------------------------------------------** A Form routine to modify the screen*----------------------------------------------------------------------*FORM F_MODIFY_SCREEN . *-- To Modify Mail Sending Options LOOP AT SCREEN. IF P_EMAIL = C_X. IF SCREEN-GROUP1 = 'US1' . SCREEN-INVISIBLE = 0. SCREEN-ACTIVE = 1. SCREEN-INPUT = 0. MODIFY SCREEN. ENDIF. IF SCREEN-GROUP2 = 'US2' . SCREEN-INVISIBLE = 0. SCREEN-ACTIVE = 1. MODIFY SCREEN. ENDIF. ELSEIF P_EMAIL = SPACE. IF SCREEN-GROUP1 = 'US1' . SCREEN-INVISIBLE = 1. SCREEN-ACTIVE = 0. MODIFY SCREEN. ENDIF. IF SCREEN-GROUP1 = 'US2' . SCREEN-INVISIBLE = 1. SCREEN-ACTIVE = 0. MODIFY SCREEN. ENDIF. ENDIF. ENDLOOP. 

Page 38: Custom BAPI Creation

ENDFORM. " F_MODIFY_SCREEN *&---------------------------------------------------------------------**& Form f_validate*&---------------------------------------------------------------------** Validation of Selection-Screen Inputs*----------------------------------------------------------------------*FORM f_validate . *-- Validate Sales Document Type if not s_AUART[] is initial. select AUART into s_AUART-low from TVAK up to 1 rows where AUART in s_AUART. endselect. if sy-subrc <> 0. message E000 with 'Invalid Sales Document Type'(e01) . endif. ENDIF. *-- Validate Order reason (reason for the business transaction) if not s_AUGRU[] is initial. select AUGRU into s_AUGRU-low from TVAU up to 1 rows where AUGRU in s_AUGRU. endselect. if sy-subrc <> 0. message E000 with 'Invalid Order reason'(e02) . endif. endif.ENDFORM. " f_validate *&---------------------------------------------------------------------**& Form F_GET_CREDIT_MEMO_REQUEST*&---------------------------------------------------------------------** Fetch Credit memo requests from VBAK & VBAP*----------------------------------------------------------------------*FORM F_GET_CREDIT_MEMO_REQUEST .  SELECT A~VBELN B~POSNR A~ERDAT A~AUART A~AUGRU A~WAERK A~VKORG A~VTWEG A~SPART A~VDATU A~BSTNK A~BSARK A~BSTDK A~AEDAT A~BUKRS_VF B~MATNR

Page 39: Custom BAPI Creation

B~ZMENG B~ZIEME INTO TABLE IT_CRMEMO FROM ( VBAK AS A INNER JOIN VBAP AS B ON A~VBELN = B~VBELN ) WHERE ( A~ERDAT IN S_ERDAT OR A~AEDAT IN S_ERDAT ) AND A~AUART IN S_AUART. IF SY-SUBRC = 0. SORT IT_CRMEMO BY VBELN POSNR. ELSE. MESSAGE I000 WITH 'No Credit Memo Request selected'(002). v_flag = C_X. stop. ENDIF. ENDFORM. " F_GET_CREDIT_MEMO_REQUEST *&---------------------------------------------------------------------**& Form F_GET_MVKE_DOCS*&---------------------------------------------------------------------** Fetch Sales Data for Material*----------------------------------------------------------------------*FORM F_GET_MVKE_DOCS .  DATA: LV_TABIX TYPE SY-TABIX. *-- Fetch Sales Data for Material SELECT MATNR " Material Number VKORG " Sales Organization VTWEG " Distribution Channel MTPOS " Item category group from material master FROM MVKE " Sales Data for Material INTO TABLE IT_MVKE FOR ALL ENTRIES IN IT_CRMEMO WHERE MATNR = IT_CRMEMO-MATNR AND VKORG = IT_CRMEMO-VKORG AND VTWEG = IT_CRMEMO-VTWEG. IF SY-SUBRC = 0. SORT IT_MVKE BY MATNR VKORG VTWEG MTPOS. ENDIF. *-- Validate Item category group if MVKE-MTOPS <> 'BANS' then ignore CM Request line item LOOP AT IT_CRMEMO INTO WA_CRMEMO. LV_TABIX = SY-TABIX. READ TABLE IT_MVKE INTO WA_MVKE WITH KEY MATNR = WA_CRMEMO-MATNR VKORG = WA_CRMEMO-VKORG VTWEG = WA_CRMEMO-VTWEG MTPOS = C_MTPOS BINARY SEARCH. IF SY-SUBRC <> 0. DELETE IT_CRMEMO INDEX LV_TABIX. " Delete CR memo records ELSE.*-- Else check for credit memo request change date is not initial, and* append those records to IT_CRMEMO_CHANGE internal table to retrive* change documents

Page 40: Custom BAPI Creation

IF NOT WA_CRMEMO-AEDAT IS INITIAL. WA_CRMEMO_CHANGE-VBELN = WA_CRMEMO-VBELN. WA_CRMEMO_CHANGE-POSNR = WA_CRMEMO-POSNR. WA_CRMEMO_CHANGE-ERDAT = WA_CRMEMO-ERDAT. WA_CRMEMO_CHANGE-AUART = WA_CRMEMO-AUART. WA_CRMEMO_CHANGE-AUGRU = WA_CRMEMO-AUGRU. WA_CRMEMO_CHANGE-WAERK = WA_CRMEMO-WAERK. WA_CRMEMO_CHANGE-VKORG = WA_CRMEMO-VKORG. WA_CRMEMO_CHANGE-VTWEG = WA_CRMEMO-VTWEG. WA_CRMEMO_CHANGE-SPART = WA_CRMEMO-SPART. WA_CRMEMO_CHANGE-VDATU = WA_CRMEMO-VDATU. WA_CRMEMO_CHANGE-BSTNK = WA_CRMEMO-BSTNK. WA_CRMEMO_CHANGE-BSARK = WA_CRMEMO-BSARK. WA_CRMEMO_CHANGE-BSTDK = WA_CRMEMO-BSTDK. WA_CRMEMO_CHANGE-AEDAT = WA_CRMEMO-AEDAT. WA_CRMEMO_CHANGE-BUKRS_VF = WA_CRMEMO-BUKRS_VF. WA_CRMEMO_CHANGE-MATNR = WA_CRMEMO-MATNR. WA_CRMEMO_CHANGE-ZMENG = WA_CRMEMO-ZMENG. WA_CRMEMO_CHANGE-ZIEME = WA_CRMEMO-ZIEME. APPEND WA_CRMEMO_CHANGE TO IT_CRMEMO_CHANGE. CLEAR WA_CRMEMO_CHANGE. ENDIF. ENDIF. ENDLOOP. ENDFORM. " F_GET_MVKE_DOCS *&---------------------------------------------------------------------**& Form F_GET_SO_PO_DOCS*&---------------------------------------------------------------------** Fetch the Sales Order documents, PO documents, & Credit Memo*----------------------------------------------------------------------*FORM F_GET_SO_PO_DOCS. *-- Fetch Preceding sales orders based on the credit memo request SELECT VBELV POSNV VBELN POSNN VBTYP_N FROM VBFA INTO TABLE IT_ORDERS FOR ALL ENTRIES IN IT_CRMEMO WHERE VBELN = IT_CRMEMO-VBELN AND POSNN = IT_CRMEMO-POSNR AND VBTYP_N = C_K AND VBTYP_V = C_C. IF SY-SUBRC = 0. SORT IT_ORDERS BY VBELV POSNV. *-- Fetch Subsequent PO documents & Credit Memo based on the sales orders SELECT VBELV POSNV VBELN POSNN VBTYP_N FROM VBFA

Page 41: Custom BAPI Creation

INTO TABLE IT_PO FOR ALL ENTRIES IN IT_ORDERS WHERE VBELV = IT_ORDERS-VBELV AND POSNV = IT_ORDERS-POSNV AND VBTYP_N IN (C_V,C_O) AND VBTYP_V = C_C. IF SY-SUBRC = 0. SORT IT_PO BY VBTYP_N. *-- Copy the IT_PO internal table contents to IT_CMEMO internal table IT_CMEMO[] = IT_PO[]. *-- Delete PO documents from IT_CMEMO internal table DELETE IT_CMEMO WHERE VBTYP_N = C_V. SORT IT_CMEMO BY VBELN POSNN. IF IT_CMEMO[] IS INITIAL. MESSAGE I000 WITH 'No Credit Memo are available for CM Request'(003).* v_flag = c_x.* stop. ENDIF. *-- Delete Credit Memo documents from IT_PO internal table DELETE IT_PO WHERE VBTYP_N = C_O. SORT IT_PO BY VBELN POSNN.  ENDIF. ENDIF. ENDFORM. " F_GET_SO_PO_DOCS *&---------------------------------------------------------------------**& Form F_GET_CHANGED_DOCS*&---------------------------------------------------------------------** Fetch Change Documents for CR Memos from CDHDR and CDPOS tables*----------------------------------------------------------------------*FORM F_GET_CHANGED_DOCS . *-- Fetch Change Documents for CR Memos from CDHDR SELECT OBJECTCLAS OBJECTID CHANGENR UDATE UTIME FROM CDHDR INTO TABLE IT_CDHDR FOR ALL ENTRIES IN IT_CRMEMO_CHANGE WHERE OBJECTCLAS = C_VERKBELEG AND OBJECTID = IT_CRMEMO_CHANGE-VBELN* AND UDATE = IT_CRMEMO_CHANGE-AEDAT . IF SY-SUBRC = 0. SORT IT_CDHDR BY OBJECTCLAS OBJECTID CHANGENR. *-- Fetch Change Documents for CR Memos from CDPOS SELECT OBJECTCLAS OBJECTID CHANGENR

Page 42: Custom BAPI Creation

TABNAME TABKEY FNAME CHNGIND VALUE_NEW VALUE_OLD FROM CDPOS INTO TABLE IT_CDPOS FOR ALL ENTRIES IN IT_CDHDR WHERE OBJECTCLAS = C_VERKBELEG AND OBJECTID = IT_CDHDR-OBJECTID AND CHANGENR = IT_CDHDR-CHANGENR AND TABNAME = C_VBAK AND FNAME = C_AUGRU AND CHNGIND = C_U. IF SY-SUBRC = 0. SORT IT_CDPOS BY OBJECTCLAS OBJECTID CHANGENR. ENDIF. ENDIF. ENDFORM. " F_GET_CHANGED_DOCS *&---------------------------------------------------------------------**& Form F_GET_EKPO*&---------------------------------------------------------------------** Fetch Purchasing Document Item Details*----------------------------------------------------------------------*FORM F_GET_EKPO . *-- Fetch Purchasing Document Item Details SELECT A~EBELN B~EBELP A~WAERS B~MENGE B~MEINS B~NETPR B~PEINH B~mwskz B~TXJCD INTO TABLE IT_EKPO FROM ( EKKO AS A INNER JOIN EKPO AS B ON A~EBELN = B~EBELN ) FOR ALL ENTRIES IN IT_PO WHERE A~EBELN = IT_PO-VBELN AND B~EBELP = IT_PO-POSNN+1(5). IF SY-SUBRC = 0. SORT IT_EKPO BY EBELN EBELP. ENDIF. ENDFORM. " F_GET_EKPO *&---------------------------------------------------------------------**& Form F_GET_VENDOR*&---------------------------------------------------------------------** Fetch MIRO Vendor details based on the PO Details*----------------------------------------------------------------------*FORM F_GET_VENDOR .

Page 43: Custom BAPI Creation

 DATA: LV_TABIX TYPE SY-TABIX. *-- Fetch History per Purchasing Document records for all the PO records SELECT EBELN EBELP ZEKKN VGABE GJAHR BELNR BUZEI FROM EKBE INTO TABLE IT_EKBE FOR ALL ENTRIES IN IT_EKPO WHERE EBELN = IT_EKPO-EBELN AND EBELP = IT_EKPO-EBELP AND VGABE = '2'.* and STBLG = space. IF SY-SUBRC = 0. SORT IT_EKBE BY BELNR GJAHR. *-- Fetch the vendor details based on table IT_EKBE internal table SELECT BELNR GJAHR BLDAT BUDAT XBLNR LIFNR RMWWR WMWST1 XRECH STBLG FROM RBKP INTO TABLE IT_RBKP FOR ALL ENTRIES IN IT_EKBE WHERE BELNR = IT_EKBE-BELNR AND GJAHR = IT_EKBE-GJAHR. IF SY-SUBRC = 0. SORT IT_RBKP BY BELNR GJAHR. ENDIF. ENDIF. *-- Sort PO History documents based on PO # and PO Item SORT IT_EKBE BY EBELN EBELP. *-- Copy the PO History documents into IT_EKBE_TEMP internal table IT_EKBE_TEMP[] = IT_EKBE[]. *-- Delete PO History documents from IT_EKBE_TEMP internal table* comparing with IT_RBKP where (STBLG) Reversal document number* is initial LOOP AT IT_EKBE_TEMP INTO WA_EKBE_TEMP. LV_TABIX = SY-TABIX. READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE_TEMP-BELNR GJAHR = WA_EKBE_TEMP-GJAHR* XRECH = SPACE STBLG = SPACE.

Page 44: Custom BAPI Creation

IF SY-SUBRC <> 0. DELETE IT_EKBE_TEMP INDEX LV_TABIX. ENDIF. CLEAR: WA_EKBE_TEMP, WA_RBKP. ENDLOOP. ENDFORM. " F_GET_VENDOR *&---------------------------------------------------------------------**& Form F_PROCESS_MIRO*&---------------------------------------------------------------------** Process MIRO*----------------------------------------------------------------------*FORM F_PROCESS_MIRO . DATA: lv_itemno TYPE i, lv_tabix type sy-index, lc_check(1) TYPE c VALUE 'X', V_FILL_ITEM, lv_rbkp_bldat type sy-datum.   clear : it_itemdata, it_accountingdata, IT_CRMEMO_MIRO, IT_CRMEMO_MR8M. refresh : it_itemdata, it_accountingdata, IT_CRMEMO_MIRO, IT_CRMEMO_MR8M. *-- Copy all the CR Memo Docs and delete order reason not in S_AUGRU IT_CRMEMO_MR8M[] = IT_CRMEMO[]. *-- Delete Reversal postings which are not in S_AUGRU DELETE IT_CRMEMO_MR8M WHERE AUGRU IN S_AUGRU. *-- Delete Reversal postings where AEDAT is initial DELETE IT_CRMEMO_MR8M where aedat is initial. *-- Delete order reason which are not in S_AUGRU DELETE IT_CRMEMO WHERE AUGRU NOT IN S_AUGRU. *-- Loop through the credit memo request records LOOP AT IT_CRMEMO INTO WA_CRMEMO. lv_tabix = sy-tabix. *-- If credit memo request change date is not initial then* send change date (AEDAT) to lv_rbkp_bldat if not WA_CRMEMO-aedat is initial. lv_rbkp_bldat = WA_CRMEMO-aedat. else.*-- If credit memo request change date is initial then* send create date (ERDAT) to lv_rbkp_bldat lv_rbkp_bldat = WA_CRMEMO-erdat. endif.  READ TABLE IT_ORDERS INTO WA_ORDERS WITH KEY VBELN = WA_CRMEMO-VBELN POSNN = WA_CRMEMO-POSNR. IF SY-SUBRC = 0. READ TABLE IT_PO INTO WA_PO WITH KEY VBELV = WA_ORDERS-VBELV POSNV = WA_ORDERS-POSNV. IF SY-SUBRC = 0.

Page 45: Custom BAPI Creation

READ TABLE IT_EKPO INTO WA_EKPO WITH KEY EBELN = WA_PO-VBELN EBELP = WA_PO-POSNN. IF SY-SUBRC = 0.*-- Read IT_EKBE_TEMP internal table which contains records which are not reversed READ TABLE IT_EKBE_TEMP INTO WA_EKBE_TEMP WITH KEY EBELN = WA_EKPO-EBELN EBELP = WA_EKPO-EBELP. IF SY-SUBRC = 0.*-- Read IT_RBKP internal table with XRECH (Indicator: post invoice) = 'X' ,* check for invoice records for the correspnding CR Memo records READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE_TEMP-BELNR GJAHR = WA_EKBE_TEMP-GJAHR XRECH = C_X. IF SY-SUBRC = 0.*-- Read IT_RBKP internal table with XRECH (Indicator: post invoice) = SPACE,* and document date = CR Memo creation date* and reference document number = PO number READ TABLE IT_RBKP INTO WA_RBKP_TMP WITH KEY BELNR = WA_EKBE_TEMP-BELNR GJAHR = WA_EKBE_TEMP-GJAHR BLDAT = WA_CRMEMO-ERDAT XRECH = ' ' XBLNR+0(10) = WA_EKBE_TEMP-ebeln.* STBLG = SPACE. IF SY-SUBRC = 0. CONTINUE. ELSE.*-- Quantity Conversion (Get the Credit Memo Quantity by passing CMR unit per one PO unit) perform f_quantity_conv. *-- Filling the Line items data *-- Incrementing the item no lv_itemno = lv_itemno + 1. v_itemno = lv_itemno.  it_itemdata-invoice_doc_item = v_itemno. it_itemdata-po_number = WA_ekPO-ebeln. it_itemdata-po_item = WA_EKPO-EBELP. it_itemdata-tax_code = WA_ekpo-mwskz. it_itemdata-TAXJURCODE = WA_ekpo-TXJCD. *-- Converting SAP amount to BAPI format by passing line item amount and currency PERFORM f_currency_amount_sap_to_bapi USING WA_EKPO-waers V_LINE_AMOUNT CHANGING it_itemdata-item_amount . 

Page 46: Custom BAPI Creation

it_itemdata-quantity = ( WA_CRMEMO-ZMENG * V_CRMEMO_QTY ). it_itemdata-po_unit = WA_EKPO-MEINS. APPEND it_itemdata. *-- Populate Account Assignment data IT_ACCOUNTINGDATA-INVOICE_DOC_ITEM = v_itemno. IT_ACCOUNTINGDATA-XUNPL = space. IT_ACCOUNTINGDATA-SERIAL_NO = C_01. IT_ACCOUNTINGDATA-TAX_CODE = it_itemdata-tax_code. IT_ACCOUNTINGDATA-TAXJURCODE = it_itemdata-TAXJURCODE. IT_ACCOUNTINGDATA-ITEM_AMOUNT = it_itemdata-item_amount. IT_ACCOUNTINGDATA-QUANTITY = it_itemdata-quantity. IT_ACCOUNTINGDATA-PO_UNIT = it_itemdata-po_unit. IT_ACCOUNTINGDATA-GL_ACCOUNT = C_0000500205. append IT_ACCOUNTINGDATA. clear IT_ACCOUNTINGDATA.  CLEAR it_itemdata. endif. endif. ENDIF. ENDIF. ENDIF. ENDIF.*-- At end of each credit memo request fill the header details of BAPI FM and*-- post the BAPI AT END OF VBELN. read table it_crmemo into wa_crmemo index lv_tabix. *-- Populate the document Header*-- Getting the header data for invoice x_docheader-invoice_ind = space. x_docheader-doc_type = c_blart. x_docheader-doc_date = lv_rbkp_bldat. x_docheader-pstng_date = lv_rbkp_bldat. x_docheader-ref_doc_no = WA_RBKP-XBLNR. x_docheader-comp_code = WA_CRMEMO-BUKRS_VF. x_docheader-CURRENCY = WA_CRMEMO-WAERK. x_docheader-calc_tax_ind = lc_check. *-- Logic to find the Tax % v_tax_per = ( WA_RBKP-WMWST1 / ( WA_RBKP-RMWWR - WA_RBKP-WMWST1 ) ) * 100. v_tax_amt = ( V_GROSSAMT * v_tax_per ) / 100. V_GROSSAMT = ( V_GROSSAMT + v_tax_amt ). x_docheader-gross_amount = V_GROSSAMT.  CLEAR:v_docnr, v_year1. *-- Calling BAPI to create PO invoice document CHECK NOT IT_ITEMDATA[] IS INITIAL. CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE' EXPORTING headerdata = x_docheader IMPORTING invoicedocnumber = v_docnr

Page 47: Custom BAPI Creation

fiscalyear = v_year1 TABLES itemdata = it_itemdata[] ACCOUNTingDATA = it_ACCOUNTingDATA[]* GLACCOUNTDATA =* taxdata = return = it_return. *-- Commit work IF NOT v_docnr IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.*-- Move the data to Success Internal Table wa_success-crmemo = wa_crmemo-vbeln. wa_success-cmemo = wa_cmemo-vbeln. wa_success-orders = wa_orders-vbelv. wa_success-po = wa_po-vbeln. wa_success-miro_no = v_docnr. wa_success-text = 'MIRO is Posted'. append wa_success TO it_success. clear wa_success.  ENDIF.*-- Read the values in the table IT_RETURN. CLEAR it_return. READ TABLE it_return INDEX 1.* If message type is error then roll back the work IF it_return-type = C_E.*-- Roll back CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. *-- Move the data to Error Internal Table wa_error-crmemo = wa_crmemo-vbeln. wa_error-cmemo = wa_cmemo-vbeln. wa_error-orders = wa_orders-vbelv. wa_error-po = wa_po-vbeln. wa_error-text = it_return-MESSAGE. append wa_error TO it_error. clear wa_error.  ENDIF.  refresh: it_return, it_itemdata, it_accountingdata. clear: V_GROSSAMT, it_return, it_itemdata, wa_crmemo, wa_orders, wa_po, wa_ekpo, WA_EKBE_TEMP, wa_rbkp, wa_rbkp_tmp, v_docnr, v_year1, WA_SUCCESS, WA_ERROR, it_accountingdata, v_tax_per, v_tax_amt, V_FILL_ITEM, lv_rbkp_bldat. ENDAT. ENDLOOP. ENDFORM. " F_PROCESS_MIRO *&---------------------------------------------------------------------**& Form f_quantity_conv*&---------------------------------------------------------------------*

Page 48: Custom BAPI Creation

* Quantity Conversion*----------------------------------------------------------------------*FORM f_quantity_conv . *-- Quantity Conversion (Get the Credit Memo Quantity by passing CMR unit per one PO unit) CLEAR: V_LINE_AMOUNT, V_CRMEMO_QTY.  call function 'MC_UNIT_CONVERSION' EXPORTING MATNR = WA_CRMEMO-MATNR nach_meins = WA_EKPO-MEINS von_meins = WA_CRMEMO-ZIEME IMPORTING UMREF = V_CRMEMO_QTY EXCEPTIONS CONVERSION_NOT_FOUND = 1 MATERIAL_NOT_FOUND = 2 NACH_MEINS_MISSING = 3 OVERFLOW = 4 VON_MEINS_MISSING = 5 OTHERS = 6. if sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ELSE. V_LINE_AMOUNT = ( V_CRMEMO_QTY * WA_CRMEMO-ZMENG * WA_EKPO-peinh * WA_EKPO-NETPR ). V_GROSSAMT = V_GROSSAMT + V_LINE_AMOUNT. ENDIF. ENDFORM. " f_quantity_conv *&---------------------------------------------------------------------**& Form f_currency_amount_sap_to_bapi*&---------------------------------------------------------------------** SAP Amount to BAPI Amount*----------------------------------------------------------------------*FORM f_currency_amount_sap_to_bapi USING p_waers p_kbetr CHANGING p_amt_doccur.  DATA : lv_waers LIKE tcurc-waers, lv_sapamount LIKE bapicurr-bapicurr, lv_bapi_amount LIKE bapicurr-bapicurr.  lv_waers = p_waers. lv_sapamount = p_kbetr.   CALL FUNCTION 'CURRENCY_AMOUNT_SAP_TO_BAPI' EXPORTING currency = lv_waers sap_amount = lv_sapamount IMPORTING bapi_amount = lv_bapi_amount. 

Page 49: Custom BAPI Creation

p_amt_doccur = lv_bapi_amount. ENDFORM. " f_currency_amount_sap_to_bapi *&---------------------------------------------------------------------**& Form f_display_report*&---------------------------------------------------------------------** Display Report*----------------------------------------------------------------------*FORM f_display_report . *-- Success Report IF NOT IT_SUCCESS[] IS INITIAL. ULINE AT /1(129). WRITE:/1 sy-vline, 'CR Memo', 19 sy-vline, 'Credit Memo', 39 sy-vline, 'Sales Order', 59 sy-vline, 'Purchase Order', 79 sy-vline, 'MIRO Number', 99 sy-vline, 'Text', 129 sy-vline. ULINE AT /1(129).  LOOP AT it_success into wa_success. WRITE:/1 sy-vline, wa_success-crmemo, 19 sy-vline, wa_success-cmemo, 39 sy-vline, wa_success-orders, 59 sy-vline, wa_success-po, 79 sy-vline, wa_success-miro_no, 99 sy-vline, wa_success-text, 129 sy-vline.  ENDLOOP. ULINE AT /1(129). SKIP 2.  ENDIF. *-- Error Report IF NOT IT_ERROR[] IS INITIAL.  ULINE AT /1(179). WRITE:/1 sy-vline, 'CR Memo', 19 sy-vline, 'Credit Memo', 39 sy-vline, 'Sales Order', 59 sy-vline, 'Purchase Order', 79 sy-vline, 'Error Text', 179 sy-vline. ULINE AT /1(179).  LOOP AT IT_ERROR into WA_ERROR. WRITE:/1 sy-vline, WA_ERROR-crmemo, 19 sy-vline, WA_ERROR-cmemo, 39 sy-vline, WA_ERROR-orders, 59 sy-vline, WA_ERROR-po, 79 sy-vline, WA_ERROR-text, 179 sy-vline.

Page 50: Custom BAPI Creation

ENDLOOP. ULINE AT /1(179).  ENDIF.   IF NOT IT_SUCCESS_MR8M[] IS INITIAL. ULINE AT /1(129). WRITE:/1 sy-vline, 'CR Memo', 19 sy-vline, 'Credit Memo', 39 sy-vline, 'Sales Order', 59 sy-vline, 'Purchase Order', 79 sy-vline, 'Reversal Posting No.', 99 sy-vline, 'Text', 129 sy-vline. ULINE AT /1(129).  LOOP AT it_success_mr8m into wa_success_mr8m. WRITE:/1 sy-vline, wa_success_mr8m-crmemo, 19 sy-vline, wa_success_mr8m-cmemo, 39 sy-vline, wa_success_mr8m-orders, 59 sy-vline, wa_success_mr8m-po, 79 sy-vline, wa_success_mr8m-miro_no, 99 sy-vline, wa_success_mr8m-text, 129 sy-vline.  ENDLOOP. ULINE AT /1(129). SKIP 2.  ENDIF. *-- Error Report IF NOT IT_ERROR_MR8M[] IS INITIAL.  ULINE AT /1(179). WRITE:/1 sy-vline, 'CR Memo', 19 sy-vline, 'Credit Memo', 39 sy-vline, 'Sales Order', 59 sy-vline, 'Purchase Order', 79 sy-vline, 'Error Text', 179 sy-vline. ULINE AT /1(179).  LOOP AT IT_ERROR_MR8M into WA_ERROR_MR8M. WRITE:/1 sy-vline, WA_ERROR_MR8M-crmemo, 19 sy-vline, WA_ERROR_MR8M-cmemo, 39 sy-vline, WA_ERROR_MR8M-orders, 59 sy-vline, WA_ERROR_MR8M-po, 79 sy-vline, WA_ERROR_MR8M-text, 179 sy-vline. ENDLOOP. ULINE AT /1(179).  ENDIF. ENDFORM. " f_display_report

Page 51: Custom BAPI Creation

 *&---------------------------------------------------------------------**& Form F_PROCESS_MR8M*&---------------------------------------------------------------------** Process Reversal postings*----------------------------------------------------------------------*FORM F_PROCESS_MR8M .  clear: wa_CRMEMO_MR8M.  LOOP AT IT_CRMEMO_MR8M into WA_CRMEMO_MR8M. read table it_cdpos into wa_cdpos with key OBJECTID = WA_CRMEMO_MR8M-VBELN. if sy-subrc <> 0. CONTINUE. ELSE. if wa_cdpos-value_old in s_augru. READ TABLE IT_ORDERS INTO WA_ORDERS WITH KEY VBELN = wa_CRMEMO_MR8M-VBELN POSNN = wa_CRMEMO_MR8M-POSNR. IF SY-SUBRC = 0.* READ TABLE IT_CMEMO INTO WA_CMEMO WITH KEY VBELV = WA_ORDERS-VBELV* POSNV = WA_ORDERS-POSNV.* IF SY-SUBRC = 0. READ TABLE IT_PO INTO WA_PO WITH KEY VBELV = WA_ORDERS-VBELV POSNV = WA_ORDERS-POSNV. IF SY-SUBRC = 0. READ TABLE IT_EKPO INTO WA_EKPO WITH KEY EBELN = WA_PO-VBELN EBELP = WA_PO-POSNN. IF SY-SUBRC = 0.* READ TABLE IT_EKBE INTO WA_EKBE WITH KEY EBELN = WA_EKPO-EBELN* EBELP = WA_EKPO-EBELP.* IF SY-SUBRC = 0. LOOP AT IT_EKBE into WA_EKBE WHERE EBELN = WA_EKPO-EBELN AND EBELP = WA_EKPO-EBELP. READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE-BELNR GJAHR = WA_EKBE-GJAHR* BLDAT = WA_CRMEMO_MR8M-AEDAT XBLNR+0(10) = WA_EKBE-EBELN XRECH = SPACE STBLG = SPACE.  IF SY-SUBRC = 0. move: WA_RBKP-BELNR TO X_REV_POST-INV_DOC_NO, WA_RBKP-GJAHR TO X_REV_POST-FISC_YEAR, WA_RBKP-BUDAT TO X_REV_POST-PSTNG_DATE. IF WA_RBKP-BUDAT+4(2) = SY-DATUM+4(2). X_REV_POST-REASON_REV = C_01. ELSE. X_REV_POST-REASON_REV = C_02. ENDIF. ENDIF. ENDLOOP.*-- Call the FM for MIRO reversal CALL FUNCTION 'BAPI_INCOMINGINVOICE_CANCEL' EXPORTING INVOICEDOCNUMBER = X_REV_POST-INV_DOC_NO

Page 52: Custom BAPI Creation

FISCALYEAR = X_REV_POST-FISC_YEAR REASONREVERSAL = X_REV_POST-REASON_REV POSTINGDATE = X_REV_POST-PSTNG_DATE IMPORTING INVOICEDOCNUMBER_REVERSAL = X_REV_POST-INV_DOC_NO FISCALYEAR_REVERSAL = X_REV_POST-FISC_YEAR TABLES RETURN = it_return_mr8m.*-- Commit work IF NOT X_REV_POST-INV_DOC_NO IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.*-- Move the data to Success Internal Table wa_success_mr8m-crmemo = wa_crmemo-vbeln. wa_success_mr8m-cmemo = wa_cmemo-vbeln. wa_success_mr8m-orders = wa_orders-vbelv. wa_success_mr8m-po = wa_po-vbeln. wa_success_mr8m-text = 'MR8M Done'. append wa_success_mr8m TO it_success_mr8m. clear wa_success_mr8m. ENDIF.*-- Read the values in the table IT_RETURN. CLEAR it_return_mr8m. READ TABLE it_return_mr8m INDEX 1.*-- If message type is error then roll back the work IF it_return_mr8m-type = 'E' .*-- Roll back CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.*-- Move the data to Error Internal Table wa_error_mr8m-crmemo = wa_crmemo-vbeln. wa_error_mr8m-cmemo = wa_cmemo-vbeln. wa_error_mr8m-orders = wa_orders-vbelv. wa_error_mr8m-po = wa_po-vbeln. wa_error_mr8m-text = it_return_mr8m-MESSAGE. append wa_error_mr8m TO it_error_mr8m. clear wa_error_mr8m.  ENDIF.* ENDIF.* ENDIF. ENDIF. ENDIF.* ENDIF. ENDIF. ENDIF. ENDIF. CLEAR: wa_error_mr8m, wa_SUCCESS_mr8m, X_REV_POST, wa_CRMEMO_MR8M, wa_orders, wa_po, wa_ekpo, wa_ekbe, wa_rbkp, wa_cmemo. REFRESH: IT_RETURN_MR8M.  endloop. ENDFORM. " F_PROCESS_MR8M *&---------------------------------------------------------------------**& Form F_spool_id

Page 53: Custom BAPI Creation

*&---------------------------------------------------------------------** Create a new spool ID*----------------------------------------------------------------------*FORM F_spool_id . *-- Create a new spool from the data in data_tab*-- new-page line-size sy-linsz print on new-page line-size 255 print on destination 'LOCL'(p19) "<<== my printer*-- receiver 'TJOSVOB' cover text 'Spool title'(p20) " <<== Title or Spool req. name list name 'List name'(p21) list dataset 'List Dataset'(p22) immediately ' ' " X means print now keep in spool c_x " X means keep spool new list identification c_x no dialog . *-- Writing Report*-- In this perform you will write the code for displaying the list perform f_display_report. *-- new-page print off new-page print off. ENDFORM. " F_spool_id *&---------------------------------------------------------------------**& Form F_MAIL_LOGIC*&---------------------------------------------------------------------** Logic to send a mail for the given Email ID's*----------------------------------------------------------------------*FORM F_MAIL_LOGIC .  data : wa_tsp01sys type tsp01sys. clear v_spono.  v_spono = sy-spono.* v_attach_desc = sy-title.*-- Convert the Spool ID into PDF format perform f_pdf_conversion tables it_compressed_list it_pdf_list using v_spono. *-- Send the Mail in PDF Format perform f_send_mail. ENDFORM. " F_MAIL_LOGIC *&---------------------------------------------------------------------**& Form f_pdf_conversion*&---------------------------------------------------------------------** Read the spool and convert into PDF format*----------------------------------------------------------------------** -->P_ITAB_COMPRESSED_LIST text* -->P_ITAB_PDF_LIST text* -->P_V_SPONO text

Page 54: Custom BAPI Creation

*----------------------------------------------------------------------*FORM f_pdf_conversion TABLES it_compressed_list structure soli it_pdf_list structure tline using lv_spooln type tsp01-rqident. clear: it_compressed_list, it_pdf_list.refresh: it_compressed_list, it_pdf_list. *-- Call the FM "RSPO_RETURN_SPOOLJOB" to read the spool by passing the spool number call function 'RSPO_RETURN_SPOOLJOB' exporting rqident = lv_spooln desired_type = v_type importing real_type = v_type tables buffer = it_compressed_list buffer_pdf = it_pdf_list exceptions no_such_job = 1 job_contains_no_data = 2 selection_empty = 3 no_permission = 4 can_not_access = 5 read_error = 6 type_no_match = 7 others = 8. if sy-subrc <> 0. message I000 with 'Error in spool reading'(017). endif. *-- If the List type is ALI call the FM "CONVERT_ABAPSPOOLJOB_2_PDF"* to convert list into PDF Format if v_type = c_ali. " for List it is ALI call function 'CONVERT_ABAPSPOOLJOB_2_PDF' exporting src_spoolid = lv_spooln tables pdf = it_pdf exceptions err_no_abap_spooljob = 1 err_no_spooljob = 2 err_no_permission = 3 err_conv_not_possible = 4 err_bad_destdevice = 5 user_cancelled = 6 err_spoolerror = 7 err_temseerror = 8 err_btcjob_open_failed = 9 err_btcjob_submit_failed = 10 err_btcjob_close_failed = 11 others = 12. if sy-subrc <> 0. message e000 with'Error in convertion of list into PDF format'(018). endif.

Page 55: Custom BAPI Creation

 *-- Logic to convert the given format into 255 character format in IT_PDF describe table it_pdf lines v_lines. describe field it_pdf length v_lineslen IN character MODE. describe field it_temp length v_mimelen IN character MODE. LOOP AT it_pdf. v_tabix = sy-tabix. MOVE it_pdf TO v_temp+v_offset. IF v_tabix = v_lines. v_lineslen = strlen( it_pdf ). ENDIF.  v_offset = v_offset + v_lineslen. IF v_offset GE v_mimelen. CLEAR it_temp. it_temp = v_temp(v_mimelen). APPEND it_temp. SHIFT v_temp BY v_mimelen PLACES. v_offset = v_offset - v_mimelen. ENDIF.  IF v_tabix = v_lines. IF v_offset GT 0. CLEAR it_temp. it_temp = v_temp(v_offset). APPEND it_temp. ENDIF. ENDIF. ENDLOOP.   LOOP AT it_temp. it_mime(255) = it_temp-line. APPEND it_mime. ENDLOOP. *-- Final Data to send to EMail it_html[] = it_mime[]. endif. ENDFORM. " f_pdf_conversion *&---------------------------------------------------------------------**& Form f_send_mail*&---------------------------------------------------------------------** Send EMail Logic*----------------------------------------------------------------------*FORM f_send_mail . data : wa_tsp01sys type tsp01sys. *-- Populate Mail Id's WA_RECLIST-REC_TYPE = P_MODE. WA_RECLIST-EXPRESS = C_X. *-- Loop through the Emial select options LOOP AT S_EMAIL INTO X_EMAIL.

Page 56: Custom BAPI Creation

WA_RECLIST-RECEIVER = X_EMAIL-LOW.*-- append receiver table APPEND WA_RECLIST TO IT_RECLIST. ENDLOOP. *-- If receiver table is not initial CHECK IT_RECLIST[] IS NOT INITIAL.*--To check Mail ID's internal table should not be Empty.*--populate document attributes *-- Mail subject line CLEAR: X_DOC_CHNG. X_DOC_CHNG-OBJ_NAME = 'HEADING'. CONCATENATE 'Automatic Vendor Dedit Postings'(005) SY-DATUM INTO X_DOC_CHNG-OBJ_DESCR SEPARATED BY SPACE. *-- Mail body CONCATENATE 'Automatic Vendor Dedit Postings'(005) ' is attached.'(006) INTO WA_OBJTXT SEPARATED BY SPACE. APPEND WA_OBJTXT TO IT_OBJTXT. *-- Append Date and Time into Body of email. MOVE 'File is generated on'(007) TO V_INFO. V_TIME = SY-UZEIT. CONCATENATE V_TIME+0(2) V_TIME+2(2) V_TIME+4(2) INTO V_TIME2 SEPARATED BY ':'. CONCATENATE SY-DATUM+4(2) '/' SY-DATUM+6(2) '/' SY-DATUM+0(4) INTO V_DATE2. CONCATENATE V_INFO V_DATE2 'At' V_TIME2 INTO V_INFO SEPARATED BY SPACE. WA_OBJTXT = V_INFO. APPEND WA_OBJTXT TO IT_OBJTXT. *-- Document size CLEAR : V_TABLE_LINES. DESCRIBE TABLE IT_OBJTXT LINES V_TABLE_LINES. READ TABLE IT_OBJTXT INTO WA_OBJTXT INDEX V_TABLE_LINES . X_DOC_CHNG-DOC_SIZE = ( V_TABLE_LINES - 1 ) * 255 + STRLEN( WA_OBJTXT ). *-- Populate packing list for body text WA_OBJPACK-HEAD_START = 1. WA_OBJPACK-HEAD_NUM = 0.

Page 57: Custom BAPI Creation

WA_OBJPACK-BODY_START = 1. WA_OBJPACK-BODY_NUM = V_TABLE_LINES. WA_OBJPACK-DOC_TYPE = 'RAW'. APPEND WA_OBJPACK TO IT_OBJPACK. CLEAR WA_OBJPACK.  if v_type = c_ali. loop at it_html. wa_objbin-line = it_html-line. APPEND WA_OBJBIN TO IT_OBJBIN. CLEAR WA_OBJBIN. endloop. v_type = 'PDF'. endif. *-- Get total no.of lines of Object table(attachment) CLEAR : V_TABLE_LINES. DESCRIBE TABLE IT_OBJBIN LINES V_TABLE_LINES. *-- Populate object header(attachment name) WA_OBJHEAD = 'Automatic Vendor Dedit Postings log'(014). APPEND WA_OBJHEAD TO IT_OBJHEAD. CLEAR WA_OBJHEAD. *-- Packing list for attachment WA_OBJPACK-TRANSF_BIN = C_X. WA_OBJPACK-HEAD_START = 1. WA_OBJPACK-HEAD_NUM = 1. WA_OBJPACK-BODY_START = 1. WA_OBJPACK-BODY_NUM = V_TABLE_LINES . WA_OBJPACK-DOC_TYPE = v_type .  WA_OBJPACK-OBJ_NAME = 'Auto_Debit'. WA_OBJPACK-OBJ_DESCR = 'attachment'. WA_OBJPACK-DOC_SIZE = V_TABLE_LINES * 255. APPEND WA_OBJPACK TO IT_OBJPACK. CLEAR WA_OBJPACK. *-- Sending the EMail document in given format CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' EXPORTING DOCUMENT_DATA = X_DOC_CHNG PUT_IN_OUTBOX = C_X COMMIT_WORK = C_X TABLES PACKING_LIST = IT_OBJPACK OBJECT_HEADER = IT_OBJHEAD CONTENTS_BIN = IT_OBJBIN CONTENTS_TXT = IT_OBJTXT RECEIVERS = IT_RECLIST EXCEPTIONS TOO_MANY_RECEIVERS = 1 DOCUMENT_NOT_SENT = 2 DOCUMENT_TYPE_NOT_EXIST = 3 OPERATION_NO_AUTHORIZATION = 4 PARAMETER_ERROR = 5 X_ERROR = 6

Page 58: Custom BAPI Creation

ENQUEUE_ERROR = 7 OTHERS = 8.  IF SY-SUBRC <> 0. MESSAGE E000 WITH 'Error occurred in sending mail'(015). ELSE.*-- Wait upto 2 secounds wait up to 2 seconds. *-- Call the RSCONN01 (SAPconnect: Start Send Process) SUBMIT RSCONN01 WITH MODE = 'INT'* WITH output = 'X' AND RETURN.  PERFORM F_DISPLAY_SENT_MAIL_STATUS. ENDIF. * To delete the spool request wa_tsp01sys-rqident = sy-spono. call function 'RSPO_IDELETE_SPOOLREQ' exporting spoolreq = wa_tsp01sys. if sy-subrc <> 0. endif. ENDFORM. " f_send_mail *&---------------------------------------------------------------------**& Form F_DISPLAY_SENT_MAIL_STATUS*&---------------------------------------------------------------------** Display Mail Sent status to the user*----------------------------------------------------------------------*FORM F_DISPLAY_SENT_MAIL_STATUS .  ULINE AT /1(60). WRITE :/ SY-VLINE, 'Mail sent Successfully to'(016) COLOR 5 INTENSIFIED ON, 60 SY-VLINE.  LOOP AT S_EMAIL INTO X_EMAIL. V_TABLE_LINES = STRLEN( X_EMAIL-LOW ). MOVE X_EMAIL-LOW+0(V_TABLE_LINES) TO V_TEXT2.  WRITE :/ SY-VLINE, 2 SY-TABIX LEFT-JUSTIFIED, 5 ')', V_TEXT2, 60 SY-VLINE. ENDLOOP.  ULINE AT /1(60). ENDFORM. " F_DISPLAY_SENT_MAIL_STATUS

 ==============================================================

Page 59: Custom BAPI Creation

BAPIs Definition

A Business Application Programming Interface (BAPI) is a precisely defined interface providing access to processes and data in business application systems such as R/3.BAPIs of SAP Business Object TypesBAPIs are defined as API methods of SAP business object types. These business object types and their BAPIs are described and stored in the Business Object Repository (BOR). A BAPI is implemented as a function module, that is stored and described in the Function Builder.

BAPIs of SAP Interface Types

As of Release 4.5A BAPIs can also describe interfaces, implemented outside the R/3 System that can be called in external systems by R/3 Systems. These BAPIs are known as BAPIs used for outbound processing. The target system is determined for the BAPI call in the distribution model of Application Link Enabling (ALE).

BAPIs used for outbound processing are defined in the Business Object Repository (BOR) as API methods of SAP Interface Types. Functions implemented outside the R/3 System can be standardized and made available as BAPIs. For further information see BAPIs Used For Outbound Processing.

Integration

BAPIs can be called within the R/3 System from external application systems and other programs. BAPIs are the communication standard for business applications. BAPI interface technology forms the basis for the following developments:

• Connecting:• New R/3 components, for example, Advanced Planner and Optimizer (APO) and Business Information Warehouse (BW).

• Non-SAP software• Legacy systems• Isolating components within the R/3 System in the context of Business Framework• Distributed R/3 scenarios with asynchronous connections using Application Link Enabling (ALE)• Connecting R/3 Systems to the Internet using Internet Application Components (IACs)• PC programs as front-end to the R/3 System, for example, Visual Basic (Microsoft) or Visual Age for Java (IBM).• Workflow applications that extend beyond system boundaries• Customers' and partners' own developments

BAPIs - Interfaces to the R/3 System

BOR

Definition

The Business Object Repository (BOR) is the object-oriented repository in the R/3 System. It contains the SAP business object types and SAP interface types as well as their components, such as methods, attributes and events.

BAPIs are defined as methods of SAP business object types (or SAP interface types) in the BOR. Thus defined, the BAPIs become standard with full stability guarantees as regards their content and interface.For general information on creating business objects see the documentation on SAP Business Workflow.

Use

The BOR has the following functions for SAP business object types and their BAPIs:

• Provides an object-oriented view of R/3 System data and processes.R/3 application functions are accessed using methods (BAPIs) of SAP Business Objects. Implementation information is encapsulated; only the interface functionality of the method is visible to the user.• Arranges the various interfaces in accordance with the component hierarchy, enabling functions to be searched and retrieved quickly and simply.This finds the functionality searched for quickly and simply.

Page 60: Custom BAPI Creation

• Manages BAPIs in release updates.

BAPI interface enhancements made by adding parameters are recorded in the BOR. Previous interface versions can thus be reconstructed at any time. When a BAPI is created the release version of the new BAPI is recorded in the BOR. The same applies when any interface parameter is created.

The version control of the function module that a BAPI is based on is managed in the Function Builder.

• Ensures interface stability.Any interface changes that are carried out in the BOR, are automatically checked for syntax compatibility against the associated development objects in the ABAP Dictionary.

Integration

A BAPI is implemented as a function module that is stored and described in the Function Builder. You should only define a BAPI as a method of an SAP business object type in the BOR, if the function module that the BAPI is based on has been fully implemented.

Access to the BOR is restricted at SAP.BOR/BAPI WizardThe BOR/BAPI Wizard helps you to create new BAPIs in the BOR. It takes you through the process step by step.

Defining and Implementing the BAPI

Purpose

Various components of the ABAP Workbench are used when you define and implement a BAPI. These are shown in the graphic below.

BAPIs are defined in the Business Object Repository (BOR) as API methods of SAP business object types. BAPIs are implemented in the Function Builder as RFC-enabled function modules. The definitions and descriptions of the data structures used by the BAPI are stored in the ABAP Dictionary.

BOR, Function Builder and ABAP Dictionary

Prerequisites

For function modules that implement BAPIs, certain standards and rules must be adhered to over and above the standard programming rules for function modules.

The following sections guide you through the steps involved in developing a BAPI. The sections contain information about the guidelines and conventions that you should adhere to when defining and implementing a BAPI. When implementing BAPIs follow the requirements below to ensure you achieve consistent behavior and representation of BAPIs as object-oriented methods of SAP business object types or SAP interface types.