动态ALV(Field Symbol)

文章详细介绍了ABAP编程语言中FieldSymbol的特性,如动态访问变量、不占用内存以及动态分配等。同时,讲解了ASSIGN语句的用法,包括静态和动态分配,以及结构体字段的分配。文章还深入讨论了如何创建和操作动态内表,包括动态结构定义、赋值和读取显示。最后,提供了一个示例程序来演示这些概念的应用。
摘要由CSDN通过智能技术生成
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.

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

  

### 回答1: reuse_alv_fieldcatalog_merge是一个ABAP函数模块,用于合并两个ALV字段目录。它可以将两个字段目录合并成一个,并且可以根据需要进行排序、删除重复项等操作。这个函数模块通常用于在ALV报表中显示数据时,对字段目录进行处理和优化。 ### 回答2: reuse_alv_fieldcatalog_merge是一个ABAP函数模块,用于合并两个ALV字段目录。 ALV字段目录是一个内部表,包含了对应于显示在ALV表格中的字段的元数据信息。它定义了字段的名称、类型、宽度、对齐方式、数据类型和编辑输出选项等。 这个函数模块的作用是将两个字段目录合并为一个字段目录。它将两个字段目录的内容逐行比较,并进行合并。如果字段名称相同,它将会合并其他属性,如类型、宽度等。如果字段名称不同,它将会将两个字段分别加到合并后的目录中。 使用这个函数模块可以方便地合并两个字段目录,并避免手动处理合并过程中的重复和冲突。 使用示例: DATA: lt_fieldcat1 TYPE TABLE OF lvc_s_fcat, lt_fieldcat2 TYPE TABLE OF lvc_s_fcat, lt_merged_fieldcat TYPE TABLE OF lvc_s_fcat. lt_fieldcat1 = ... "填充第一个字段目录 lt_fieldcat2 = ... "填充第二个字段目录 CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING it_fieldcatalog1 = lt_fieldcat1 it_fieldcatalog2 = lt_fieldcat2 IMPORTING et_fieldcatalog = lt_merged_fieldcat. 现在,lt_merged_fieldcat中包含了合并后的字段目录,可以用于创建或修改一个ALV表格的显示。 ### 回答3: reuse_alv_fieldcatalog_merge是一个在ABAP程序中用于合并两个ALV Field Catalog的函数模块。它的作用是将两个Field Catalog合并成一个,以便在ALV报表中使用。 要使用reuse_alv_fieldcatalog_merge,首先需要定义两个ALV Field Catalog,然后将它们作为输入参数传递给该函数模块。当函数模块被调用时,它会将两个Field Catalog合并成一个,并返回合并后的Field Catalog。 函数模块会将两个Field Catalog中的字段和属性进行合并。如果两个Field Catalog中存在相同的字段,则它们的属性会根据合并规则进行相应的处理。例如,如果两个Field Catalog中都定义了同一个字段的标题(field catalog的字段名称),则可以选择保留某一个Field Catalog的标题,或者合并两个标题。 使用reuse_alv_fieldcatalog_merge可以方便地将两个Field Catalog合并在一起,以便在ALV报表中显示所需的字段和属性。合并后的Field Catalog可以后续用于生成ALV报表的列设置和字段显示。这可以大大简化ABAP程序的开发工作,提高开发效率。 总之,通过reuse_alv_fieldcatalog_merge函数模块,我们可以在ABAP程序中快速、简便地合并两个ALV Field Catalog,以便在ALV报表中使用。这有助于更好地展示和处理数据,并提高ABAP程序的可读性和实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值