ABAP动态内表使用的例子.docx

上传人:b****5 文档编号:30057789 上传时间:2023-08-04 格式:DOCX 页数:27 大小:23.51KB
下载 相关 举报
ABAP动态内表使用的例子.docx_第1页
第1页 / 共27页
ABAP动态内表使用的例子.docx_第2页
第2页 / 共27页
ABAP动态内表使用的例子.docx_第3页
第3页 / 共27页
ABAP动态内表使用的例子.docx_第4页
第4页 / 共27页
ABAP动态内表使用的例子.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

ABAP动态内表使用的例子.docx

《ABAP动态内表使用的例子.docx》由会员分享,可在线阅读,更多相关《ABAP动态内表使用的例子.docx(27页珍藏版)》请在冰豆网上搜索。

ABAP动态内表使用的例子.docx

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-动态

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1