ABAP动态编程-动态数据对象
目录
1.2 使用cl_alv_table_create=>create_dynamic_table方法生成
前言
本文为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>.
结构:
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博客
post SAP-Garson
原文链接:https://blog.csdn.net/xiefireworks/article/details/123100868文章来自于网络,如果侵犯了您的权益,请联系站长删除!