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