SAP ABAP应收账款账龄分析表

*&---------------------------------------------------------------------*
*& Report ZRP_FI_008
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zrp_fi_008 LINE-SIZE 800 NO STANDARD PAGE HEADING.

TABLES: kna1, bsid, knb1.

* Global data declaration
TYPE-POOLS: slis.

TYPES:BEGIN OF gt_cust,
bukrs LIKE bsid-bukrs,
kunnr LIKE kna1-kunnr,
name1 LIKE kna1-name1,
gjahr LIKE bsid-gjahr,
monat LIKE bsid-monat,
waers LIKE fdbl_header-waers,
bgber LIKE fdbl_balance_line-balance, "期初余额
arber LIKE fdbl_balance_line-balance, "本期销售
pyber LIKE fdbl_balance_line-balance, "本期收款
blber LIKE fdbl_balance_line-balance, "本期余额
END OF gt_cust.

TYPES:BEGIN OF gt_bsid.
INCLUDE STRUCTURE bsid.
TYPES:END OF gt_bsid.

* GLOBAL STRUCTURE OF LIST
TYPES:BEGIN OF t_outtab,
bukrs LIKE bsid-bukrs,
kunnr LIKE kna1-kunnr,
name1 LIKE kna1-name1,
gjahr LIKE bsid-gjahr,
monat LIKE bsid-monat,
waers LIKE fdbl_header-waers,
bgber LIKE fdbl_balance_line-balance, "期初余额
arber LIKE fdbl_balance_line-balance, "本期销售
pyber LIKE fdbl_balance_line-balance, "本期收款
blber LIKE fdbl_balance_line-balance, "本期余额
bera0 LIKE fdbl_balance_line-balance, "账龄<0天
bera1 LIKE fdbl_balance_line-balance, "账龄0~30天
bera2 LIKE fdbl_balance_line-balance, "账龄31~60天
bera3 LIKE fdbl_balance_line-balance, "账龄61~90天
bera4 LIKE fdbl_balance_line-balance, "账龄91~120天
bera5 LIKE fdbl_balance_line-balance, "账龄121~180天
bera6 LIKE fdbl_balance_line-balance, "账龄181~360天
bera7 LIKE fdbl_balance_line-balance, "账龄>360天
END OF t_outtab.

* Data variable for use of ALV
DATA: i_gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: i_gt_outtab TYPE t_outtab OCCURS 0 WITH HEADER LINE.
DATA: i_gt_excluding TYPE slis_t_extab.
DATA: v_gt_repid LIKE sy-repid.
DATA: i_gt_events TYPE slis_t_event.
DATA: v_gt_variant LIKE disvariant.
DATA: i_gs_layout TYPE slis_layout_alv.

DATA: lt_cust TYPE gt_cust OCCURS 0 WITH HEADER LINE.
DATA: lt_bsid TYPE gt_bsid OCCURS 0 WITH HEADER LINE.

*---------------------------------------------------------------------*
* SELECTION SCREEN *
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_bukrs FOR bsid-bukrs NO INTERVALS OBLIGATORY,
s_kunnr FOR bsid-kunnr,
s_ktokd FOR kna1-
ktokd,
s_akont FOR knb1-akont.
PARAMETERS: p_gjahr

LIKE bsid-gjahr,
p_monat LIKE bsid-monat.
SELECTION-SCREEN SKIP.
PARAMETERS: cb_zero AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.

*---------------------------------------------------------------------*
* INITIALIZATION *
*---------------------------------------------------------------------*
* Initialization fieldcatalog
INITIALIZATION.
v_gt_repid = sy-repid.
REFRESH: s_bukrs.
s_bukrs-sign = 'I'.
s_bukrs-option = 'EQ'.
s_bukrs-low = '1000'.
APPEND s_bukrs.
p_gjahr = sy-datum+0(4).
p_monat = sy-datum+4(2).

AT SELECTION-SCREEN.

*---------------------------------------------------------------------*
* START-OF-SELECTION *
*---------------------------------------------------------------------*
* Start of Selection
START-OF-SELECTION.
PERFORM get_data.

*---------------------------------------------------------------------*
* END-OF-SELECTION *
*---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM fieldcat_init.
PERFORM eventtab_build.
PERFORM call_alv.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
DATA: lt_bala LIKE bapi3007_7 OCCURS 0 WITH HEADER LINE,
lt_spec LIKE bapi3007_a OCCURS 0 WITH HEADER LINE.
DATA: lv_days LIKE sy-index.
DATA: lv_budat LIKE sy-datum.

REFRESH: lt_cust.
SELECT a~bukrs a~kunnr a~gjahr b~name1
INTO CORRESPONDING FIELDS OF TABLE lt_cust
FROM knc1 AS a
INNER JOIN kna1 AS b ON b~kunnr = a~kunnr
INNER JOIN knb1 AS c ON c~kunnr = a~kunnr AND c~bukrs = a~bukrs
WHERE a~kunnr IN s_kunnr
AND a~bukrs IN s_bukrs
AND a~gjahr EQ p_gjahr
AND b~ktokd IN s_ktokd
AND c~akont IN s_akont.

LOOP AT lt_cust.
REFRESH: lt_bala, lt_spec.
* lt_cust-monat = p_monat.
* CALL FUNCTION 'BAPI_AR_ACC_GETPERIODBALANCES'
* EXPORTING
* companycode = lt_cust-bukrs
* customer = lt_cust-kunnr
* TABLES
* debitor_balances = lt_bala
* debitor_special_balances = lt_spec.
* READ TABLE lt_bala WITH KEY customer = lt_cust-kunnr
* comp_code = lt_cust-bukrs
* fisc_year = lt_cust-gjahr
* fis_period = lt_cust-monat.
* IF sy-subrc = 0.
* lt_cust-arber = lt_bala-debits_mth.
* lt_cust-pyber =
lt_bala-credit_mth.
* lt_cust-blber = lt_bala-balance.

* lt_cust-bgber = lt_cust-blber - ( lt_cust-arber + lt_cust-pyber ).
* lt_cust-waers = lt_bala-currency.
* ELSE.
* lt_cust-arber = 0.
* lt_cust-pyber = 0.
* lt_cust-blber = 0.
* lt_cust-bgber = 0.
* lt_cust-waers = 'CNY'.
* ENDIF.

lt_cust-monat = p_monat.
CALL FUNCTION 'ZFM_FI_CUSTOMER_DATA'
EXPORTING
IN_BUKRS = lt_cust-bukrs
IN_KUNNR = lt_cust-kunnr
IN_GJAHR = p_gjahr
TABLES
debitor_balances = lt_bala.
READ TABLE lt_bala WITH KEY customer = lt_cust-kunnr
comp_code = lt_cust-bukrs
fisc_year = lt_cust-gjahr
fis_period = lt_cust-monat.
IF sy-subrc = 0.
lt_cust-arber = lt_bala-debits_mth. "期间借方发生额
lt_cust-pyber = lt_bala-credit_mth. "期间贷方发生额
lt_cust-blber = lt_bala-balance. "期末
lt_cust-bgber = lt_bala-MNTH_SALES. "期初余额
lt_cust-waers = lt_bala-currency.
ELSE.
lt_cust-arber = 0.
lt_cust-pyber = 0.
lt_cust-blber = 0.
lt_cust-bgber = 0.
lt_cust-waers = 'CNY'.
ENDIF.

MODIFY lt_cust.
ENDLOOP.

IF NOT lt_cust[] IS INITIAL.
CONCATENATE p_gjahr p_monat '01' INTO lv_budat.
CALL FUNCTION 'DATE_GET_MONTH_LASTDAY'
EXPORTING
i_date = lv_budat
IMPORTING
e_date = lv_budat.

SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bsid
FROM bsid
FOR ALL ENTRIES IN lt_cust
WHERE bukrs = lt_cust-bukrs
AND kunnr = lt_cust-kunnr
AND umsks = space
AND budat <= lv_budat.
ENDIF.

LOOP AT lt_cust.
CLEAR: i_gt_outtab.
MOVE-CORRESPONDING lt_cust TO i_gt_outtab.
LOOP AT lt_bsid WHERE bukrs = lt_cust-bukrs
AND kunnr = lt_cust-kunnr.
lv_days = sy-datum - ( lt_bsid-zfbdt + lt_bsid-zbd1t ).
IF lv_days < 0.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera0 = i_gt_outtab-bera0 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera0 = i_gt_outtab-bera0 - lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days >= 0 AND lv_days <= 30.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera1 = i_gt_outtab-bera1 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera1 = i_gt_outtab-bera1 - lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days >= 31 AND lv_days <= 60.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera2 = i_gt_outtab-bera2 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera2 = i_gt_outtab-bera2 - lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days >= 61 AND lv_days <= 90.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera3 = i_gt_outtab-bera3 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera3 = i_gt_outtab-bera3 -
lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days >= 91 AND lv_days <= 120.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera4 = i_gt_outtab-bera4 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera4 = i_gt_outtab-bera4 - lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days >= 121 AND lv_days <= 180.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera5 = i_gt_outtab-bera5 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera5 = i_gt_outtab-bera5 - lt_bsid-dmbtr.
ENDIF.

ELSEIF lv_days >= 181 AND lv_days <= 360.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera6 = i_gt_outtab-bera6 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera6 = i_gt_outtab-bera6 - lt_bsid-dmbtr.
ENDIF.
ELSEIF lv_days > 360.
IF lt_bsid-shkzg = 'S'.
i_gt_outtab-bera7 = i_gt_outtab-bera7 + lt_bsid-dmbtr.
ELSE.
i_gt_outtab-bera7 = i_gt_outtab-bera7 - lt_bsid-dmbtr.
ENDIF.
ENDIF.
IF cb_zero = 'X'.
CHECK i_gt_outtab-arber <> 0 OR i_gt_outtab-pyber <> 0 OR
i_gt_outtab-blber <> 0 OR i_gt_outtab-bgber <> 0 OR
i_gt_outtab-bera0 <> 0 OR i_gt_outtab-bera1 <> 0 OR
i_gt_outtab-bera2 <> 0 OR i_gt_outtab-bera3 <> 0 OR
i_gt_outtab-bera4 <> 0 OR i_gt_outtab-bera5 <> 0 OR
i_gt_outtab-bera6 <> 0 OR i_gt_outtab-bera7 <> 0 .
ENDIF.
ENDLOOP.
shift i_gt_outtab-kunnr left deleting leading '0'. "去前导空格
APPEND i_gt_outtab.
ENDLOOP.
FREE: lt_cust, lt_bsid.
SORT i_gt_outtab BY bukrs kunnr.
ENDFORM. " GET_DATA

*&---------------------------------------------------------------------*
*& Form FIELDCAT_INIT
*&---------------------------------------------------------------------*
* Initialization fieldcatalog DEFINITION OF HEADING.
* Fieldnames and ref_fieldnames MUST be UPPER CASE !!
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fieldcat_init.
DATA: l_fieldcat TYPE slis_fieldcat_alv.
*---------------------------------------------------------------------*
* general fields selected *
*---------------------------------------------------------------------*
DEFINE alv_fieldcat.
l_fieldcat-tabname = &1.
l_fieldcat-fieldname = &2.
l_fieldcat-key = &3.
l_fieldcat-ref_fieldname = &4.
l_fieldcat-ref_tabname = &5.
l_fieldcat-reptext_ddic = &6.
l_fieldcat-no_out = &7.
l_fieldcat-no_zero = &8.
l_fieldcat-outputlen = &9.
append l_fieldcat to i_gt_fieldcat.
END-OF-DEFINITION.

alv_fieldcat 'I_GT_OUTTAB' 'BUKRS' ' ' ' ' ' ' '公司' ' ' ' ' 4.
alv_fieldcat 'I_GT_OUTTAB' 'KUNNR' ' ' ' ' ' ' '客户' ' ' ' '
10.
alv_fieldcat 'I_GT_OUTTAB' 'NAME1' ' ' ' ' ' ' '客户名称' ' ' ' ' 36.
alv_fieldcat 'I_GT_OUTTAB' 'GJAHR' ' ' ' ' ' ' '年度' ' ' ' ' 4.
alv_fieldcat 'I_GT_OUTTAB' 'MONAT' ' ' ' ' ' ' '月度' ' ' ' ' 4.
alv_fieldca

t 'I_GT_OUTTAB' 'WAERS' ' ' ' ' ' ' '币种' ' ' ' ' 4.
alv_fieldcat 'I_GT_OUTTAB' 'BGBER' ' ' ' ' ' ' '期初余额' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'ARBER' ' ' ' ' ' ' '本期借方' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'PYBER' ' ' ' ' ' ' '本期贷方' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BLBER' ' ' ' ' ' ' '本期余额' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA0' ' ' ' ' ' ' '账龄(<0)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA1' ' ' ' ' ' ' '账龄(0~30)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA2' ' ' ' ' ' ' '账龄(31~60)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA3' ' ' ' ' ' ' '账龄(61~90)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA4' ' ' ' ' ' ' '账龄(91~120)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA5' ' ' ' ' ' ' '账龄(121~180)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA6' ' ' ' ' ' ' '账龄(181~360)天' ' ' ' ' 15.
alv_fieldcat 'I_GT_OUTTAB' 'BERA7' ' ' ' ' ' ' '账龄(>360)天' ' ' ' ' 15.

ENDFORM. "FIELDCAT_INIT

*&---------------------------------------------------------------------*
*& Form EVENTTAB_BUILD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM eventtab_build.
DATA: l_ls_event TYPE slis_alv_event.

CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = i_gt_events.

*........ADD EVENT AT-USER-COMMAND .....................................
READ TABLE i_gt_events WITH KEY name = slis_ev_user_command
INTO l_ls_event.
IF sy-subrc = 0.
MOVE slis_ev_user_command TO l_ls_event-form.
APPEND l_ls_event TO i_gt_events.
ENDIF.

ENDFORM. "EVENTTAB_BUILD

*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
* DYNAMIC CALL FROM THE

ALV
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: l_index LIKE sy-index,
l_colno TYPE slis_sel_tab_field.
DATA: rspar_tab TYPE rsparams OCCURS 0 WITH HEADER LINE.

l_index = rs_selfield-tabindex. "LINE IN LIST
l_colno = rs_selfield-sel_tab_field. "COLUMN
HEADER

*........POSITION THE CURSOR ON A LINE IN THE LIST......................
IF l_index LE 0.
* MESSAGE .........
ENDIF.
READ TABLE i_gt_outtab INDEX l_index.

CASE l_colno.
*........CUSTOMER DISPLAY..............................................*
WHEN 'I_GT_OUTTAB-KUNNR'.
SET PARAMETER ID 'KUN' FIELD i_gt_outtab-kunnr.
CALL TRANSACTION 'XD03' AND SKIP FIRST SCREEN.
WHEN 'I_GT_OUTTAB-BGBER' OR 'I_GT_OUTTAB-ARBER' OR
'I_GT_OUTTAB-PYBER' OR 'I_GT_OUTTAB-BLBER'.
CLEAR rspar_tab. REFRESH rspar_tab.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = 'RFARBALANCE'
TABLES
selection_table = rspar_tab
EXCEPTIONS
not_found = 01
no_report = 02.
LOOP AT rspar_tab.
CASE rspar_tab-selname.
WHEN 'SO_KUNNR'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = i_gt_outtab-kunnr.
rspar_tab-high = space.
WHEN 'SO_BUKRS'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = i_gt_outtab-bukrs.
rspar_tab-high = space.
WHEN 'GP_GJAHR'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = i_gt_outtab-gjahr.
rspar_tab-high = space.
ENDCASE.
MODIFY rspar_tab.
ENDLOOP.
IF NOT i_gt_outtab-kunnr IS INITIAL.
SUBMIT rfarbalance USING SELECTION-SCREEN '1000'
WITH SELECTION-TABLE rspar_tab
AND RETURN.
ENDIF.
WHEN 'I_GT_OUTTAB-BERA0' OR 'I_GT_OUTTAB-BERA1' OR
'I_GT_OUTTAB-BERA2' OR 'I_GT_OUTTAB-BERA3' OR
'I_GT_OUTTAB-BERA4' OR 'I_GT_OUTTAB-BERA5' OR
'I_GT_OUTTAB-BERA6' OR 'I_GT_OUTTAB-BERA7'.
CLEAR rspar_tab. REFRESH rspar_tab.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = 'RFITEMAR'
TABLES
selection_table = rspar_tab
EXCEPTIONS
not_found = 01
no_report = 02.
LOOP AT rspar_tab.
CASE rspar_tab-selname.
WHEN 'DD_KUNNR'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = i_gt_outtab-kunnr.
rspar_tab-high = space.
WHEN 'DD_BUKRS'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = i_gt_outtab-bukrs.
rspar_tab-high = space.
WHEN 'X_OPSEL'.
rspar_tab-sign = '

I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = 'X'.
rspar_tab-high = space.
WHEN 'X_NORM'.
rspar_tab-sign = 'I'.
rspar_tab-option = 'EQ'.
rspar_tab-low = 'X'.
rspar_tab-high = space.
ENDCASE.
MODIFY rspar_tab.
ENDLOOP.
IF NOT i_gt_outtab-kunnr IS INITIAL.
SUBMIT rfitemar USING SELECTION-SCREEN '1000'
WITH SELECTION-TABLE rspar_tab
AND RETURN.
ENDIF.
ENDCASE.

ENDFORM. "USER_COMMAND

*&---------------------------------------------------------------------*
*& Form CALL_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM call_alv.
DATA: l_excluding TYPE slis_extab.

i_gs_layout-colwidth_optimize = 'X'.

* l_excluding-fcode = '&OUP'.
* APPEND l_excluding TO i_gt_excluding.
* l_excluding-fcode = '&ODN'.
* APPEND l_excluding TO i_gt_excluding.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = v_gt_repid
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = i_gs_layout
it_fieldcat = i_gt_fieldcat
it_excluding = i_gt_excluding
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
i_default = 'X'
i_save = 'A'
is_variant = v_gt_variant
it_events = i_gt_events
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT

=
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab
= i_gt_outtab
EXCEPTIONS
program_error = 1
OTHERS = 2
.

ENDFORM. " CALL_ALV

相关文档
最新文档