0% found this document useful (0 votes)
31 views

Reverse Posting Code

Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
31 views

Reverse Posting Code

Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

CONSTANTS:

lc_tvarvc_name TYPE string VALUE 'ZCATS_COMP_CODE', " Properties for


company code maintained in TVARVC
lc_tvarvc_type TYPE string VALUE 'P',

lc_marked TYPE c VALUE 'X',


lc_empty TYPE c VALUE '',
lc_yes TYPE c VALUE 'Y',
lc_no TYPE c VALUE 'N',

lc_december TYPE string VALUE '12', " December month


lc_error_flag TYPE c VALUE 'E', " Error flag for BAPI call

lc_message_class TYPE symsgid VALUE 'ZCATS', " Message class


lc_message_006 TYPE symsgno VALUE '006', " WBS Bookings not available for
selected period
lc_message_000 TYPE symsgno VALUE '000', " Reverse posting possible only
for previous period and fiscal year
lc_message_001 TYPE symsgno VALUE '001', " Documents are not posted or
validated for previous month
lc_message_002 TYPE symsgno VALUE '002', " Company code not maintained
lc_message_005 TYPE symsgno VALUE '005', " Documents are already reversed
lc_message_007 TYPE symsgno VALUE '007', " Documents can't be updated to
WBS
lc_message_003 TYPE symsgno VALUE '003', " Reverse posting unsuccessful
while updating the bookings
lc_message_004 TYPE symsgno VALUE '004'. " Reversal posting successful

DATA:
lv_prev_month TYPE c LENGTH 2,
lv_curr_year TYPE c LENGTH 4,
lv_prev_year TYPE c LENGTH 4,
lv_date TYPE sydatum.

DATA(lv_curr_month_dat) = sy-datum+4(2). " current month (datum)


DATA(lv_curr_year_dat) = sy-datum+0(4). " current year (datum)

DATA lv_curr_date TYPE dats. " today


DATA(lv_username) = sy-uname. " user name
lv_curr_date = sy-datum.

" Reverse BAPI parameters


DATA:
lwa_rev_doc_header TYPE bapidochdrr, " Input header
lit_rev_posting_return TYPE TABLE OF bapiret2, " Error result
lit_rev_posting_result TYPE TABLE OF bapidochdrr, " Result table
lwa_rev_posting_result TYPE bapidochdrr. " Reverse document
details

READ TABLE keys INDEX 1 INTO DATA(lwa_filter_values).

DATA(lv_period) = lwa_filter_values-%param-period. " period entered


by user
DATA(lv_fiscal_year) = lwa_filter_values-%param-fiscalyear. " fiscal year
entered by user

lv_prev_month = lv_curr_month_dat - 1. " Previous month


lv_curr_year = lv_curr_year_dat. " Current year
lv_prev_year = lv_curr_year_dat - 1. " Previous year

" Validation : Period must be previous month or year


IF (
lv_fiscal_year EQ lv_curr_year AND lv_period <> lv_prev_month OR " For
current year, month must be previous month
lv_fiscal_year EQ lv_prev_year AND lv_period <> lc_december ). " For
previous year, month must be December
APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_000
severity = if_abap_behv_message=>severity-
error )
) TO reported-wbs_bookings.
RETURN.
ENDIF.

" Maintain ( original, reverse ) doc. list


TYPES: BEGIN OF lty_reversal_list,
original_doc TYPE zcats_emp_time_i-document,
reversal_doc TYPE zcats_emp_time_i-document,
END OF lty_reversal_list.

DATA: lit_reversal_list TYPE TABLE OF lty_reversal_list.

CONCATENATE lv_fiscal_year lv_period '01' INTO lv_date.

CALL FUNCTION 'HR_JP_MONTH_BEGIN_END_DATE' ##FM_SUBRC_OK


EXPORTING
iv_date = lv_date
IMPORTING
* ev_month_begin_date = lv_curr_begda
ev_month_end_date = lv_date.
" WBS bookings for current period
SELECT
*
FROM zcats_emp_time_i
WHERE "booking_month = @lv_period AND
* booking_year = @lv_fiscal_year AND
posting_date EQ @lv_date AND
posted EQ @abap_true AND
pspnr <> @lc_empty
INTO TABLE @DATA(lit_wbs_bookings). " reverse posting
happens only for WBS based entries

IF sy-subrc <> 0.
" Check : Bookings present for entered period
APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_006
severity = if_abap_behv_message=>severity-error )
) TO reported-wbs_bookings.
RETURN.
ENDIF.

SELECT
*
FROM zcats_emp_time_l
WHERE posting_date EQ @lv_date AND
posted EQ @abap_true AND
pspnr <> @lc_empty
INTO TABLE @DATA(lit_wbs_bookings_l).

" Fetch company code (9000) from TVARVC


SELECT
SINGLE low
FROM tvarvc
INTO @DATA(lv_company_code)
WHERE name = @lc_tvarvc_name AND
type = @lc_tvarvc_type.

" Check : Company code maintained in TVARVC


IF sy-subrc <> 0.
APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_002
severity = if_abap_behv_message=>severity-error )
) TO reported-wbs_bookings.
RETURN.
ENDIF.

SELECT
stblg AS rev_doc, " Reversal document
xreversal AS rev_flag, " Reversal flag : 1-Reversal, 2-
Reversed
belnr, " document no
awkey AS ref_key " reference key
FROM bkpf
INTO TABLE @DATA(lit_acc_doc) " Accounting documents
WHERE
bukrs EQ @lv_company_code AND " Company code
gjahr EQ @lv_fiscal_year " Fiscal year
ORDER BY belnr.

IF sy-subrc <> 0 ##NEEDED.


ENDIF.

" Reverse post each line item


LOOP AT lit_wbs_bookings ASSIGNING FIELD-SYMBOL(<lfs_wbs_bookings>).

" check if the document is already reversed


IF line_exists( lit_reversal_list[ original_doc = <lfs_wbs_bookings>-document
] ).

<lfs_wbs_bookings>-changedat = lv_curr_date.
<lfs_wbs_bookings>-changedby = lv_username.

* <lfs_wbs_bookings>-validated = lc_no. " N (no)


<lfs_wbs_bookings>-posted = lc_empty. " EMPTY (not
posted)

" reversal document


<lfs_wbs_bookings>-document = lit_reversal_list[ original_doc =
<lfs_wbs_bookings>-document ]-reversal_doc.
CONTINUE.

ENDIF.
" Check : if the document is already reversed before reverse posting call
DATA(lv_ref_key) = <lfs_wbs_bookings>-document && lv_company_code. "
reference key => (KB11N document number)(company code)

" reversed document no


DATA(lv_rev_doc) = VALUE #( lit_acc_doc[ ref_key = lv_ref_key ]-rev_doc
OPTIONAL ) ##WARN_OK.

" Check : if document is already reversed.


IF lv_rev_doc <> lc_empty.

" reversed document key


DATA(lv_rev_indicator) = VALUE #( lit_acc_doc[ belnr = lv_rev_doc ]-
ref_key OPTIONAL ).

IF lv_rev_doc EQ lv_rev_indicator. " 1 - reversed document

<lfs_wbs_bookings>-changedat = lv_curr_date.
<lfs_wbs_bookings>-changedby = lv_username.

* <lfs_wbs_bookings>-validated = lc_no. " N (no)


<lfs_wbs_bookings>-posted = lc_empty. " EMPTY
(not posted)
<lfs_wbs_bookings>-document = lv_rev_indicator+0(10). "
(existing reversal doc.)(company code)
CONTINUE.
ENDIF.

APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_005
severity = if_abap_behv_message=>severity-error )
) TO reported-wbs_bookings.
RETURN.

ENDIF.

lwa_rev_doc_header-co_area = lv_company_code.
" controlling area
lwa_rev_doc_header-doc_hdr_tx = |{ TEXT-000 } { lv_period } ,
{ lv_fiscal_year }|. " reversal description
lwa_rev_doc_header-username = lv_username.
" user initiating reversal
lwa_rev_doc_header-rvrs_no = <lfs_wbs_bookings>-document.
" KB11N reference doc. No
lwa_rev_doc_header-postgdate = <lfs_wbs_bookings>-posting_date.

" Reverse CO document


CALL FUNCTION 'BAPI_ACC_ACT_POSTINGS_REVERSE' DESTINATION 'NONE'
EXPORTING
doc_header = lwa_rev_doc_header
TABLES
doc_no = lit_rev_posting_result
return = lit_rev_posting_return.

READ TABLE lit_rev_posting_return


INTO DATA(lwa_rev_posting_return)
INDEX 1.
IF lwa_rev_posting_return-type EQ lc_error_flag.
" Check : reverse posting BAPI error
APPEND VALUE #(
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = lwa_rev_posting_return-message ) ) TO reported-
wbs_bookings.
RETURN.
ENDIF.

" Fetch reverse doc. from result


READ TABLE lit_rev_posting_result
INTO lwa_rev_posting_result
INDEX 1.

DATA: lwa_reversal_doc TYPE lty_reversal_list.


lwa_reversal_doc-original_doc = <lfs_wbs_bookings>-document.
lwa_reversal_doc-reversal_doc = lwa_rev_posting_result-doc_no.

" add current ( original, reverse ) doc. to list


APPEND lwa_reversal_doc TO lit_reversal_list.

<lfs_wbs_bookings>-changedat = lv_curr_date.
<lfs_wbs_bookings>-changedby = lv_username.

* <lfs_wbs_bookings>-validated = lc_no. " N (no)


<lfs_wbs_bookings>-posted = lc_empty. " EMPTY
(not posted)
<lfs_wbs_bookings>-document = lwa_rev_posting_result-doc_no. " new
reversal doc.

CLEAR:
lwa_rev_doc_header,
lit_rev_posting_return,
lit_rev_posting_result,
lwa_rev_posting_result.

ENDLOOP.

LOOP AT lit_wbs_bookings_l ASSIGNING FIELD-SYMBOL(<lfs_wbs_bookings_l>).

" check if the document is already reversed


IF line_exists( lit_reversal_list[ original_doc = <lfs_wbs_bookings_l>-
document ] ).

CONTINUE.

ENDIF.

" Check : if the document is already reversed before reverse posting call
lv_ref_key = <lfs_wbs_bookings_l>-document && lv_company_code. " reference
key => (KB11N document number)(company code)

" reversed document no


lv_rev_doc = VALUE #( lit_acc_doc[ ref_key = lv_ref_key ]-rev_doc OPTIONAL )
##WARN_OK.

" Check : if document is already reversed.


IF lv_rev_doc <> lc_empty.

" reversed document key


lv_rev_indicator = VALUE #( lit_acc_doc[ belnr = lv_rev_doc ]-ref_key
OPTIONAL ).

IF lv_rev_doc EQ lv_rev_indicator.
CONTINUE.
ENDIF.

ENDIF.

lwa_rev_doc_header-co_area = lv_company_code.
" controlling area
lwa_rev_doc_header-doc_hdr_tx = |{ TEXT-000 } { lv_period } ,
{ lv_fiscal_year }|. " reversal description
lwa_rev_doc_header-username = lv_username.
" user initiating reversal
lwa_rev_doc_header-rvrs_no = <lfs_wbs_bookings_l>-document.
" KB11N reference doc. No
lwa_rev_doc_header-postgdate = <lfs_wbs_bookings_l>-posting_date.

" Reverse CO document


CALL FUNCTION 'BAPI_ACC_ACT_POSTINGS_REVERSE' DESTINATION 'NONE'
EXPORTING
doc_header = lwa_rev_doc_header
TABLES
doc_no = lit_rev_posting_result
return = lit_rev_posting_return.

READ TABLE lit_rev_posting_return


INTO lwa_rev_posting_return
INDEX 1.

IF lwa_rev_posting_return-type EQ lc_error_flag.
" Check : reverse posting BAPI error
APPEND VALUE #(
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = lwa_rev_posting_return-message ) ) TO reported-
wbs_bookings.
RETURN.
ENDIF.

" Fetch reverse doc. from result


READ TABLE lit_rev_posting_result
INTO lwa_rev_posting_result
INDEX 1.

lwa_reversal_doc-original_doc = <lfs_wbs_bookings>-document.
lwa_reversal_doc-reversal_doc = lwa_rev_posting_result-doc_no.

" add current ( original, reverse ) doc. to list


APPEND lwa_reversal_doc TO lit_reversal_list.

CLEAR:
lwa_rev_doc_header,
lit_rev_posting_return,
lit_rev_posting_result,
lwa_rev_posting_result.

ENDLOOP.

" Commit if no error occurs


CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION 'NONE'
EXPORTING
wait = 'X'.

IF sy-subrc <> 0.
" Check : if update of DB successful
APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_007
severity = if_abap_behv_message=>severity-error )
) TO reported-wbs_bookings.
ELSE.
" Update WBS bookings
UPDATE zcats_emp_time_i FROM TABLE lit_wbs_bookings.

CONCATENATE lv_fiscal_year lv_period '01' INTO lv_date.

CALL FUNCTION 'HR_JP_MONTH_BEGIN_END_DATE' ##FM_SUBRC_OK


EXPORTING
iv_date = lv_date
IMPORTING
ev_month_end_date = lv_date.

DELETE FROM zcats_emp_time_l WHERE posting_date EQ lv_date.

APPEND VALUE #(
%msg = new_message( id = lc_message_class
number = lc_message_004
severity = if_abap_behv_message=>severity-success )
) TO reported-wbs_bookings.
ENDIF.

You might also like