自从 SAP 推出 SAP ON HANA,与之相随的 AS ABAP NW 7.40 版本以后,ABAP 语法也有了较多的更新,本篇对 Open Sql的语法更新部分做一个DEMO演示。
NW 7.40 以前 OpenSQL 的限制:
① 没有固定值或计算列;
② 没有Case表达式;
③ 没有 right outer join;
④ 没有 Union;
⑤ 没有子查询
NW 7.40 开始 OpenSQL 支持的新特性:
① CASE;
② COALESCE;
③ 算术表达式:+,-,*,/;
④ CAST类型转换;
⑤ 算术函数:DIV、MOD、ABS、FLOOR、CEIL、ROUND;
⑥ 聚合函数:SUM,COUNT,AVG,MAX,MIN;
⑦ 字符串连接符 &&;
⑧ right outer join;
⑨ union and union all
存在的限制:
① 无法使用 SAP HANA 内置函数,如DAYS_BETWEEN;
② 无法使用 SAP HANA 数据库视图和存储过程
*&---------------------------------------------------------------------*
*& Report Y_XLEVON_OPEN_SQL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT y_xlevon_open_sql.
TYPES: BEGIN OF ty_sflight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
seatsmax TYPE sflight-seatsmax,
seatsocc TYPE sflight-seatsocc,
status TYPE char10,
END OF ty_sflight.
PARAMETERS:
p_carrid TYPE sflight-carrid,
p_cust TYPE scustom-name.
* Old syntax for before AS ABAP 7.4 SP05
* 存在以下限制:① 没有固定值或计算列;② 没有Case表达式;
* ③ 没有 right outer join;④ 没有 Union;⑤ 没有子查询
DATA: gt_data TYPE STANDARD TABLE OF ty_sflight.
FIELD-SYMBOLS: <fs_sflight> TYPE ty_sflight.
SELECT
carrid
connid
fldate
seatsmax
seatsocc
FROM sflight
INTO TABLE gt_data
WHERE carrid = p_carrid.
LOOP AT gt_data ASSIGNING <fs_sflight>.
IF <fs_sflight>-seatsocc GT 300.
<fs_sflight>-status = 'High OCC'.
ELSE.
<fs_sflight>-status = 'Low OCC'.
ENDIF.
ENDLOOP.
* AS ABAP 7.4 SP05
* 存在以下限制: ① 无法使用 SAP HANA内置函数,如DAYS_BETWEEN;
* ② 无法使用 SAP HANA 数据库视图和存储过程
* 支持的新特性:① CASE;② COALESCE;③ 算术表达式:+,-,*,/;④ CAST类型转换;
* ⑤ 算术函数:DIV、MOD、ABS、FLOOR、CEIL、ROUND;
* ⑥ 聚合函数:SUM,COUNT,AVG,MAX,MIN;
* ⑦ 字符串连接符 &&;
* ⑧ right outer join;⑨ union and union all
SELECT
carrid,
connid,
fldate,
seatsmax,
seatsocc,
CASE WHEN seatsocc GT 300 THEN 'High OCC'
ELSE 'Low OCC'
END AS status
*into table @DATA(gt_data2) " syntax OK
FROM sflight
*into table @DATA(gt_data2) " syntax OK
WHERE carrid = @p_carrid
INTO TABLE @DATA(gt_data2).
* New Syntax 7.5
SELECT FROM sflight
FIELDS carrid,
connid,
fldate,
seatsmax,
seatsocc,
CASE WHEN seatsocc GT 300 THEN 'High OCC'
ELSE 'Low OCC'
END AS status
*into table @DATA(gt_data3). " syntax error
WHERE carrid = @p_carrid
INTO TABLE @DATA(gt_data3). " 必须放在最后
* 表达式&计算函数
DATA: lv_rebate TYPE p DECIMALS 2 VALUE '0.10'.
SELECT
'hello' && 'XLevon' AS char, " 字符串拼接
100 AS i_num, " 整型
@sy-langu AS sys_lan, " 系统语言
@lv_rebate AS p_num, " 定点小鼠
price,
( price * @lv_rebate ) AS rebate, " 折扣
round( ( price * @lv_rebate ), 1 ) AS round_col," 折扣保留一位小数
ceil( ( price * @lv_rebate ) ) AS ceil_col,
floor( ( price * @lv_rebate ) ) AS floor_col
FROM sflight
WHERE carrid = @p_carrid
INTO TABLE @DATA(gt_data_expression).
* 聚合函数
SELECT
carrid,
connid,
COUNT( DISTINCT ( fldate ) ) AS distinct_fldate,
SUM( seatsmax ) AS sum_seatsmax,
CAST( AVG( seatsocc ) AS INT4 ) AS avg_seatsocc
FROM sflight
WHERE carrid = @p_carrid
GROUP BY carrid, connid
INTO TABLE @DATA(gt_data_aggregate).
* 右外连接
SELECT
scarr~carrid,
scarr~carrname,
spfli~connid,
spfli~cityfrom,
spfli~cityto
FROM scarr
RIGHT OUTER JOIN spfli ON spfli~carrid = scarr~carrid
WHERE coalesce( scarr~carrid, 'NO CARR' ) <> 'NO CARR'
AND scarr~carrid IS NOT NULL "与上面这句作用相同
ORDER BY scarr~carrid, spfli~connid
INTO TABLE @DATA(gt_data_coalesce)
UP TO 10 ROWS.
* UNION & sub query
SELECT FROM sbook
FIELDS 1 AS type, carrid, connid, fldate, bookid,
CAST( loccuram AS FLTP ) / CAST( 2 AS FLTP ) AS div_field,
loccurkey
WHERE customid IN ( SELECT id FROM scustom WHERE name = 'Martin' )
UNION ALL
SELECT FROM sbook
FIELDS 2 AS type, carrid, connid, fldate, bookid,
CAST( loccuram AS FLTP ) / CAST( 2 AS FLTP ) AS div_field,
loccurkey
WHERE customid IN ( SELECT id FROM scustom WHERE name = @p_cust )
ORDER BY type, carrid, connid, fldate, bookid
INTO TABLE @DATA(gt_data_union).
* 判断数据记录是否存在
DATA: lv_msg TYPE string.
SELECT SINGLE @abap_true
FROM scustom
INTO @DATA(lv_exists)
WHERE name = @p_cust.
IF lv_exists EQ abap_true.
CONCATENATE 'Customer' p_cust 'Exists' INTO lv_msg SEPARATED BY space.
* lv_msg = 'Customer ' && p_cust && ' Exists'. " 前两个单词间空格丢失
ELSE.
lv_msg = 'Customer ' && | { p_cust } doesn't Exists|.
ENDIF.
* 字符串函数
SELECT
carrid,
left( carrid , 1 ) AS left1,
right( carrid , 1 ) AS right1,
substring( carrid , 1,1 ) AS substr1,
substring( carrid , 2,1 ) AS substr2
FROM spfli
INTO TABLE @DATA(gt_data_function)
UP TO 2 ROWS.
* 6)Select 内表
* select 内表,可以对内表使用sql的语法。例如:取内表某一列的最大值,就可以直接MAX,无需排序后,读第一行。
* 需要append a表 to B表时,但A表字段与B表字段数量不一致时,可以使
SELECT FROM @gt_data_coalesce AS a
FIELDS carrid AS carrier_id, carrname AS carrier_name
APPENDING TABLE @DATA(gt_carrier).
cl_demo_output=>write( gt_data ).
cl_demo_output=>write( gt_data2 ).
cl_demo_output=>write( gt_data3 ).
cl_demo_output=>write( gt_data_expression ).
cl_demo_output=>write( gt_data_aggregate ).
cl_demo_output=>write( gt_data_coalesce ).
cl_demo_output=>write( gt_data_union ).
cl_demo_output=>write( lv_msg ).
cl_demo_output=>write( gt_data_function ).
cl_demo_output=>write( gt_carrier ).
cl_demo_output=>display( ).
原创文章,转载请注明来源-X档案