SAP SQL取数新语法汇总(持续更新)

FILTER关键字筛选内表数据

  DATA: GT_FILTER TYPE HASHED TABLE OF GTY_ALV WITH UNIQUE KEY SEL.
  GT_FILTER = VALUE #( ( SEL = 'X' ) ).
  GT_ALV_SEL = FILTER #( GT_ALV IN GT_FILTER WHERE SEL = SEL ) .

 定义变量直接参考结构 MDPS

 DATA(LV_MDPS) = VALUE MDPS( PLAAB = '2' PLANR = 'D' ).

 调用函数传参

*------------------旧语法------------------
  ORDERDATA = VALUE #(
                      ORDER_TYPE        = 'ZX05'          "订单类型
                      MATERIAL          = P_FS_ALV-MATNR1 "销售物料
                      PLANT             = P_FS_ALV-WERKS  "工厂
                      BASIC_START_DATE  = P_FS_ALV-PSTTR  "基础开始日期
                      BASIC_END_DATE    = P_FS_ALV-PSTTR  "基准结束日期
                      QUANTITY          = P_FS_ALV-BDMNG2 "订单数量
                      ).

*&--- 生成工单
  CALL FUNCTION 'BAPI_PRODORD_CREATE'
    EXPORTING
     ORDERDATA    = ORDERDATA
    IMPORTING
      RETURN       = RETURN
      ORDER_NUMBER = ORDER_NUMBER
      ORDER_TYPE   = ORDER_TYPE.

*------------------新语法------------------

*&--- 生成工单
  CALL FUNCTION 'BAPI_PRODORD_CREATE'
    EXPORTING
*     ORDERDATA    = ORDERDATA
      ORDERDATA    = VALUE BAPI_PP_ORDER_CREATE(
                                                ORDER_TYPE        = 'ZX05'          "订单类型
                                                MATERIAL          = P_FS_ALV-MATNR1 "销售物料
                                                PLANT             = P_FS_ALV-WERKS  "工厂
                                                BASIC_START_DATE  = P_FS_ALV-PSTTR  "基础开始日期
                                                BASIC_END_DATE    = P_FS_ALV-PSTTR  "基准结束日期
                                                QUANTITY          = P_FS_ALV-BDMNG2 "订单数量
                                                )
    IMPORTING
      RETURN       = RETURN
      ORDER_NUMBER = ORDER_NUMBER
      ORDER_TYPE   = ORDER_TYPE.

 SQL 汇总借贷项S,H的金额S为负数

SELECT
SUM( CASE SHKZG WHEN 'S' THEN CAST( WRBTR AS CURR( 31,2 ) ) WHEN 'H' THEN CAST( WRBTR * -1 AS CURR( 31,2 ) ) END ) AS WRBTR
FROM BSIK_VIEW
WHERE HKONT = '2202000100'
AND LIFNR = '0000100001'
AND BUKRS = '1010'
INTO TABLE @DATA(LT_TOTAL).

SELECT语句,非DB中字段创建(类型、长度、初始值等)

DATA LV_CURR_23 TYPE FINS_VTCUR12.

SELECT
BELNR,
RYEAR,
RBUKRS,
CAST( CONCAT( BELNR,RYEAR ) AS CHAR( 20 ) ) AS OBJ_KEY,
CAST( @SPACE AS CHAR( 10 ) ) AS EXT_FD01,
@LV_CURR_23 AS CURR_23  "通过定义字段的方式,在SQL取数的时候创建字段
FROM ACDOCA
WHERE RBUKRS IN @S_BUKRS
AND   RYEAR = '2018'
INTO TABLE @DATA(LT_ACDOCA).
  
*OBJ_KEY 和 EXT_FD01即为新增字段    

*CAST( CONCAT( BELNR,RYEAR ) AS CHAR( 20 ) ) AS OBJ_KEY,
*CAST( @SPACE AS CHAR( 10 ) ) AS EXT_FD01

*OBJ_KEY 类型CHAR  长度20   初始值= CONCAT( BELNR,RYEAR ) 

*EXT_FD01 类型CHAR  长度10   初始值=SPACE 。

 初始化RANGE表

INITRANGE:S_HKONT 'BT' '1122000000' '1122099999'. "应付账款-材料-关联
INITRANGE:S_HKONT 'EQ' '1122000000' ''. "应付账款-材料-非关联
INITRANGE:S_HKONT 'EQ' '1122000100' ''. "应付账款-暂估-材料
INITRANGE:S_HKONT 'EQ' '1122010000' ''. "应付账款-固定资产-关联
INITRANGE:S_HKONT 'EQ' '1122010100' ''. "应付账款-固定资产-非关联

 取最大日期下的最大条件记录号

    SELECT
    A~MATNR,
    MAX( A~DATAB ) AS DATAB,
    MAX( A~KNUMH ) AS KNUMH
    FROM
    A305 AS A
    WHERE A~KSCHL = 'ZX00'
    AND   A~MATNR = 'ZB.M005-R0000'
    AND   A~DATAB = ( SELECT MAX( DATAB ) AS DATAB FROM A305 WHERE MATNR = A~MATNR )
    GROUP BY  A~MATNR
    INTO TABLE @DATA(LT_A305)
    .

Open SQL LPAD与 RPAD 函数(填充字符串,前导零)

在ABAP中使用LPAD及 RPAD 函数,需要符合ABAP Open SQL的语法规则,包括ABAP中的变量(宿主)要用@转义,表中的字段必须使用逗号分隔,INTO放置在SQL的最后等,LPAD与 RPAD 函数可以在Select中为获取的字段值填充指定的字符串,在ABAP中的语法格式分别为LPAD( arg, len, src );RPAD( arg, len, src ) ,三个参数分别指定了操作字段;填充后值的长度;填充字符

原表数据:

 LPAD函数从左侧填充:

SELECT
LPAD( CARRNAME,18,'&' ) AS CARRNAME, "LPAD函数从左侧填充
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE LENGTH( CARRNAME ) > 9 "判断字符长度
INTO TABLE @DATA(RESULT6).

SELECT 
RPAD( CARRNAME ,15,'!') AS CARRNAME, "RPAD函数从左侧填充
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE LENGTH( CARRNAME ) > 9
INTO TABLE @DATA(RESULT7).

 CONCAT拼接字符串

*&--- CONCAT 在sql链表数据的使用方法,一定要在左边
SELECT *
FROM RSEG
INNER JOIN BKPF
ON CONCAT( RSEG~BELNR, RSEG~GJAHR ) = BKPF~AWKEY
INTO TABLE @DATA(TARGET).

Open SQL LTRIM与 RTRIM 函数(去除两端字符串,去前导零)

在ABAP中使用LTRIM与 RTRIM 函数,需要符合ABAP Open SQL的语法规则,包括ABAP中的变量(宿主)要用@转义,表中的字段必须使用逗号分隔,INTO放置在SQL的最后等,LTRIM与 RTRIM 函数可以在Select中为获取的字段值去除指定的字符串,在ABAP中的语法格式分别为LTRIM( arg, char );RTRIM( arg, char ) ,两个参数分别指定了操作字段和去除字符
原表数据:

LTRIM函数从左侧去除字符:

DATA:LV_CHAR TYPE CHAR40.
LV_CHAR = '%' && 'XX' && '%' .

SELECT 
LTRIM( CARRNAME,'X' ) AS CARRNAME,
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE CARRNAME LIKE @LV_CHAR
INTO TABLE @DATA(RESULT8).

结果展示:

 RTRIM函数从右侧去除字符:

DATA: LV_CHAR TYPE CHAR40.
LV_CHAR = '%' && 'XX' && '%' .

SELECT LTRIM( CARRNAME,'X' ) AS CARRNAME ,
MANDT ,
CARRID ,
CURRCODE
FROM SCARR
WHERE CARRNAME LIKE @LV_CHAR
INTO TABLE @DATA(RESULT8).

Open SQL LEFT与RIGHT函数

在ABAP中使用LEFT与RIGHT函数,需要符合ABAP Open SQL的语法,包括ABAP中的变量(宿主)要用@转义,列表中的元素必须使用逗号分隔,INTO放置在SQL的最后,LEFT函数可以截取字段值中从左侧开始的部分字符,而RIGHT函数是从右侧截取,在语法中可以定义截取的长度

原表数据:

 LEFT函数

SELECT
LEFT( CARRNAME,2 ) AS LEFT,
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE LENGTH( CARRNAME ) > 9
INTO TABLE @DATA(RESULT2).

 

结果展示:

RIGHT函数

SELECT
RIGHT( CARRNAME,3 ) AS RIGHT,
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE LENGTH( CARRNAME ) > 9
INTO TABLE @DATA(RESULT3).

 

结果展示:

Open SQL REPLACE函数(字符串替换)

在ABAP中使用REPLACE函数,需要符合ABAP Open SQL的语法规则,包括ABAP中的变量(宿主)要用@转义,表中的字段必须使用逗号分隔,INTO放置在SQL的最后等,L REPLACE函数可以在Select中为替换值中的某段字符串,在ABAP中的语法格式为REPLACE( arg1, arg2, arg3 ) , 其意为用arg3替换arg1中出现的所有arg2

原表数据:

 REPLACE函数字符串替换:

SELECT 
REPLACE( CARRNAME,'PX','&*' ) AS CARRNAME,
MANDT,
CARRID,
CURRCODE
FROM SCARR
WHERE CARRID = 'PS'
INTO TABLE @DATA(RESULT10).

函数coalesce的用法

SQL实例

select coalesce(success_cnt, 1) from tableA

当success_cnt 为null值的时候,将返回1,否则将返回success_cnt的真实值。

select coalesce(success_cnt,period,1) from tableA

当success_cnt不为null,那么无论period是否为null,都将返回success_cnt的真实值(因为success_cnt是第一个参数),当success_cnt为null,而period不为null的时候,返回period的真实值。只有当success_cnt和period均为null的时候,将返回1。

@AbapCatalog.sqlViewName: 'ZSALESORDERS'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Order Information'
define view ZSalesOrders as select from vbak
{
  key vbak.vbeln,
  vbak.erdat,
  vbak.status,
  COALESCE(vbak.status, CASE WHEN vbak.erdat <= '20230730' THEN '已完成' ELSE '未完成' END) as status_with_default
} 

 

posted @ 2023-07-20 09:32  艾靑  阅读(60)  评论(0编辑  收藏  举报