ABAP 动态内表构建 Dynamic internal table

动态内表构建
本文介绍如何根据用户输入的工资项动态构建ABAP中的内表结构并填充数据。通过使用FIELD-SYMBOLS和循环处理,实现内表结构的动态生成,适用于配置信息变动的情况。

出自:http://www.imalex.net/?q=node/11

这两天做了一个这样的需求,其中要求根据用户输入的工资项(T512W-LGART)查找数据,并输出到ALV,要求是输出跟着输入变。由于工资项的配置信息可能会变,因此用于存储要显示的数据的内表就不能预先知道,因此不得不寻求动态内表的构建方法。

      其实网上的例子也有不少,但是都缺少说明,折腾了一上午才弄明白一些,写出来与大家分享。

REPORT Z_DT2.

type-pools : abap.  

*t512w为例,构建一个动态内表

tables: t512w.

*field-symbols是一个标志,你可以理解为一个指针,将来创建的内表就要通过它们来访问

field-symbols: <dyn_table> type standard table,

            <dyn_wa>,

            <dyn_field>.

*这里定义了一个dy_table和一个dy_line类型是引用,但to data未能理解是什么意思,我觉得应该是说指向为空的意思

data: dy_table type ref to data,

dy_line type ref to data,

*用于存储即将构建的动态内表结构

ifc type lvc_t_fcat,

xfc type lvc_s_fcat.

data: begin of t_lgart occurs 0,

       LGART like t512w-lgart,

     end of t_lgart.

select-options: S_LGART FOR t512w-lgart.

 

start-of-selection.

*首先从数据库中把符合用户输入的LGART填入内表,将来构建的动态内表每一列就是LGART中的每一行。

 select lgart into t_lgart-lgart from t512w where lgart in s_lgart and MOLGA = '28'.

   append t_lgart.

 endselect.

*循环读取内表t_lgart,对于每行构建内表

loop at t_lgart.

*这里偷了个懒,因为工资项中会有/103这样的数据,而/是不能用左列明的,大家可以自己写一个替换逻辑,把/替换成_之类的字符。

check t_lgart-lgart+0(1) <> '/'.

*列名就用lgart

xfc-fieldname = t_lgart-lgart.

   xfc-datatype = 'C'.

   xfc-inttype = 'C'.

   xfc-intlen = 6.

   xfc-decimals = 0.

   append xfc to ifc.

 endloop.

*此处调用一个方法,这个方法用于构建动态内表,输入的就是要构建的结构,输出的就是一个dy_table,之前定义过,但是并不能直接访问。

 call method cl_alv_table_create=>create_dynamic_table

   EXPORTING

     it_fieldcatalog = ifc

   IMPORTING

     ep_table       = dy_table.

*设定<dyn_table>指向dy_table

assign dy_table->* to <dyn_table>.

*下面这句建立了一个<dyn_table>类型的工作区Work area

create data dy_line like line of <dyn_table>.

*同理设定指针

assign dy_line->* to <dyn_wa>.

 

于是便动态的建立了一个内表和一个工作区,由于此方法建立的内表没有header line,所以需要一个工作区。

 

下面是取数或者赋值的方法:

 

*此行中的xxxx1就是列名

ASSIGN COMPONENT xxxx1 OF STRUCTURE <dyn_wa> TO <dyn_field>.

*此行的作用就是给<dyn_wa>中的该列一个值

<dyn_field> = xxxx2.

*Append就可以把该行添加到表中了

APPEND <dyn_wa> TO <dyn_table>.

 

如上所述,即可以动态构建内表,这种方法主要用于表结构无法确定有几列,几有哪些列,尤其与信息配置有关的时候,就只能用这种方法,否则配置一变,程序就不能用了。


以下是一个简单的 ABAP 动态的示例,它允许您在运行时动态添加和删除行: ```abap REPORT z_dynamic_internal_table. DATA: dynamic_table TYPE STANDARD TABLE OF any WITH DEFAULT KEY. FIELD-SYMBOLS: <fs_table> LIKE LINE OF dynamic_table. DATA: lv_choice TYPE i, lv_input TYPE i. DO. WRITE: / '1. Add row', / '2. Delete row', / '3. Display table', / '4. Exit'. WRITE: / 'Enter your choice: '. READ lv_choice. CASE lv_choice. WHEN 1. CLEAR: dynamic_table. WRITE: / 'Enter the number of rows to add: '. READ lv_input. DO lv_input TIMES. APPEND INITIAL LINE TO dynamic_table ASSIGNING <fs_table>. <fs_table> = sy-index. ENDDO. WRITE: / lv_input, ' rows added to table.'. WHEN 2. IF dynamic_table IS INITIAL. WRITE: / 'Table is empty.'. ELSE. WRITE: / 'Enter the row to delete: '. READ lv_input. DELETE dynamic_table INDEX lv_input. WRITE: / 'Row ', lv_input, ' deleted from table.'. ENDIF. WHEN 3. IF dynamic_table IS INITIAL. WRITE: / 'Table is empty.'. ELSE. LOOP AT dynamic_table ASSIGNING <fs_table>. WRITE: / <fs_table>. ENDLOOP. ENDIF. WHEN 4. EXIT. ENDCASE. ENDDO. ``` 该示例使用了 `any` 类型来声明动态,使其可以存储任何类型的数据。通过使用 `FIELD-SYMBOLS` 语句创建一个指向动态的行的字段符号,我们可以轻松地访问和操作中的数据。 在主循环中,我们使用 `CASE` 语句来根据用户的选择执行不同的操作。当用户选择添加行时,我们清空并使用 `APPEND INITIAL LINE TO` 语句添加指定数量的新行。当用户选择删除行时,我们使用 `DELETE` 语句删除指定索引处的行。最后,当用户选择显示时,我们使用 `LOOP AT` 语句遍历中的所有行并将其输出到屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值