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
} 
复制代码

 SUBSTRING

复制代码
IF cb_01 EQ 'X' .
    LOOP AT gt_out INTO gs_out .
      SELECT SINGLE belnr
        FROM bkpf AS t1
        WHERE substring( t1~awkey , 1, 10 )  = @gs_out-mblnr
        AND   substring( t1~awkey , 11, 4 )  = @gs_out-mjahr
        INTO @gs_out-belnr .
        MODIFY gt_out from gs_out .
    ENDLOOP .
  ENDIF .
"(1,10)表示从第一位开始取,取到第十位。
 

"1.截取字符
select t1~matnr,
       werks,
       charg,
       cuobj
  from mchb as t1
  left outer join inob as t2
  on substring( t2~objek , 1, 18 )  = t1~matnr  "1-18位 是物料号
  and substring( t2~objek, 41,10 )  = t1~charg  "41~50位 是批次
  where t2~klart = '023'
  into corresponding fields of table @lt_mchb.   

注意: into corresponding fields of table @lt_mchb.   必须放在最后面

2 replace ,但是B不能为空白 语法和1一样

REPLACE( bseg~zuonr , 'A','B' )  替换成B  

3 去掉字符(其他语言是去空格,这个可以去掉去空格,去a都可以)

 where LTRIM( RTRIM( bseg~zuonr,' ' ),' ' )  = '暂存'    
复制代码

 

posted @   艾靑  阅读(249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示