ABAP动态内表使用的例子.docx
《ABAP动态内表使用的例子.docx》由会员分享,可在线阅读,更多相关《ABAP动态内表使用的例子.docx(27页珍藏版)》请在冰豆网上搜索。
![ABAP动态内表使用的例子.docx](https://file1.bdocx.com/fileroot1/2023-8/4/83861d33-0c58-4b4d-9248-0929730f4654/83861d33-0c58-4b4d-9248-0929730f46541.gif)
ABAP动态内表使用的例子
关键技巧:
1,创建动态内表:
a,动态内表的结构的定义.
动态内表表结构的定义必须使用表结构与tabletype:
lvc_t_fcat一样的内表.
一般情况下,我们都内表的所有列定义成字符型.
b,根据表结构生成内表.
系统提供了一个标准的method来产生动态表,使用方法如下:
2,动态内表的赋值:
a,获取指定的字段
b,给指定的字段赋值
3,读取动态内表的值:
a,获取指定的字段
b,读取指定的字段值
REPORT zdyn_test.
FIELD-SYMBOLS:
TYPE STANDARD TABLE,
,
.
DATA:
dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
it_structure TYPE lvc_t_fcat,
wa_structure TYPE lvc_s_fcat.
START-OF-SELECTION.
PERFORM create_structure. " 定义内表的结构
PERFORM create_dynamic_table. " 按照定义的内表结构,产生一个内表
PERFORM write_data_to_dyntable. " 向动态内表中写数
PERFORM output_dyntable_data. " 从动态内表中取数,并写到屏幕
*&---------------------------------------------------------------------*
*& Form create_structure
*&---------------------------------------------------------------------*
FORM create_structure .
wa_structure-fieldname = 'COL1'. " 第一列列名
wa_structure-col_pos = 1. " 表示第一列 --- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
wa_structure-inttype = 'C'. " 数据类型
wa_structure-intlen = 6. " 长度
APPEND wa_structure TO it_structure.
wa_structure-fieldname = 'COL2'. " 第二列列名
wa_structure-col_pos = 2. " 表示第二列--- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
wa_structure-inttype = 'C'. " 数据类型
wa_structure-intlen = 6. " 长度
APPEND wa_structure TO it_structure.
wa_structure-fieldname = 'COL3'. " 第三列名
wa_structure-col_pos = 3. " 表示第三列 --- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
wa_structure-inttype = 'C'. " 数据类型
wa_structure-intlen = 6. " 长度
APPEND wa_structure TO it_structure.
ENDFORM. " create_structure
*&---------------------------------------------------------------------*
*& Form create_dynamic_table
*&---------------------------------------------------------------------*
FORM create_dynamic_table .
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_structure
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO . " 用表类型指针 指向 数据对象的内容.
ENDFORM. " create_dynamic_table
*&---------------------------------------------------------------------*
*& Form write_data_to_dyntable
*&---------------------------------------------------------------------*
FORM write_data_to_dyntable .
DATA:
wa_new_line TYPE REF TO data.
DATA:
i TYPE n.
DATA:
j TYPE n.
CREATE DATA wa_new_line LIKE LINE OF . " 建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
ASSIGN wa_new_line->* TO .
" 用指针指向该结构
DO 3 TIMES.
i = i + 1.
CLEAR j.
LOOP AT it_structure INTO wa_structure.
j = j + 1.
ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE TO . " 用指针 指向工作区中的一个字段,字段名为wa_structure-fieldname.
CONCATENATE i j INTO . " 给指针指向的字段赋值
ENDLOOP.
APPEND TO .
ENDDO.
ENDFORM. " write_data_to_dyntable
*&---------------------------------------------------------------------*
*& Form output_dyntable_data
*&---------------------------------------------------------------------*
FORM output_dyntable_data .
LOOP AT it_structure INTO wa_structure.
WRITE:
wa_structure-fieldname(5).
ENDLOOP.
LOOP AT INTO .
WRITE:
/ .
LOOP AT it_structure INTO wa_structure.
ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE TO . " 用指针 指向工作区中的一个字段,字段名为wa_structure-fieldname.
WRITE:
.
ENDLOOP.
ENDLOOP.
ENDFORM. " output_dyntable_data
案例分析
REPORTY_TEST_BY_KB.
DATA:
GR_TABLE TYPEREFTOCL_SALV_TABLE.
FIELD-SYMBOLS:
TYPESTANDARDTABLE,
,
.
DATA:
DY_TABLETYPEREFTODATA,
DY_LINE TYPEREFTODATA.
DATA:
LI_FIELDCATTYPELVC_T_FCAT.
*界面上输入要显示的表的名称
PARAMETER:
P_TBNAMLIKEDD02L-TABNAME.
START-OF-SELECTION.
*获取表的fieldcategory
CALLFUNCTION'LVC_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME=P_TBNAM
CHANGING
CT_FIELDCAT =LI_FIELDCAT.
*根据获取的fieldcategory来创建动态内部表
CALLMETHODCL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG=LI_FIELDCAT
IMPORTING
EP_TABLE =DY_TABLE.
*设定指向DY_TABLE
ASSIGNDY_TABLE->*TO.
*下面这句建立了一个类型的工作区Workarea本程序内没有使用
CREATEDATADY_LINELIKELINEOF.
*同理设定指针本程序内此变量无用
ASSIGNDY_LINE->*TO.
* 从街面上的表中抽取数据
SELECT*
FROM(P_TBNAM)
INTOCORRESPONDINGFIELDSOFTABLE.
* 创建对象gr_table.
* CreateInstance
CALLMETHODCL_SALV_TABLE=>FACTORY
IMPORTING
R_SALV_TABLE=GR_TABLE
CHANGING
T_TABLE =.
*显示表的内容
GR_TABLE->DISPLAY().
REPORTz_barry_test .
TYPE-POOLS:
abap.
FIELD-SYMBOLS:
TYPESTANDARDTABLE,
,
.
DATA:
dy_tableTYPEREFTOdata,
dy_lineTYPEREFTOdata,
xfcTYPElvc_s_fcat,
ifcTYPElvc_t_fcat.
SELECTION-SCREENBEGINOFBLOCKb1WITHFRAME.
PARAMETERS:
p_table(30)TYPEcDEFAULT'T001'.
SELECTION-SCREENENDOFBLOCKb1.
START-OF-SELECTION.
PERFORMget_structure.
PERFORMcreate_dynamic_itab.
PERFORMget_data.
PERFORMwrite_out.
*---------------------------------------------------------------------*
* FORMget_structure *
*---------------------------------------------------------------------*
FORMget_structure.
DATA:
idetailsTYPEabap_compdescr_tab,
xdetailsTYPEabap_compdescr.
DATA:
ref_table_desTYPEREFTOcl_abap_structdescr.
ref_table_des?
=
cl_abap_typedescr=>describe_by_name(p_table).
idetails[]=ref_table_des->components[].
LOOPATidetailsINTOxdetails.
CLEARxfc.
xfc-fieldname=xdetails-name.
* xfc-datatype=xdetails-type_kind.
xfc-inttype=xdetails-type_kind.
xfc-intlen=xdetails-length+xdetails-decimals.
xfc-decimals=xdetails-decimals.
APPENDxfcTOifc.
ENDLOOP.
ENDFORM. "get_structure
*---------------------------------------------------------------------*
* FORMcreate_dynamic_itab *
*---------------------------------------------------------------------*
FORMcreate_dynamic_itab.
CALLMETHODcl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog=ifc
IMPORTING
ep_table =dy_table.
ASSIGNdy_table->*TO.
CREATEDATAdy_lineLIKELINEOF.
ASSIGNdy_line->*TO.
ENDFORM. "create_dynamic_itab
*---------------------------------------------------------------------*
* FORMget_data *
*---------------------------------------------------------------------*
FORMget_data.
DATA:
BEGINOFitabOCCURS0.
INCLUDESTRUCTUREspfli.
DATA:
ENDOFitab.
SELECT*INTOCORRESPONDINGFIELDSOFTABLE
FROM(p_table).
ENDFORM. "get_data
*---------------------------------------------------------------------*
* FORMwrite_out *
*---------------------------------------------------------------------*
FORMwrite_out.
LOOPATINTO.
DO.
ASSIGNCOMPONENTsy-index
OFSTRUCTURETO.
IFsy-subrc<>0.
EXIT.
ENDIF.
IFsy-index=1.
WRITE:
/.
ELSE.
WRITE:
.
ENDIF.
ENDDO.
ENDLOOP.
ENDFORM. "write_out
ABAP动态内表构建Dynamicinternaltable
要求根据用户输入的工资项(T512W-LGART)查找数据,并输出到ALV,要求是输出跟着输入变。
由于工资项的配置信息可能会变,因此用于存储要显示的数据的内表就不能预先知道,因此不得不寻求动态内表的构建方法。
其实网上的例子也有不少,但是都缺少说明,折腾了一上午才弄明白一些,写出来与大家分享。
REPORT Z_DT2.
type-pools:
abap.
*以t512w为例,构建一个动态内表
tables:
t512w.
*field-symbols是一个标志,你可以理解为一个指针,将来创建的内表就要通过它们来访问
field-symbols:
[小于号]dyn_table>typestandardtable,
[小于号]dyn_wa>,
[小于号]dyn_field>.
*这里定义了一个dy_table和一个dy_line类型是引用,但todata未能理解是什么意思,我觉得应该是说指向为空的意思
data:
dy_tabletypereftodata,
dy_line typereftodata,
*用于存储即将构建的动态内表结构
ifctypelvc_t_fcat,
xfctypelvc_s_fcat.
data:
beginoft_lgartoccurs0,
LGARTliket512w-lgart,
endoft_lgart.
select-options:
S_LGARTFORt512w-lgart.
start-of-selection.
*首先从数据库中把符合用户输入的LGART填入内表,将来构建的动态内表每一列就是LGART中的每一行。
selectlgartintot_lgart-lgartfromt512wwherelgartins_lgartandMOLGA='28'.
appendt_lgart.
endselect.
*循环读取内表t_lgart,对于每行构建内表
loopatt_lgart.
*这里偷了个懒,因为工资项中会有/103这样的数据,而/是不能用左列明的,大家可以自己写一个替换逻辑,把/替换成_之类的字符。
checkt_lgart-lgart+0
(1)ne'/'.
*列名就用lgart值
xfc-fieldname=t_lgart-lgart.
xfc-datatype='C'.
xfc-inttype='C'.
xfc-intlen=6.
xfc-decimals=0.
appendxfctoifc.
endloop.
*此处调用一个方法,这个方法用于构建动态内表,输入的就是要构建的结构,输出的就是一个dy_table,之前定义过,但是并不能直接访问。
callmethodcl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog=ifc
IMPORTING
ep_table =dy_table.
*设定指向dy_table
assigndy_table->*to.
*下面这句建立了一个类型的工作区Workarea
createdatady_linelikelineof.
*同理设定指针
assigndy_line->*to.
于是便动态的建立了一个内表和一个工作区,由于此方法建立的内表没有headerline,所以需要一个工作区。
下面是取数或者赋值的方法:
*此行中的xxxx1就是列名
ASSIGNCOMPONENTxxxx1OFSTRUCTURETO.
*此行的作用就是给中的该列一个值
=xxxx2.
*用Append就可以把该行添加到表中了
APPENDTO.
ABAP-动态