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,' ' ),' ' ) = '暂存'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本