动态ALV(Field Symbol)

Field Symbol 的几种特性
在程序 Field Symbol 允许动态访问变量
Field Symbol 不占有自己特有的内存空间
Field Symbol 的数据名与属性到执行时刻( Runtime )才能确定
Field Symbol 可以指定所有数据对象
一旦 Field Symbol 被分配到,则它与一般数据对象没有太大区别。同样可以使用类似于 MOVE 之类的语句
Field Symbol 可以明确指定数据类型,也可以不指定数据类型。若不指定,则会继承被分配的字段(对象)的数据类型
Assign 语句的基本结构
静态 分配 字段名已知
ASSIGN dobj TO < fs > .
动态分配 字段名无法知道
ASSSIGN ( dobj ) TO < fs > .
将结构体字段分配到 Field Symbol
ASSIGN COMPONENT comp OF STRUCTURE struc TO < fs > .
Comp 可以为行编号或者字段名
类型更改,可以通过 casting 把一个不同类型的变量分配给一个 < fs >
式型 变化: ASSIGN < var > TO < fs > CASTING.
显式型变化: ASSIGN <var> TO <fs> CASTING TYPE…
基本定义 语句
如果指定为 Generic Type ,必须使用 TYPE ANY TABLE
分配 语句
ASSIGN itab TO < f_s > .
在读取时,需要使用动态指定方式读取字段
READ TABLE < f_s > INTO structure WITH KEY ( dobj ) = val1.
明确指定 字段名会产生错误
内表循环修改
LOOP 使用 ASSIGNING 语句,不需要使用 MODIFY 语句
直接 修改存储在内存中的值,所以可以省略内表值复制到结构体再执行 MODIFY 的过程,提高性能
目的
创建列数不确定的内表
步骤
动态 内表的 创建。首先 要定义动态结构,然后再根据定义的动态结构利用系统一个标准的 method :” cl_alv_table_create => create_dynamic_table 生成动态内表
可以使用 DO 循环, 动态指定字段
动态 内表的 赋值。遍历 动态结构,获取指定的字段,然后给指定的字段赋值
可以使用 LOOP 循环中的 AT 事件,将基本表中的数据分块赋值到动态表中

动态内表的读取显示。与赋值相似,遍历动态结构,获取指定的字段,然后读取对应字段的值。或使用输出工具直接输出 

*&---------------------------------------------------------------------*
*& Report ZJJ_TEST_08
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zjj_test_08.

TABLES:mara,zcus_incom.
DATA gt_order TYPE STANDARD TABLE OF mara.
DATA gt_fieldcat  TYPE lvc_t_fcat.
DATA gs_fieldcat  TYPE lvc_s_fcat.
DATA gv_pos TYPE  int4.
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-outputlen = 10.
  APPEND gs_fieldcat  TO gt_fieldcat.
END-OF-DEFINITION.
FIELD-SYMBOLS:<ft_vb>    TYPE STANDARD TABLE,
              <fs_vb>    TYPE any,
              <fv_field> TYPE any.

PARAMETERS:p_year TYPE zcus_incom-zyear.
SELECT-OPTIONS:s_month  FOR zcus_incom-zmonth.

START-OF-SELECTION.
  PERFORM get_data.



FORM get_data.
  DATA lt_data TYPE STANDARD TABLE OF zcus_incom.
  DATA ls_data1 TYPE zcus_incom.
  DATA lv_cnt TYPE int4.
  DATA lv_month TYPE  zcus_incom-zmonth.
  DATA lv_month1 TYPE int4 value 1.
  DATA lv_monthstr TYPE char10.
  DATA lv_fieldname TYPE string.
  DATA: lt_newtable TYPE REF TO data,
        ls_newline  TYPE REF TO data.

  SELECT * FROM zcus_incom INTO CORRESPONDING FIELDS OF TABLE @lt_data WHERE zmonth IN @s_month.

  SORT lt_data BY company zyear zmonth.
  READ TABLE s_month INTO DATA(ls_month) INDEX 1.
  ls_month-high = COND #( WHEN ls_month-high IS INITIAL THEN 12 ELSE ls_month-high ).
  ls_month-low = COND #( WHEN ls_month-low IS INITIAL THEN 12 ELSE 1 ).
  lv_cnt = ls_month-high - ls_month-low + 1.

  %%add_fieldcat 'COMPANY' '公司'.
  %%add_fieldcat 'ZYEAR' '年份'.


  DO 12 TIMES.
    lv_month =  sy-index.
    IF lv_month IN s_month.
      lv_monthstr = |{ lv_month1 }月|.
      lv_fieldname = |MONTH_{ lv_month }|.
      CONDENSE lv_fieldname NO-GAPS.
      %%add_fieldcat lv_fieldname lv_monthstr.
    ENDIF.
    lv_month1 = lv_month1 + 1.
    CLEAR:lv_fieldname,lv_monthstr.
  ENDDO.
  %%add_fieldcat 'WEARS' '货币单位'.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
*     i_style_table             =
      it_fieldcatalog           = gt_fieldcat
*     i_length_in_byte          =
    IMPORTING
      ep_table                  = lt_newtable
*     e_style_fname             =
    EXCEPTIONS
      generate_subpool_dir_full = 1
*     others                    = 2
    .
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

  ASSIGN lt_newtable->* TO <ft_vb>.
  CREATE DATA ls_newline LIKE LINE OF <ft_vb>.
  ASSIGN ls_newline->* TO <fs_vb>.
  " SORT lt_data BY zyear company.
  LOOP AT lt_data INTO DATA(ls_data).

    MOVE-CORRESPONDING ls_data TO  ls_data1.


    AT NEW  company.
      ASSIGN COMPONENT 'COMPANY' OF STRUCTURE <fs_vb> TO <fv_field>.
      <fv_field> = ls_data1-company.
      ASSIGN COMPONENT 'ZYEAR' OF STRUCTURE <fs_vb> TO <fv_field>.
      <fv_field> = ls_data1-zyear.
      ASSIGN COMPONENT 'WEARS' OF STRUCTURE <fs_vb> TO <fv_field>.
      <fv_field> = ls_data1-wears.
    ENDAT.

    lv_fieldname = |MONTH_{ ls_data1-zmonth }|.
    CONDENSE lv_fieldname NO-GAPS.
    ASSIGN COMPONENT lv_fieldname  OF STRUCTURE <fs_vb> TO <fv_field>.
    <fv_field> = ls_data1-income.

    AT END OF company.
      APPEND <fs_vb> TO <ft_vb>.
    ENDAT.
    CLEAR :ls_data,ls_data1.
  ENDLOOP.

  IF <ft_vb> IS NOT INITIAL.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
*       I_INTERFACE_CHECK  = ' '
*       I_BYPASSING_BUFFER =
*       I_BUFFER_ACTIVE    =
        i_callback_program = sy-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_LVC      =
        it_fieldcat_lvc    = gt_fieldcat
*       IT_EXCLUDING       =
*       IT_SPECIAL_GROUPS_LVC             =
*       IT_SORT_LVC        =
*       IT_FILTER_LVC      =
*       IT_HYPERLINK       =
*       IS_SEL_HIDE        =
*       I_DEFAULT          = 'X'
*       I_SAVE             = ' '
*       IS_VARIANT         =
*       IT_EVENTS          =
*       IT_EVENT_EXIT      =
*       IS_PRINT_LVC       =
*       IS_REPREP_ID_LVC   =
*       I_SCREEN_START_COLUMN             = 0
*       I_SCREEN_START_LINE               = 0
*       I_SCREEN_END_COLUMN               = 0
*       I_SCREEN_END_LINE  = 0
*       I_HTML_HEIGHT_TOP  =
*       I_HTML_HEIGHT_END  =
*       IT_ALV_GRAPHICS    =
*       IT_EXCEPT_QINFO_LVC               =
*       IR_SALV_FULLSCREEN_ADAPTER        =
*                    IMPORTING
*       E_EXIT_CAUSED_BY_CALLER           =
*       ES_EXIT_CAUSED_BY_USER            =
      TABLES
        t_outtab           = <ft_vb>
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

  ENDIF.
ENDFORM.

执行效果如下:根据筛选项展示不同的月份数据

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值