内表

定义类型 关键types

用定义的类型定义工作区域

用定义的类型定义内表

用DATA中加OCCIRS 0 可以直接定义内表,只不过这种方式自带表头

DATA  gt_tab like table of gs_man(工作区)   参照工作区定义一个内表

DATA gs_tab like line of gt_tab(内表) 参照内表定义工作区域

调试debug的时候在程序运行前输入/H 命令可以进入debug界面或者在程序下家break-point

对内表的操作

赋值: gs_tab-name = 'jim'.

工作区插入到内表 append   gs_tab   to   gt_tab.

append 是往内表的最后一笔记录后插入记录的

insert  gs_tab  into  gt_tab  index2   指定插入内表第2行

collect  gs_tab  into  gt_tab  也可以插入内表数据  但是和append不一样,append 可以在内表中插入内表已经有的数据而collect可以把非数值字段相同的情况下实现非数值字段这行的数值字段汇总。不会增加相同字段下的插入相同的数值

系统变量:sy-subrc 如果等于0则说明上面的程序执行ok没有问题

内表复制:gt_tab1 = gt_tab2 两个内表直接复制时必须是两个内表结构相同

还有一种方式是 append  lines  of  gt_tab1  to  gt_tab2

删除内表:delete    gt_tab 相当于 free gt_tab[]  和 refresh  gt_tab

delete  gt_man where name = ‘jim’   把所有名称等于‘jim’的所有记录都删掉

delete  gt_man where math>34  and physis<45 删除内表中数学成绩大于34 和物理程序小于45的记录

查看内表记录:

read table gt_tab with table key 用于读取哈希内表

read table gt_tab  into gs_tab  with key  name = 'jim'   这边可以加上binary serach 二分查找  但是使用二分查找时必须排序内表,无所谓升序还是降序

内表排序:sort  gt_man  by name  meath 这边可以以多个字段进行内表排序,先排序然后再name基础上再以meath排序 

排序的时候默认是升序的   ascending   降序是descending

字符串在赋值的时候区分大小的列:'jim'和'JIM'是区分大小写的

字符排序规则:先做首字母的排序,在此基础上在做第二个字母的比较

读取内表属性:

descrbe table  gt_man lines num 得到内表中有记笔记并赋给num

descrbe table gt_man lines num kind S排序标准内表

                                                     H排序哈希内表 

去掉重复的时候首先要排序,注意排序要按照comparing后的字段排序

delete adjacent duplicates from gt_table  comparing name  当姓名重复的时候就删掉重复的那一笔记录,内表只保留一笔记录

比较过程:比较第一笔和第二笔如果一样删掉第二笔 在和第三笔比较。

                                        如果不一样就再拿二笔和第三笔比较。

查询:把内表中所有记录读取到工作区gs_tab中

loop at gt_tab into gs_tab.

 gs_tab-name = 'lili'.      

modify gt_tab from gs_tab.修改每次循环name的值,可以在此加上transportation指定只修改内表中这个字段的值。

endloop.

每一次操作内表工作区域的时候都要对工作区域清理一下

clear gs_tab.

loop  at  gt_tab  into  gs_tab.

   delete  gt_man index sy_tabix.用循环内表的方式删除内表的所有记录

endloop.

 

loop at gt_tab  into gs_tab from 3 to 4.  只是循环3列到4列

endloop.

loop at gt_tab into gs_tab from 3 to 4.

    wa = gs_tab.读取3到4行到工作区中再赋给wa

    append wa to gt_tab. wa又插入到gt_tab内表

endloop.

move-corresponoding gs_tab1  to gs_tab2 把工作区gs_tab1 给 gs_tab2 而且这两个工作区会自动识别字段赋值,没有值就补0.

loop循环可以嵌套:

判断内表是否为空有两种方法:1、通过取得内表中的行数   2、是以下方式

if gt_tab is  initial.

endif.

用指针变量去循环内表,

定义指针变量:field-symbols <fs> type ty_ta.

loop at gt_tab assgning <fs>.  把内表中的每一笔记录循环给指针<fs>

     write <fs>-name.

endloop.

如果要改变name值的时候,只需要<fs>-name = '',而且不需要modify gt_tab from <fs>-name.

这边补充一下系统变量:

SY-TABIX  在做内表循环的时候在做内表循环的时候循环到了第几笔记录

SY-INDEX 在做do循环的时候和while循环的时候循环第几次

SY-SUBRC如果等于0则说明上面的程序执行ok没有问题

SY-DATUM取当前日期

at first  是在loop循环第一笔记录的时候

at last  是在loop循环最后一笔记录的时候

at new of 字段     只根据该字段为基础比较,是对相邻记录进行比较,在at new的时候要对内表排序。

loop at gt_tab into gs_tab.

  at new name.  比较内表里name的值第一笔是新的,然后执行下面的write,然后第二笔name和第一笔name比较如果一样的就不执行write,如果不一样就认为

     write / sy-tabix.第二笔name是新的就执行write

  endat.

endloop.

和at new相对的还有一个at end

这里再补充一下debug知识 可以在warchpoint中设置断点精确的找出所需的监控到的字段,可以在breakpoint  、breakpoint at、 breakpoint at staement中设置关键字段,可以专门打这些关键字的断点。

 

原文地址:https://www.cnblogs.com/caizjian/p/3113207.html