‎2006 Oct 04 8:08 AM
Hi,
I am trying to use BAPI_INCOMINGINVOICE_CREATE for MIRO transaction. Can anyone please explain to me how to use component PROFIT_SEGM_NO in structure BAPI_INCINV_CREATE_GL_ACCOUNT? (This is missing from the documentation as it is a 'late' addition to the BAPI).
Or:
Has anyone had success posting Incoming Invoice GL account line - with a profitability segment (COPA)?
Thanks,
Michal
‎2006 Oct 04 8:16 AM
Hi michal,
Look at the code in th fm:
<b>BBP_INVOICE_CREATE
MRM_XMLBAPI_INCINV_CREATE</b>
Look at this sample code
REPORT Z_BAPI_INCOMINGINVOICE_CREATE .
*----------------------------------------------------------------------*
* Create Vendor Invoices using BAPI *
Invoice data is sent by the vendors in a text file and an inbound
* interface is required to create Vendor Invoices in SAP.
* The file contains the Purchase Order information, material quantity
* received from vendor along with the amount.
* Here the requirement becomes a little complex as there might be
* several ocuurences of same Purchase Order item in one invoice.
*----------------------------------------------------------------------*
* Only a incomplete sample coding is given here and it can only be used
* as a base for writing a program.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Populate internal Table I_ITAB from the data uploaded
* from text data file.
*......
*......
*----------------------------------------------------------------------*
* Populate Item Table from item data in data file
*......
*......
* Processing for header records of data file.
* set up header data for BAPI call.
* Check whwther it's an Incoice or Credit Memo.
* And populate Invoice indicator accordingly.
IF I_ITAB-TRANS EQ '-'.
I_HEADER-INVOICE_IND = C_X.
ELSE.
CLEAR I_HEADER-INVOICE_IND.
ENDIF.
I_HEADER-PSTNG_DATE = I_ITAB-BUDAT.
I_HEADER-DOC_DATE = I_ITAB-BLDAT.
I_HEADER-CURRENCY = W_WAERS.
I_HEADER-GROSS_AMOUNT = I_ITAB-DMBTR.
I_HEADER-COMP_CODE = I_ITAB-BUKRS.
I_HEADER-HEADER_TXT = I_ITAB-SGTXT.
I_HEADER-REF_DOC_NO = I_ITAB-XBLNR.
IF NOT I_ITAB-INV_REC_DATE IS INITIAL.
I_HEADER-INV_REC_DATE = I_ITAB-INV_REC_DATE.
ELSE.
I_HEADER-INV_REC_DATE = I_ITAB-BLDAT.
ENDIF.
I_HEADER-PYMT_METH = I_ITAB-ZLSCH.
APPEND I_HEADER.
*....
*....
*----------------------------------------------------------------------*
* Populate Item Table from item data in data file
lv_count = 0.
LOOP AT I_ITAB.
* Processing for header records of data file.
lv_count = lv_count + 1.
* ...........
* ...........
* Item Data
I_ITEM-INVOICE_DOC_ITEM = lv_COUNT.
I_ITEM-PO_NUMBER = I_ITAB-EBELN.
I_ITEM-PO_ITEM = I_ITAB-EBELP.
I_ITEM-TAX_CODE = I_ITAB-MWSKZ2.
I_ITEM-ITEM_AMOUNT = I_ITAB-NETWR.
* Populate quantities if not a blanket order
IF I_ITAB-BLANKET EQ SPACE.
I_ITEM-QUANTITY = I_ITAB-MENGE.
PERFORM GET_MEINS USING I_ITAB-EBELN " Use table EKPO
I_ITAB-EBELP
CHANGING I_ITEM-PO_UNIT.
I_ACCOUNTINGDATA-PO_UNIT = I_ITEM-PO_UNIT.
IF I_ITEM-QUANTITY EQ 0.
I_ITEM-PO_UNIT = SPACE.
ENDIF.
ENDIF.
* Item Text
I_ITEM-ITEM_TEXT = I_ITAB-ITEM_TEXT.
APPEND I_ITEM.
* Populate Accounting Data
IF I_ITAB-BLANKET EQ SPACE.
I_ACCOUNTINGDATA-INVOICE_DOC_ITEM = lv_COUNT.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-TAX_CODE = I_ITAB-MWSKZ2.
I_ACCOUNTINGDATA-ITEM_AMOUNT = I_ITAB-NETWR.
SELECT SINGLE SAKTO KOSTL VBELN VBELP ANLN1 ANLN2 DABRZ
FISTL GEBER GRANT_NBR GSBER IMKEY KOKRS KSTRG PAOBJNR
PRCTR PS_PSP_PNR AUFNR MENGE
FROM EKKN
INTO (I_ACCOUNTINGDATA-GL_ACCOUNT, I_ACCOUNTINGDATA-COSTCENTER,
I_ACCOUNTINGDATA-SD_DOC, I_ACCOUNTINGDATA-SDOC_ITEM,
I_ACCOUNTINGDATA-ASSET_NO, I_ACCOUNTINGDATA-SUB_NUMBER,
I_ACCOUNTINGDATA-REF_DATE, I_ACCOUNTINGDATA-FUNDS_CTR,
I_ACCOUNTINGDATA-FUND, I_ACCOUNTINGDATA-GRANT_NBR,
I_ACCOUNTINGDATA-BUS_AREA, I_ACCOUNTINGDATA-RL_EST_KEY,
I_ACCOUNTINGDATA-CO_AREA, I_ACCOUNTINGDATA-COSTOBJECT,
I_ACCOUNTINGDATA-PROFIT_SEGM_NO, I_ACCOUNTINGDATA-PROFIT_CTR,
I_ACCOUNTINGDATA-WBS_ELEM, I_ACCOUNTINGDATA-ORDERID,
I_ACCOUNTINGDATA-QUANTITY)
WHERE EBELN EQ I_ITAB-EBELN
AND EBELP EQ I_ITAB-EBELP
AND ZEKKN EQ '01'.
IF EKKO-BSART NE 'LTV'.
CLEAR I_ACCOUNTINGDATA-QUANTITY.
CLEAR I_ACCOUNTINGDATA-PO_UNIT.
ENDIF.
APPEND I_ACCOUNTINGDATA.
ENDIF.
*.....
*.....
ENDLOOP.
*----------------------------------------------------------------------*
* The following coding is to solve the problem
* mentioned in OSS Note 518338.
* Same PO item within several invoice items.
SORT I_ITEM BY PO_NUMBER PO_ITEM.
LOOP AT I_ITEM.
ON CHANGE OF I_ITEM-PO_NUMBER OR I_ITEM-PO_ITEM.
W_COUNTER = 1.
LOOP AT I_ITEM WHERE PO_NUMBER = I_ITEM-PO_NUMBER
AND PO_ITEM = I_ITEM-PO_ITEM.
IF W_COUNTER EQ 1.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-XUNPL = ' '.
ELSE.
I_ACCOUNTINGDATA-SERIAL_NO = ' '.
I_ACCOUNTINGDATA-XUNPL = 'X'.
ENDIF.
MODIFY I_ACCOUNTINGDATA
TRANSPORTING SERIAL_NO XUNPL
WHERE INVOICE_DOC_ITEM = I_ITEM-INVOICE_DOC_ITEM.
W_COUNTER = W_COUNTER + 1.
ENDLOOP.
* To solve the repetition of PO item in subsequent invoices.
ELSEIF SY-TABIX EQ 1.
W_COUNTER = 1.
LOOP AT I_ITEM WHERE PO_NUMBER = I_ITEM-PO_NUMBER
AND PO_ITEM = I_ITEM-PO_ITEM.
IF W_COUNTER EQ 1.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-XUNPL = ' '.
ELSE.
I_ACCOUNTINGDATA-SERIAL_NO = ' '.
I_ACCOUNTINGDATA-XUNPL = 'X'.
ENDIF.
MODIFY I_ACCOUNTINGDATA
TRANSPORTING SERIAL_NO XUNPL
WHERE INVOICE_DOC_ITEM = I_ITEM-INVOICE_DOC_ITEM.
W_COUNTER = W_COUNTER + 1.
ENDLOOP.
ENDON.
ENDLOOP.
* Changes over for OSS Note 518338.
SORT I_ITEM BY INVOICE_DOC_ITEM PO_NUMBER PO_ITEM.
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
EXPORTING
HEADERDATA = I_HEADER
IMPORTING
INVOICEDOCNUMBER = W_BELNR
FISCALYEAR = W_GJAHR
TABLES
ITEMDATA = I_ITEM
ACCOUNTINGDATA = I_ACCOUNTINGDATA
TAXDATA = I_TAX
RETURN = I_RETURN.
if sy-subrc < > 0.
message e999(re) with 'Problem occured'.
else.
loop at return.
if not return is initial.
clear bapi_retn_info.
move-corresponding return to bapi_retn_info.
if return-type = 'A' or return-type = 'E'.
error_flag = 'X'.
endif.
append bapi_retn_info.
endif.
endloop.
if error_flag = 'X'.
message e999(re) with 'Problem occured'.
rollback work.
else.
* Return Table from BAPI call is empty
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'
IMPORTING
RETURN = I_RETURN.
endif.
endif.Thanks
Sudheer
‎2006 Oct 04 8:16 AM
Hi michal,
Look at the code in th fm:
<b>BBP_INVOICE_CREATE
MRM_XMLBAPI_INCINV_CREATE</b>
Look at this sample code
REPORT Z_BAPI_INCOMINGINVOICE_CREATE .
*----------------------------------------------------------------------*
* Create Vendor Invoices using BAPI *
Invoice data is sent by the vendors in a text file and an inbound
* interface is required to create Vendor Invoices in SAP.
* The file contains the Purchase Order information, material quantity
* received from vendor along with the amount.
* Here the requirement becomes a little complex as there might be
* several ocuurences of same Purchase Order item in one invoice.
*----------------------------------------------------------------------*
* Only a incomplete sample coding is given here and it can only be used
* as a base for writing a program.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Populate internal Table I_ITAB from the data uploaded
* from text data file.
*......
*......
*----------------------------------------------------------------------*
* Populate Item Table from item data in data file
*......
*......
* Processing for header records of data file.
* set up header data for BAPI call.
* Check whwther it's an Incoice or Credit Memo.
* And populate Invoice indicator accordingly.
IF I_ITAB-TRANS EQ '-'.
I_HEADER-INVOICE_IND = C_X.
ELSE.
CLEAR I_HEADER-INVOICE_IND.
ENDIF.
I_HEADER-PSTNG_DATE = I_ITAB-BUDAT.
I_HEADER-DOC_DATE = I_ITAB-BLDAT.
I_HEADER-CURRENCY = W_WAERS.
I_HEADER-GROSS_AMOUNT = I_ITAB-DMBTR.
I_HEADER-COMP_CODE = I_ITAB-BUKRS.
I_HEADER-HEADER_TXT = I_ITAB-SGTXT.
I_HEADER-REF_DOC_NO = I_ITAB-XBLNR.
IF NOT I_ITAB-INV_REC_DATE IS INITIAL.
I_HEADER-INV_REC_DATE = I_ITAB-INV_REC_DATE.
ELSE.
I_HEADER-INV_REC_DATE = I_ITAB-BLDAT.
ENDIF.
I_HEADER-PYMT_METH = I_ITAB-ZLSCH.
APPEND I_HEADER.
*....
*....
*----------------------------------------------------------------------*
* Populate Item Table from item data in data file
lv_count = 0.
LOOP AT I_ITAB.
* Processing for header records of data file.
lv_count = lv_count + 1.
* ...........
* ...........
* Item Data
I_ITEM-INVOICE_DOC_ITEM = lv_COUNT.
I_ITEM-PO_NUMBER = I_ITAB-EBELN.
I_ITEM-PO_ITEM = I_ITAB-EBELP.
I_ITEM-TAX_CODE = I_ITAB-MWSKZ2.
I_ITEM-ITEM_AMOUNT = I_ITAB-NETWR.
* Populate quantities if not a blanket order
IF I_ITAB-BLANKET EQ SPACE.
I_ITEM-QUANTITY = I_ITAB-MENGE.
PERFORM GET_MEINS USING I_ITAB-EBELN " Use table EKPO
I_ITAB-EBELP
CHANGING I_ITEM-PO_UNIT.
I_ACCOUNTINGDATA-PO_UNIT = I_ITEM-PO_UNIT.
IF I_ITEM-QUANTITY EQ 0.
I_ITEM-PO_UNIT = SPACE.
ENDIF.
ENDIF.
* Item Text
I_ITEM-ITEM_TEXT = I_ITAB-ITEM_TEXT.
APPEND I_ITEM.
* Populate Accounting Data
IF I_ITAB-BLANKET EQ SPACE.
I_ACCOUNTINGDATA-INVOICE_DOC_ITEM = lv_COUNT.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-TAX_CODE = I_ITAB-MWSKZ2.
I_ACCOUNTINGDATA-ITEM_AMOUNT = I_ITAB-NETWR.
SELECT SINGLE SAKTO KOSTL VBELN VBELP ANLN1 ANLN2 DABRZ
FISTL GEBER GRANT_NBR GSBER IMKEY KOKRS KSTRG PAOBJNR
PRCTR PS_PSP_PNR AUFNR MENGE
FROM EKKN
INTO (I_ACCOUNTINGDATA-GL_ACCOUNT, I_ACCOUNTINGDATA-COSTCENTER,
I_ACCOUNTINGDATA-SD_DOC, I_ACCOUNTINGDATA-SDOC_ITEM,
I_ACCOUNTINGDATA-ASSET_NO, I_ACCOUNTINGDATA-SUB_NUMBER,
I_ACCOUNTINGDATA-REF_DATE, I_ACCOUNTINGDATA-FUNDS_CTR,
I_ACCOUNTINGDATA-FUND, I_ACCOUNTINGDATA-GRANT_NBR,
I_ACCOUNTINGDATA-BUS_AREA, I_ACCOUNTINGDATA-RL_EST_KEY,
I_ACCOUNTINGDATA-CO_AREA, I_ACCOUNTINGDATA-COSTOBJECT,
I_ACCOUNTINGDATA-PROFIT_SEGM_NO, I_ACCOUNTINGDATA-PROFIT_CTR,
I_ACCOUNTINGDATA-WBS_ELEM, I_ACCOUNTINGDATA-ORDERID,
I_ACCOUNTINGDATA-QUANTITY)
WHERE EBELN EQ I_ITAB-EBELN
AND EBELP EQ I_ITAB-EBELP
AND ZEKKN EQ '01'.
IF EKKO-BSART NE 'LTV'.
CLEAR I_ACCOUNTINGDATA-QUANTITY.
CLEAR I_ACCOUNTINGDATA-PO_UNIT.
ENDIF.
APPEND I_ACCOUNTINGDATA.
ENDIF.
*.....
*.....
ENDLOOP.
*----------------------------------------------------------------------*
* The following coding is to solve the problem
* mentioned in OSS Note 518338.
* Same PO item within several invoice items.
SORT I_ITEM BY PO_NUMBER PO_ITEM.
LOOP AT I_ITEM.
ON CHANGE OF I_ITEM-PO_NUMBER OR I_ITEM-PO_ITEM.
W_COUNTER = 1.
LOOP AT I_ITEM WHERE PO_NUMBER = I_ITEM-PO_NUMBER
AND PO_ITEM = I_ITEM-PO_ITEM.
IF W_COUNTER EQ 1.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-XUNPL = ' '.
ELSE.
I_ACCOUNTINGDATA-SERIAL_NO = ' '.
I_ACCOUNTINGDATA-XUNPL = 'X'.
ENDIF.
MODIFY I_ACCOUNTINGDATA
TRANSPORTING SERIAL_NO XUNPL
WHERE INVOICE_DOC_ITEM = I_ITEM-INVOICE_DOC_ITEM.
W_COUNTER = W_COUNTER + 1.
ENDLOOP.
* To solve the repetition of PO item in subsequent invoices.
ELSEIF SY-TABIX EQ 1.
W_COUNTER = 1.
LOOP AT I_ITEM WHERE PO_NUMBER = I_ITEM-PO_NUMBER
AND PO_ITEM = I_ITEM-PO_ITEM.
IF W_COUNTER EQ 1.
I_ACCOUNTINGDATA-SERIAL_NO = '01'.
I_ACCOUNTINGDATA-XUNPL = ' '.
ELSE.
I_ACCOUNTINGDATA-SERIAL_NO = ' '.
I_ACCOUNTINGDATA-XUNPL = 'X'.
ENDIF.
MODIFY I_ACCOUNTINGDATA
TRANSPORTING SERIAL_NO XUNPL
WHERE INVOICE_DOC_ITEM = I_ITEM-INVOICE_DOC_ITEM.
W_COUNTER = W_COUNTER + 1.
ENDLOOP.
ENDON.
ENDLOOP.
* Changes over for OSS Note 518338.
SORT I_ITEM BY INVOICE_DOC_ITEM PO_NUMBER PO_ITEM.
CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
EXPORTING
HEADERDATA = I_HEADER
IMPORTING
INVOICEDOCNUMBER = W_BELNR
FISCALYEAR = W_GJAHR
TABLES
ITEMDATA = I_ITEM
ACCOUNTINGDATA = I_ACCOUNTINGDATA
TAXDATA = I_TAX
RETURN = I_RETURN.
if sy-subrc < > 0.
message e999(re) with 'Problem occured'.
else.
loop at return.
if not return is initial.
clear bapi_retn_info.
move-corresponding return to bapi_retn_info.
if return-type = 'A' or return-type = 'E'.
error_flag = 'X'.
endif.
append bapi_retn_info.
endif.
endloop.
if error_flag = 'X'.
message e999(re) with 'Problem occured'.
rollback work.
else.
* Return Table from BAPI call is empty
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'
IMPORTING
RETURN = I_RETURN.
endif.
endif.Thanks
Sudheer
‎2006 Oct 04 9:34 AM
Dear Sudheer,
Thanks for your reply. What I need is for a GLAccount data, not regular account data. The major difference being: I need to ENTER the COPA data at this time (as is possible for GL account data in the MIRO transaction), and not take it out of EKKN (as it does not exist yet...).
Please see that in the MIRO transaction, G/L account tab, there exists a Profitability segment button in which a COPA record can be entered.
Hope this is clear now, and that you or someone else can help with this problem.
Thanks,
Michal
‎2006 Oct 05 7:17 AM
For the benefit of those who are looking for a solution to this problem as well...
I just received from OSS that this functionality currently does not exist. I plan to request a development, but as of now this is the answer I received.
Best Regards,
Michal
‎2007 Mar 22 11:35 PM
Hi Michal,
I am facing the similar problem. I am also using BAPI_INCOMINGINVOICE_CREATE but unable to post COPA segment data !
Could you please share your idea how you have acheived it ?
I am struck with my work and unable to proceed further....