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: 

BAPI_PO_CREATE1

Former Member
0 Kudos

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

7 REPLIES 7

Former Member
0 Kudos

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.

0 Kudos

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.

0 Kudos

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,

0 Kudos

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

0 Kudos

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....

0 Kudos

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

Former Member
0 Kudos

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