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: 

query regarding BAPI_PO_CHANGE

Former Member
0 Kudos

After a PO has been created I want to change the PO items, is it enough if I just pass the modified PO Item details or do I need to pass all the details?

2 REPLIES 2

Former Member
0 Kudos

Check this program: I have sent the details of the PO Create in the earlier post. The include program is the same for both.

FUNCTION Z_BC1_BAPI_PO_CHANGE02.

*"----


""Local Interface:

*" IMPORTING

*" VALUE(PURCHASEORDER) TYPE BAPIMEPOHEADER-PO_NUMBER

*" VALUE(POADDRVENDOR) TYPE BAPIMEPOADDRVENDOR

*" VALUE(TESTRUN) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(MEMORY_UNCOMPLETE) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(MEMORY_COMPLETE) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(POEXPIMPHEADER) TYPE BAPIEIKP

*" VALUE(POEXPIMPHEADERX) TYPE BAPIEIKPX

*" VALUE(VERSIONS) TYPE BAPIMEDCM

*" VALUE(NO_MESSAGING) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_MESSAGE_REQ) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_AUTHORITY) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_PRICE_FROM_PO) TYPE BAPIFLAG-BAPIFLAG

*" EXPORTING

*" VALUE(EXPHEADER) TYPE BAPIMEPOHEADER

*" VALUE(EXPPOEXPIMPHEADER) TYPE BAPIEIKPX

*" TABLES

*" RETURN STRUCTURE BAPIRET2

*" POITEM STRUCTURE BAPIMEPOITEM

*" POITEMX STRUCTURE BAPIMEPOITEMX

*" POADDRDELIVERY STRUCTURE BAPIMEPOADDRDELIVERY

*" POSCHEDULE STRUCTURE BAPIMEPOSCHEDULE

*" POSCHEDULEX STRUCTURE BAPIMEPOSCHEDULX

*" POACCOUNT STRUCTURE BAPIMEPOACCOUNT

*" POACCOUNTPROFITSEGMENT STRUCTURE BAPIMEPOACCOUNTPROFITSEGMENT

*" POACCOUNTX STRUCTURE BAPIMEPOACCOUNTX

*" POCONDHEADER STRUCTURE BAPIMEPOCONDHEADER

*" POCONDHEADERX STRUCTURE BAPIMEPOCONDHEADERX

*" POCOND STRUCTURE BAPIMEPOCOND

*" POCONDX STRUCTURE BAPIMEPOCONDX

*" POLIMITS STRUCTURE BAPIESUHC

*" POCONTRACTLIMITS STRUCTURE BAPIESUCC

*" POSERVICES STRUCTURE BAPIESLLC

*" POSRVACCESSVALUES STRUCTURE BAPIESKLC

*" POSERVICESTEXT STRUCTURE BAPIESLLTX

*" EXTENSIONIN STRUCTURE BAPIPAREX

*" EXTENSIONOUT STRUCTURE BAPIPAREX

*" POEXPIMPITEM STRUCTURE BAPIEIPO

*" POEXPIMPITEMX STRUCTURE BAPIEIPOX

*" POTEXTHEADER STRUCTURE BAPIMEPOTEXTHEADER

*" POTEXTITEM STRUCTURE BAPIMEPOTEXT

*" ALLVERSIONS STRUCTURE BAPIMEDCM_ALLVERSIONS

*" POPARTNER STRUCTURE BAPIEKKOP

*" POCOMPONENTS STRUCTURE BAPIMEPOCOMPONENT

*" POCOMPONENTSX STRUCTURE BAPIMEPOCOMPONENTX

*" POSHIPPING STRUCTURE BAPIITEMSHIP

*" POSHIPPINGX STRUCTURE BAPIITEMSHIPX

*" POSHIPPINGEXP STRUCTURE BAPIMEPOSHIPPEXP

*" POHISTORY STRUCTURE BAPIEKBE

*" POHISTORY_TOTALS STRUCTURE BAPIEKBES

*" POCONFIRMATION STRUCTURE BAPIEKES

*" NFMETALLITMS STRUCTURE /NFM/BAPIDOCITM

*" CHANGING

*" VALUE(POHEADER) TYPE BAPIMEPOHEADER

*" VALUE(POHEADERX) TYPE BAPIMEPOHEADERX

*"----


************************************************************************

  • PROGRAM Z_BC1_BAPI_PO_CHANGE

  • TITLE Function module to Change PO using BAPI

  • AUTHOR Aveek Ghose

  • DATE WRITTEN 24.05.2006

  • R/3 RELEASE 4.6C

*----


  • COPIED FROM N/A

*

  • This function module is called during PO change in Ariba.

  • The call to this function module is from WebMethods. The function

  • module performs custom validations on data provided from Ariba and

  • then calls BAPI_PO_CHANGE. The error messages are returned to Ariba.

*

*----


  • PROGRAM TYPE Function module

  • DEV. CLASS ZP2P

  • LOGICAL DB N/A

*----


  • SCREENS N/A

  • GUl TITLE N/A

  • GUl STATUS N/A

  • TRANSACTIONS N/A

  • USER EXITS N/A

*----


*----


----


  • DB-Tables

----


TABLES: ekkn, "Account Assignment in Purchasing Document

ekbe. "History per Purchasing Document

  • zconstants_new. "Constants for various interfaces

  • & programs with comp code

----


  • Global variables

----


DATA: g_cnt_poaccount TYPE i, "No. of records in POACCOUNT

g_cnt_ekkn TYPE i, "No. of records in EKKN

g_msgv1 LIKE sy-msgv1. "Message variable1

----


  • Internal Tables

----


DATA: g_t_poaccount_tmp LIKE poaccount OCCURS 0 WITH HEADER LINE,

g_t_poaccount1 LIKE poaccount OCCURS 0 WITH HEADER LINE,

g_t_poaccountx1 LIKE poaccountx OCCURS 0 WITH HEADER LINE,

g_t_poaccount LIKE poaccount OCCURS 0 WITH HEADER LINE,

*PVU-20-May-2004 - Changes for SCR1

g_t_itemx_tmp LIKE poitemx OCCURS 0 WITH HEADER LINE,

g_t_schdx_tmp LIKE poschedulex OCCURS 0 WITH HEADER LINE,

g_t_accntx_tmp LIKE poaccountx OCCURS 0 WITH HEADER LINE,

g_t_condx_tmp LIKE pocondx OCCURS 0 WITH HEADER LINE.

  • T_Zconstants LIKE ZCONSTANTS_NEW OCCURS 0 WITH HEADER LINE.

*RD1K911982

*PVU-20-May-2004 - End Changes for SCR1

----


  • Structure

----


DATA: g_w_hdrx_tmp LIKE poheaderx. "PVU-20-May-2004 - Changes for SCR1

  • DATA: p_constname TYPE zconstname, "Constant Name

  • g_constval TYPE zconstval, "Constant Value

  • c_po_ehub_var LIKE ZCONSTANTS_NEW-CONSTname value 'EHUB_POS%'.

DATA : L_CONST_NAME LIKE SY-MSGV1, "Constant name

L_COMP_CODE LIKE SY-MSGV2. "Company code

DATA: L_WA_TIMESTAMP TYPE ZP2P_TIMESTAMP.

data: l_waers type waers.

DATA: L_EKORG TYPE EKORG.

DATA: L_SERIAL TYPE I.

DATA : L_VEND_ACTGRP(30) TYPE C, "Vendor Account Group

L_VEND_PAYTRM(30) TYPE C, "Vendor Payment Terms

L_VEND_RECON(30) TYPE C, "Vendor Reconciliation Account

L_MSGV1 LIKE SY-MSGV1, "Message variable1

L_WBS_EXTERNAL LIKE BAPIMEPOACCOUNT-WBS_ELEMENT,

"WBS external format

L_WBS_INTERNAL LIKE BAPIMEPOACCOUNT-WBS_ELEMENT,

L_bukrs type bukrs.

  • Ranges :r_ehub_pos for t_zconstants-constvalu.

    • Begin of Change SVALIDET(RD1K911990)

  • SELECT *

  • FROM zconstants_new

  • INTO TABLE t_zconstants

  • WHERE constname LIKE c_po_ehub_var. " EHUB_POS%

*

  • IF sy-subrc = 0.

  • SORT t_zconstants BY constvalu ASCENDING.

  • DELETE ADJACENT DUPLICATES FROM t_zconstants

  • COMPARING constvalu.

  • LOOP AT t_zconstants.

  • r_ehub_pos-sign = 'I'.

  • r_ehub_pos-option = 'EQ'.

  • r_ehub_pos-low = t_zconstants-constvalu.

  • APPEND r_ehub_pos.

  • CLEAR: r_ehub_pos,

  • t_zconstants.

  • ENDLOOP.

  • ENDIF.

**End of Change SVALIDET(RD1K911990)

*

    • Srini 18-May-2005 Start of changes

    • Developer Flexibility to debug issues

  • p_constname = 'BAPI_PO_CHANGE2'.

*

  • do.

  • CALL FUNCTION 'ZXA_GET_CONSTANT'

  • EXPORTING

  • const_name = p_constname

    • comp_code =

  • IMPORTING

  • const_value = g_constval

  • EXCEPTIONS

  • no_value_found = 1

  • null_value = 2

  • OTHERS = 3.

  • if g_constval NE 'X'.

  • exit.

  • endif.

  • enddo.

*Begin of comment RD1Kk911990

  • IF PURCHASEORDER+0(3) EQ '099' AND POHEADER-DOC_TYPE EQ 'ZEHS'.

  • POHEADER-DOC_TYPE = 'ZEH'.

  • ENDIF.

*End of comment RD1K911990

**********************************************************

*mod-003

**********************************************************

    • if not poheader-comp_code is initial.

  • if poheader-comp_code is initial.

  • clear: l_bukrs.

  • select single companycode

  • into l_bukrs

  • from zcompanycodes01

    • where companycode = poheader-comp_code and

  • where FSID = poheader-fsid and

  • le = poheader-le and

  • frmrc = poheader-frmrc.

*

  • if sy-subrc ne 0.

  • CLEAR L_MSGV1.

  • L_MSGV1 = POHEADER-DOC_TYPE.

    • Please Enter an Account number for line

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = C_MSGTYPE_E

  • CL = C_MSGID_Z001

  • NUMBER = C_MSGNR_618

  • PAR1 = L_MSGV1

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

  • else.

  • poheader-comp_code = l_bukrs.

  • endif.

  • endif.

**********************************************************

*mod-003

**********************************************************

  • IF POHEADER-DOC_TYPE EQ 'ZEHS'.

  • POHEADER-DOC_TYPE = 'ZEH'.

  • ENDIF.

  • SORT poaccount BY po_item serial_no.

*Clear internal tables and global variables

REFRESH: g_t_poaccount_tmp,

g_t_poaccount1,

g_t_poaccountx1,

g_t_poaccount,

return,

  • g_t_idoc_data,

g_t_itemx_tmp,

g_t_schdx_tmp,

g_t_accntx_tmp,

g_t_condx_tmp.

CLEAR: g_cnt_poaccount,

g_cnt_ekkn,

g_msgv1.

  • g_distr_perc,

  • g_distr_perc1,

  • g_adjust_perc,

  • g_idoc_no,

  • g_w_hdrx_tmp.

IF poheader-po_number+0(1) = 'C'.

poheader-doc_type = 'ZAC'.

ENDIF.

IF poheader-po_number+0(1) = 'P'.

poheader-doc_type = 'ZAP'.

ENDIF.

IF poheader-po_number IS INITIAL.

poheader-doc_type = 'ZAPS'.

ENDIF.

IF purchaseorder(3) <> c_pco.

g_t_poaccount[] = poaccount[].

  • To retrieve the line items with blank GL Account Number

  • PERFORM filter_items TABLES g_t_poaccount.

LOOP AT g_t_poaccount.

CLEAR g_msgv1.

g_msgv1 = g_t_poaccount-po_item.

  • Please Enter an Account number for line

CALL FUNCTION 'BALW_BAPIRETURN_GET2'

EXPORTING

type = c_msgtype_e "E

cl = c_msgid_z001 "Z001

number = c_msgnr_037 "037

par1 = g_msgv1

IMPORTING

return = return.

APPEND return.

CLEAR return.

loop at return.

l_wa_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

l_wa_ZERRORS-serial_no = sy-tabix.

l_wa_ZERRORS-COMP_CODE = poheader-comp_code.

l_wa_ZERRORS-zid = return-id.

l_wa_ZERRORS-znumber = return-number.

l_wa_ZERRORS-BEACON_DOC_NO = poheader-po_number.

l_wa_ZERRORS-SRC_DOC_NO = poheader-po_number.

l_wa_ZERRORS-ZDATE = sy-datum.

l_wa_ZERRORS-ERR_MSG = return-message.

append l_wa_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values l_wa_ZP2P_ERRORS.

clear: L_WA_ZERRORS.

endloop.

CLEAR g_msgv1.

ENDLOOP.

SORT return BY type.

  • On Error, exit the function module

READ TABLE return

WITH KEY type = c_msgtype_e "E

BINARY SEARCH.

IF sy-subrc EQ 0.

EXIT.

ENDIF.

***Begin of Change - BVIJAYA 01-July-2004 TPR-2239

  • If line item is marked for deletion, Clear the final_inv indicator,

  • so that the condition value[conditions tab(po header)] reflects the

  • correct gross price for the remaining items.

SORT poitem BY po_item.

SORT poitemx BY po_item.

LOOP AT poitem.

IF NOT poitem-delete_ind IS INITIAL. "delete ind marked.

  • sraman2 07/17/04

*For item deletion to work properly

*indicator should be 'D'. webmethods passes indicator 'X'.

poitem-delete_ind = 'D'.

  • sraman2 07/17/04

CLEAR poitem-final_inv.

MODIFY poitem.

READ TABLE poitemx WITH KEY po_item = poitem-po_item.

IF sy-subrc = 0.

poitemx-final_inv = c_checked. "X

MODIFY poitemx INDEX sy-tabix.

ENDIF.

else.

ENDIF.

ENDLOOP.

endif.

****************************************************

*mod-003

****************************************************

DATA: L_TABIX TYPE SY-TABIX.

LOOP AT POITEM.

TBX = SY-TABIX.

l_wa_timestamp-mandt = SY-MANDT.

l_wa_timestamp-EBELN = POHEADER-PO_NUMBER.

l_wa_timestamp-EBELP = POITEM-PO_ITEM.

l_wa_timestamp-CHANGE_IND = ' '.

l_wa_timestamp-DATE_TIME_STMP = POITEM-ARIBACRTTIMESTMP.

insert into ZP2P_TIMESTAMP values l_wa_timestamp.

clear: poheader-ARIBACRTTIMESTMP,

poheader-ARIBACHGTIMESTMP.

IF NOT POITEM-DISTRIB IS INITIAL.

CLEAR : L_CONST_NAME,

L_COMP_CODE.

READ TABLE POACCOUNT INDEX L_TABIX.

IF SY-SUBRC EQ 0.

L_CONST_NAME = POACCOUNT-GL_ACCOUNT.

L_COMP_CODE = L_comp_code.

CALL FUNCTION 'BALW_BAPIRETURN_GET2'

EXPORTING

type = c_msgtype_e "E

cl = c_msgid_z001

number = c_msgnr_613

PAR1 = L_CONST_NAME

PAR2 = L_COMP_CODE

IMPORTING

return = t_yreturn.

APPEND t_yreturn.

CLEAR t_yreturn.

loop at t_yreturn.

L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

L_WA_ZERRORS-serial_no = sy-tabix.

L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

L_WA_ZERRORS-zid = t_yreturn-id.

L_WA_ZERRORS-znumber = t_yreturn-number.

L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

L_WA_ZERRORS-ZDATE = sy-datum.

L_WA_ZERRORS-ERR_MSG = t_yreturn-message.

append L_WA_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values L_WA_ZERRORS.

clear: L_WA_ZERRORS.

endloop.

ENDIF.

ENDIF.

ENDLOOP.

if not poheader-currency is initial.

if not poheader-vendor is initial.

loop at pocond.

SELECT SINGLE WAERS

INTO L_WAERS

FROM LFM1 WHERE

LIFNR = POHEADER-VENDOR

AND EKORG = POHEADER-PURCH_ORG.

IF SY-SUBRC NE 0.

IF L_WAERS NE poheader-currency.

pocond-cond_value = 'PBXX'.

pocond-currency = l_waers.

modify pocond transporting cond_value currency.

endif.

ENDIF.

endloop.

ENDIF.

ENDIF.

IF NOT TESTRUN IS INITIAL.

POHEADER-VENDOR = '4259999999'.

poheader-doc_type = 'ZAPS'.

ENDIF.

  • IF NOT POHEADER-PURCH_ORG IS INITIAL.

  • IF POHEADER-PURCH_ORG IS INITIAL.

  • SELECT SINGLE PUR_ORG

  • INTO L_EKORG

  • FROM ZPUR_ORG

  • WHERE LE = POHEADER-LE AND

  • FRMRC = POHEADER-FRMRC AND

  • FSID = POHEADER-FSID.

*

  • IF SY-SUBRC NE 0.

  • CLEAR : L_CONST_NAME,

  • L_COMP_CODE.

*

  • L_CONST_NAME = C_p2p_pur_ORG.

  • L_COMP_CODE = POHEADER-COMP_CODE.

*

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = c_msgtype_e

  • CL = c_msgid_z001

  • NUMBER = c_msgnr_619

  • PAR1 = L_CONST_NAME

  • PAR2 = L_COMP_CODE

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

*

  • loop at t_yreturn.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = t_yreturn-id.

  • L_WA_ZERRORS-znumber = t_yreturn-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = t_yreturn-message.

  • append L_WA_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

  • EXIT.

  • ELSE.

  • POHEADER-PURCH_ORG = L_EKORG.

  • ENDIF.

  • ENDIF.

  • IF NOT POHEADER-PUR_GROUP IS INITIAL.

  • IF POHEADER-PUR_GROUP IS INITIAL.

  • clear: g_constval.

  • CALL FUNCTION 'ZXA_GET_CONSTANT'

  • EXPORTING

  • const_name = c_p2p_pur_org

  • comp_code = POHEADER-COMP_CODE

  • IMPORTING

  • const_value = g_constval

  • EXCEPTIONS

  • no_value_found = 1

  • null_value = 2

  • OTHERS = 3.

*

*

  • IF SY-SUBRC NE 0.

  • CLEAR : L_CONST_NAME,

  • L_COMP_CODE.

*

  • L_CONST_NAME = C_p2p_pur_org.

  • L_COMP_CODE = POHEADER-COMP_CODE.

*

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = c_msgtype_e

  • CL = c_msgid_z001

  • NUMBER = c_msgnr_046

  • PAR1 = L_CONST_NAME

  • PAR2 = L_COMP_CODE

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

*

  • loop at t_yreturn.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = t_yreturn-id.

  • L_WA_ZERRORS-znumber = t_yreturn-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = t_yreturn-message.

  • append L_WA_ZERRORS to t_errors.

    • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

  • EXIT.

  • ELSE.

  • POHEADER-PUR_GROUP = G_CONSTVAL.

  • ENDIF.

  • ENDIF.

*

  • data: l_werks1 type werks_d.

  • LOOP AT poitem.

  • if poitem-plant is initial.

  • clear: l_werks1.

  • select single plant

  • into l_werks1

  • from zpo_plantmapping

  • where COMPANY_CODE = poheader-comp_code and

  • PUR_ORG = poheader-purch_org and

  • PUR_GROUP = poheader-pur_group and

  • LE = poheader-le and

  • FSID = poheader-fsid and

  • FRMRC = poheader-frmrc.

  • if sy-subrc ne 0.

  • PERFORM ERROR_HANDLING_PLANT USING POHEADER

  • poheader-comp_code

  • L_WA_ZERRORS.

  • EXIT.

  • else.

  • poitem-plant = l_werks1.

  • CLEAR: L_WERKS1.

  • endif.

  • endif.

    • IF POITEM-NET_PRICE NE POHEADER-CURRENCY.

    • POITEM-NET_PRICE = POHEADER-CURRENCY.

    • ENDIF.

*

  • IF POITEM-net_price NE 0.

  • POITEM-IR_IND = 'X'.

  • ENDIF.

*

  • POITEM-UNLIMITED_DLV = 'X'.

  • POITEM-UNDER_DLV_TOL = 0.

  • clear: poitem-ARIBACRTTIMESTMP,

  • poitem-ARIBAUPDTIMESTMP.

*

  • MODIFY POITEM TRANSPORTING UNLIMITED_DLV

  • UNDER_DLV_TOL

  • PLANT

  • IR_IND

  • ARIBACRTTIMESTMP

  • ARIBAUPDTIMESTMP.

*

*

  • ENDLOOP.

**********************************************************

*mod-003

***********************************************************

if not poheader-currency is initial.

if not poheader-vendor is initial.

loop at pocond.

SELECT SINGLE WAERS

INTO L_WAERS

FROM LFM1 WHERE

LIFNR = POHEADER-VENDOR

AND EKORG = POHEADER-PURCH_ORG.

IF SY-SUBRC NE 0.

IF L_WAERS NE poheader-currency.

pocond-cond_value = 'PBXX'.

pocond-currency = l_waers.

modify pocond transporting cond_value currency.

endif.

ENDIF.

endloop.

ENDIF.

ENDIF.

IF NOT TESTRUN IS INITIAL.

POHEADER-VENDOR = '4259999999'.

poheader-doc_type = 'ZAPS'.

ENDIF.

  • IF NOT POHEADER-PURCH_ORG IS INITIAL.

  • IF POHEADER-PURCH_ORG IS INITIAL.

  • SELECT SINGLE PUR_ORG

  • INTO L_EKORG

  • FROM ZPUR_ORG

  • WHERE LE = POHEADER-LE AND

  • FRMRC = POHEADER-FRMRC AND

  • FSID = POHEADER-FSID.

*

  • IF SY-SUBRC NE 0.

  • CLEAR : L_CONST_NAME,

  • L_COMP_CODE.

*

  • L_CONST_NAME = C_p2p_pur_ORG.

  • L_COMP_CODE = POHEADER-COMP_CODE.

*

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = c_msgtype_e

  • CL = c_msgid_z001

  • NUMBER = c_msgnr_619

  • PAR1 = L_CONST_NAME

  • PAR2 = L_COMP_CODE

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

*

  • loop at t_yreturn.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = t_yreturn-id.

  • L_WA_ZERRORS-znumber = t_yreturn-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = t_yreturn-message.

  • append L_WA_ZERRORS to t_errors.

    • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

  • EXIT.

  • ELSE.

  • POHEADER-PURCH_ORG = L_EKORG.

  • ENDIF.

  • ENDIF.

*

    • IF NOT POHEADER-PUR_GROUP IS INITIAL.

  • IF POHEADER-PUR_GROUP IS INITIAL.

  • clear: g_constval.

  • CALL FUNCTION 'ZXA_GET_CONSTANT'

  • EXPORTING

  • const_name = c_p2p_pur_org

  • comp_code = POHEADER-COMP_CODE

  • IMPORTING

  • const_value = g_constval

  • EXCEPTIONS

  • no_value_found = 1

  • null_value = 2

  • OTHERS = 3.

*

*

  • IF SY-SUBRC NE 0.

  • CLEAR : L_CONST_NAME,

  • L_COMP_CODE.

*

  • L_CONST_NAME = C_p2p_pur_org.

  • L_COMP_CODE = POHEADER-COMP_CODE.

*

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = c_msgtype_e

  • CL = c_msgid_z001

  • NUMBER = c_msgnr_046

  • PAR1 = L_CONST_NAME

  • PAR2 = L_COMP_CODE

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

*

  • loop at return.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = return-id.

  • L_WA_ZERRORS-znumber = return-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = return-message.

  • append L_WA_ZERRORS to t_errors.

    • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

  • EXIT.

  • ELSE.

  • POHEADER-PUR_GROUP = G_CONSTVAL.

  • ENDIF.

  • ENDIF.

**********************************************************

*mod-003

***********************************************************

*-- Retrieve Account Assignment

PERFORM get_account_assignment TABLES poitem

poitemx

poaccount

poaccountx

t_yreturn

USING poheader-comp_code

poheader.

****************************************************

*mod-003

****************************************************

IF NOT t_yreturn[] IS INITIAL.

APPEND LINES OF t_yreturn TO RETURN.

loop at return.

L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

L_WA_ZERRORS-serial_no = sy-tabix.

L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

L_WA_ZERRORS-zid = return-id.

L_WA_ZERRORS-znumber = return-number.

L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

L_WA_ZERRORS-ZDATE = sy-datum.

L_WA_ZERRORS-ERR_MSG = return-message.

append L_WA_ZERRORS to t_errors.

clear: L_WA_ZERRORS.

endloop.

SELECT max( serial_no )

INTO L_SERIAL

FROM ZP2P_ERRORS.

LOOP AT T_ERRORS.

L_SERIAL = L_SERIAL + 1.

T_ERRORS-serial_no = L_SERIAL.

MODIFY T_ERRORS TRANSPORTING serial_no.

ENDLOOP.

INSERT ZP2P_ERRORS FROM TABLE T_ERRORS.

ENDIF.

READ TABLE t_yreturn WITH KEY type = 'E'.

IF sy-subrc = 0.

EXIT.

ENDIF.

*For Non-PCO Orders, do not update the GR and IR Indicator if the

*indicator passed in the current run is same as in PO.

SORT poitem BY po_item.

SORT poitemx BY po_item.

LOOP AT poitem.

SELECT SINGLE wepos "Goods receipt indicator

repos "Invoice receipt indicator

INTO (ekpo-wepos, ekpo-repos)

FROM ekpo

WHERE ebeln = purchaseorder AND

ebelp = poitem-po_item.

IF sy-subrc EQ 0.

IF ekpo-wepos EQ poitem-gr_ind.

READ TABLE poitemx

WITH KEY po_item = poitem-po_item

BINARY SEARCH.

IF sy-subrc EQ 0.

CLEAR poitemx-gr_ind.

MODIFY poitemx INDEX sy-tabix.

ENDIF.

ENDIF.

IF ekpo-repos EQ poitem-ir_ind.

READ TABLE poitemx

WITH KEY po_item = poitem-po_item

BINARY SEARCH.

IF sy-subrc EQ 0.

CLEAR poitemx-ir_ind.

MODIFY poitemx INDEX sy-tabix.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

*Logic for addition, deletion and change of records in

*account assignment

LOOP AT poaccount.

CLEAR g_t_poaccount_tmp.

MOVE-CORRESPONDING poaccount TO g_t_poaccount_tmp.

APPEND g_t_poaccount_tmp.

ADD 1 TO g_cnt_poaccount.

AT END OF po_item.

SORT g_t_poaccount_tmp.

  • For single account assignment, if the goods receipt is not posted,

  • set the non-valuated indicator to blank.

IF g_cnt_poaccount EQ 1.

SELECT belnr "History per Purchasing Document

INTO ekbe-belnr

FROM ekbe

UP TO 1 ROWS

WHERE ebeln = purchaseorder AND

ebelp = g_t_poaccount_tmp-po_item AND

vgabe = 1.

ENDSELECT.

IF sy-subrc NE 0.

*PVU-08-May-2004 - Set the no valuated GR indicator to blank in POITEM

READ TABLE poitem

WITH KEY po_item = g_t_poaccount_tmp-po_item

BINARY SEARCH.

IF sy-subrc EQ 0.

CLEAR poitem-gr_non_val .

MODIFY poitem INDEX sy-tabix.

ENDIF.

*PVU-08-May-2004 - End of Set the no valuated GR indicator to blank

READ TABLE poitemx

WITH KEY po_item = g_t_poaccount_tmp-po_item

BINARY SEARCH.

IF sy-subrc EQ 0.

poitemx-gr_non_val = c_checked.

MODIFY poitemx INDEX sy-tabix.

ENDIF.

ENDIF.

ENDIF.

CLEAR: ekkn.

SELECT * FROM ekkn

WHERE ebeln = purchaseorder AND

ebelp = poaccount-po_item

ORDER BY zekkn.

ADD 1 TO g_cnt_ekkn.

**BV-12-July-2004- Begin of change - split line accounting

*clear the headerline before data population

CLEAR : g_t_poaccount1,

g_t_poaccountx1.

**BV-12-July-2004- End of change - split line accounting

READ TABLE g_t_poaccount_tmp INDEX g_cnt_ekkn.

IF sy-subrc EQ 0.

g_t_poaccount1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccount1-serial_no = ekkn-zekkn.

g_t_poaccount1-quantity = g_t_poaccount_tmp-quantity.

g_t_poaccount1-gl_account = g_t_poaccount_tmp-gl_account.

READ TABLE poitem

WITH KEY po_item = poaccount-po_item. "dd

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccount1-costcenter = g_t_poaccount_tmp-costcenter .

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccount1-wbs_element = g_t_poaccount_tmp-wbs_element.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccount1-orderid = g_t_poaccount_tmp-orderid.

g_t_poaccount1-distr_perc = g_t_poaccount_tmp-distr_perc.

APPEND g_t_poaccount1.

g_t_poaccountx1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccountx1-serial_no = ekkn-zekkn.

g_t_poaccountx1-po_itemx = c_checked.

g_t_poaccountx1-quantity = c_checked.

g_t_poaccountx1-gl_account = c_checked.

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccountx1-costcenter = c_checked.

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccountx1-wbs_element = c_checked.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccountx1-orderid = c_checked.

g_t_poaccountx1-distr_perc = c_checked.

APPEND g_t_poaccountx1.

*If line is deleted from account assignment in Ariba

*then delete that line from SAP PO

ELSE.

g_t_poaccount1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccount1-serial_no = ekkn-zekkn.

g_t_poaccount1-delete_ind = c_checked.

g_t_poaccount1-quantity = ekkn-menge.

g_t_poaccount1-gl_account = ekkn-sakto.

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccount1-costcenter = ekkn-kostl.

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccount1-wbs_element = ekkn-ps_psp_pnr.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccount1-orderid = ekkn-aufnr.

APPEND g_t_poaccount1.

g_t_poaccountx1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccountx1-serial_no = ekkn-zekkn.

g_t_poaccountx1-po_itemx = c_checked.

g_t_poaccountx1-delete_ind = c_checked.

g_t_poaccountx1-quantity = c_checked.

g_t_poaccountx1-gl_account = c_checked.

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccountx1-costcenter = c_checked.

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccountx1-wbs_element = c_checked.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccountx1-orderid = c_checked.

APPEND g_t_poaccountx1.

ENDIF.

SUBTRACT 1 FROM g_cnt_poaccount.

ENDSELECT.

**BV-12-July-2004- Begin of change - split line accounting

*clear the headerline before data population

CLEAR : g_t_poaccount1,

g_t_poaccountx1.

**BV-12-July-2004- End of change - split line accounting

  • If new lines are added to account assignment in Ariba

  • add those lines to SAP PO

IF g_cnt_poaccount GT 0.

g_cnt_ekkn = ekkn-zekkn.

SORT g_t_poaccount_tmp DESCENDING BY serial_no.

LOOP AT g_t_poaccount_tmp.

ADD 1 TO g_cnt_ekkn.

g_t_poaccount1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccount1-serial_no = g_cnt_ekkn.

g_t_poaccount1-quantity = g_t_poaccount_tmp-quantity.

g_t_poaccount1-gl_account = g_t_poaccount_tmp-gl_account.

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccount1-costcenter = g_t_poaccount_tmp-costcenter.

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccount1-wbs_element = g_t_poaccount_tmp-wbs_element.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccount1-orderid = g_t_poaccount_tmp-orderid.

g_t_poaccount1-distr_perc = g_t_poaccount_tmp-distr_perc.

APPEND g_t_poaccount1.

g_t_poaccountx1-po_item = g_t_poaccount_tmp-po_item.

g_t_poaccountx1-serial_no = g_cnt_ekkn.

g_t_poaccountx1-po_itemx = c_checked.

g_t_poaccountx1-quantity = c_checked.

g_t_poaccountx1-gl_account = c_checked.

*PVU-11-May-2004-Set cost center or WBS element depending on acc.assgn.

IF poitem-acctasscat = c_costcenter. "K

g_t_poaccountx1-costcenter = c_checked.

ELSEIF poitem-acctasscat = c_wbs. "P

g_t_poaccountx1-wbs_element = c_checked.

ENDIF.

*PVU-11-May-2004-End of set cost center or WBS element.

g_t_poaccountx1-orderid = c_checked.

g_t_poaccountx1-distr_perc = c_checked.

APPEND g_t_poaccountx1.

SUBTRACT 1 FROM g_cnt_poaccount.

IF g_cnt_poaccount EQ 0.

EXIT.

ENDIF.

ENDLOOP.

ENDIF.

CLEAR: g_cnt_poaccount, g_cnt_ekkn.

REFRESH g_t_poaccount_tmp.

ENDAT.

ENDLOOP.

REFRESH: poaccount, poaccountx.

CLEAR: poaccount, poaccountx.

APPEND LINES OF g_t_poaccount1 TO poaccount.

APPEND LINES OF g_t_poaccountx1 TO poaccountx.

REFRESH: g_t_poaccount1, g_t_poaccountx1.

SORT: poaccount, poaccountx.

*For POs Converted from legacy system, populate the item quantity and

*price based on the original purchase order qty/price. Also, populate

*the actual qty and price passed by Ariba in the Net weight and gross

*weight fields.

LOOP AT poitem.

CLEAR: ekpo.

SELECT SINGLE menge "Purchase order quantity

netpr "Net price in PO

INTO (ekpo-menge, ekpo-netpr)

FROM ekpo

WHERE ebeln EQ purchaseorder AND

ebelp EQ poitem-po_item. "AND

IF sy-subrc EQ 0.

  • Turn off Final Invoice Indicator if net price or quantity is higher

  • than the existing value.

IF poitem-quantity GT ekpo-menge OR

poitem-net_price GT ekpo-netpr.

CLEAR poitem-final_inv.

READ TABLE poitemx

WITH KEY po_item = poitem-po_item

BINARY SEARCH.

IF sy-subrc EQ 0.

poitemx-final_inv = c_checked.

MODIFY poitemx INDEX sy-tabix.

ENDIF.

ENDIF.

MODIFY poitem.

ENDIF.

ENDLOOP.

*endif.

****Start of changes by Balaji V - 08-June-04

****Zero Pad and Prefix 1 to Vendor.

DATA : L_LENGTH TYPE I.

"Vendor string length.

  • L_MSGV1 LIKE SY-MSGV1. "Message variable1

IF NOT POHEADER-VENDOR IS INITIAL.

*remove any leading zeros for vendor populated from webmethods

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'

EXPORTING

INPUT = POHEADER-VENDOR

IMPORTING

OUTPUT = POHEADER-VENDOR.

L_LENGTH = STRLEN( POHEADER-VENDOR ).

IF L_LENGTH < 10.

*To pad leading zeros to Vendor

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

INPUT = POHEADER-VENDOR

IMPORTING

OUTPUT = POHEADER-VENDOR.

*To replace first character with 1.

MOVE '1' TO POHEADER-VENDOR(1).

ELSE. "Vendor is 10 char in length

CLEAR L_MSGV1.

L_MSGV1 = POHEADER-VENDOR.

*Zero Padding and Prefixing 1 Not possible.Vendor is 10 Character

*length

CALL FUNCTION 'BALW_BAPIRETURN_GET2'

EXPORTING

TYPE = C_MSGTYPE_I "I

CL = C_MSGID_Z001 "Z001

NUMBER = C_MSGNR_040 "040

PAR1 = L_MSGV1

IMPORTING

RETURN = RETURN.

APPEND RETURN.

CLEAR RETURN.

loop at return.

L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

L_WA_ZERRORS-serial_no = sy-tabix.

L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

L_WA_ZERRORS-zid = return-id.

L_WA_ZERRORS-znumber = return-number.

L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

L_WA_ZERRORS-ZDATE = sy-datum.

L_WA_ZERRORS-ERR_MSG = return-message.

append L_WA_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values L_WA_ZERRORS.

clear: L_WA_ZERRORS.

endloop.

ENDIF.

ENDIF.

****End of changes by Balaji V - 08-June-04

**********************************************************

*mod-003

***********************************************************

****************************************************

*mod-003

****************************************************

  • if not poheader-comp_code is initial.

  • select single companycode

  • into l_bukrs

  • from zcompanycodes01

  • where companycode = poheader-comp_code and

  • FSID = poheader-fsid and

  • le = poheader-le and

  • frmrc = poheader-frmrc.

*

  • if sy-subrc ne 0.

  • CLEAR L_MSGV1.

  • L_MSGV1 = POACCOUNT-PO_ITEM.

    • Please Enter an Account number for line

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = C_MSGTYPE_E

  • CL = C_MSGID_Z001

  • NUMBER = C_MSGNR_618

  • PAR1 = L_MSGV1

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

  • loop at return.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = return-id.

  • L_WA_ZERRORS-znumber = return-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = return-message.

  • append L_WA_ZERRORS to t_errors.

    • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

*

  • ELSE.

  • poheader-comp_code = l_bukrs.

  • endif.

  • endif.

**********************************************************

*mod-003

***********************************************************

if not poheader-currency is initial.

if not poheader-vendor is initial.

loop at pocond.

SELECT SINGLE WAERS

INTO L_WAERS

FROM LFM1 WHERE

LIFNR = POHEADER-VENDOR

AND EKORG = POHEADER-PURCH_ORG.

IF SY-SUBRC NE 0.

IF L_WAERS NE poheader-currency.

pocond-cond_value = 'PBXX'.

pocond-currency = l_waers.

modify pocond transporting cond_value currency.

endif.

ENDIF.

endloop.

ENDIF.

ENDIF.

**********************************************************

*mod-003

***********************************************************

  • IF NOT TESTRUN IS INITIAL.

  • POHEADER-VENDOR = '4259999999'.

  • poheader-doc_type = 'ZAP'.

  • ENDIF.

**********************************************************

*mod-003

***********************************************************

**********************************************************

*mod-003

***********************************************************

  • IF NOT POHEADER-PURCH_ORG IS INITIAL.

  • SELECT SINGLE PUR_ORG

  • INTO L_EKORG

  • FROM ZPUR_ORG

  • WHERE LE = POHEADER-LE AND

  • FRMRC = POHEADER-FRMRC AND

  • FSID = POHEADER-FSID.

*

  • IF SY-SUBRC NE 0.

  • CLEAR : L_CONST_NAME,

  • L_COMP_CODE.

*

  • L_CONST_NAME = C_p2p_pur_ORG.

  • L_COMP_CODE = POHEADER-COMP_CODE.

*

  • CALL FUNCTION 'BALW_BAPIRETURN_GET2'

  • EXPORTING

  • TYPE = c_msgtype_e

  • CL = c_msgid_z001

  • NUMBER = c_msgnr_619

  • PAR1 = L_CONST_NAME

  • PAR2 = L_COMP_CODE

  • IMPORTING

  • RETURN = RETURN.

*

  • APPEND RETURN.

  • CLEAR RETURN.

*

  • loop at return.

  • L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

  • L_WA_ZERRORS-serial_no = sy-tabix.

  • L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

  • L_WA_ZERRORS-zid = return-id.

  • L_WA_ZERRORS-znumber = return-number.

  • L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

  • L_WA_ZERRORS-ZDATE = sy-datum.

  • L_WA_ZERRORS-ERR_MSG = return-message.

  • append L_WA_ZERRORS to t_errors.

    • insert into ZP2P_ERRORS values L_WA_ZERRORS.

  • clear: L_WA_ZERRORS.

  • endloop.

  • EXIT.

  • ELSE.

  • POHEADER-PURCH_ORG = L_EKORG.

  • ENDIF.

  • ENDIF.

**********************************************************

*mod-003

**********************************************************

LOOP AT POITEM.

l_wa_timestamp-mandt = SY-MANDT.

l_wa_timestamp-EBELN = POHEADER-PO_NUMBER.

l_wa_timestamp-EBELP = POITEM-PO_ITEM.

l_wa_timestamp-CHANGE_IND = ' '.

l_wa_timestamp-DATE_TIME_STMP = POHEADER-ARIBACHGTIMESTMP.

insert into ZP2P_TIMESTAMP values l_wa_timestamp.

ENDLOOP.

DATA: g_constval(10) type c.

IF NOT POHEADER-PUR_GROUP IS INITIAL.

clear: g_constval.

CALL FUNCTION 'ZXA_GET_CONSTANT'

EXPORTING

const_name = c_p2p_pur_org

comp_code = POHEADER-COMP_CODE

IMPORTING

const_value = g_constval

EXCEPTIONS

no_value_found = 1

null_value = 2

OTHERS = 3.

IF SY-SUBRC NE 0.

CLEAR : L_CONST_NAME,

L_COMP_CODE.

L_CONST_NAME = C_p2p_pur_org.

L_COMP_CODE = POHEADER-COMP_CODE.

CALL FUNCTION 'BALW_BAPIRETURN_GET2'

EXPORTING

TYPE = c_msgtype_e

CL = c_msgid_z001

NUMBER = c_msgnr_619

PAR1 = L_CONST_NAME

PAR2 = L_COMP_CODE

IMPORTING

RETURN = RETURN.

APPEND RETURN.

CLEAR RETURN.

loop at return.

L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

L_WA_ZERRORS-serial_no = sy-tabix.

L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

L_WA_ZERRORS-zid = return-id.

L_WA_ZERRORS-znumber = return-number.

L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

L_WA_ZERRORS-ZDATE = sy-datum.

L_WA_ZERRORS-ERR_MSG = return-message.

append L_WA_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values L_WA_ZERRORS.

clear: L_WA_ZERRORS.

endloop.

EXIT.

ELSE.

POHEADER-PUR_GROUP = G_CONSTVAL.

ENDIF.

ENDIF.

**********************************************************

*mod-003

**********************************************************

IF purchaseorder(3) = c_pco. "PCO

&----


&

*& Begin of Change: 26-Sep-2005 SDUTTARO RD1K910989 *&

&----


&

  • Map the external fields for ALZA with account assignment

  • IF poheader-comp_code = c_bukrs_alza. "@SDR

**-- Retrieve Account Assignment

PERFORM get_account_assignment TABLES poitem "@SDR

poitemx "@SDR

poaccount "@SDR

poaccountx "@SDR

t_yreturn "@SDR

USING poheader-comp_code "@SDR

poheader. "@SDR

  • ENDIF. "@SDR

&----


&

**& Begin of Change: 26-Sep-2005 SDUTTARO RD1K910989 *&

*&----


&

    • For PCO Order, populate the PO and accounting data into a Z table and

    • exit the program run.

  • PERFORM populate_nonpo_document TABLES poitem

  • return

  • potextheader

  • USING purchaseorder

  • poheader.

  • PERFORM populate_nonpo_accounting TABLES poaccount

  • return

  • USING poheader.

**&&---Begin of Addition: Soumya D Roy: 03/10/2006

    • To make sure that the ztables do not get updated in case of

    • checkpoints 1, 2 and get updated only after approval

  • IF testrun IS INITIAL. "SDR

**&&---End of Addition: Soumya D Roy: 03/10/2006

  • PERFORM update_nonpodocument.

**&&---Begin of Addition: Soumya D Roy: 03/10/2006

    • To delete PCOs. No deletion code is required for CRs & UTs

    • as these two cannot be deleted

  • ENDIF. "@SDR

**&&---End of Addition: Soumya D Roy: 03/10/2006

  • LOOP AT t_return.

  • MOVE: t_return-type TO return-type,

  • t_return-number TO return-number,

  • t_return-message TO return-message.

  • APPEND return.

  • CLEAR return.

  • ENDLOOP.

*&&&&&---- Begin of Addition: Soumya D Roy: 03/02/2006

  • Code to build the message table for output to Ariba

  • for PCOs

*GENERATE CUSTOM RETURN MESSAGES BASED ON MESSAGE ID AND NUMBER FROM

*maintenance table ZMESSAGES

  • CALL FUNCTION 'Z_MM_BUILD_MESSAGES'

  • TABLES

  • return = return.

*

  • SORT return BY type id number.

  • READ TABLE return

  • WITH KEY id = space

  • number = c_msgnr_000 "000

  • BINARY SEARCH.

*

  • IF sy-subrc EQ 0 AND sy-tabix NE 1.

  • DELETE return INDEX sy-tabix.

  • INSERT return INDEX 1.

  • ENDIF.

**&&&&----- End of Addition: Soumya D Roy: 03/02/2006

  • EXIT.

ENDIF.

*

*-- Round off to 100 percent due to small difference in one decimal

*-- point rounding (in Ariba/wM)

SORT poaccount BY po_item distr_perc.

LOOP AT poaccount.

ADD poaccount-distr_perc TO g_distr_perc.

AT END OF po_item.

*-- Round off to 100 percent due to small difference in one decimal

*-- point rounding (in Ariba/wM)

IF g_distr_perc GT 0.

g_distr_perc = 100 - g_distr_perc.

g_adjust_perc = c_checked.

ENDIF.

ENDAT.

IF g_adjust_perc = c_checked.

g_distr_perc1 = g_distr_perc + poaccount-distr_perc.

IF g_distr_perc1 = 100.

poaccount-distr_perc = 0.

ELSE.

poaccount-distr_perc = g_distr_perc1.

ENDIF.

MODIFY poaccount.

CLEAR poaccount.

CLEAR: g_distr_perc, g_distr_perc1.

ENDIF.

CLEAR g_adjust_perc.

ENDLOOP.

SORT poaccount.

SORT poschedule BY po_item sched_line.

SORT poschedulex BY po_item sched_line.

*PVU-20-May-2004 - Start Changes for SCR1

***************************************************

**MOD-003

**************************************************

*Populate the change indicator structures before calling BAPI_PO_CHANGE

*so that IDOC can be populated with this data

IF NOT poheaderx IS INITIAL.

g_w_hdrx_tmp = poheaderx.

ENDIF.

IF NOT poitemx[] IS INITIAL.

g_t_itemx_tmp[] = poitemx[].

ENDIF.

IF NOT poschedulex[] IS INITIAL.

g_t_schdx_tmp[] = poschedulex[].

ENDIF.

IF NOT poaccountx[] IS INITIAL.

g_t_accntx_tmp[] = poaccountx[].

ENDIF.

IF NOT pocondx[] IS INITIAL.

g_t_condx_tmp[] = pocondx[].

ENDIF.

***************************************************

**MOD-003

**************************************************

*PVU-20-May-2004 - End Changes for SCR1

*sraman2 06/28/04

*-- Default the Material Group to 99 if the incoming commodity

*-- code don't exist in SAP

LOOP AT poitem.

SELECT SINGLE matkl INTO t023-matkl FROM t023

WHERE matkl = poitem-matl_group.

IF sy-subrc NE 0.

MOVE: '99' TO poitem-matl_group.

MODIFY poitem.

ENDIF.

CLEAR poitem.

ENDLOOP.

*sraman2 06/28/04

*&---Begin of Addition: Soumya D Roy: 03/27/2006

  • Logic for PO changes which are listed in table ZCONVERTEDPOS.

  • ZCONVERTEDPOS contains Purchase Orders ie. both Material and

  • Service which have either NONVAL GR checked or GR checked respectively

  • and are invoiced. Any changes to these POs from Ariba would not let

  • other quantity or amount or text description changes to flow into SAP.

  • This piece of code will keep the Indicators' status same as in SAP

  • and also let the user perform the change.

*Begin of change by svalidet RD1K911990

  • IF purchaseorder+0(3) = '099'.

  • IF purchaseorder+0(3) in r_ehub_pos[].

*End of change by svalidet RD1K911990

CALL FUNCTION 'Z_CONVERTED_POS'

EXPORTING

P_PURCHASEORDER = purchaseorder

P_POHEADER = poheader

TABLES

P_POITEM = poitem

P_POITEMX = poitemx.

  • ENDIF.

**************************************************************

*mod-003

**************************************************************

  • perform get_uom_conversion tables poitem

  • POITEMX

  • poaccount

  • poaccountx

  • poschedule

  • poschedulex

  • changing poheader

  • poheaderx.

perform get_uom_conversion tables poitem

POITEMX

poaccount

poaccountx

poschedule

poschedulex

pocond

pocondx

Pocondheader

pocondheaderx

changing poheader

poheaderx.

**************************************************************

*mod-003

**************************************************************

*Populate the change indicator structures before calling BAPI_PO_CHANGE

*so that IDOC can be populated with this data

IF NOT poheaderx IS INITIAL.

g_w_hdrx_tmp = poheaderx.

ENDIF.

IF NOT poitemx[] IS INITIAL.

g_t_itemx_tmp[] = poitemx[].

ENDIF.

IF NOT poschedulex[] IS INITIAL.

g_t_schdx_tmp[] = poschedulex[].

ENDIF.

IF NOT poaccountx[] IS INITIAL.

g_t_accntx_tmp[] = poaccountx[].

ENDIF.

IF NOT pocondx[] IS INITIAL.

g_t_condx_tmp[] = pocondx[].

ENDIF.

***************************************************

**MOD-003

**************************************************

CALL FUNCTION 'BAPI_PO_CHANGE'

EXPORTING

purchaseorder = purchaseorder

poheader = poheader

poheaderx = poheaderx

poaddrvendor = poaddrvendor

testrun = testrun

memory_uncomplete = memory_uncomplete

memory_complete = memory_complete

  • poexpimpheader = poexpimpheader

  • poexpimpheaderx = poexpimpheaderx

  • versions = versions

  • no_messaging = no_messaging

  • no_message_req = no_message_req

  • no_authority = no_authority

  • no_price_from_po = no_price_from_po

IMPORTING

expheader = expheader

  • exppoexpimpheader = exppoexpimpheader

TABLES

return = return

poitem = poitem

poitemx = poitemx

poaddrdelivery = poaddrdelivery

poschedule = poschedule

poschedulex = poschedulex

poaccount = poaccount

poaccountprofitsegment = poaccountprofitsegment

poaccountx = poaccountx

pocondheader = pocondheader

pocondheaderx = pocondheaderx

pocond = pocond

pocondx = pocondx

polimits = polimits

pocontractlimits = pocontractlimits

poservices = poservices

posrvaccessvalues = posrvaccessvalues

poservicestext = poservicestext

extensionin = extensionin

extensionout = extensionout

  • poexpimpitem = poexpimpitem

  • poexpimpitemx = poexpimpitemx

potextheader = potextheader

potextitem = potextitem .

  • allversions = allversions

  • popartner = popartner.

  • Code inserted to commit work

SORT return BY type.

IF testrun IS INITIAL.

READ TABLE return

WITH KEY type = c_msgtype_e "E.

BINARY SEARCH.

IF sy-subrc NE 0.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

ELSE.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

**PVU-20-May-2004 - Start Changes for SCR1

**To generate inbound IDOC for failed PO

  • perform idoc_create tables poitem

  • g_t_itemx_tmp

  • poaddrdelivery

  • poschedule

  • g_t_schdx_tmp

  • poaccount

  • poaccountprofitsegment

  • g_t_accntx_tmp

  • pocond

  • g_t_condx_tmp

  • polimits

  • pocontractlimits

  • poservices

  • posrvaccessvalues

  • poservicestext

  • extensionin

  • return

  • using c_flg_pochange "CHNG

  • purchaseorder

  • poheader

  • g_w_hdrx_tmp

  • poaddrvendor

  • testrun

  • memory_uncomplete

  • memory_complete .

*

*PVU-20-May-2004 - End Changes for SCR1

loop at return.

L_WA_ZERRORS-OBJECT = 'PURCHASE_ORDER'.

L_WA_ZERRORS-serial_no = sy-tabix.

L_WA_ZERRORS-COMP_CODE = poheader-comp_code.

L_WA_ZERRORS-zid = return-id.

L_WA_ZERRORS-znumber = return-number.

L_WA_ZERRORS-BEACON_DOC_NO = poheader-po_number.

L_WA_ZERRORS-SRC_DOC_NO = poheader-po_number.

L_WA_ZERRORS-ZDATE = sy-datum.

L_WA_ZERRORS-ERR_MSG = return-message.

append L_WA_ZERRORS to t_errors.

  • insert into ZP2P_ERRORS values L_WA_ZERRORS.

clear: L_WA_ZERRORS.

endloop.

SELECT max( serial_no )

INTO L_SERIAL

FROM ZP2P_ERRORS.

LOOP AT T_ERRORS.

L_SERIAL = L_SERIAL + 1.

T_ERRORS-serial_no = L_SERIAL.

MODIFY T_ERRORS TRANSPORTING serial_no.

ENDLOOP.

INSERT ZP2P_ERRORS FROM TABLE T_ERRORS.

ENDIF.

ELSE.

  • CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

*GENERATE CUSTOM RETURN MESSAGES BASED ON MESSAGE ID AND NUMBER FROM

*maintenance table ZMESSAGES

CALL FUNCTION 'Z_MM_BUILD_MESSAGES'

TABLES

return = return.

SORT return BY type id number.

READ TABLE return

WITH KEY id = space

number = c_msgnr_000 "000

BINARY SEARCH.

IF sy-subrc EQ 0 AND sy-tabix NE 1.

DELETE return INDEX sy-tabix.

INSERT return INDEX 1.

ENDIF.

SELECT max( serial_no )

INTO L_SERIAL

FROM ZP2P_ERRORS.

LOOP AT T_ERRORS.

L_SERIAL = L_SERIAL + 1.

T_ERRORS-serial_no = L_SERIAL.

MODIFY T_ERRORS TRANSPORTING serial_no.

ENDLOOP.

INSERT ZP2P_ERRORS FROM TABLE T_ERRORS.

ENDFUNCTION.

Former Member
0 Kudos

You need to look at this part of the FM:

FUNCTION Z_BC1_BAPI_PO_CHANGE02.

*"----


""Local Interface:

*" IMPORTING

*" VALUE(PURCHASEORDER) TYPE BAPIMEPOHEADER-PO_NUMBER

*" VALUE(POADDRVENDOR) TYPE BAPIMEPOADDRVENDOR

*" VALUE(TESTRUN) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(MEMORY_UNCOMPLETE) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(MEMORY_COMPLETE) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(POEXPIMPHEADER) TYPE BAPIEIKP

*" VALUE(POEXPIMPHEADERX) TYPE BAPIEIKPX

*" VALUE(VERSIONS) TYPE BAPIMEDCM

*" VALUE(NO_MESSAGING) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_MESSAGE_REQ) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_AUTHORITY) TYPE BAPIFLAG-BAPIFLAG

*" VALUE(NO_PRICE_FROM_PO) TYPE BAPIFLAG-BAPIFLAG

*" EXPORTING

*" VALUE(EXPHEADER) TYPE BAPIMEPOHEADER

*" VALUE(EXPPOEXPIMPHEADER) TYPE BAPIEIKPX

*" TABLES

*" RETURN STRUCTURE BAPIRET2

*" POITEM STRUCTURE BAPIMEPOITEM

*" POITEMX STRUCTURE BAPIMEPOITEMX

*" POADDRDELIVERY STRUCTURE BAPIMEPOADDRDELIVERY

*" POSCHEDULE STRUCTURE BAPIMEPOSCHEDULE

*" POSCHEDULEX STRUCTURE BAPIMEPOSCHEDULX

*" POACCOUNT STRUCTURE BAPIMEPOACCOUNT

*" POACCOUNTPROFITSEGMENT STRUCTURE BAPIMEPOACCOUNTPROFITSEGMENT

*" POACCOUNTX STRUCTURE BAPIMEPOACCOUNTX

*" POCONDHEADER STRUCTURE BAPIMEPOCONDHEADER

*" POCONDHEADERX STRUCTURE BAPIMEPOCONDHEADERX

*" POCOND STRUCTURE BAPIMEPOCOND

*" POCONDX STRUCTURE BAPIMEPOCONDX

*" POLIMITS STRUCTURE BAPIESUHC

*" POCONTRACTLIMITS STRUCTURE BAPIESUCC

*" POSERVICES STRUCTURE BAPIESLLC

*" POSRVACCESSVALUES STRUCTURE BAPIESKLC

*" POSERVICESTEXT STRUCTURE BAPIESLLTX

*" EXTENSIONIN STRUCTURE BAPIPAREX

*" EXTENSIONOUT STRUCTURE BAPIPAREX

*" POEXPIMPITEM STRUCTURE BAPIEIPO

*" POEXPIMPITEMX STRUCTURE BAPIEIPOX

*" POTEXTHEADER STRUCTURE BAPIMEPOTEXTHEADER

*" POTEXTITEM STRUCTURE BAPIMEPOTEXT

*" ALLVERSIONS STRUCTURE BAPIMEDCM_ALLVERSIONS

*" POPARTNER STRUCTURE BAPIEKKOP

*" POCOMPONENTS STRUCTURE BAPIMEPOCOMPONENT

*" POCOMPONENTSX STRUCTURE BAPIMEPOCOMPONENTX

*" POSHIPPING STRUCTURE BAPIITEMSHIP

*" POSHIPPINGX STRUCTURE BAPIITEMSHIPX

*" POSHIPPINGEXP STRUCTURE BAPIMEPOSHIPPEXP

*" POHISTORY STRUCTURE BAPIEKBE

*" POHISTORY_TOTALS STRUCTURE BAPIEKBES

*" POCONFIRMATION STRUCTURE BAPIEKES

*" NFMETALLITMS STRUCTURE /NFM/BAPIDOCITM

*" CHANGING

*" VALUE(POHEADER) TYPE BAPIMEPOHEADER

*" VALUE(POHEADERX) TYPE BAPIMEPOHEADERX

*"----


cheers

Aveek