如何创建一个动态内表

举报
雨绸缪 发表于 2023/06/30 11:16:53 2023/06/30
【摘要】 Field symbols 字段符号是其他字段的占位符或符号名称。它们类似于 C 语言中的解引用指针。字段符号使你能够:为一个数据对象指定一个别名在运行时动态地采用或改变一个数据对象的类型和大小在运行时可变地设置一个字符串的偏移量和长度设置一个指向你在运行时确定的数据对象的指针(动态ASSIGN)。访问一个结构的组成部分语句 ASSIGN f to <fs> 将字段 f 分配给字段符号 <f...

image.png

Field symbols 字段符号是其他字段的占位符或符号名称。它们类似于 C 语言中的解引用指针。

字段符号使你能够:

  • 为一个数据对象指定一个别名

  • 在运行时动态地采用或改变一个数据对象的类型和大小

  • 在运行时可变地设置一个字符串的偏移量和长度

  • 设置一个指向你在运行时确定的数据对象的指针(动态ASSIGN)。

  • 访问一个结构的组成部分

语句 ASSIGN f to <fs> 将字段 f 分配给字段符号 <fs>。然后字段符号 <fs> 在运行时 "指向 "字段 f 的内容。这意味着 f 的内容的所有变化在 <fs> 中都是可见的,反之亦然。

你可以使用 FIELD-SYMBOLS ,声明字段符号:<fs>

数据引用是指向数据对象的指针。

  • 你可以使用数据引用来动态地创建数据对象。你也可以创建对现有数据对象的引用。

  • 你只能通过对字段符号的特殊赋值来取消对数据引用的引用。

  • 你可以通过以下方式创建一个数据引用变量:

DATA <dref> TYPE REF TO DATA.

为了在程序中动态地创建一个数据对象,你需要一个数据引用变量和以下语句:

CREATE DATA <dref> TYPE <type>|LIKE <obj>.

要访问数据引用所指向的数据对象的内容,你必须解除对它的引用:

ASSIGN <dref>->* TO <FS>.

动态内部表可以下列方式创建:

  • CL_ALV_TABLE_CREATE 和方法 CREATE_DYNAMIC_TABLE.
  • 输出参数:it_fieldcatalog
  • 输入参数:ep_table
  • 异常:generate_subpool_dir_full = 1
  • Others = 2

动态内表创建的结构体

ABAP 结构体 LVC_S_FCAT

这个结构用于维护动态数据的每个字段的属性。内部表的每个字段的属性,如字段名、列位置等。

ABAP 表类型 LVC_T_FCAT

该表类型的行类型为 LVC_S_FCAT。所有的字段属性,字段保存在这个表中。 创建一个动态内部表的步骤如下:

  1. 数据定义

声明结构体类型 lvc_s_fcat,声明一个类型为 lvc_t_fcat 的内部表(该内部表的行类型为 lvc_s_fcat )。

声明两个数据参考变量,一个用于动态内部表(如 dr1 ),另一个用于工作区(如 dr2 )。

声明 ref to dataany tableany 类型的字段符号(比如 fs1fs2fs3 分别)。 # 用动态内部表所需的字段名来填充内部表

  • 将字段名、字段类型、字段宽度、检查表等分配给结构。
  • 将结构附加到内部表 # 将字段符号分配给动态内部表
Assign dr1 to <fs1> # Call the method CREATE_DYNAMIC_TABLE

将包含字段属性的内部表作为导出参数。传递动态内部表的字段符号作为导入参数。# 这将创建动态内部表

<fs1> 现在指的是我们想在开始时创建的动态内部表。将 <fs1> 的数据内容分配给一个字段符号 <fs2> (取消引用)。

所以 <fs2> 现在指向动态内部表。下一步是为我们的动态内部表创建一个工作区。

创建类似 <fs2> 行的数据 dr2。一个字段符号来访问该工作区将 dr2->* 分配给<fs_2>

动态内部表的缺点

具有许多动态内部表格的程序的可读性较差,而且它们的安全性也较差。因为错误不能通过语法检查来检测,而只能通过运行时来检测系统。

使用动态内部表时,性能将不如使用静态内部表时好。

TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
             <dyn_wa>,
             <dyn_field>.
DATA: dy_table TYPE REF TO data,
    dy_line  TYPE REF TO data,
    xfc TYPE lvc_s_fcat,
    ifc TYPE lvc_t_fcat.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_table(30) TYPE c DEFAULT 'T001'.
SELECTION-SCREEN END OF BLOCK b1.
 
START-OF-SELECTION.
  PERFORM get_structure.
  PERFORM create_dynamic_itab.
 
*******Creates a dynamic internal table*********
  PERFORM get_data.
  PERFORM write_out.
*&---------------------------------------------------------------------*
*&      Form  get_structure
*&---------------------------------------------------------------------*
FORM get_structure.
  DATA : idetails TYPE abap_compdescr_tab,
       xdetails TYPE abap_compdescr.
  DATA : ref_table_des TYPE REF TO cl_abap_structdescr.
* Get the structure of the table.
  ref_table_des ?=
      cl_abap_typedescr=>describe_by_name( p_table ).
  idetails[] = ref_table_des->components[].
  LOOP AT idetails INTO xdetails.
    CLEAR xfc.
    xfc-fieldname = xdetails-name .
* Correction by Paul Robert Oct 28, 2009 17:04
*    xfc-datatype = xdetails-type_kind.
    CASE xdetails-type_kind.
      WHEN 'C'.
        xfc-datatype = 'CHAR'.
      WHEN 'N'.
        xfc-datatype = 'NUMC'.
      WHEN 'D'.
        xfc-datatype = 'DATE'.
      WHEN 'P'.
        xfc-datatype = 'PACK'.
      WHEN OTHERS.
        xfc-datatype = xdetails-type_kind.
    ENDCASE.
    xfc-inttype = xdetails-type_kind.
    xfc-intlen = xdetails-length.
    xfc-decimals = xdetails-decimals.
    APPEND xfc TO ifc.
  ENDLOOP.
ENDFORM.                    "get_structure
*&---------------------------------------------------------------------*
*&      Form  create_dynamic_itab
*&---------------------------------------------------------------------*
FORM create_dynamic_itab.
* Create dynamic internal table and assign to FS
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = ifc
      i_length_in_byte = 'X' "added by Paul Robert Oct 28, 2009 17:04
    IMPORTING
      ep_table         = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.
* Create dynamic work area and assign to FS
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.                    "create_dynamic_itab
 
*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
FORM get_data.
* Select Data from table.
  SELECT * INTO TABLE <dyn_table>
             FROM (p_table).
ENDFORM.                    "get_data
 
*&---------------------------------------------------------------------*
*&      Form  write_out
*&---------------------------------------------------------------------*
FORM write_out.
  LOOP AT <dyn_table> INTO <dyn_wa>.
    DO.
      ASSIGN COMPONENT  sy-index
         OF STRUCTURE <dyn_wa> TO <dyn_field>.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
      IF sy-index = 1.
        WRITE:/ <dyn_field>.
      ELSE.
        WRITE: <dyn_field>.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    "write_out`

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。