Introduction: There are a number of scenarios when we found our BAPI does not post/check records more than 999 line items. Actually there is a limitation in BAPI where we can't post more than 999 records. This small piece of code will serve our purpose.
Suppose our XL file contains thousand of records and we have to check/post using BAPI in a bunch of 950 records.
We need to upload the data of XL to our internal table, let's say we have uploaded the records to internal table ITAB_INDATA.
PERFORM POST_DOCUMENT .
FORM POST_DOCUMENT .
DATA: V_LINES TYPE I,
V_LINES1 TYPE I,
COUNT(3) TYPE N.*----declaration of internal tables used in BAPI
DATA: DOC_HEADER LIKE BAPIACHE09 OCCURS 0 WITH HEADER LINE,
DOC_ITEM LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE,
DOC_VALUES LIKE BAPIACCR09 OCCURS 0 WITH HEADER LINE,
CUSTOMER LIKE BAPIACAR09 OCCURS 0 WITH HEADER LINE,
VENDOR LIKE BAPIACAP09 OCCURS 0 WITH HEADER LINE,
CHECK_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
OBJTYP TYPE AWKEY.
DATA: V_BAL TYPE P DECIMALS 4,
V_BAL1 TYPE P DECIMALS 4,
V_INDEX LIKE SY-TABIX.*---set the counter to '0' which will calculate the number of records
COUNT = 0.
CLEAR: ITAB_INDATA. *---Calculating the number of records in internal table
DESCRIBE TABLE ITAB_INDATA LINES V_LINES.*----Logic to be implemented inside the internal table
LOOP AT ITAB_INDATA. *----Clearing the internal tables before appending data
CLEAR: DOC_HEADER[], DOC_ITEM[], CUSTOMER[], VENDOR[], DOC_VALUES[].
CLEAR: LWA_INPUT_FILE.*----Here we are filling the structure and internal tables corresponding to Transaction Number field in our internal table
AT NEW TNO.
LOOP AT ITAB_INDATA INTO LWA_INPUT_FILE WHERE TNO = ITAB_INDATA-TNO.* Fill Document Header
DOC_HEADER-USERNAME = SY-UNAME.
DOC_HEADER-COMP_CODE = 'BP01'.
DOC_HEADER-HEADER_TXT = LWA_INPUT_FILE-BKTXT.
DOC_HEADER-REF_DOC_NO = LWA_INPUT_FILE-XBLNR.
DOC_HEADER-DOC_DATE = LWA_INPUT_FILE-DDATE.
DOC_HEADER-PSTNG_DATE = LWA_INPUT_FILE-PDATE.
DOC_HEADER-DOC_TYPE = LWA_INPUT_FILE-BLART.
ADD 1 TO COUNT. ** Fill Document Item
MOVE COUNT TO DOC_ITEM-ITEMNO_ACC.
MOVE COUNT TO DOC_VALUES-ITEMNO_ACC.
DOC_ITEM-GL_ACCOUNT = LWA_INPUT_FILE-GLACC.
DOC_ITEM-PSTNG_DATE = LWA_INPUT_FILE-PDATE.
DOC_ITEM-DOC_TYPE = LWA_INPUT_FILE-BLART.
DOC_ITEM-PROFIT_CTR = LWA_INPUT_FILE-PC.
DOC_ITEM-ALLOC_NMBR = LWA_INPUT_FILE-ASSGN.
DOC_ITEM-ITEM_TEXT = LWA_INPUT_FILE-TEXT.
DOC_ITEM-COSTCENTER = LWA_INPUT_FILE-CC.
DOC_ITEM-ACCT_TYPE = LWA_INPUT_FILE-ACTYP.
DOC_ITEM-COMP_CODE = 'BP01'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = DOC_ITEM-GL_ACCOUNT
IMPORTING
OUTPUT = DOC_ITEM-GL_ACCOUNT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = DOC_ITEM-COSTCENTER
IMPORTING
OUTPUT = DOC_ITEM-COSTCENTER.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = DOC_ITEM-PROFIT_CTR
IMPORTING
OUTPUT = DOC_ITEM-PROFIT_CTR. APPEND DOC_ITEM.
CLEAR DOC_ITEM.
MOVE COUNT TO VENDOR-ITEMNO_ACC.
VENDOR-VENDOR_NO = LWA_INPUT_FILE-GLACC.
VENDOR-ALLOC_NMBR = LWA_INPUT_FILE-ASSGN.
VENDOR-ITEM_TEXT = LWA_INPUT_FILE-TEXT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = VENDOR-VENDOR_NO
IMPORTING
OUTPUT = VENDOR-VENDOR_NO.
APPEND VENDOR.
CLEAR VENDOR.
MOVE COUNT TO CUSTOMER-ITEMNO_ACC.
CUSTOMER-CUSTOMER = LWA_INPUT_FILE-GLACC.
CUSTOMER-ALLOC_NMBR = LWA_INPUT_FILE-ASSGN.
CUSTOMER-ITEM_TEXT = LWA_INPUT_FILE-TEXT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = CUSTOMER-CUSTOMER
IMPORTING
OUTPUT = CUSTOMER-CUSTOMER.
APPEND CUSTOMER.
CLEAR CUSTOMER. * Fill Document Value.
DOC_VALUES-CURRENCY_ISO = 'USD'.
DATA: NUM TYPE P DECIMALS 2.
CLEAR NUM.*---in case of Credit amount available
DOC_VALUES-AMT_DOCCUR = LWA_INPUT_FILE-CRAMT * -1.*---in case of Debit amount available
DOC_VALUES-AMT_DOCCUR = LWA_INPUT_FILE-DRAMT. APPEND DOC_VALUES.
CLEAR DOC_VALUES. V_LINES1 = V_LINES1 + 1. "Counting line no
READ TABLE ITAB_INDATA INDEX V_INDEX.
IF ITAB_INDATA-DRAMT <> SPACE.
CLEAR V_BAL. "clear when found debit amount
V_BAL1 = ITAB_INDATA-DRAMT.
V_BAL = V_BAL + V_BAL1.
ENDIF.
IF SY-SUBRC = 0.
IF ITAB_INDATA-CRAMT <> SPACE.
V_BAL1 = ITAB_INDATA-CRAMT * -1.
V_BAL = V_BAL + V_BAL1.
ENDIF.
ENDIF. *----V_LINES contains total no of records in internal table
IF V_LINES >= 950.
IF V_LINES1 >= 950
AND V_BAL = 0.*---call bapi
PERFORM CHECK_BAPI.
ENDIF. "IF CHECK <> 'X'.*---refreshing tables for storing another chunk of records
REFRESH: DOC_ITEM, CUSTOMER, VENDOR, DOC_VALUES.
clear COUNT.
V_LINES = V_LINES - V_LINES1.
CLEAR: V_LINES1, V_BAL. "clearing balance and line counts
CONTINUE.
ELSE.
CONTINUE.
ENDIF.
ENDLOOP.*----In case records less than 950
IF V_LINES < 950
and V_LINES <> 0. "avoiding if remaining records = 0.*---call bapi
PERFORM CHECK_BAPI.*---refreshing tables for storing another chunk of records
REFRESH: DOC_ITEM, CUSTOMER, VENDOR, DOC_VALUES.
ENDIF. "IF CHECK <> 'X'.
ENDAT.
ENDLOOP.
ENDFORM. " POST_DOCUMENT
FORM CHECK_BAPI .
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
DOCUMENTHEADER = DOC_HEADER
TABLES
ACCOUNTGL = DOC_ITEM
ACCOUNTRECEIVABLE = CUSTOMER
ACCOUNTPAYABLE = VENDOR
CURRENCYAMOUNT = DOC_VALUES
RETURN = CHECK_RETURN .*----If CHECK_RETURN contains Success result then post documents using
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
DOCUMENTHEADER = DOC_HEADER
IMPORTING
OBJ_KEY = OBJTYP
TABLES
ACCOUNTGL = DOC_ITEM
ACCOUNTRECEIVABLE = CUSTOMER
ACCOUNTPAYABLE = VENDOR
CURRENCYAMOUNT = DOC_VALUES
RETURN = RETURN.
*---If no error found commit BAPI 'BAPI_TRANSACTION_COMMIT'
ENDFORM. " CHECK_BAPI
When the documents get posted the 'BAPI_ACC_DOCUMENT_POST' will generate an document no.
We can pass that document number to FB03 Transaction to check out the posted documents.
Comments (1)
Jul 08, 2011
abaper1712 says:
Hi all, I have followed the code above but I did not understand that the Accout...Hi all,
I have followed the code above but I did not understand that the Accout Type ='S' and Posting Key ='40' or '50' . In FB01 of my system only input Posting key ='40' Or Posting key ='50'.
When I run the code above the system could not post and dispaly error as below:
"Error in document: BKPFF $ T90CLNT090
Required field BUS_ACT was not transferred in parameter DOCUMENTHEADER"
How to fix the error and which field of bapi to input Posting Key ?
Please help me. Thanks alot.
Abaper