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

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,' ' ),' ' ) = '暂存'

相关文章

刻录光盘价格(刻录光盘价格多少钱一张)
英国365bet网址

刻录光盘价格(刻录光盘价格多少钱一张)

📅 07-03 🔍 2121
join是什么意思
速发365app下载

join是什么意思

📅 11-08 🔍 5209
消防员模拟器烈焰行动在哪玩-Firefighting Simulator Ignite游戏游玩平台介绍