ABAP动态内表使用的例子.docx
- 文档编号:30057789
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:27
- 大小:23.51KB
ABAP动态内表使用的例子.docx
《ABAP动态内表使用的例子.docx》由会员分享,可在线阅读,更多相关《ABAP动态内表使用的例子.docx(27页珍藏版)》请在冰豆网上搜索。
ABAP动态内表使用的例子
关键技巧:
1,创建动态内表:
a,动态内表的结构的定义.
动态内表表结构的定义必须使用表结构与tabletype:
lvc_t_fcat一样的内表.
一般情况下,我们都内表的所有列定义成字符型.
b,根据表结构生成内表.
系统提供了一个标准的method来产生动态表,使用方法如下:
2,动态内表的赋值:
a,获取指定的字段
b,给指定的字段赋值
3,读取动态内表的值:
a,获取指定的字段
b,读取指定的字段值
REPORT zdyn_test.
FIELD-SYMBOLS:
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
CONCATENATE i j INTO
ENDLOOP.
APPEND
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
WRITE:
/ .
LOOP AT it_structure INTO wa_structure.
ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE
WRITE:
ENDLOOP.
ENDLOOP.
ENDFORM. " output_dyntable_data
案例分析
REPORTY_TEST_BY_KB.
DATA:
GR_TABLE TYPEREFTOCL_SALV_TABLE.
FIELD-SYMBOLS:
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.
*设定
ASSIGNDY_TABLE->*TO
*下面这句建立了一个
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:
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.
LOOPAT
DO.
ASSIGNCOMPONENTsy-index
OFSTRUCTURE
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.
*设定
assigndy_table->*to
*下面这句建立了一个
createdatady_linelikelineof
*同理设定指针
assigndy_line->*to
于是便动态的建立了一个内表和一个工作区,由于此方法建立的内表没有headerline,所以需要一个工作区。
下面是取数或者赋值的方法:
*此行中的xxxx1就是列名
ASSIGNCOMPONENTxxxx1OFSTRUCTURE
*此行的作用就是给
*用Append就可以把该行添加到表中了
APPEND
ABAP-动态
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ABAP 动态 使用 例子
![提示](https://static.bdocx.com/images/bang_tan.gif)