*&
*& Report ZFIR050
*&
*&
*&
*&
*&
REPORT zfir050.
TABLES : bkpf,sscrfields.
TYPE-POOLS: slis.
DATA: wa_layo TYPE lvc_s_layo.
DATA: wa_fcat TYPE lvc_s_fcat,
it_fcat TYPE lvc_t_fcat.
DATA it_scol TYPE lvc_t_scol.
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,<dyn_wa1>,<dyn_wa2>,
<dyn_field>,<dyn_field1>,<dyn_field2>.
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data.
DATA:functxt TYPE smp_dyntxt.
DATA : gt_ztzbdm TYPE TABLE OF ztzbdm ,
gs_ztzbdm TYPE ztzbdm.
DATA : gt_zdm1 TYPE TABLE OF zfzh_dm1 WITH HEADER LINE .
*
*&
*
SELECTION-SCREEN : BEGIN OF BLOCK b1 WITH FRAME TITLE text_001.
PARAMETERS : p_gjahr TYPE bkpf-gjahr DEFAULT sy-datum(4) OBLIGATORY,
p_monat TYPE bkpf-monat DEFAULT sy-datum+4(2) OBLIGATORY.
SELECTION-SCREEN : END OF BLOCK b1.
SELECTION-SCREEN : FUNCTION KEY 1 .
INITIALIZATION.
functxt-icon_id = icon_intensify.
functxt-quickinfo = '投资收益率指标表维护'.
functxt-icon_text = '投资收益率指标表维护'.
sscrfields-functxt_01 = functxt.
*
* At Selection-screen
*
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'."系统预留的功能码
PERFORM frm_call_sm30 USING 'ZTZBDM'.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION .
SELECT zfzhdm zfzhms FROM zfzh_dm1 INTO CORRESPONDING FIELDS OF TABLE gt_zdm1.
PERFORM frm_create_table.
SELECT
zzbdm
txt50
zjsgs
zqslx
zscxs
FROM ztzbdm
INTO CORRESPONDING FIELDS OF TABLE gt_ztzbdm[].
LOOP AT gt_ztzbdm INTO gs_ztzbdm.
IF gs_ztzbdm-zqslx = 'D'. "直接计算
PERFORM frm_get_data_d USING gs_ztzbdm .
ELSEIF gs_ztzbdm-zqslx = 'P' . "首末加权
PERFORM frm_get_data_p USING gs_ztzbdm .
ELSEIF gs_ztzbdm-zqslx = 'Y' . "月平均余额
PERFORM frm_get_data_y USING gs_ztzbdm .
ENDIF.
ENDLOOP.
PERFORM frm_display.
*&
*& Form FRM_GET_DATA_D
*&
* text
*
*
* <
*
FORM frm_get_data_d USING gs_tab TYPE ztzbdm.
* CLEAR : <dyn_wa>,<dyn_wa1> ,<dyn_wa2>.
DATA : lv_value(16) TYPE p DECIMALS 2.
DATA: colname(10) .
SEARCH gs_tab-zjsgs FOR '/'.
IF sy-subrc = 0.
DATA : lv_text1 TYPE string,
lv_text2 TYPE string,
lv_dmbtr1 TYPE zfzhbb-zlsje,
lv_dmbtr2 TYPE zfzhbb-zlsje,
lv_dmbtr3(6) TYPE p DECIMALS 4,
lv_dmbtr3_txt TYPE string.
DATA : lt_zfzhdm1 TYPE TABLE OF zfzh_dm1 WITH HEADER LINE .
CLEAR : lv_text1 ,lv_text2.
SPLIT gs_tab-zjsgs AT '/' INTO lv_text1 lv_text2.
IF lv_text1 IS NOT INITIAL AND lv_text2 IS NOT INITIAL .
READ TABLE <dyn_table> ASSIGNING <dyn_wa1> WITH KEY ('ZZBDM') = lv_text1.
READ TABLE <dyn_table> ASSIGNING <dyn_wa2> WITH KEY ('ZZBDM') = lv_text2.
ENDIF.
LOOP AT gt_zdm1.
CLEAR :lv_dmbtr1,lv_dmbtr2,lv_dmbtr3.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa1> TO <dyn_field1>.
IF sy-subrc = 0.
lv_dmbtr1 = <dyn_field1>.
ENDIF.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa2> TO <dyn_field2>.
IF sy-subrc = 0.
lv_dmbtr2 = <dyn_field2>.
ENDIF.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa> TO <dyn_field>.
IF sy-subrc = 0.
IF lv_dmbtr2 <> 0.
lv_dmbtr3 = lv_dmbtr1 / lv_dmbtr2 * 100.
* lv_dmbtr3 = lv_dmbtr3 * 100.
lv_dmbtr3_txt = lv_dmbtr3.
CONCATENATE lv_dmbtr3_txt '%' INTO lv_dmbtr3_txt.
<dyn_field> = lv_dmbtr3_txt.
ENDIF.
ENDIF.
ENDLOOP.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa1> TO <dyn_field1>.
lv_dmbtr1 = <dyn_field1>.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa2> TO <dyn_field2>.
lv_dmbtr2 = <dyn_field2>.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
IF lv_dmbtr2 <> 0.
lv_dmbtr3 = lv_dmbtr1 / lv_dmbtr2 * 100.
* lv_dmbtr3 = lv_dmbtr3 * 100.
lv_dmbtr3_txt = lv_dmbtr3.
CONCATENATE lv_dmbtr3_txt '%' INTO lv_dmbtr3_txt.
<dyn_field> = lv_dmbtr3_txt.
ENDIF.
ASSIGN COMPONENT 'ZZBDM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-zzbdm.
ASSIGN COMPONENT 'TXT50' OF STRUCTURE <dyn_wa> TO <dyn_field>.
CONCATENATE gs_tab-txt50 '(%)' INTO gs_tab-txt50.
<dyn_field> = gs_tab-txt50.
APPEND <dyn_wa> TO <dyn_table>.
ELSE. "全是相加的情况
DATA : it_fieldvalue TYPE TABLE OF string,
is_stru TYPE string.
SPLIT gs_tab-zjsgs AT '+' INTO TABLE it_fieldvalue.
RANGES: gr_zxmdm FOR zfzhbb-zxmdm.
RANGES: gr_hkont FOR skat-saknr.
DATA : lt_zfzhbb TYPE TABLE OF zfzhbb WITH HEADER LINE.
DATA : lt_zfzhjgb TYPE TABLE OF zfzhjgb WITH HEADER LINE.
TYPES :BEGIN OF tyout ,
zfzhdm TYPE zfzh_dm1-zfzhdm,
dmbtr TYPE zfzhbb-zlsje,
END OF tyout.
DATA : it_out TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lt_collect TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lv_ljdmbtr TYPE zfzhbb-zlsje.
LOOP AT it_fieldvalue INTO is_stru.
CLEAR : gr_zxmdm,gr_hkont.
IF is_stru(1) = 'B'.
gr_zxmdm-option = 'EQ'.
gr_zxmdm-sign = 'I'.
gr_zxmdm-low = is_stru+1(3).
APPEND gr_zxmdm.
ELSEIF is_stru(1) = 'K'.
gr_hkont-option = 'EQ'.
gr_hkont-sign = 'I'.
gr_hkont-low = is_stru+1(10).
APPEND gr_hkont.
ENDIF.
ENDLOOP.
"查询报表结果表
SELECT
zfzhdm
zbnje AS dmbtr
FROM zfzhbb
INTO CORRESPONDING FIELDS OF TABLE it_out[]
WHERE gjahr = p_gjahr AND monat = p_monat AND zxmdm IN gr_zxmdm[] AND zbblx = 'F'.
"查询分账户结果表数据
SELECT
zfzhdm
dmbtr
FROM zfzhjgb
APPENDING CORRESPONDING FIELDS OF TABLE it_out[]
WHERE gjahr = p_gjahr AND monat LE p_monat AND hkont IN gr_hkont[].
SORT it_out BY zfzhdm.
lv_ljdmbtr = 0.
LOOP AT it_out.
lv_ljdmbtr = lv_ljdmbtr + it_out-dmbtr.
lt_collect-zfzhdm = it_out-zfzhdm.
* it_out-dmbtr = it_out-dmbtr * gs_tab-zscxs.
AT END OF zfzhdm.
SUM.
lt_collect-dmbtr = it_out-dmbtr.
APPEND lt_collect.
ENDAT.
ENDLOOP.
LOOP AT gt_zdm1.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa> TO <dyn_field>.
READ TABLE lt_collect WITH KEY zfzhdm = gt_zdm1-zfzhdm.
IF sy-subrc = 0.
* <dyn_field> = lt_collect-dmbtr * gs_tab-zscxs.
lv_value = lt_collect-dmbtr * gs_tab-zscxs.
<dyn_field> = lv_value.
CLEAR lv_value.
ELSE.
lt_collect-dmbtr = 0.
<dyn_field> = lt_collect-dmbtr .
ENDIF.
ENDLOOP.
ASSIGN COMPONENT 'ZZBDM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-zzbdm.
ASSIGN COMPONENT 'TXT50' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-txt50.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
* <dyn_field> = lv_ljdmbtr * gs_tab-zscxs .
lv_value = lv_ljdmbtr * gs_tab-zscxs .
<dyn_field> = lv_value.
CLEAR lv_value.
APPEND <dyn_wa> TO <dyn_table>.
ENDIF.
ENDFORM. " FRM_GET_DATA_D
*&
*& Form FRM_GET_DATA_P
*&
* text
*
*
*
FORM frm_get_data_p USING gs_tab STRUCTURE ztzbdm .
CLEAR : <dyn_wa>.
DATA : lv_gjahr TYPE bkpf-gjahr,
lv_monat TYPE bkpf-monat.
DATA : it_fieldvalue TYPE TABLE OF string,
is_stru TYPE string.
SPLIT gs_tab-zjsgs AT '+' INTO TABLE it_fieldvalue.
RANGES: gr_zxmdm FOR zfzhbb-zxmdm.
DATA : lv_value(16) TYPE p DECIMALS 2.
TYPES :BEGIN OF tyout ,
zfzhdm TYPE zfzh_dm1-zfzhdm,
dmbtr TYPE zfzhbb-zlsje,
END OF tyout.
DATA : it_out TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lt_collect TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lv_ljdmbtr TYPE zfzhbb-zlsje.
LOOP AT it_fieldvalue INTO is_stru.
CLEAR :gr_zxmdm.
gr_zxmdm-option = 'EQ'.
gr_zxmdm-sign = 'I'.
gr_zxmdm-low = is_stru+1(3).
APPEND gr_zxmdm.
ENDLOOP.
lv_gjahr = p_gjahr - 1.
SELECT MAX( monat ) INTO lv_monat FROM zfzhbb WHERE gjahr = lv_gjahr AND zbblx = 'F'.
"查询报表结果表
SELECT
zfzhdm
zlsje AS dmbtr
FROM zfzhbb
INTO CORRESPONDING FIELDS OF TABLE it_out[]
WHERE ( ( gjahr = p_gjahr AND monat = p_monat ) OR ( gjahr = lv_gjahr AND monat = lv_monat ) ) AND zxmdm IN gr_zxmdm[] AND zbblx = 'F'.
SORT it_out BY zfzhdm.
lv_ljdmbtr = 0.
LOOP AT it_out.
lv_ljdmbtr = lv_ljdmbtr + it_out-dmbtr.
lt_collect-zfzhdm = it_out-zfzhdm.
* it_out-dmbtr = it_out-dmbtr / 2 .
* it_out-dmbtr = it_out-dmbtr * gs_tab-zscxs.
AT END OF zfzhdm.
SUM.
lt_collect-dmbtr = it_out-dmbtr.
APPEND lt_collect.
ENDAT.
ENDLOOP.
LOOP AT gt_zdm1.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa> TO <dyn_field>.
READ TABLE lt_collect WITH KEY zfzhdm = gt_zdm1-zfzhdm.
IF sy-subrc = 0.
* <dyn_field> = lt_collect-dmbtr / 2 * gs_tab-zscxs.
lv_value = lt_collect-dmbtr / 2 * gs_tab-zscxs.
<dyn_field> = lv_value.
CLEAR lv_value.
ELSE.
* lt_collect-dmbtr = 0.
* <dyn_field> = lt_collect-dmbtr / 2 .
lv_value = 0.
<dyn_field> = lv_value.
CLEAR lv_value.
ENDIF.
ENDLOOP.
ASSIGN COMPONENT 'ZZBDM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-zzbdm.
ASSIGN COMPONENT 'TXT50' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-txt50.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
* <dyn_field> = lv_ljdmbtr / 2 * gs_tab-zscxs .
lv_value = lv_ljdmbtr / 2 * gs_tab-zscxs .
<dyn_field> = lv_value.
CLEAR lv_value.
APPEND <dyn_wa> TO <dyn_table>.
ENDFORM. " FRM_GET_DATA_P
*&
*& Form FRM_GET_DATA_Y
*&
* text
*
*
*
FORM frm_get_data_y USING gs_tab STRUCTURE ztzbdm.
CLEAR : <dyn_wa>.
DATA : lv_gjahr TYPE bkpf-gjahr,
lv_monat TYPE bkpf-monat.
DATA : it_fieldvalue TYPE TABLE OF string,
is_stru TYPE string.
SPLIT gs_tab-zjsgs AT '+' INTO TABLE it_fieldvalue.
RANGES: gr_zxmdm FOR zfzhbb-zxmdm.
DATA : lv_value(16) TYPE p DECIMALS 2.
TYPES :BEGIN OF tyout ,
zfzhdm TYPE zfzh_dm1-zfzhdm,
dmbtr TYPE zfzhbb-zlsje,
END OF tyout.
DATA : it_out TYPE TABLE OF tyout WITH HEADER LINE.
DATA : it_out1 TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lt_collect TYPE TABLE OF tyout WITH HEADER LINE.
DATA : lv_ljdmbtr TYPE zfzhbb-zlsje.
LOOP AT it_fieldvalue INTO is_stru.
CLEAR :gr_zxmdm.
gr_zxmdm-option = 'EQ'.
gr_zxmdm-sign = 'I'.
gr_zxmdm-low = is_stru+1(3).
APPEND gr_zxmdm.
ENDLOOP.
lv_gjahr = p_gjahr - 1.
SELECT MAX( monat ) INTO lv_monat FROM zfzhbb WHERE gjahr = lv_gjahr AND zbblx = 'F'.
IF p_monat = 1.
"查询报表结果表
SELECT
zfzhdm
zlsje AS dmbtr
FROM zfzhbb
INTO CORRESPONDING FIELDS OF TABLE it_out[]
WHERE ( ( gjahr = p_gjahr AND monat = p_monat ) OR ( gjahr = lv_gjahr AND monat = lv_monat ) ) AND zxmdm IN gr_zxmdm[] AND zbblx = 'F'.
*
* LOOP AT it_out.
* it_out-dmbtr = it_out-dmbtr / 2 .
* MODIFY it_out.
* ENDLOOP.
ELSE.
SELECT
zfzhdm
zlsje AS dmbtr
FROM zfzhbb
INTO CORRESPONDING FIELDS OF TABLE it_out[]
WHERE gjahr = p_gjahr AND monat < p_monat AND zxmdm IN gr_zxmdm[] AND zbblx = 'F'.
SELECT
zfzhdm
zlsje AS dmbtr
FROM zfzhbb
INTO CORRESPONDING FIELDS OF TABLE it_out1[]
WHERE ( ( gjahr = p_gjahr AND monat = p_monat ) OR ( gjahr = lv_gjahr AND monat = lv_monat ) ) AND zxmdm IN gr_zxmdm[] AND zbblx = 'F'.
* LOOP AT it_out1.
* it_out1-dmbtr = it_out1-dmbtr / 2 .
* MODIFY it_out1.
* ENDLOOP.
LOOP AT it_out.
it_out-dmbtr = it_out-dmbtr * 2 .
MODIFY it_out.
ENDLOOP.
APPEND LINES OF it_out1[] TO it_out[].
ENDIF.
SORT it_out BY zfzhdm.
lv_ljdmbtr = 0.
LOOP AT it_out.
lv_ljdmbtr = lv_ljdmbtr + it_out-dmbtr.
lt_collect-zfzhdm = it_out-zfzhdm.
* it_out-dmbtr = it_out-dmbtr / 3.
* it_out-dmbtr = it_out-dmbtr * gs_tab-zscxs.
AT END OF zfzhdm.
SUM.
lt_collect-dmbtr = it_out-dmbtr.
APPEND lt_collect.
ENDAT.
ENDLOOP.
LOOP AT gt_zdm1.
ASSIGN COMPONENT gt_zdm1-zfzhdm OF STRUCTURE <dyn_wa> TO <dyn_field>.
READ TABLE lt_collect WITH KEY zfzhdm = gt_zdm1-zfzhdm.
IF sy-subrc = 0.
* <dyn_field> = lt_collect-dmbtr / 2 / p_monat * gs_tab-zscxs.
lv_value = lt_collect-dmbtr / 2 / p_monat * gs_tab-zscxs.
<dyn_field> = lv_value.
CLEAR : lv_value.
ELSE.
lt_collect-dmbtr = 0.
<dyn_field> = lt_collect-dmbtr / 2 / p_monat .
ENDIF.
ENDLOOP.
ASSIGN COMPONENT 'ZZBDM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-zzbdm.
ASSIGN COMPONENT 'TXT50' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = gs_tab-txt50.
ASSIGN COMPONENT 'ZLJ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
* <dyn_field> = lv_ljdmbtr / 2 / p_monat * gs_tab-zscxs.
lv_value = lv_ljdmbtr / 2 / p_monat * gs_tab-zscxs.
<dyn_field> = lv_value.
CLEAR : lv_value.
APPEND <dyn_wa> TO <dyn_table>.
ENDFORM. " FRM_GET_DATA_Y
*&
*& Form FRM_CREATE_TABLE
*&
* text
*
*
* <
*
FORM frm_create_table .
PERFORM frm_add_fact USING : 'ZZBDM' '指标代码' '20' 'L'.
PERFORM frm_add_fact USING : 'TXT50' '指标描述' '20' 'L'.
LOOP AT gt_zdm1.
PERFORM frm_add_fact USING : gt_zdm1-zfzhdm gt_zdm1-zfzhms '20' 'R'.
ENDLOOP.
PERFORM frm_add_fact USING : 'ZLJ' '累计' '20' 'R'.
* 根据it_fact生成动态表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fcat
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
ASSIGN dy_line->* TO <dyn_wa1>.
ASSIGN dy_line->* TO <dyn_wa2>.
ENDFORM. " FRM_CREATE_TABLE
*&---------------------------------------------------------------------*
*& Form frm_add_fcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->VALUE1 text
* -->VALUE2 text
* -->VALUE3 text
* -->VALUE4 text
*----------------------------------------------------------------------*
FORM frm_add_fact USING value1 value3 value4 value5.
wa_fcat-fieldname = value1.
* wa_fcat-inttype = value2.
wa_fcat-reptext = value3.
wa_fcat-intlen = value4.
wa_fcat-just = value5.
APPEND wa_fcat TO it_fcat.
CLEAR: wa_fcat.
ENDFORM. "frm_add_fcat
*&
*& Form FRM_DISPLAY
*&
* text
*
*
* <
*
FORM frm_display .
CLEAR: wa_layo.
wa_layo-zebra = 'X'.
wa_layo-cwidth_opt = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = wa_layo
it_fieldcat_lvc = it_fcat
TABLES
t_outtab = <dyn_table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " FRM_DISPLAY
*&---------------------------------------------------------------------*
*& Form FRM_CALL_SM30
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0137 text
*----------------------------------------------------------------------*
FORM frm_call_sm30 USING lv_name.
DATA:gt_dba_sellist TYPE STANDARD TABLE OF vimsellist.
DATA:gt_tabname TYPE dd02v-tabname ."表名称
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
generate_maint_tool_if_missing = 'X'
view_name = lv_name
TABLES
dba_sellist = gt_dba_sellist
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_CALL_SM30
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」