READ table 是用来遍历内表,取第一条符合条件的记录
READ TABLE [INTO ] WITH KEY [BINARY SEARCH].
阅读某一张表的数据,读取第一条符合条件的记录(主键为key)进去某个表,
add-20200427
WITH KEY 中的检索条件比较符不能使用 ‘<>’ (不等于)。
如果只想取得内部表中不等于某条件的一条记录,那么请使用下面的变通方法
LOOP AT itab WHERE KEY <> 'XX'.
此处取得第一条记录。
EXIT.
ENDLOOP.
如果在运行时值为空,则统一忽略该关键字段。另外可对关键字段指定偏移量和长度。
用INTO选项可以指定目标区域。如果表格由表头行,则可以忽略INTO选项。这样,表格工作区域就成了目标区域。
系统读取中匹配中所定义的关键字的第一个条目。
如果使用二分搜索法的话,需要先对内表进行相关条件的排序。
如果找到由适当关键字的条目,则将系统字段SY-SUBRC设置为0,并且SY-TABIX包含该行的索引。否则,将SY-SUBRC设置为非0值。
DATA: IT_TAB1 TYPE STANDARD TABLE OF EKPO WITH HEADER LINE,
IT_TAB2 TYPE STANDARD TABLE OF EKPO,
IT_TAB3 TYPE STANDARD TABLE OF EKPO,
WA_TAB1 TYPE EKPO,
WA_TAB2 TYPE EKPO,
WA_TAB3 TYPE EKPO,
WA_TAB3 TYPE EKPO,
SELECT * FROM EKPO INTO TABLE IT_TAB1 UP TO 10 ROWS.
SELECT * FROM EKPO INTO TABLE IT_TAB2 UP TO 10 ROWS.
SELECT * FROM EKPO INTO TABLE IT_TAB3 UP TO 10 ROWS.
SORT IT_TAB1.
SORT IT_TAB2.
SORT IT_TAB3.
READ TABLE IT_TAB1 WITH KEY MATNR = 'QQQ'..
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB2 INTO WA_TAB2 WITH KEY MATNR = 'M06A-CAA42' TXZ01 = '芯片M06A-CAA42'.“这个是多个KEY的
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB3 INTO WA_TAB3 WITH KEY MATNR = 'M06A-CAA42' TXZ01 = '三氧化二铝'.
WRITE:/ SY-SUBRC,SY-TABIX.
READ TABLE IT_TAB1 WITH KEY '4500000002'.
WRITE:/ SY-SUBRC,SY-TABIX.
LOOP AT [INTO ]
[FROM ] [TO ] [WHERE ].
…
ENDLOOP.
-指定内部表。
–指定表格工作区。
FROM- 指定要读取的第一行索引
TO- 指定要读取的最后一行的索引
WHERE- 指定逻辑表达式,逻辑表达式中的操作数必须是的组成部分。
一旦执行了LOOP语句,SY-TABIX包含当前检索行的索引。一旦处理完表格的所有行,循环处理就结束。
SY-SUBRC = 0; 如果至少检索到一行。否则设置为4.
FROM和 TO选项限制行数并指定系统必须读取的行数。WHERE选项过滤满足条件的行。如果没有WHERE选项,系统将读取所有行。因此,最佳实践始终是指定FROM,TO或者WHERE选项以提高性能
案例:下面使用LOOP语句从具有以下结构的产品信息内部表中读取数据的简单实例。
REPORT Z_INTERNAL_TABLE.
TYPE : BEGIN OF t_product,
pid(10) TYPE C,
pname(40) TYPE C,
pamount(10) TYPE P,
END OF t_product.
DATA: wa TYPE t_product, "工作区
it TYPE TABLE OF t_product, “定义内表
it1 TYPE TABLE OF t_product "再定义一张内表
wa-pid = 'IFB1'.
wa-pname = 'IFB SPLIT AC'.
wa-pamount = 38000.
INSERT wa INTO TABLE it.
wa-pid = 'IFB2'.
wa-pname = 'IFB SPLIT AC'.
wa-pamount = 38000.
INSERT wa INTO TABLE it.
WRITE 'displaying' IT table data...'
*Reading internal table for all the records
LOOP AT it INTO wa.
IF sy-subrc = 0.
WRITE :/ wa-pid , wa-pname , wa-pamount.
ELSE.
WRITE 'No Record Found'.
ENDIF.
ENDLOOP.
上面两段代码达到同样的效果
简单的CASE WHEN函数:
CASE SCORE WHEN 'A' THEN '优' ELSE “不及格” END
CASE SCORE WHEN 'A' THEN '良" ELSE “不及格” END
CASE SCORE WHEN 'A' THEN '中' ELSE “不及格” END
等同于下面
CASE WHEN SCORE = 'A' THEN '优'
WHEN SCORE = 'B' THEN ‘’良'
WHEN SCORE = 'C' THEN '中' ELSE '不及格' END
SELECT
STUDENT_NAME,
(CASE WHEN score <60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >=80 THEN '优秀'
ELSE '异常' END) AS REMARK
FROM
TABLE
group by 语句可以根据一个或者多个列对结果集进行分组。
在分组的列上我们可以使用COUNT,SUM,AVG等函数。
语法
SELECT column_name,function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
案例:
假设我们拥有一个客户订单表
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在我们希望查找到每个客户的总金额(或者总订单)
我们想要使用GROUP BY 语句对客户进行组合。
SELECT Customer, SUM(OrderPrice) FROM Orders
GROUP BY Customer
然后就会出现如下结果
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
从字面看好像作用是相同的,但具体使用以来还是有区别的。如果都是从数据库表中select一次数据,添加到内表中,他们的作用相同;但是多次,他们的作用则有很大差别,INTO TABLE:将数据select出来添加到内表时会将内表先清空再添加,而APPENDING TABLE则会直接追加,实现累计效果。
for all entries in 语句将数据库表与内表串联
for all entries in 类似于外连接的时候,为避免多次重复数据库查询,用内表的某一个字段为条件,从数据库中取得数据,有相同的数据则筛除,相当于过滤数据的作用。
语法:
SELECT
FROM
FOR ALL ENTRIES IN @itab
WHERE
@DATA 按取数指定的字段定义内表结
MESSAGE gv_message TYPE ‘I’.
MESSAGE gv_message TYPE ‘S’.
MESSAGE gv_message TYPE ‘W’.
MESSAGE gv_message TYPE ‘E’.
使用SELECT语句选择查询:
SY-SUBURC = 0 :至少有一行数据,当ENDSELECT语句执行完,SY-DBCNT中保存着记录的个数
SY-SUBRC = 4 :没有数据
SY-SUBRC = 8 :只有使用 “SELECT SINGLE FOR UPDATE” 时才会有
表示: WHERE条件指定的记录不止一行,结果是没有记录被选中
使用INSERT语句,向表中插入一行,必须注意INSERT的顺序与表中字段的顺序一致:
SY-SUBRC = 0 :插入成功,SY-DBCNT包含了插入的行数,0或1
SY-SUBRC = 4 : 循环没有被执行,可能是没有数据,也可能是没有符合条件的记录。
使用DELETE语句来删除一条数据
SY-SUBRC = 0 : 找到一行并删除之,如果该表有不唯一主键,也就是有多条重复的记录,则只删除第一条记录。
SY-SUBRC = 4 : 没有找到符合条件的记录,也没有删除。
使用UPDATE语句来更新一条记录:
SY-SUBRC = 0 : 找到记录并更新,(如果有多条记录呢?)
SY-SUBRC = 4 : 没有找到符合条件的记录,也没有更新。
LEAVE TO LIST-PROCESSING:指退出其他屏幕后,到List输入的屏幕,例如:WRITE 语句输入的屏幕
LEAVE LIST-PROCESSING:是在其他屏幕退出,到LIST输入屏幕间的动作
leave list-processing
如果写在 at selection-screen 就会返回到输出界面
如果写在 start-of-selection 就返回到initialization事情
第一类,销售订单交期,不需要计算,但是需要数据库读取,那么代码如下
READ TABLE lt_vbep INTO(ls_vebp) WITH KEY vbeln = gs_so_inf-vbeln posnr = gs_so_inf-posnr
* 即,读取lt_vbep表进入 ls_vebp,并且要求主键是vbeln(销售订单号)的同时,其销售订单号和等于内表的销售订单号
IF sy-subrc EQ 0 . *如果读取成功,(标志为sy-subrc=0)
gs_so_inf_edatu = ls_vbep-edatu. "那么gs_so_inf_edatu = ls_vbep-edatu.
END IF.
第二类,销售订单数据,不需要计算,但是需要相连