2014 Nov 17 9:44 AM
Hi All,
I am facing problem with BAPI_PO_CREATE1 . everything works fine apart from QUANTITY Field. It is getting doubled in the created PO.
Please suggest.
here is the code what i have used.
REPORT zmm_open_purchase_order_upload.
*&---------------------------------------------------------------------*
*& Include ZMM_OPENPO_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS: truxs.
*&--------------------------------------------------------------------&*
*& Table Declarations
*&--------------------------------------------------------------------&*
TABLES : t001, t077d.
*&--------------------------------------------------------------------&*
*& Data Declarations
*&--------------------------------------------------------------------&*
* Types
DATA : l_pono(50).
DATA: it_tab TYPE filetable,
gd_subrc TYPE i,
l_file TYPE rlgrap-filename.
DATA: it_raw TYPE truxs_t_text_data.
DATA : BEGIN OF gt_final OCCURS 0,
id(5),
doc_type TYPE esart,
* docdate(10),
* SUPPL_PLNT TYPE RESWK,
vendor TYPE elifn,
purch_org TYPE ekorg,
pur_group TYPE bkgrp,
comp_code TYPE bukrs,
pmnttrms TYPE dzterm,
incoterms1 TYPE inco1,
incoterms2 TYPE inco2,
our_ref TYPE UNSEZ,
acctasscat TYPE bapimepoitem-acctasscat ,
docdate(10), " item
item_cat TYPE bapimepoitem-item_cat,
material TYPE matnr,
TXZ01 TYPE TXZ01, " Short Text
* quantity TYPE bstmg,"bapimepoitem-QUANTITY,
quantity(13)," LIKE bapimepoitem-quantity,
net_price TYPE bapimepoitem-net_price,
tax_code TYPE mwskz,
plant TYPE ewerk,
VAL_TYPE TYPE BWTAR_D,
stge_loc TYPE bapimepoitem-stge_loc,
MATL_GROUP type MATKL,
GL_ACCOUNT type SAKNR,
COSTCENTER TYPE KOSTL,
ORDERID type AUFNR,
WBS_ELEMENT TYPE PS_POSID,
NETWORK TYPE NPLNR,
* scheduleno TYPE eeten,
deldate(10),
END OF gt_final.
DATA: suppl_plnt type reswk.
DATA : BEGIN OF gt_header OCCURS 0,
id(5),
doc_type TYPE esart,
* suppl_plnt type reswk,
vendor TYPE elifn,
* docdate(10),
purch_org TYPE ekorg,
pur_group TYPE bkgrp,
comp_code TYPE bukrs,
* vendor TYPE elifn,
pmnttrms TYPE dzterm,
incoterms1 TYPE inco1,
incoterms2 TYPE inco2,
* sales_pers TYPE char30,
our_ref TYPE UNSEZ,
END OF gt_header.
DATA : BEGIN OF gt_item OCCURS 0,
id(5),
* l_item,
acctasscat TYPE bapimepoitem-acctasscat ,
docdate(10),
item_cat TYPE bapimepoitem-item_cat,
material TYPE matnr,
TXZ01 TYPE TXZ01, " Short Text
* quantity TYPE bstmg,"bapimepoitem-QUANTITY,
quantity(13)," LIKE bapimepoitem-quantity,
net_price TYPE bapimepoitem-net_price,
tax_code TYPE mwskz,
plant TYPE ewerk,
VAL_TYPE TYPE BWTAR_D,
stge_loc TYPE bapimepoitem-stge_loc,
* price_unit TYPE bapimepoitem-price_unit,
* orderpr_un TYPE bapimepoitem-orderpr_un,
* val_type TYPE bapimepoitem-val_type,
MATL_GROUP type MATKL,
GL_ACCOUNT type SAKNR,
COSTCENTER TYPE KOSTL,
ORDERID type AUFNR,
WBS_ELEMENT TYPE PS_POSID,
NETWORK TYPE NPLNR,
* scheduleno TYPE eeten,
END OF gt_item.
DATA : BEGIN OF gt_schedule OCCURS 0,
id(5),
* scheduleno TYPE eeten,
deldate(10),
* quantity TYPE etmen,
quantity(13)," LIKE bapimepoitem-quantity,
END OF gt_schedule.
TYPES : BEGIN OF gt_pono,
pono TYPE ebeln,
* message TYPE bapi_msg,
END OF gt_pono.
TYPES : BEGIN OF gt_error,
number TYPE char10,
error TYPE bapi_msg,
END OF gt_error.
* Internal Tables
*DATA : git_final TYPE STANDARD TABLE OF gty_final,
* git_temp TYPE STANDARD TABLE OF gty_final,
DATA : git_pono TYPE STANDARD TABLE OF gt_pono,
git_error TYPE STANDARD TABLE OF gt_error.
DATA : git_poitem TYPE STANDARD TABLE OF bapimepoitem,
git_poitemx TYPE STANDARD TABLE OF bapimepoitemx,
git_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
git_posch TYPE STANDARD TABLE OF bapimeposchedule,
git_poschx TYPE STANDARD TABLE OF bapimeposchedulx,
POACCOUNT TYPE STANDARD TABLE OF BAPIMEPOACCOUNT,
POACCOUNTX TYPE STANDARD TABLE OF BAPIMEPOACCOUNTX,
test LIKE bapiflag-bapiflag,
NO_PRICE_FROM_PO type BAPIFLAG-BAPIFLAG.
* Work Area
*DATA : gwa_final TYPE gty_final,
* gwa_temp TYPE gty_final,
DATA : gwa_pono TYPE gt_pono,
gwa_error TYPE gt_error.
DATA : gt_pohdr TYPE bapimepoheader,
gt_pohdrx TYPE bapimepoheaderx.
DATA : gwa_poitem TYPE bapimepoitem,
gwa_poitemx TYPE bapimepoitemx,
gwa_return TYPE bapiret2,
gwa_posch TYPE bapimeposchedule,
gwa_poschx TYPE bapimeposchedulx,
gwa_POACCOUNT type BAPIMEPOACCOUNT,
gwa_POACCOUNTx type BAPIMEPOACCOUNTx.
DATA : pono LIKE bapimepoheader-po_number,
poret LIKE bapimepoheader OCCURS 0 WITH HEADER LINE.
* Variables
DATA : g_tot_rec_cnt TYPE p, "to hold total record count
g_suc_rec_cnt TYPE p, "to hold success record count
g_err_rec_cnt TYPE p. "to hold error record count
* Field Symbols
*&--------------------------------------------------------------------&*
*& Initialization
*&--------------------------------------------------------------------&*
INITIALIZATION.
g_tot_rec_cnt = 0.
g_suc_rec_cnt = 0.
g_err_rec_cnt = 0.
*INCLUDE zmm_openpo_top. "Top Include
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_uname LIKE rlgrap-filename OBLIGATORY,
p_test AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_uname.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Select File'
CHANGING
file_table = it_tab
rc = gd_subrc.
READ TABLE it_tab INTO p_uname INDEX 1.
START-OF-SELECTION.
PERFORM get_excel_data.
PERFORM get_header_item.
*Selection texts
*----------------------------------------------------------
* P_DNAM File name for PO No
* P_DNAM_E File name for Error
* P_UNAME File name for Template
*&---------------------------------------------------------------------*
*& Form GET_EXCEL_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_excel_data .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = p_uname
IMPORTING
output = l_file.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X'
i_tab_raw_data = it_raw
i_filename = l_file
TABLES
i_tab_converted_data = gt_final
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " GET_EXCEL_DATA
*&---------------------------------------------------------------------*
*& Form GET_HEADER_ITEM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_header_item .
DATA : flag(1),
flag1(10).
DATA : l_item(5) TYPE N,
l_scheditem(5) TYPE n VALUE '10'.
LOOP AT gt_final.
CLEAR : flag,flag1.
ON CHANGE OF gt_final-id.
flag = 'X'.
ENDON.
* ON CHANGE OF gt_final-scheduleno.
* flag1 = 'X'.
* ENDON.
*
IF flag = 'X'.
MOVE-CORRESPONDING gt_final TO gt_header.
APPEND gt_header.
ENDIF.
*
IF flag = 'X'.
MOVE-CORRESPONDING gt_final TO gt_item.
APPEND gt_item.
ENDIF.
IF flag = 'X'.
MOVE-CORRESPONDING gt_final TO gt_schedule.
APPEND gt_schedule.
ENDIF.
ENDLOOP.
LOOP AT gt_header.
IF p_test = 'X'.
test = 'X'.
ELSE.
test = ' '.
ENDIF.
IF gt_header-doc_type = 'ZST2'." OR gt_header-doc_type = 'ZST2' .
gt_pohdr-suppl_plnt = gt_header-vendor.
gwa_poitem-acctasscat = 'Q'.
ELSE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_header-vendor
IMPORTING
output = gt_pohdr-vendor.
ENDIF.
*end of changes 08.07.2014
gt_pohdr-comp_code = gt_header-comp_code.
gt_pohdr-doc_type = gt_header-doc_type.
gt_pohdr-vendor = gt_header-vendor.
gt_pohdr-purch_org = gt_header-purch_org.
gt_pohdr-pur_group = gt_header-pur_group.
gt_pohdr-PMNTTRMS = gt_header-PMNTTRMS.
gt_pohdr-INCOTERMS1 = gt_header-INCOTERMS1.
gt_pohdr-our_ref = gt_header-our_ref.
gt_pohdr-pmnttrms = gt_header-pmnttrms.
gt_pohdr-incoterms1 = gt_header-incoterms1.
gt_pohdr-incoterms2 = gt_header-incoterms2.
* gt_pohdr-sales_pers = gt_header-sales_pers.
gt_pohdrx-comp_code = 'X'.
gt_pohdrx-doc_type = 'X'.
gt_pohdrx-vendor = 'X'.
if gt_header-doc_type = 'ZST2'." OR gt_header-doc_type = 'ZST2'.
gt_pohdrx-suppl_plnt = 'X'.
else.
gt_pohdrx-vendor = 'X'.
endif.
gt_pohdrx-purch_org = 'X'.
gt_pohdrx-pur_group = 'X'.
gt_pohdrx-doc_date = 'X'.
gt_pohdrx-pmnttrms = 'X'.
gt_pohdrx-incoterms1 = 'X'.
gt_pohdrx-incoterms2 = 'X'.
* gt_pohdrx-sales_pers = 'X'.
gt_pohdrx-our_ref = 'X'.
NO_PRICE_FROM_PO = 'X'.
L_ITEM = '00010'.
LOOP AT gt_item WHERE id = gt_header-id.
gwa_poitem-po_item = l_item.
IF gt_header-doc_type <> 'ZST2'." OR gt_header-doc_type <> 'ZST2'.
gwa_poitem-acctasscat = gt_item-acctasscat.
endif.
gwa_poitem-item_cat = gt_item-item_cat.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_item-material
IMPORTING
output = gwa_poitem-material.
gwa_poitem-short_text = gt_item-TXZ01.
gwa_poitem-quantity = gt_item-quantity.
gwa_poitem-net_price = gt_item-net_price.
gwa_poitem-plant = gt_item-plant.
gwa_poitem-VAL_TYPE = gt_item-VAL_TYPE.
gwa_poitem-tax_code = gt_item-tax_code.
gwa_poitem-stge_loc = gt_item-stge_loc.
gwa_poitem-MATL_GROUP = gt_item-MATL_GROUP.
APPEND gwa_poitem TO git_poitem.
CLEAR :gt_item-quantity.
gwa_poitemx-po_item = l_item.
gwa_poitemx-acctasscat = 'X'.
gwa_poitemx-material = 'X'.
gwa_poitemx-quantity = 'X'.
gwa_poitemx-net_price = 'X'.
gwa_poitemx-plant = 'X'.
* gwa_poitem-VAL_TYPE = 'X'.
IF gwa_poitem-VAL_TYPE IS NOT INITIAL.
gwa_poitemx-VAL_TYPE = 'X'.
ENDIF.
gwa_poitemx-tax_code = 'X'.
* gwa_poitemx-price_unit = 'X'.
* gwa_poitemx-orderpr_un = 'X'.
* gwa_poitemx-val_type = 'X'.
gwa_poitemx-item_cat = 'X'.
gwa_poitemx-stge_loc = 'X'.
gwa_poitemx-MATL_GROUP = 'X'.
APPEND gwa_poitemx TO git_poitemx.
* CLEAR :gwa_poitemx-quantity .
*******************************G/L Account**************************************
gwa_POACCOUNT-PO_ITEM = l_item.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_item-GL_ACCOUNT
IMPORTING
OUTPUT = gwa_POACCOUNT-GL_ACCOUNT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_item-COSTCENTER
IMPORTING
OUTPUT = gwa_POACCOUNT-COSTCENTER.
* gwa_POACCOUNT-COSTCENTER = gt_item-COSTCENTER.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_item-ORDERID
IMPORTING
OUTPUT = gwa_POACCOUNT-ORDERID.
* gwa_POACCOUNT-ORDERID = gt_item-ORDERID.
CALL FUNCTION 'CONVERSION_EXIT_ABPSN_INPUT'
EXPORTING
input = gt_item-WBS_ELEMENT
IMPORTING
OUTPUT = gwa_POACCOUNT-WBS_ELEMENT.
* gwa_POACCOUNT-WBS_ELEMENT = gt_item-WBS_ELEMENT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gt_item-NETWORK
IMPORTING
OUTPUT = gwa_POACCOUNT-NETWORK.
* gwa_POACCOUNT-NETWORK = gt_item-NETWORK.
APPEND gwa_POACCOUNT to POACCOUNT.
* CLEAR :gwa_POACCOUNT.
gwa_POACCOUNTX-PO_ITEM = l_item.
gwa_POACCOUNTX-GL_ACCOUNT = 'X'.
gwa_POACCOUNTX-COSTCENTER = 'X'.
gwa_POACCOUNTX-ORDERID = 'X'.
gwa_POACCOUNTX-WBS_ELEMENT = 'X'.
gwa_POACCOUNTX-NETWORK = 'X'.
APPEND gwa_POACCOUNTX to POACCOUNTX.
ENDLOOP.
********************************************************************************
LOOP AT gt_schedule WHERE id = gt_header-id." AND
* scheduleno = gt_item-scheduleno.
gwa_posch-po_item = l_item.
gwa_posch-sched_line = l_scheditem.
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
date_external = gt_schedule-deldate
accept_initial_date = 'X'
IMPORTING
date_internal = gwa_posch-delivery_date.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
gwa_posch-quantity = gt_schedule-quantity.
APPEND gwa_posch TO git_posch.
* CLEAR :GWA_POSCH.
gwa_poschx-po_item = l_item.
gwa_poschx-sched_line = l_scheditem.
gwa_poschx-delivery_date = 'X'.
gwa_poschx-quantity = 'X'.
APPEND gwa_poschx TO git_poschx.
* CLEAR :gwa_posch-quantity.
l_scheditem = l_scheditem + 10.
CLEAR :gwa_posch-quantity,GWA_POSCHX-quantity.
ENDLOOP.
* APPEND gt_pohdr.
* APPEND gt_pohdrx.
* l_item = l_item + 10.
* CLEAR :gwa_poitem-quantity.
* CLEAR :git_poitem-quantity.
* ENDLOOP.
* CLEAR :gwa_poitem-quantity.
* CLEAR :gwa_poitem-quantity.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = gt_pohdr
poheaderx = gt_pohdrx
testrun = test
NO_PRICE_FROM_PO = NO_PRICE_FROM_PO
IMPORTING
exppurchaseorder = pono
expheader = poret
TABLES
return = git_return
poitem = git_poitem
poitemx = git_poitemx
poschedule = git_posch
poschedulex = git_poschx
POACCOUNT = POACCOUNT
POACCOUNTX = POACCOUNTX.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
* EXPORTING
WAIT UP TO 1 SECONDS." = 'X'.
LOOP AT git_return.
IF git_return-type = 'S'.
CONCATENATE 'PO Number' pono text-002 INTO l_pono
SEPARATED BY space.
WRITE : l_pono.
ELSEIF git_return-type = 'E'.
WRITE : git_return-type, git_return-message.
ENDIF.
ENDLOOP.
REFRESH : git_poitem[],git_return[].
CLEAR : gt_header,git_return,git_poitem.
CLEAR:gt_pohdr,
gt_pohdrx,
test,
NO_PRICE_FROM_PO,
pono,
poret,
git_return[],
* git_header[],
git_poitem,
git_poitemx[],
git_posch[],
git_poschx[],
POACCOUNT[],
POACCOUNTX[].
CLEAR L_ITEM.
* CLEAR L_ITEM1.
ENDLOOP.
ENDFORM. " GET_HEADER_ITEM
Thanks
Suresh
2014 Nov 17 9:51 AM
2014 Nov 17 10:06 AM
Hello
Did you try executing the BAPI in SE37 with same parameters? Try it once and see what's happening when you execute it in SE37.
Best Wishes,
Ravi
2014 Nov 17 10:39 AM
Hi,
CHeck whether you can use AT ENDOF instead of ON CHANGE OF inside loop. Check whether it can produce desired result.
2014 Nov 17 10:54 AM
thanks for reply Jayanthi Jayaraman,
i tried that too ( At END OF) still the result is same.