05-07-2008 6:34 AM
I have a requirement for BAPI (BAPI_PO_CREATE1). I'm new to BAPI. i've gone through the link
/people/sap.user72/blog/2005/03/22/sample-code-to-create-purchase-order-using-bapi-in-r3
it is very helpful. but i have a doubt. while populating HEADER,HEADERX,ITEM and ITEMX, does it contain only one row?
suppose i have many rows in the flat file, waht should i do?
pls help me . very urgent
05-07-2008 7:04 AM
Hi,
For all items of a single PO within the file you have to populate in internal table ITEM and its corresponding flags in ITEMX. Using the BAPI you can create one PO at a time. So if your flat file contains data for multiple PO group each PO details and call the BAPI individually.
Hope below example can give you some idea on how to approach.
Eg:
LOOP AT <file> INTO <wa>.
AT NEW <po_num>. " For every New PO
PERFORM refresh. " Refresh/Clear Internal Tables, Structures for the BAPI
PERFORM populate_po_header. " Populate Header Details
ENDAT.
PERFORM add_item. " Add Line Item
.... " Other details like Conditions ... etc if any
AT END OF <po_num>. " After Populating required details for PO, Create the same
PERFORM create_po. " CALL BAPI for populated details
PEFORM prepare_log. " Prepare log for Success and Error Records
ENDAT.
ENDLOOP.
05-07-2008 10:13 AM
Hi,
this is the structure of my internal table. It contains 100 records. I have to use 'BAPI_PO_CREATE1'. how to proceed.
DATA : begin of itab,
BSART like ekko-BSART,
LIFNR like ekko-LIFNR,
EKORG like ekko-EKORG,
EKGRP like ekko-EKGRP,
BUKRS like ekko-BUKRS,
EBELP like ekpo-EBELP,
PSTYP like ekpo-PSTYP,
KNTTP like ekpo-KNTTP,
EMATN like ekpo-EMATN,
TXZ01 like ekpo-TXZ01,
MENGE like ekpo-MENGE,
MEINS like ekpo-MEINS,
NETPR like ekpo-NETPR,
MATKL like ekpo-MATKL,
WERKS like ekpo-WERKS,
LGORT like ekpo-LGORT,
BEDNR like ekpo-BEDNR,
AFNAM like ekpo-AFNAM,
MWSKZ like ekpo-MWSKZ,
end of itab.
05-08-2008 9:12 AM
Hi Eswar,
Thanks for ur reply...
here we r creating PO. then how the above code will work?
"AT NEW <po_num>. "
i'm new to bapi. can u tell me step by step?
i have a flat file of 100 records. the fields of flat file is given below.
ekko-BSART, ekko-LIFNR, ekko-EKORG,
ekko-EKGRP, ekko-BUKRS, ekpo-EBELP,
ekpo-PSTYP, ekpo-KNTTP, ekpo-EMATN,
ekpo-TXZ01, ekpo-MENGE, ekpo-MEINS,
ekpo-NETPR, ekpo-MATKL, ekpo-WERKS,
ekpo-LGORT, ekpo-BEDNR, ekpo-AFNAM,
ekpo-MWSKZ,
05-08-2008 5:01 PM
Follow the logic below after you have all the rows in internal table:
SORT ITAB BY EBELN EBELP.
LOOP AT ITAB INTO W_ITAB
AT NEW EBELN.
*-----------POPULATE HEADER
*-----------POPULATE HEADER_FLAG
ENDAT.
*---------------FILL ITEM AND ITEM_FLAG
*---------------FILL ACCOUNT
*---------------FILL SCHEDULE
*---------------FILL DELIVERYADD ( IF REQUIRED)
IF W_ITAB-PSTYP EQ 9 (IF THE ITEM CATEGORY IS 9)
*----------FILL SERVICE
*----------FILL LIMITS
ENDIF.
AT END OF EBELN.
*----------CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = GS_POHEADER
POHEADERX = GS_POHEADER_X
TESTRUN = P_TEST
TABLES
RETURN = GT_PORETURN
POITEM = GT_POITEM
POITEMX = GT_POITEM_X
POADDRDELIVERY = GT_POADDRDELIVERY
POSCHEDULE = GT_POSCHEDULE
POSCHEDULEX = GT_POSCHEDULE_X
POACCOUNT = GT_POACCOUNT
POACCOUNTX = GT_POACCOUNT_X
POSERVICES = GT_POSERVICES
POSRVACCESSVALUES = GT_POSACCESS
IF SY-SUBRC <> 0.
*---------PROCESS PORETURN WITH ERRORS
ENDIF
ENDLOOP
Thanks,
SKJ
05-09-2008 5:36 AM
Thanks SKJ,
but i have a doubt. i'm not using EBELN, then how can i sort by EBELN. i've already given u the internal table fields.
i populated HEADER and HEADER_FLAG. Then i filled ITEM, ITEM_FLAG and ACCOUNT.
what else i have to fill as per my requirement.
pls help me....... very urgent....
05-14-2008 6:55 PM
Ok...so you are doing internal PO assignment here i guess...
In that case you have BSART in your int table. This is at header level. So you can sort your itab with BSART and follow above logic.
If you are creating service and limit POs then you may have to fill those structures accordingly. Otherwise, these are sufficient.
Hope this helps,
SKJ
05-14-2008 8:58 PM
Hi,
Here I am sending you the sample code.
It may help u.
REPORT ZM_BAPI_PURCHDOCU_CREATE_01.
*----
User defined structure for Creation of PO using BAPI
*----
DATA: BEGIN OF IT_POMAIN OCCURS 0,
BUKRS(4), "cOMAPNY cODE
ESART(4), "Purchasing Document Type
ELIFN(10), "Vendor's account number
SPRAS(1), "Language Key
EKORG(4), "Purchasing Organization
BKGRP(3), "Purchasing group
WAERS(5), "Currency Key
RESWK(4), "Supplying Plant in case of stock transport order
EBELP(6), "Item Number of Purchasing Document
MATERIAL(18), "Material Number
EWERK(4), "Plant
LGORT_D(4), "Storage location
MATKL(9), "Material group
BSTMG(13), "Purchase order quantity
BSTME(3), "Order unit
BAPICUREXT(28), "Currency amount for BAPIS (with 9 decimal places)
EEIND(10), "Delivery date
ETBDT(8), "Order date of schedule line
END OF IT_POMAIN,
*----
Structures for PO Header and Tables for PO Item Data
*----
WA_POHEADER TYPE BAPIMEPOHEADER,
WA_POHEADERX TYPE BAPIMEPOHEADERX,
IT_ITEM TYPE STANDARD TABLE OF BAPIMEPOITEM WITH HEADER LINE,
IT_ITEMX TYPE STANDARD TABLE OF BAPIMEPOITEMX WITH HEADER LINE,
IT_SCHEDULE TYPE STANDARD TABLE OF BAPIMEPOSCHEDULE WITH HEADER LINE,
IT_SCHEDULEX TYPE STANDARD TABLE OF BAPIMEPOSCHEDULX WITH HEADER LINE,
******Bapi return table for Messages...
IT_RETURN TYPE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.
*----
Designing Selection Screen
*----
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-000.
PARAMETERS: P_FILE TYPE RLGRAP-FILENAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.
*----
AT LINE SELECTION to give Value request for File Name p_file
*----
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM GET_F4.
*----
START OF SELECTION
*----
START-OF-SELECTION.
DATA: LV_INFILE TYPE STRING.
LV_INFILE = P_FILE.
*----
Function Module to Upload Data from Flalt file to Internal Table
*----
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = LV_INFILE
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X'
tables
data_tab = IT_POMAIN
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
PERFORM POPULATE_BAPISTRUCT. " Populating Bapi structures
PERFORM PO_CREATE. " Creating PO using BAPI
ENDIF.
*----
END OF SELECTION
*----
END-OF-SELECTION.
PERFORM GET_ERROR. " Getting Error Records
&----
*& Form GET_F4
&----
Subroutine to get Flat File Name
----
form GET_F4 .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
PROGRAM_NAME = SYST-CPROG
DYNPRO_NUMBER = SYST-DYNNR
FIELD_NAME = ' '
IMPORTING
FILE_NAME = P_FILE.
endform. " GET_F4
&----
*& Form POPULATE_BAPISTRUCT
&----
Subroutine to Populate BAPI PO Header & Item Structures
----
form POPULATE_BAPISTRUCT .
READ TABLE IT_POMAIN INDEX SY-TABIX.
Populating BAPI Header Data
WA_POHEADER-COMP_CODE = IT_POMAIN-BUKRS.
WA_POHEADER-DOC_TYPE = IT_POMAIN-ESART.
WA_POHEADER-VENDOR = IT_POMAIN-ELIFN.
WA_POHEADER-LANGU = IT_POMAIN-SPRAS.
WA_POHEADER-PURCH_ORG = IT_POMAIN-EKORG.
WA_POHEADER-PUR_GROUP = IT_POMAIN-BKGRP.
WA_POHEADER-CURRENCY = IT_POMAIN-WAERS.
WA_POHEADER-SUPPL_PLNT = IT_POMAIN-RESWK.
Populating BAPI Header X Data
WA_POHEADERX-COMP_CODE = 'X'.
WA_POHEADERX-DOC_TYPE = 'X'.
WA_POHEADERX-VENDOR = 'X'.
WA_POHEADERX-LANGU = 'X'.
WA_POHEADERX-PURCH_ORG = 'X'.
WA_POHEADERX-PUR_GROUP = 'X'.
WA_POHEADERX-CURRENCY = 'X'.
WA_POHEADERX-SUPPL_PLNT = 'X'.
Populating BAPI Item Data
IT_ITEM-PO_ITEM = IT_POMAIN-EBELP.
IT_ITEM-MATERIAL = IT_POMAIN-MATERIAL.
IT_ITEM-PLANT = IT_POMAIN-EWERK.
IT_ITEM-STGE_LOC = IT_POMAIN-LGORT_D.
IT_ITEM-MATL_GROUP = IT_POMAIN-MATKL.
IT_ITEM-QUANTITY = IT_POMAIN-BSTMG.
IT_ITEM-PO_UNIT = IT_POMAIN-BSTME.
IT_ITEM-NET_PRICE = IT_POMAIN-BAPICUREXT.
APPEND IT_ITEM.
Populating BAPI Item X Data
IT_ITEMX-PO_ITEM = IT_POMAIN-EBELP.
IT_ITEMX-MATERIAL = 'X'.
IT_ITEMX-PLANT = 'X'.
IT_ITEMX-STGE_LOC = 'X'.
IT_ITEMX-MATL_GROUP = 'X'.
IT_ITEMX-QUANTITY = 'X'.
IT_ITEMX-PO_UNIT = 'X'.
IT_ITEMX-NET_PRICE = 'X'.
APPEND IT_ITEMX.
IT_SCHEDULE-PO_ITEM = IT_POMAIN-EBELP.
IT_SCHEDULE-DELIVERY_DATE = IT_POMAIN-EEIND.
IT_SCHEDULE-PO_DATE = IT_POMAIN-ETBDT.
APPEND IT_SCHEDULE.
IT_SCHEDULEX-PO_ITEM = IT_POMAIN-EBELP.
IT_SCHEDULEX-DELIVERY_DATE = 'X'.
IT_SCHEDULEX-PO_DATE = 'X'.
APPEND IT_SCHEDULEX.
endform. " POPULATE_BAPISTRUCT
&----
*& Form PO_CREATE
&----
Subroutine to Create PO using exsting BAPI FM -- BAPI_PO_CREATE
----
form PO_CREATE .
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = WA_POHEADER
POHEADERX = WA_POHEADERX
IMPORTING
EXPPURCHASEORDER =
EXPHEADER =
EXPPOEXPIMPHEADER =
TABLES
RETURN = IT_RETURN
POITEM = IT_ITEM
POITEMX = IT_ITEMX
POSCHEDULE = IT_SCHEDULE
POSCHEDULEX = IT_SCHEDULEX.
APPEND IT_RETURN.
endform. " PO_CREATE
&----
*& Form GET_ERROR
&----
Subroutine for Error Handling using Bapi return structure
and update the databse using BAPI_TRANSACTION_COMMIT
----
form GET_ERROR .
READ TABLE IT_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
LOOP AT IT_RETURN.
WRITE:/ IT_RETURN-TYPE,
IT_RETURN-MESSAGE.
ENDLOOP.
ELSE.
LOOP AT IT_RETURN.
WRITE:/ IT_RETURN-TYPE,
IT_RETURN-MESSAGE.
ENDLOOP.
ENDIF.
endform. " GET_ERROR
Regards
Sandeep Reddy