定义类型 关键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中设置关键字段,可以专门打这些关键字的断点。