这个报表实现的效果是子选择界面中选择要显示的列(此程序为月份),内表会动态的形成需要的结构并输出在ALV中。
*&---------------------------------------------------------------------*
*& Report YN_FIELD_SYMBOLS_TEST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT yn_field_symbols_test01.
TYPES:BEGIN OF zsun_icome_01,
sign TYPE char1 ,
option TYPE char2 ,
low TYPE char12 ,
high TYPE char12 ,
zyear TYPE char6 ,
company TYPE char4 ,
zmonth TYPE n LENGTH 2 ,
waers TYPE char4 ,
income TYPE char4 ,
END OF zsun_icome_01.
DATA:gt_income TYPE TABLE OF zsun_icome_01,
gs_income TYPE zsun_icome_01.
"FIELDCAT
DATA:gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat.
RANGES r_month FOR gs_income-zmonth .
DATA gv_fieldname TYPE c LENGTH 20 .
DATA gv_description TYPE c LENGTH 20 .
DATA gv_number TYPE i .
DATA gv_low TYPE c LENGTH 2 .
"动态内表字段符号
FIELD-SYMBOLS :<ft_vb> TYPE STANDARD TABLE, "内表
<fs_vb> TYPE any, "结构
<dyn_field> TYPE any. "字段
" ADD FIELDCAT
DATA gv_pos TYPE i .
DEFINE %%add_fieldcat .
CLEAR gs_fieldcat.
gv_pos = gv_pos + 1.
gs_fieldcat-col_pos = gv_pos .
gs_fieldcat-fieldname = &1 .
gs_fieldcat-scrtext_m = &2 .
gs_fieldcat-cfieldname = &3 .
gs_fieldcat-outputlen = 15 .
APPEND gs_fieldcat TO gt_fieldcat .
END-OF-DEFINITION.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS :p_year TYPE zsun_icome_01-zyear OBLIGATORY . "公司代码 1
SELECT-OPTIONS:s_comp FOR gs_income-company OBLIGATORY . "利润中心 1
SELECT-OPTIONS:s_month FOR gs_income-zmonth . "利润中心 1
SELECTION-SCREEN END OF BLOCK b1.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* 数据获取
FORM get_data .
SELECT *
FROM zsun_icome
INTO CORRESPONDING FIELDS OF TABLE gt_income
WHERE zyear = p_year
AND company IN s_comp
AND zmonth IN s_month .
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT_02
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* 创建 fieldcat_02
FORM build_fieldcat .
DATA lv_month TYPE n LENGTH 2 .
"1. 公司
%%add_fieldcat 'COMPANY' '公司' space .
"2. 年份
%%add_fieldcat 'ZYEAR' '年份' space .
"3. 月份
DO 12 TIMES .
lv_month = sy-index .
IF lv_month IN s_month .
CONCATENATE 'MONTH_' lv_month INTO gv_fieldname .
CONCATENATE lv_month '月份' INTO gv_description .
%%add_fieldcat gv_fieldname gv_description 'WAERS' .
ENDIF.
ENDDO.
"4. 货币单位
%%add_fieldcat 'WAERS' '币别' space .
ENDFORM. " BUILD_FIELDCAT_02
*&---------------------------------------------------------------------*
*& Form BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* 创建动态内表
FORM build_dynamic_table . "调用静态方法 :CREATE_DYNAMIC_TABLE
DATA lt_new_table TYPE REF TO data .
DATA ls_new_line TYPE REF TO data .
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
* I_STYLE_TABLE =
it_fieldcatalog = gt_fieldcat "输入FIELDCATALOG 将返回一个动态内表
* I_LENGTH_IN_BYTE =
IMPORTING
ep_table = lt_new_table "获取返回的动态内表 (类)
* E_STYLE_FNAME =
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
IF sy-subrc <> 0.
EXIT.
* Implement suitable error handling here
ENDIF.
ASSIGN lt_new_table->* TO <ft_vb> . "LT_NEW_TABLE 中的所有都被指向<FT_VB>(动态内表)
CREATE DATA ls_new_line LIKE LINE OF <ft_vb> .
ASSIGN ls_new_line->* TO <fs_vb> . "LS_NEW_LINE 中的所有都被指向<FS_VB> (动态内表结构)
ENDFORM. " BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
*& Form ADD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* 向动态内表增加数据
FORM add_data .
DATA ls_income TYPE zsun_icome_01 .
" 首先根据年份,公司 排序
SORT gt_income BY zyear company .
LOOP AT gt_income INTO ls_income .
MOVE-CORRESPONDING ls_income TO gs_income . "AT事件后被loop字段为*需要从 LS_INCOME 转存到 GS_INCOME
AT NEW company . " 当公司变更时 先录入 公司 ,年份 ,货币
"<FS_VB>-COMPANY = GS_INCOME-COMPANY
ASSIGN COMPONENT 'COMPANY' OF STRUCTURE <fs_vb> TO <dyn_field> .
IF sy-subrc = 0 .
<dyn_field> = gs_income-company .
ENDIF .
"<FS_VB>-ZYEAR = GS_INCOME-ZYEAR
ASSIGN COMPONENT 'ZYEAR' OF STRUCTURE <fs_vb> TO <dyn_field> .
IF sy-subrc = 0 .
<dyn_field> = gs_income-zyear .
ENDIF.
"<FS_VB>-WAERS = GS_INCOME-WAERS
ASSIGN COMPONENT 'WAERS' OF STRUCTURE <fs_vb> TO <dyn_field> .
IF sy-subrc = 0 .
<dyn_field> = gs_income-waers .
ENDIF .
ENDAT .
" 再根据月份的值,把收入写入对应字段(每一行都执行)
" <FS_VB>-MONTH_XX = GS_INCOME-INCOME
CONCATENATE 'MONTH_'gs_income-zmonth INTO gv_fieldname .
ASSIGN COMPONENT gv_fieldname OF STRUCTURE <fs_vb> TO <dyn_field> .
IF sy-subrc = 0 .
<dyn_field> = gs_income-income .
ENDIF .
AT END OF company .
" 当公司的值到达最后一行时
APPEND <fs_vb> TO <ft_vb> .
CLEAR <fs_vb> .
ENDAT .
ENDLOOP .
ENDFORM. " ADD_DATA
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* DISPLAY
FORM display_data .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = <ft_vb>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
EXIT .
* Implement suitable error handling here
ENDIF.
ENDFORM. " DISPLAY_DATA
INITIALIZATION.
START-OF-SELECTION.
PERFORM get_data. "数据获取
PERFORM build_fieldcat. "创建 fieldcat_02
PERFORM build_dynamic_table. "创建动态内表
PERFORM add_data. "向动态内表增加数据
END-OF-SELECTION.
PERFORM display_data. "DISPLAY
实现的效果为:
前台选择1~7月
ALV输出对应的1-7月的数据(表数据是乱建的)