‎2007 Aug 27 3:19 PM
Hi guys,
I am working on an interface where I need to create a accounting document using FB01 and for this I have identified the following BAPI..'BAPI_ACC_DOCUMENT_POST'.I am pretty new to ABAP, so can anyone please help me out how to use this BAPI, I mean Step by step using an example.
Thanks
Rajev Gupta
‎2007 Aug 27 3:25 PM
Here a full example
REPORT zfi_bapi_ndf NO STANDARD PAGE HEADING.
*-------------------------------- DATA --------------------------------*
DATA : BEGIN OF itg_data OCCURS 500,
bschl TYPE bschl ,
hkont TYPE hkont , " Compte
saknr TYPE saknr , " Compte KODA
dmbtr(20) TYPE c , " Montant
kostl TYPE kostl , " Centre de coûts
text(50) TYPE c, " texte
etab TYPE zetab , " Etablissement
servi TYPE zservi, " Service
code TYPE zca_code , " Code carte affaire
gsber TYPE gsber , " Domaine activité
mwskz TYPE mwskz , " Code TVA
END OF itg_data ,
BEGIN OF itg_error OCCURS 500,
erreur(1) , " N° erreur
bschl TYPE bschl , "
hkont TYPE hkont , " Compte
saknr TYPE saknr , " Compte KODA
dmbtr(20) TYPE c , " Montant
kostl TYPE kostl , " Centre de coûts
text(50) TYPE c, " texte
etab TYPE zetab , " Etablissement
servi TYPE zservi, " Service
code TYPE zca_code , " Code carte affaire
gsber TYPE gsber , " Domaine activité
END OF itg_error.
DATA : w_obj_type LIKE bapiache02-obj_type,
w_obj_key LIKE bapiache02-obj_key,
w_obj_sys LIKE bapiache02-obj_sys,
w_amount(13).
DATA: w_object LIKE nriv-object VALUE 'RF_BELEG'.
*-------------------------- SELECTION SCREEN --------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS : p_blart TYPE blart ,
p_bukrs TYPE bukrs
DEFAULT '1441',
p_gjahr TYPE gjahr
DEFAULT sy-datum(04),
p_date TYPE sydatum
DEFAULT sy-datum,
p_waers TYPE waers
DEFAULT 'EUR',
p_bktxt TYPE bktxt
OBLIGATORY ,
p_file TYPE localfile
OBLIGATORY .
SELECTION-SCREEN END OF BLOCK b2.
*------------------------------- EVENTS -------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file.
AT PF8.
* Create the line of account document.
PERFORM p_create.
*-------------------------------- MAIN --------------------------------*
START-OF-SELECTION.
* Read data from the Excel file.
PERFORM p_read_file.
* Analyse.
PERFORM p_analyse.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Form P_READ_FILE. *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM p_read_file.
DATA : it_file LIKE alsmex_tabline OCCURS 100 WITH HEADER LINE ,
w_flag_row TYPE kcd_ex_row_n ,
w_count(6) TYPE n ,
w_flag_code(1) ,
BEGIN OF it_skb1 OCCURS 0 ,
saknr TYPE saknr ,
altkt(10) ,
mwskz TYPE mwskz ,
END OF it_skb1 ,
it_ca_001 LIKE TABLE OF zfi_ca_001 WITH HEADER LINE ,
it_etab LIKE TABLE OF zfi_etab_001 WITH HEADER LINE ,
it_serv LIKE TABLE OF zfi_serv_001 WITH HEADER LINE .
* Function to read the Microsoft Excel file.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = '2'
i_end_col = '10'
i_end_row = '1000'
TABLES
intern = it_file
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc NE space.
STOP.
ENDIF.
* Transfer data from IT_FILE to IT_DATA.
LOOP AT it_file.
IF w_flag_row NE it_file-row.
APPEND itg_data.
CLEAR itg_data.
MOVE it_file-row TO w_flag_row.
ENDIF.
CASE it_file-col.
WHEN '0001'.
MOVE it_file-value TO itg_data-text.
WHEN '0003'.
IF it_file-value CA '.'.
SPLIT it_file-value
AT '.'
INTO itg_data-hkont
itg_data-code.
MOVE 'X' TO w_flag_code.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = itg_data-hkont
IMPORTING
output = itg_data-hkont.
ELSE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_file-value
IMPORTING
output = itg_data-hkont.
ENDIF.
WHEN '0004'.
MOVE it_file-value TO itg_data-etab.
WHEN '0005'.
IF it_file-value NE '0'.
MOVE : '40' TO itg_data-bschl ,
it_file-value TO itg_data-dmbtr.
ENDIF.
REPLACE ',' WITH '.' INTO itg_data-dmbtr.
WHEN '0006'.
IF it_file-value NE '0'.
MOVE : '50' TO itg_data-bschl ,
it_file-value TO itg_data-dmbtr.
ENDIF.
REPLACE ',' WITH '.' INTO itg_data-dmbtr.
WHEN '0009'.
MOVE it_file-value TO itg_data-servi.
ENDCASE.
ENDLOOP.
* Record the last row.
APPEND itg_data.
CLEAR itg_data.
* Detele the empty row.
DELETE itg_data WHERE hkont EQ space.
* Check there is something to do.
DESCRIBE TABLE itg_data LINES w_count.
IF w_count EQ space.
WRITE : /1 ''.
STOP.
ENDIF.
* Change the account number.
SELECT saknr altkt mwskz
INTO TABLE it_skb1
FROM skb1
WHERE bukrs EQ p_bukrs.
SORT it_skb1 BY altkt.
LOOP AT itg_data.
READ TABLE it_skb1
WITH KEY altkt = itg_data-hkont
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_skb1-saknr TO itg_data-saknr.
MODIFY itg_data.
ELSE.
MOVE : '4' TO itg_error-erreur.
MOVE-CORRESPONDING itg_data TO itg_error.
APPEND itg_error.
ENDIF.
ENDLOOP.
* Get the cost center.
IF w_flag_code EQ 'X'.
SELECT *
INTO TABLE it_ca_001
FROM zfi_ca_001
WHERE datbi GE p_date
AND datab LE p_date.
LOOP AT it_ca_001.
MOVE it_ca_001-ca_code+0(8) TO it_ca_001-ca_code.
MODIFY it_ca_001.
ENDLOOP.
SORT it_ca_001 BY ca_code.
ENDIF.
SELECT *
INTO TABLE it_etab
FROM zfi_etab_001.
SORT it_etab BY etab.
SELECT *
INTO TABLE it_serv
FROM zfi_serv_001.
SORT it_serv BY etab servi.
LOOP AT itg_data.
* Recherche code etablissement & service si carte affaire
IF itg_data-code NE space.
READ TABLE it_ca_001
WITH KEY ca_code = itg_data-code
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_ca_001-etab TO itg_data-etab ,
it_ca_001-servi TO itg_data-servi .
MODIFY itg_data.
ELSE.
MOVE : '1' TO itg_error-erreur .
MOVE-CORRESPONDING itg_data TO itg_error.
APPEND itg_error.
CHECK '1' EQ '2'.
ENDIF.
ENDIF.
* Recherche du domaine d'activité si code établissement.
IF itg_data-hkont EQ '0000425200' OR
itg_data-hkont EQ '0000445660'.
MOVE 'FR01' TO itg_data-gsber.
ELSE.
READ TABLE it_etab
WITH KEY etab = itg_data-etab
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_etab-gsber TO itg_data-gsber.
ELSE.
MOVE : '2' TO itg_error-erreur.
MOVE-CORRESPONDING itg_data TO itg_error.
APPEND itg_error.
CHECK '1' EQ '2'.
ENDIF.
ENDIF.
* Recherche du centre de coûts.
IF itg_data-hkont NE '0000425200' AND
itg_data-hkont NE '0000445660'.
READ TABLE it_serv
WITH KEY etab = itg_data-etab
servi = itg_data-servi
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_serv-kostl TO itg_data-kostl.
ELSE.
MOVE : '3' TO itg_error-erreur.
MOVE-CORRESPONDING itg_data TO itg_error.
APPEND itg_error.
CHECK '1' EQ '2'.
ENDIF.
ENDIF.
* Recherche du code TVA.
IF itg_data-hkont EQ '0000445660'.
MOVE 'V4' TO itg_data-mwskz.
ELSEIF itg_data-hkont NE '0000445660' OR
itg_data-hkont NE '0000425200'.
MOVE 'V0' TO itg_data-mwskz.
ENDIF.
* Si MWSKZ dans SKB1 vide alors on enlève le code TVA.
READ TABLE it_skb1
WITH KEY altkt = itg_data-hkont
BINARY SEARCH.
IF sy-subrc EQ space AND it_skb1-mwskz EQ space.
CLEAR itg_data-mwskz.
ENDIF.
MODIFY itg_data.
ENDLOOP.
ENDFORM. " P_READ_FILE.
*----------------------------------------------------------------------*
* Form P_ANALYSE. *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM p_analyse.
DATA : w_count TYPE i.
* Describe the table.
DESCRIBE TABLE itg_data LINES w_count.
WRITE : /1 text-i02 COLOR 3 ,
w_count COLOR 3 .
SKIP 2.
WRITE : /1 text-i03 COLOR 3.
SKIP 2.
* Check if there is error.
DESCRIBE TABLE itg_error LINES w_count.
* Everything OK.
IF w_count EQ space.
WRITE text-i01 COLOR 5.
* Error.
ELSE.
READ TABLE itg_error
WITH KEY erreur = '1'.
IF sy-subrc EQ space.
WRITE text-e01 COLOR 6.
WRITE : /1 text-l01 COLOR 1 ,
13 text-l02 COLOR 1 ,
30 text-l03 COLOR 1 ,
45 text-l04 COLOR 1 ,
60 text-l05 COLOR 1 .
LOOP AT itg_error
WHERE erreur EQ '1'.
WRITE : /1 itg_error-hkont ,
13 itg_error-dmbtr ,
30 itg_error-etab ,
45 itg_error-servi ,
60 itg_error-code .
ENDLOOP.
SKIP 2.
ENDIF.
READ TABLE itg_error
WITH KEY erreur = '2'.
IF sy-subrc EQ space.
WRITE text-e02 COLOR 6.
WRITE : /1 text-l01 COLOR 1 ,
13 text-l02 COLOR 1 ,
30 text-l03 COLOR 1 ,
45 text-l04 COLOR 1 ,
60 text-l05 COLOR 1 .
LOOP AT itg_error
WHERE erreur EQ '2'.
WRITE : /1 itg_error-hkont ,
13 itg_error-dmbtr ,
30 itg_error-etab ,
45 itg_error-servi ,
60 itg_error-code .
ENDLOOP.
SKIP 2.
ENDIF.
READ TABLE itg_error
WITH KEY erreur = '3'.
IF sy-subrc EQ space.
WRITE text-e03 COLOR 6.
WRITE : /1 text-l01 COLOR 1 ,
13 text-l02 COLOR 1 ,
30 text-l03 COLOR 1 ,
45 text-l04 COLOR 1 ,
60 text-l05 COLOR 1 .
LOOP AT itg_error
WHERE erreur EQ '3'.
WRITE : /1 itg_error-hkont ,
13 itg_error-dmbtr ,
30 itg_error-etab ,
45 itg_error-servi ,
60 itg_error-code .
ENDLOOP.
SKIP 2.
ENDIF.
READ TABLE itg_error
WITH KEY erreur = '4'.
IF sy-subrc EQ space.
WRITE text-e04 COLOR 6.
WRITE : /1 text-l01 COLOR 1 ,
13 text-l02 COLOR 1 ,
30 text-l03 COLOR 1 ,
45 text-l04 COLOR 1 ,
60 text-l05 COLOR 1 .
LOOP AT itg_error
WHERE erreur EQ '4'.
WRITE : /1 itg_error-hkont ,
13 itg_error-dmbtr ,
30 itg_error-etab ,
45 itg_error-servi ,
60 itg_error-code .
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM. " P_ANALYSE.
*----------------------------------------------------------------------*
* Form P_CREATE. *
*----------------------------------------------------------------------*
* Create of G/L account document. *
*----------------------------------------------------------------------*
FORM p_create.
DATA : v_type TYPE bapi_mtype ,
v_nrlevel LIKE nriv-nrlevel ,
v_kostl TYPE kostl ,
v_posid TYPE ps_posid ,
v_aufnr TYPE aufnr ,
v_blart TYPE blart ,
v_count TYPE posnr_acc ,
isg_header TYPE STANDARD TABLE OF bapiache09
WITH HEADER LINE ,
itg_accountgl TYPE STANDARD TABLE OF bapiacgl09
WITH HEADER LINE ,
itg_return TYPE STANDARD TABLE OF bapiret2
WITH HEADER LINE ,
itg_currency TYPE STANDARD TABLE OF bapiaccr09
WITH HEADER LINE ,
itg_tax TYPE STANDARD TABLE OF bapiactx09
WITH HEADER LINE .
* Refresh.
REFRESH : itg_accountgl, itg_currency.
CLEAR : itg_accountgl, itg_currency, isg_header.
* Append the header.
MOVE :
'RFBU' TO isg_header-bus_act ,
sy-uname TO isg_header-username ,
p_bukrs TO isg_header-comp_code ,
p_blart TO isg_header-doc_type ,
p_date TO isg_header-doc_date ,
p_date TO isg_header-pstng_date ,
p_bktxt TO isg_header-header_txt ,
p_bktxt TO isg_header-ref_doc_no .
* Append the post.
LOOP AT itg_data.
v_count = v_count + 1.
CLEAR itg_accountgl.
MOVE : v_count TO itg_accountgl-itemno_acc ,
itg_data-saknr TO itg_accountgl-gl_account ,
itg_data-mwskz TO itg_accountgl-tax_code ,
itg_data-kostl TO itg_accountgl-costcenter ,
itg_data-gsber TO itg_accountgl-bus_area .
APPEND itg_accountgl.
* Montant du poste
IF itg_data-bschl EQ '50'.
w_amount = itg_data-dmbtr.
ELSE.
w_amount = - itg_data-dmbtr.
ENDIF.
MOVE : v_count TO itg_currency-itemno_acc,
'00' TO itg_currency-curr_type ,
p_waers TO itg_currency-currency ,
w_amount TO itg_currency-amt_doccur ,
w_amount TO itg_currency-amt_base .
APPEND itg_currency.
* Tax.
MOVE : v_count TO itg_tax-itemno_acc ,
itg_data-saknr TO itg_tax-gl_account ,
itg_data-mwskz TO itg_tax-tax_code .
ENDLOOP.
* Call the BAPI function
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = isg_header
IMPORTING
obj_type = w_obj_type
obj_key = w_obj_key
obj_sys = w_obj_sys
TABLES
accountgl = itg_accountgl
currencyamount = itg_currency
accounttax = itg_tax
return = itg_return.
IF sy-subrc EQ space.
COMMIT WORK AND WAIT.
IF sy-subrc NE space.
CLEAR itg_return.
MOVE : 'E' TO itg_return-type,
'S&' TO itg_return-id,
'150' TO itg_return-number ,
'ERROR !!'
TO itg_return-message.
APPEND itg_return.
DELETE itg_return
WHERE number = '605'.
ENDIF.
ENDIF.
* Edit the result of the BAPI.
LOOP AT itg_return.
PERFORM p_message_return USING itg_return.
SKIP 1.
ENDLOOP.
* It the document is create, edit the number.
READ TABLE itg_return
WITH KEY number = '605'.
IF sy-subrc EQ space.
SKIP 1.
WRITE : /1 text-003 ,
':' ,
itg_return-message_v2+0(10).
SET PARAMETER ID 'BLN' FIELD itg_return-message_v2+0(10).
ENDIF.
ENDFORM. " P_CREATE
*----------------------------------------------------------------------*
* Form P_MESSAGE_RETURN. *
*----------------------------------------------------------------------*
* Edit the return message. *
*----------------------------------------------------------------------*
FORM p_message_return
USING struct_return STRUCTURE bapiret2.
* Color depends of the error type.
CASE struct_return-type.
WHEN 'A'.
FORMAT COLOR 6.
WRITE : /1 'Termination !' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
WHEN 'E'.
FORMAT COLOR 6.
WRITE : /1 'Error ! ' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
WHEN 'I'.
FORMAT COLOR 5.
WRITE : /1 'Information. ' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
WHEN 'S'.
FORMAT COLOR 4.
WRITE : /1 'Status. ' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
WHEN 'W'.
FORMAT COLOR 3.
WRITE : /1 'Warning ! ' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
WHEN 'X'.
FORMAT COLOR 6.
WRITE : /1 'Short dump !!' ,
20 'Classe de message :',
struct_return-id ,
45 'Numéro :' ,
struct_return-number ,
/1 '' ,
/1 struct_return-message.
FORMAT COLOR OFF.
ENDCASE.
ENDFORM. " P_MESSAGE_RETURN
‎2007 Aug 27 3:29 PM