如何创建一个动态内表
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
。所有的字段属性,字段保存在这个表中。 创建一个动态内部表的步骤如下:
- 数据定义
声明结构体类型 lvc_s_fcat
,声明一个类型为 lvc_t_fcat
的内部表(该内部表的行类型为 lvc_s_fcat
)。
声明两个数据参考变量,一个用于动态内部表(如 dr1
),另一个用于工作区(如 dr2
)。
声明 ref to data
、any table
和 any
类型的字段符号(比如 fs1
、fs2
和 fs3
分别)。 #
用动态内部表所需的字段名来填充内部表
- 将字段名、字段类型、字段宽度、检查表等分配给结构。
- 将结构附加到内部表
#
将字段符号分配给动态内部表
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`
- 点赞
- 收藏
- 关注作者
评论(0)