【SAP Abap】X-DOC:SAP ABAP 新语法之 Open SQL 新增特性

X-DOC:SAP ABAP 新语法之 Open SQL 新增特性

1、前言

自从 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 数据库视图和存储过程

2、演示

*&---------------------------------------------------------------------*
*& 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.

* 6Select 内表
*  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档案

猜你喜欢

转载自blog.csdn.net/XLevon/article/details/129223049
今日推荐