• OPENSQL


    关于使用READ TABLE语句

    READ table 是用来遍历内表,取第一条符合条件的记录

    READ TABLE [INTO ] WITH KEY [BINARY SEARCH].

    阅读某一张表的数据,读取第一条符合条件的记录(主键为key)进去某个表,

    add-20200427
    WITH KEY 中的检索条件比较符不能使用 ‘<>’ (不等于)。
    如果只想取得内部表中不等于某条件的一条记录,那么请使用下面的变通方法

    	LOOP AT itab WHERE KEY <> 'XX'.
    		此处取得第一条记录。
    		EXIT.
    	ENDLOOP.
    
    • 1
    • 2
    • 3
    • 4

    如果在运行时值为空,则统一忽略该关键字段。另外可对关键字段指定偏移量和长度。

    用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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    LOOP AT 语句

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    上面两段代码达到同样的效果

    SQL之CASE WHEN的用法详解

    简单的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    CASE WHEN语句的 IF ELSE结构

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    MySQL GROUP BY语句

    group by 语句可以根据一个或者多个列对结果集进行分组。
    在分组的列上我们可以使用COUNT,SUM,AVG等函数。
    语法

    SELECT column_name,function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY	column_name;
    
    • 1
    • 2
    • 3
    • 4

    案例:
    假设我们拥有一个客户订单表
    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
    
    • 1
    • 2

    然后就会出现如下结果
    Customer SUM(OrderPrice)
    Bush 2000
    Carter 1700
    Adams 2000

    INTO TABLE与APPENDING TABLE的区别

    从字面看好像作用是相同的,但具体使用以来还是有区别的。如果都是从数据库表中select一次数据,添加到内表中,他们的作用相同;但是多次,他们的作用则有很大差别,INTO TABLE:将数据select出来添加到内表时会将内表先清空再添加,而APPENDING TABLE则会直接追加,实现累计效果。

    For All entries的用法

    for all entries in 语句将数据库表与内表串联

    for all entries in 类似于外连接的时候,为避免多次重复数据库查询,用内表的某一个字段为条件,从数据库中取得数据,有相同的数据则筛除,相当于过滤数据的作用。
    语法:

    SELECT 
    FROM  
    FOR  ALL ENTRIES IN @itab
    WHERE  
    
    • 1
    • 2
    • 3
    • 4

    @DATA用法

    @DATA 按取数指定的字段定义内表结

    MESSAGE用法

    information message(弹出一个对话框)

    MESSAGE gv_message TYPE ‘I’.

    success message(左下角显示一个成功的提示框)

    MESSAGE gv_message TYPE ‘S’.

    warning message(左下角显示一个黄色叹号警告消息)

    MESSAGE gv_message TYPE ‘W’.

    error message(左下角显示一个红色叹号错误消息)

    MESSAGE gv_message TYPE ‘E’.

    SY-SUBRC的含义

    使用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 和 LEAVE LIST-PROCESSING

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第二类,销售订单数据,不需要计算,但是需要相连

  • 相关阅读:
    promise原理
    Codeforces Round #815 (Div. 2)
    MATLAB | 世界杯来用MATLAB画个足球玩叭~
    解析java中的clone方法
    [附源码]SSM计算机毕业设计星期八酒店管理系统JAVA
    Kibana从已有的ES连接转到新的ES连接的简要步骤
    Java新手小白入门篇 SpringBoot项目的构建
    Git(7)——使用Beyond Compare快速解决冲突
    了解IO,内外存,文件操作这一篇就够了
    Jmeter 逻辑控制之IF条件控制器
  • 原文地址:https://blog.csdn.net/weixin_43847969/article/details/126047782