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