ABAP创建动态内表

业务顾问有诸多相同逻辑但处理表不同的需求,为方便处理,准备编写动态程序,核心是动态内表。介绍了两种动态内表定义方式,一是根据数据库表定义,二是根据自身选择定义,还提及动态内表值读取和修改需用语法动态读取。

说明:最近业务顾问有很多的需求,其实都是一样的逻辑,就是处理的表不一样,就要写好多次程序,整理一下他的一系列需求之后,准备写一个动态的程序,这样会方便很多,动态的其实核心是动态的内表,所以简单的说一下动态内表的定义方式。

1、根据数据库表定义动态内表
这种定义比较直接,直接把数据库表的所有字段都放在动态内表中了,可能会有冗余,但是用起来比较好写。

  DATA: dy_table    TYPE REF TO data,
        dy_line     TYPE REF TO data.
  DATA :lv_tabname  type char15.
  FIELD-SYMBOLS: <dyn_table>  TYPE STANDARD TABLE,
                  <dyn_wa>.

  lv_tabname = 'MARA'.
  CREATE DATA dy_table TYPE TABLE OF (lv_tabname).
  ASSIGN dy_table->* TO <dyn_table>.
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.

2、根据自己的选择定义动态内表
这种定义更DIY一点,用什么定义什么就好了,就是依据lvc_t_fcat来定义,这里我简单的展示一下,把字段名称以及描述放在内表中,然后去写给lvc_t_fcat

   DATA: dy_table      TYPE REF TO data,
         dy_line       TYPE REF TO data.

   FIELD-SYMBOLS: <dyn_table>    TYPE STANDARD TABLE,
                  <dyn_wa>.

    DATA : lt_ftab    TYPE lvc_t_fcat.
    DATA : lw_ftab    LIKE LINE OF lt_ftab.

   "LT_TABLE中准备好要展示的字段名和字段名称

        "将表内容写给lt_ftab,依据lt_ftab创建动态的内表
        LOOP AT lt_table INTO DATA(lw_table).
          MOVE-CORRESPONDING lw_table TO lw_ftab.
          "模板都使用char 类型.
          lw_ftab-datatype = 'CHAR'.
          lw_ftab-inttype    = 'C'.
          "小于30位的字段设为30.
          IF lw_ftab-intlen <= '000030'.
            lw_ftab-intlen = '000030'.
          ENDIF.
          APPEND lw_ftab TO lt_ftab.
        ENDLOOP.

        "创建表的动态内表.
        CALL METHOD cl_alv_table_create=>create_dynamic_table
          EXPORTING
            it_fieldcatalog = lt_ftab[]
          IMPORTING
            ep_table        = dy_table.

        ASSIGN dy_table->* TO <dyn_table>.
        CREATE DATA dy_line LIKE LINE OF <dyn_table>.
        ASSIGN dy_line->* TO <dyn_wa>.

动态内表值的读取和修改不可以直接写成<dy_wa>-matkl,需要用语法动态读取一下,下面以读取一条MARA的为例


DATA: dy_table    TYPE REF TO data,
      dy_line     TYPE REF TO data.
DATA :lv_tabname  TYPE char15.
FIELD-SYMBOLS: <dyn_table>  TYPE STANDARD TABLE,
                <dyn_wa>.

lv_tabname = 'MARA'.
CREATE DATA dy_table TYPE TABLE OF (lv_tabname).
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.

SELECT * FROM MARA INTO CORRESPONDING FIELDS OF TABLE <dyn_table> WHERE MATNR = '000001'.

LOOP AT <dyn_table> INTO <dyn_wa>.
  "获取物料组MARA-MATKL
  ASSIGN COMPONENT 'MATKL' OF STRUCTURE <dyn_wa> TO FIELD-SYMBOLS(<fs_data>).
  IF sy-subrc = 0.
"此时,<dyn_wa>中物料组的值就存在<fs_data>中了,修改<fs_data>的值,就会直接修改<dyn_wa><dyn_table>MATKL的值
  ENDIF.
ENDLOOP.

作者:小飞猪猪猪猪猪猪猪–CSDN
注意:转发请注明作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞猪猪猪猪猪猪猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值