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 .
  "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 .
        <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 .
        <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 .
        <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 .
      <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也是不错的选择

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值