[SAP Abap] X-DOC: Open SQL nuevas características de la nueva sintaxis de SAP ABAP

X-DOC: Nuevas características de SAP ABAP nueva sintaxis Open SQL

1. Introducción

Desde que SAP lanzó SAP ON HANA y la versión adjunta de AS ABAP NW 7.40, la sintaxis ABAP también se ha actualizado mucho. Este artículo brindará una demostración DEMO de la parte de actualización de sintaxis de Open Sql.

Limitaciones de OpenSQL antes de NW 7.40:
① Sin valor fijo o columna calculada;
② Sin expresión de caso;
③ Sin unión externa derecha;
④ Sin unión;
⑤ Sin subconsulta

Nuevas características soportadas por OpenSQL desde NW 7.40:
① CASE;
② COALESCE;
③ Expresiones aritméticas: +, -, *, /;
④ Conversión de tipo CAST;
⑤ Funciones aritméticas: DIV, MOD, ABS, FLOOR, CEIL, ROUND;
⑥ Agregación funciones: SUM, COUNT, AVG, MAX, MIN;
⑦ Conector de cadena &&;
⑧ unión externa derecha;
⑨ Unión y unión todas
las limitaciones:
① No se pueden usar las funciones integradas de SAP HANA, como DAYS_BETWEEN;
② No se pueden usar las vistas de la base de datos de SAP HANA y procedimientos almacenados

2. Demostración

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

Artículo original, indique la fuente al reimprimir - Expediente X

Supongo que te gusta

Origin blog.csdn.net/XLevon/article/details/129223049
Recomendado
Clasificación