ABAP动态内表总结
实现动态内表功能需调用静态方法 :CREATE_DYNAMIC_TABLE
其功能为根据输入的fieldcat自动生成一个相应的内表,所以与常规的ALV编写顺序相反,在使用动态内表时一般先根据需求静态或动态的写好fieldcat数据,之后再以fieldcat为参数调用CREATE_DYNAMIC_TABLE方法来生成动态内表
1.填写FIELDCAT
" 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.
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
可以看到编写动态fieldcat无需引用任何方法,个人感觉动态内表的适用范围并不大
2.调用静态方法 :CREATE_DYNAMIC_TABLE 生成动态内表
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
生成的动态内表:
3.向动态内表增加数据
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 .
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 .
因为生成的动态内表结构并不固定所以通常要使用指针为其赋值
4.ALV显示
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.
动态内表的引用并不复杂,问题是想要将数据准确的填入动态的内表着实需要好好设计一番,
如果对数据没有特别要求,只做成动态fieldcat也是不错的选择