ABAP动态编程-动态数据对象

43 篇文章 7 订阅

目录

前言

一、动态内表/结构的生成

1.1 数据引用动态参考创建

1.2 使用cl_alv_table_create=>create_dynamic_table方法生成

1.3 使用RTTS类生成

1.4 动态纵深结构生成

二、动态内表的使用

1.1 动态内表 - READ

1.2 动态内表LOOP

1.3 动态内表排序

总结


前言

        本文为ABAP编程中的动态数据声明及使用,主要为动态结构及内表。前置需要了解指针和数据引用的使用。


一、动态内表/结构的生成

        1.1 数据引用动态参考创建

        示例:

*& Data reference
DATA: lr_dyn_data TYPE REF TO data.
DATA(lv_tabname) = 'T001'.
CREATE DATA lr_dyn_data TYPE TABLE OF (lv_tabname).

        数据结构:

        PS: 类对象同理

        1.2 使用cl_alv_table_create=>create_dynamic_table方法生成

        示例:

" Dynamic internal table - 1
DATA: lt_fieldcat TYPE lvc_t_fcat,
      ls_fieldcat TYPE lvc_s_fcat.

DATA: lr_line TYPE REF TO data,
      lr_itab TYPE REF TO data.

FIELD-SYMBOLS: <lt_itab> TYPE STANDARD TABLE,
               <ls_line> TYPE any.

DEFINE %fieldcat.
  CLEAR ls_fieldcat.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-coltext  =  ls_fieldcat-scrtext_m = ls_fieldcat-scrtext_l = ls_fieldcat-scrtext_s = &2.
    ls_fieldcat-ref_field = &3.
    ls_fieldcat-ref_table = &4.
    ls_fieldcat-inttype   = &5.
    ls_fieldcat-intlen    = &6.
  APPEND ls_fieldcat TO lt_fieldcat.
END-OF-DEFINITION.

" Field
%fieldcat: 'BUKRS' 'Company Code' 'BUKRS' 'T001' '' '' ,
           'BUTXT' 'Company Name' 'BUTXT' 'T001' '' '' .         

" Dynamic internal table
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = lt_fieldcat
  IMPORTING
    ep_table        = lr_itab.
ASSIGN lr_itab->* TO <lt_itab>.

" Structure
CREATE DATA lr_line LIKE LINE OF <lt_itab>.
ASSIGN lr_line->* TO <ls_line>.

        结构:

        1.3 使用RTTS类生成

        示例:

DATA:lo_struct TYPE REF TO cl_abap_structdescr,
     lo_table  TYPE REF TO cl_abap_tabledescr.

DATA:ls_components TYPE abap_componentdescr,
     lt_components TYPE abap_component_tab,
     lo_elemt_type TYPE REF TO cl_abap_datadescr.

DATA: lr_line TYPE REF TO data,
      lr_itab TYPE REF TO data.

FIELD-SYMBOLS: <lt_itab> TYPE STANDARD TABLE,
               <ls_line> TYPE any.
DEFINE %fill_component.
  CLEAR ls_components.
  ls_components-type  = lo_elemt_type.
  ls_components-name  = &1.
  APPEND ls_components TO lt_components.
  CLEAR lo_elemt_type.
END-OF-DEFINITION.

" Element for data object
lo_elemt_type ?= cl_abap_structdescr=>describe_by_name( 'T001-BUKRS' ).
%fill_component 'BUKRS'.
lo_elemt_type ?= cl_abap_structdescr=>describe_by_name( 'T001-BUTXT' ).
%fill_component 'BUTXT'.

" Dynamic internal structure
lo_struct = cl_abap_structdescr=>create( lt_components ).
CREATE DATA lr_line TYPE HANDLE lo_struct.
ASSIGN lr_line->* TO <ls_line>.

" Dynamic internal table
lo_table = cl_abap_tabledescr=>create( lo_struct ).
CREATE DATA lr_itab TYPE HANDLE lo_table.
ASSIGN lr_itab->* TO <lt_itab>.

        结构:

Runtime Type Services (RTTS) - ABAP Development - Community Wikihttps://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=42965

        1.4 动态纵深结构生成

        示例:

DATA: lr_deep_line TYPE REF TO DATA.

FIELD-SYMBOLS: <ls_deep_line> TYPE any.

CLEAR  lt_components.
lo_elemt_type ?= cl_abap_structdescr=>describe_by_data( <lt_itab> ).
%fill_component 'COMPANY_INFO'.

lo_struct = cl_abap_structdescr=>create( lt_components ).
CREATE DATA lr_deep_line TYPE HANDLE lo_struct.
ASSIGN lr_deep_line->* TO <ls_deep_line>.

        结构:

二、动态内表的使用

        1.1 动态内表 - READ

" Read - 1
DATA: lv_fieldname TYPE fieldname.
lv_fieldname = 'BUKRS'.
READ TABLE <lt_itab> ASSIGNING <ls_line> WITH KEY (lv_fieldname) = '0001'.
IF sy-subrc = 0.

ENDIF.

" Read - 2
DATA: BEGIN OF ls_bukrs_read,
        bukrs TYPE bukrs_d,
      END OF ls_bukrs_read.
      
ls_bukrs_read-bukrs = '0001'.
READ TABLE <lt_itab> ASSIGNING <ls_line> WITH KEY (lv_fieldname) = '0001'.
IF sy-subrc = 0.

ENDIF.

        1.2 动态内表LOOP

DATA(lv_where) = `BUKRS = '0001'`.
LOOP AT <lt_itab> INTO <ls_line> WHERE (lv_where).

ENDLOOP.

        1.3 动态内表排序

" Sort
SORT <lt_itab> BY (lv_fieldname).

DATA(lt_sorted_field) = VALUE abap_sortorder_tab( ( name = 'BUKRS' descending = 'X' astext = 'X' ) ).
SORT <lt_itab> BY (lv_fieldname).

总结

        1. 方法cl_alv_table_create=>create_dynamic_table生成动态内表是通过动态form(后续文章说明)来动态声明变量,再通过类静态属性及数据引用的特点来实现;RTTS方式通过内置的KERNEL MODULE实现。

        2. 指针是其分配的数据对象的占位符,并指向数据对象的内容,本身不可独立使用。数据引用指向数据对象,且包含数据对象的内存地址。创建引用时可以作为数据对象单独使用。

关联文章:

ABAP动态编程-动态数据对象_xiefireworks的博客-CSDN博客

ABAP动态编程-动态调用子例程&方法及动态SQL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成子例程和本地类-GENERATE SUBROUTINE POOL_xiefireworks的博客-CSDN博客

ABAP动态编程-动态生成报表、屏幕_xiefireworks的博客-CSDN博客

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值