Sunteți pe pagina 1din 11

*&---------------------------------------------------------------------*

* Report ZF_DELETE_DUPLICAT_BSET_FICA_2
*&---------------------------------------------------------------------*
* original in P7D - maintained only there
*-----------------------------------------------------------------------
* Select-Options :
* p_belnr FI document number
* p_bukrs company code
* p_gjahr business year
* p_budat posting date
* p_blart document type
* p_awtyp reference procudure i.e. VBRK for SD billing documents
* p_tcode transaction code
* p_awkey bkpf-awkey
* Parameters :
* testrun ON = no databbase changes
* listall ON = list BSET of all selected documents
* OFF = list BSET for only corrupted documents
*-----------------------------------------------------------------------

REPORT ZF_DELETE_DUPLICAT_BSET_FICA_2 MESSAGE-ID FF LINE-SIZE 300.

TABLES: bkpf, bseg, bset.


TABLES: t007a, t007b, t683s.

DATA: xbkpf LIKE bkpf OCCURS 10 WITH HEADER LINE,


ybkpf LIKE bkpf OCCURS 10 WITH HEADER LINE,
xbseg LIKE bseg OCCURS 10 WITH HEADER LINE,
xbset LIKE bset OCCURS 10 WITH HEADER LINE,
ybset LIKE bset OCCURS 10 WITH HEADER LINE.
DATA: t_error_return LIKE fimsg OCCURS 10 WITH HEADER LINE.

* output structure
DATA: BEGIN OF xoutput OCCURS 0,
bukrs LIKE bkpf-bukrs,
belnr LIKE bkpf-belnr,
gjahr LIKE bkpf-gjahr,
count_ist TYPE i,
count_soll TYPE i,
deleted TYPE i,
inserted TYPE i,
text(20) TYPE c,
updated TYPE c,
corrupt,
END OF xoutput.

* BSET for output


DATA: BEGIN OF bset_output OCCURS 0,
status(3) TYPE c, " 'OLD' or 'NEW',
xcorrupt.
INCLUDE STRUCTURE bset.
DATA: END OF bset_output.

* counter
DATA: exist_bset_count TYPE i,
calc_bset_count TYPE i,
docs_checked TYPE i,
docs_corrupt TYPE i,
docs_not_correctable TYPE i,
xcorrupt TYPE c,
icommit TYPE i.
*
DATA: old_bukrs LIKE bkpf-bukrs.
DATA: e_external,
e_linewise,
e_with_jurcode.

* DATA: tolerance TYPE fwste VALUE '0.01'.


DATA: l_fwste TYPE fwste,
l_hwste TYPE hwste,
l_h2ste TYPE h2ste,
l_h3ste TYPE h3ste.
DATA: not_sel.
DATA: l_sel.
FIELD-SYMBOLS: <bseg> TYPE bseg,
<*bseg> TYPE bseg.

DATA: h_bukrs TYPE bukrs,


h_belnr TYPE bkpf-belnr,
h_gjahr TYPE bkpf-gjahr.

DATA: t_t683s LIKE t683s OCCURS 30 WITH HEADER LINE.


DATA: g_kalsm LIKE t005-kalsm,
t_t001 LIKE t001.

FIELD-SYMBOLS: <ybset> TYPE bset.

SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME.

PARAMETERS: p_bukrs LIKE bkpf-bukrs MEMORY ID buk


OBLIGATORY,
p_gjahr LIKE bkpf-gjahr MEMORY ID gjr
OBLIGATORY.
SELECT-OPTIONS: p_belnr FOR bkpf-belnr,
p_budat FOR bkpf-budat,
p_bldat FOR bkpf-bldat,
p_blart FOR bkpf-blart,
p_awtyp FOR bkpf-awtyp,
p_awkey FOR bkpf-awkey,
p_tcode FOR bkpf-tcode,
p_mwskz FOR bseg-mwskz.
SELECTION-SCREEN END OF BLOCK 001.

PARAMETERS : testrun AS CHECKBOX DEFAULT 'X'.


PARAMETERS : listall AS CHECKBOX DEFAULT ' '.

START-OF-SELECTION.

* select documents
SELECT * FROM bkpf WHERE bukrs = p_bukrs
AND belnr IN p_belnr
AND gjahr = p_gjahr
AND budat IN p_budat
AND blart IN p_blart
AND awtyp IN p_awtyp
AND tcode IN p_tcode
AND awkey IN p_awkey
AND bstat = space.
CHECK bkpf-awtyp EQ 'FKKSU'.
MOVE-CORRESPONDING bkpf TO xbkpf.
APPEND xbkpf.
ENDSELECT.

LOOP AT xbkpf.

CLEAR not_sel.
xcorrupt = space.
docs_checked = docs_checked + 1.

REFRESH: ybkpf, ybset, xbseg, xbset.


CLEAR: ybkpf, ybset, xbseg, xbset.
CLEAR: exist_bset_count, calc_bset_count.
CLEAR: xoutput.

MOVE-CORRESPONDING xbkpf TO ybkpf.


APPEND ybkpf.

SELECT * FROM bseg WHERE bukrs = xbkpf-bukrs


AND belnr = xbkpf-belnr
AND gjahr = xbkpf-gjahr
AND mwskz IN p_mwskz.
EXIT.
ENDSELECT.

IF sy-subrc IS INITIAL.
* then entire document
SELECT * FROM bseg APPENDING TABLE xbseg
WHERE bukrs = xbkpf-bukrs
AND belnr = xbkpf-belnr
AND gjahr = xbkpf-gjahr.
SELECT * FROM bset WHERE bukrs = xbkpf-bukrs
AND belnr = xbkpf-belnr
AND gjahr = xbkpf-gjahr.
exist_bset_count = exist_bset_count + 1.
MOVE-CORRESPONDING bset TO xbset.
MOVE-CORRESPONDING bset TO ybset.
APPEND xbset.
APPEND ybset.
ENDSELECT.
ELSE.
CONTINUE.
ENDIF.

MOVE-CORRESPONDING ybkpf TO xoutput.

PERFORM remove_duplicate_bsets TABLES ybkpf


xbseg
ybset.

LOOP AT ybset.
calc_bset_count = calc_bset_count + 1.
ENDLOOP.

* no BSET calculated
IF calc_bset_count = 0.
xoutput-text = 'No BSET necessary'.
ENDIF.

* corrupt when calculated BSET does not equal existing BSET


* IF calc_bset_count ne exist_bset_count
* corrupt when calculated BSET has more entries than existing BSET
IF calc_bset_count NE exist_bset_count
OR ybset[] NE xbset[].

* activate or deactivate if necessary


* only special differences are checked
IF ybset[] NE xbset[]
AND calc_bset_count = exist_bset_count.
LOOP AT ybset.
LOOP AT xbset WHERE mwskz = ybset-mwskz
AND txjcd = ybset-txjcd
AND txjdp = ybset-txjdp
AND txjlv = ybset-txjlv
AND ktosl = ybset-ktosl
* AND kschl = ybset-kschl "for SD documents kschl is
changed
AND shkzg = ybset-shkzg.
IF xbset-fwbas NE ybset-fwbas
* OR xbset-fwste NE ybset-fwste
OR xbset-hwbas NE ybset-hwbas
* OR xbset-hwste NE ybset-hwste
OR xbset-h2bas NE ybset-h2bas
OR xbset-h3bas NE ybset-h3bas
* OR xbset-h2ste NE ybset-h2ste
* OR xbset-h3ste NE ybset-h3ste
OR xbset-ktosl NE ybset-ktosl
OR xbset-stbkz NE ybset-stbkz
OR xbset-kbetr NE ybset-kbetr
* OR xbset-knumh NE ybset-knumh
OR xbset-kschl NE ybset-kschl
OR xbset-lstml NE ybset-lstml
OR xbset-lwste NE ybset-lwste
OR xbset-lwbas NE ybset-lwbas
OR xbset-shkzg NE ybset-shkzg.
xcorrupt = 'X'.
ENDIF.

EXIT.
ENDLOOP.
IF sy-subrc NE 0.
xcorrupt = 'X'.
EXIT.
ENDIF.
l_fwste = ABS( xbset-fwste - ybset-fwste ).
l_hwste = ABS( xbset-hwste - ybset-hwste ).
l_h2ste = ABS( xbset-h2ste - ybset-h2ste ).
l_h3ste = ABS( xbset-h3ste - ybset-h3ste ).

IF xcorrupt = 'X'.
EXIT.
ENDIF.
ENDLOOP.
ELSE.
* calc_bset_count NE exist_bset_count
xcorrupt = 'X'.
ENDIF.

ENDIF.

MOVE-CORRESPONDING ybkpf TO xoutput.


xoutput-count_ist = exist_bset_count.
xoutput-count_soll = calc_bset_count.

xoutput-corrupt = xcorrupt.
bset_output-xcorrupt = xcorrupt.

IF listall = 'X'
OR xcorrupt = 'X'.
* store some old bset data for output list
LOOP AT xbset.
bset_output-status = 'OLD'.
MOVE-CORRESPONDING xbset TO bset_output.
APPEND bset_output.
ENDLOOP.

IF xcorrupt = 'X'.
* store some new bset data for output list
LOOP AT ybset.
bset_output-status = 'NEW'.
MOVE-CORRESPONDING ybset TO bset_output.
APPEND bset_output.
ENDLOOP.
ENDIF.

ENDIF.

IF testrun IS INITIAL
AND xcorrupt = 'X'.
* delete old BSET
DELETE bset FROM TABLE xbset.
xoutput-deleted = sy-dbcnt.
* insert new BSET
INSERT bset FROM TABLE ybset.
xoutput-inserted = sy-dbcnt.
xoutput-updated = 'X'.
icommit = icommit + 1.
ENDIF.

IF listall = 'X'.
APPEND xoutput.
ENDIF.

IF xcorrupt = 'X'.
docs_corrupt = docs_corrupt + 1.
ENDIF.
IF icommit GT 500.
COMMIT WORK.
CLEAR icommit.
ENDIF.

ENDLOOP. "xbkpf

COMMIT WORK.
*----------------------------------------------------------------------------------
-------------------
* write results in different output lists
PERFORM output_documents.

***********************************************************************************
********************
* EVENTS
TOP-OF-PAGE.

FORMAT COLOR COL_NEGATIVE.


IF NOT testrun IS INITIAL.
WRITE: 'Only TEST-RUN'.
ELSE.
WRITE: 'Productive UPDATE-RUN'.
ENDIF.
FORMAT COLOR COL_NORMAL.
ULINE.

CASE sy-tvar0.
WHEN '1'.
IF listall = 'X'.
* summary information
FORMAT COLOR COL_HEADING.
WRITE: / 'BUKRS BELNR GJAHR existBSET calcBSET '.
WRITE: 'deletedBSET insertedBSET updated corrupt comment '.
ULINE.
FORMAT COLOR OFF.
ENDIF.

WHEN '2'.
* BSET changes
IF listall IS INITIAL.
FORMAT COLOR COL_KEY.
WRITE: 'List of Documents that will be corrected: compare old and new
BSET'.
SKIP.
ENDIF.
FORMAT COLOR COL_HEADING.
WRITE: /(3) 'Sta', "state new or old
(4) 'CompC', "company code
(10) 'DocumentNo',
(4) 'Year',
(4) 'item', "buzei
(4) 'code', "tax code
(3) 'D/C', "shkzg debit/credit
(3) 'Key', "ktosl
(4) 'Cond', "kschl
(3) 'Grp', "txgrp
(11) ' Percentage'. "kbetr

WRITE: (15) ' Doc. tax base', "fwbas


(15) ' Doc.tax', "fwste
(15) ' LC1 tax base', "hwbas
(15) ' LC1 tax', "hwste

(4) 'Ctry', "Country lstml


(15) ' Reporting base', "lwbas
(15) ' Reporting tax'. "lwste
WRITE: (15) ' LC2 tax base', "h2bas
(15) ' LC2 tax', "h2ste
(15) ' LC3 tax base', "h3bas
(15) ' LC3 tax'."h3ste

* jurisdiction code fields


IF NOT e_with_jurcode IS INITIAL.
WRITE: (15) ' Level-Jurcode', "txjcd
(15) 'Deepest-Jurcode'. "txjdp
ENDIF.

WRITE: (1) 'L'. "txjlv = D for direct tax items

IF NOT e_with_jurcode IS INITIAL.


WRITE: (6) ' TAXPS'. "taxps
ENDIF.

WHEN '3'.
FORMAT COLOR COL_NEGATIVE.
WRITE: 'Documents not handled because of error'.

FORMAT COLOR COL_NORMAL.

WHEN OTHERS.

CLEAR sy-tvar0.

ENDCASE.

AT LINE-SELECTION.

CLEAR: h_bukrs, h_belnr, h_gjahr.


READ CURRENT LINE.
* display FI document
IF NOT h_bukrs IS INITIAL
AND NOT h_belnr IS INITIAL
AND NOT h_gjahr IS INITIAL.
SET PARAMETER ID 'BLN' FIELD h_belnr.
SET PARAMETER ID 'BLP' FIELD h_belnr.
SET PARAMETER ID 'BUK' FIELD h_bukrs.
SET PARAMETER ID 'GJR' FIELD h_gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.

**********************************************************************
* Form OUTPUT_DOCUMENTS
**********************************************************************
FORM output_documents.

SORT xoutput BY bukrs belnr gjahr.


SORT bset_output BY bukrs belnr gjahr status buzei.

sy-tvar0 = '1'. "for top-of-page: Summary

h_bukrs = p_bukrs.
h_gjahr = p_gjahr.

IF listall = 'X'.
LOOP AT xoutput.

WRITE: /(6) xoutput-bukrs,


(12) xoutput-belnr,
(6) xoutput-gjahr,
(10) xoutput-count_ist,
(10) xoutput-count_soll,
(13) xoutput-deleted,
(13) xoutput-inserted.

IF xoutput-updated = 'X'.
FORMAT COLOR COL_NEGATIVE.
ENDIF.
WRITE: (8) xoutput-updated.
FORMAT COLOR OFF.

IF xoutput-corrupt = 'X'.
FORMAT COLOR COL_NEGATIVE.
ENDIF.
WRITE: (8) xoutput-corrupt.
FORMAT COLOR OFF.

WRITE: (20) xoutput-text.

h_belnr = xoutput-belnr.
HIDE: h_bukrs, h_belnr, h_gjahr.

ENDLOOP.

ENDIF.

NEW-LINE. ULINE.
FORMAT COLOR COL_TOTAL.
WRITE: / 'Documents checked: ', docs_checked.
WRITE: / 'Documents corrupt: ', docs_corrupt.
WRITE: / 'Documents not correctable: ', docs_not_correctable.
FORMAT COLOR OFF.

* individual BSET information


IF NOT bset_output[] IS INITIAL.
sy-tvar0 = '2'. "for top-of-page: BSET changes
NEW-PAGE.

FORMAT COLOR COL_NORMAL.


LOOP AT bset_output.
ON CHANGE OF bset_output-belnr.
ULINE.
IF bset_output-xcorrupt IS INITIAL.
FORMAT COLOR COL_POSITIVE.
WRITE: / 'BSET ok and will not be changed'.
ELSE.
IF listall = 'X'.
FORMAT COLOR COL_KEY.
WRITE: / 'Document will be corrected: compare old and new BSET'.

ENDIF.
ENDIF.
ENDON.

IF NOT bset_output-xcorrupt IS INITIAL.


IF bset_output-status = 'OLD'.
FORMAT COLOR COL_NEGATIVE.
ELSE.
FORMAT COLOR COL_POSITIVE.
ENDIF.
WRITE: /(3) bset_output-status.
ELSE.
FORMAT COLOR COL_POSITIVE.
WRITE: /(3) bset_output-status.
ENDIF.

IF bset_output-xcorrupt IS INITIAL.
FORMAT COLOR COL_NORMAL.
ENDIF.

WRITE: (4) bset_output-bukrs,


(10) bset_output-belnr,
(4) bset_output-gjahr,
(4) bset_output-buzei,

(4) bset_output-mwskz,
(3) bset_output-shkzg,

(3) bset_output-ktosl,
(4) bset_output-kschl,
(3) bset_output-txgrp,
(11) bset_output-kbetr.

WRITE: (15) bset_output-fwbas,


(15) bset_output-fwste,
(15) bset_output-hwbas,
(15) bset_output-hwste,

(4) bset_output-lstml,
(15) bset_output-lwbas,
(15) bset_output-lwste.

WRITE: (15) bset_output-h2bas,


(15) bset_output-h2ste,
(15) bset_output-h3bas,
(15) bset_output-h3ste.

* jurisdiction code fields


IF NOT e_with_jurcode IS INITIAL.
WRITE: (15) bset_output-txjcd,
(15) bset_output-txjdp.
ENDIF.

WRITE: (1) bset_output-txjlv. " = D for direct tax items

IF NOT e_with_jurcode IS INITIAL.


WRITE: (6) bset_output-taxps.
ENDIF.

h_belnr = bset_output-belnr.
HIDE: h_bukrs, h_belnr, h_gjahr.
ENDLOOP.
ENDIF.

* error list information

* error list
IF NOT t_error_return[] IS INITIAL.
sy-tvar0 = '3'. "for top-of-page: Error list
NEW-PAGE.

LOOP AT t_error_return.

CALL FUNCTION 'FI_MESSAGE_INIT'.

CALL FUNCTION 'FI_MESSAGE_COLLECT'


EXPORTING
i_fimsg = t_error_return.

WRITE: / 'Document :', t_error_return-msort.

h_belnr = t_error_return-msort.
HIDE: h_bukrs, h_belnr, h_gjahr.

CALL FUNCTION 'FI_MESSAGE_PRINT'.


HIDE: h_bukrs, h_belnr, h_gjahr.
ULINE.

ENDLOOP.
ENDIF.

ENDFORM. "output_documents

*&---------------------------------------------------------------------*
*& Form REMOVE_DUPLICATE_BSETS
*&---------------------------------------------------------------------*
FORM remove_duplicate_bsets TABLES t_bkpf STRUCTURE bkpf
t_bseg STRUCTURE bseg
t_bset STRUCTURE bset.

DATA: lv_bukrs TYPE bukrs,


lv_kalsm TYPE kalsm_d.

DATA: ls_ttxd TYPE ttxd.

DATA: ls_bset TYPE bset.

READ TABLE t_bkpf INDEX 1.


READ TABLE t_bseg INDEX 1.

IF t_bseg-stbuk IS INITIAL.
lv_bukrs = t_bkpf-bukrs.
ELSE.
lv_bukrs = t_bseg-stbuk.
ENDIF.

CALL FUNCTION 'FIND_TAX_SPREADSHEET'


EXPORTING
buchungskreis = lv_bukrs
IMPORTING
schema = lv_kalsm.

SELECT SINGLE * FROM ttxd INTO ls_ttxd WHERE kalsm = lv_kalsm.

CHECK sy-subrc NE 0.

IF xbseg[] IS INITIAL.
EXIT.
ENDIF.

LOOP AT t_bset INTO ls_bset.


DELETE t_bset WHERE mandt = ls_bset-mandt
AND bukrs = ls_bset-bukrs
AND belnr = ls_bset-belnr
AND gjahr = ls_bset-gjahr
AND buzei > ls_bset-buzei
AND mwskz = ls_bset-mwskz
AND hkont = ls_bset-hkont
AND txgrp <> ls_bset-txgrp
AND txgrp IS NOT INITIAL
AND shkzg = ls_bset-shkzg
AND hwbas = ls_bset-hwbas
AND fwbas = ls_bset-fwbas
AND hwste = ls_bset-hwste
AND fwste = ls_bset-fwste
AND ktosl = ls_bset-ktosl
AND knumh = ls_bset-knumh
AND stceg = ls_bset-stceg
AND egbld = ls_bset-egbld
AND eglld = ls_bset-eglld
AND txjcd = ls_bset-txjcd
AND h2ste = ls_bset-h2ste
AND h3ste = ls_bset-h3ste
AND h2bas = ls_bset-h2bas
AND h3bas = ls_bset-h3bas
AND kschl = ls_bset-kschl
AND stmdt = ls_bset-stmdt
AND stmti = ls_bset-stmti
AND mlddt = ls_bset-mlddt
AND kbetr = ls_bset-kbetr
AND stbkz <> ls_bset-stbkz
AND stbkz IS INITIAL
AND lstml = ls_bset-lstml
AND lwste = ls_bset-lwste
AND lwbas = ls_bset-lwbas
AND txdat = ls_bset-txdat
AND bupla = ls_bset-bupla
AND txjdp = ls_bset-txjdp
AND txjlv = ls_bset-txjlv
AND taxps = ls_bset-taxps
AND txmod = ls_bset-txmod.
ENDLOOP.

ENDFORM.

S-ar putea să vă placă și