网站主题和建设,自己创建网站容易吗,开发小程序用什么语言,青岛网站建设seo优化1. 常量
1.1 常量赋值
常量字段可以用来为内表中的部分字段赋初始值#xff0c;字段类型和长度依据输入常量的值决定 SELECTmara~matnr, 物料号mara~matkl, 物料组mara~mtart, 物料类型 AS lkenz, 删除标识#xff0c;常量空字符串123 AS fla…1. 常量
1.1 常量赋值
常量字段可以用来为内表中的部分字段赋初始值字段类型和长度依据输入常量的值决定 SELECTmara~matnr, 物料号mara~matkl, 物料组mara~mtart, 物料类型 AS lkenz, 删除标识常量空字符串123 AS flag 常量数字FROM maraINTO TABLE DATA(lt_mara)UP TO 100 ROWS.cl_demo_outputdisplay( lt_mara ).像上面的删除标识字段就蛮有用的循环内表有时候需要根据复杂的条件决定该行目是否需要此时若不需要就打上删除标记’X’最后再用 delete {table} where lkenz ‘X’ 一次性删除
2. 宿主变量/表达式
2.1 作为SQL操作数
通常在查询语句中程序声明非数据库层级的变量前需要使用转义符 进行标识这些宿主变量通常被用作 Open SQL 语句中的操作数 在查询语句内部声明结构/内表时应该在 DATA 前使用转义符 此外在使用宿主表达式在 Open SQL 中作为操作数使用的一些表达式 时也需要添加转义字符如下例所示 注表达式内部的变量不需要再使用转义符且不能使用表达式外部的数据库对象 DATA: lv_maktx TYPE makt-maktx VALUE 物料描述.SELECTmara~matnr, 物料号mara~matkl, 物料组mara~mtart, 物料类型lv_maktx AS maktx, 物料描述 宿主变量( COND char10( WHEN sy-langu 1 THEN 中文WHEN sy-langu E THEN EnglishELSE 其他语言 ) ) AS langu 物料语言 宿主表达式FROM maraINTO TABLE DATA(lt_mara)UP TO 100 ROWS.cl_demo_outputdisplay( lt_mara ).3. 聚合表达式
3.1 对一组数据计算
聚合表达式用于对一组值执行计算并返回单一的值可以使用在SELECT或HAVING子句中不能用在WHERE子句 WHERE 子句的搜索条件在进行分组操作之前应用而 HAVING 的搜索条件则在进行分组操作之后应用 常见的聚合表达式如下表达式内部可选用DISTINCT对数据去重后再进行处理
AVG返回结果集的平均值返回类型默认为浮点型可通过AS语句返回指定类型如DECCURRQUAN或FLTPMAX返回结果集的最大值MIN返回结果集的最小值SUM返回结果集的汇总值COUNT返回结果集的条目数通常情况下使用COUNT( * ) / COUNT(*)需要使用DISTINCT时则要指定字段名 SELECTvbeln, 交货单号MAX( lfimg ) AS max_lfimg, 最大交货数量MIN( lfimg ) AS min_lfimg, 最小交货数量AVG( lfimg AS DEC( 14,3 ) ) AS avg_lfimg, 平均交货数量SUM( lfimg ) AS sum_lfimg, 总交货数量COUNT(*) AS count_lfimg, 总行目数AVG( DISTINCT lfimg AS DEC( 14,3 ) ) AS avg_dstct_lfimg, 去重交货数量SUM( DISTINCT lfimg ) AS sum_dstct_lfimg, 去重总交货数量COUNT( DISTINCT lfimg ) AS count_dstct_lfimg 去重总行目数FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]WHEREvbeln BETWEEN 8000000061 AND 8000000069GROUP BY vbelnINTO TABLE DATA(lt_data).SORT lt_data BY vbeln.4. 嵌入表达式
4.1 数值
在 SELECT LIST 使用内嵌表达式来处理数值使用时需注意传入参数的类型 常见的数值表达式如下
ABS获取绝对值CEIL向上取整FLOOR向下取整DIV除法计算取整数位DIVISION除法计算保留 N 位小数MOD除法计算取余数ROUND计算舍入值 DATA(lv_num) CONV lfimg( -123.456 ). 简化测试全部用宿主变量SELECT SINGLElv_num AS num , 原始值ABS( lv_num ) AS abs_num , 绝对值CEIL( lv_num ) AS ceil_num , 向上取整FLOOR( lv_num ) AS floor_num , 向下取整DIV( 5 , 2 ) AS div_num , 除法整数DIVISION( 5 , 2 , 2 ) AS divison_num , 除法保留n位小数MOD( 5 , 2 ) AS mod_num , 取余ROUND( lv_num , 2 ) AS rount_num_po , 四舍五入N为正数时保留小数点后N位ROUND( lv_num , -2 ) AS rount_num_ne 四舍五入N为负数时保留小数点前N位FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]INTO DATA(ls_data).4.2 字符串
在 SELECT LIST 使用内嵌表达式来处理字符串, 通常情况下字符串返回结果不能超过255个字符如果字符长度异常语法检查时会有错误提示
CONCAT连接字符串参数固定为2个各个表达式之间可以嵌套使用CONCAT内部也可以使用 连接字符串参数没有个数限制但不能将其他内嵌表达式当作参数使用仅作为操作符使用在非SELECT语句中也可以被使用CONCAT_WITH_SPACE连接字符串并用 N 个空格分隔该表达式结果不能超过1333个字符INSTR遍历字符串查找指定字符 s1 并返回第一次出现的位置没有查到则返回0LEFT/RIGHT从字符串左/右侧开始取出 N 位字符忽略前导/尾部的空格LENGTH计算字符串长度 SELECT concat( carrid , currcode ) AS concat ,carrid currcode AS concat_sign ,concat_with_space( carrid , currcode , 1 ) AS with_space ,instr( carrid , BA ) AS instr ,left( carrname , 4 ) AS left ,right( carrname , 4 ) AS right ,length( carrname ) AS lengthFROM scarrINTO TABLE DATA(lt_data)UP TO 5 ROWS.LOWER/UPPER将字符串转换成小写/大写LPAD/RPAD在字符串左侧/右侧填充指定字符 s1直到字符串长度为 N如果初始值长度N则不会填充但是超过 N 位的字符会被截断LTRIM/RTRIM从字符串左侧/右侧开始逐个删除指定字符 s1直到出现其他字符为止默认会删除尾部的空格REPLACE将字符串中所有的指定字符 s1 用其他字符 s2 代替SUBSTRING从字符串第 N 位开始截取长度为 M 的字符系统会默认检查截取范围是否超出该字段最大长度以避免造成DUMP
SELECT lower( carrid ) AS lower,upper( carrid ) AS upper,lpad( carrid , 5 , B ) AS lpad,rpad( carrid , 5 , B ) AS rpad,ltrim( carrid , A ) AS ltrim,rtrim( carrid , A ) AS rtrim,replace( carrid , A , ) AS replace,substring( carrname , 5 , 10 ) AS substring FROM scarrINTO TABLE DATA(lt_data)UP TO 3 ROWS. 4.3 日期/时间
在 SELECT LIST 使用内嵌表达式来处理日期/时间
DATS_IS_VALID/TIMS_IS_VALID校验日期/时间有效性有效时返回 1否则返回 0时间有效性的函数有报错可能版本不支持DATS_DAYS_BETWEEN计算日期d1和d2相隔的天数DATS_ADD_DAYS为指定日期加上N天DATS_ADD_MONTHS为指定日期加上N月 DATA(lv_date) CONV datum( 20181022 ).SELECT fldate AS original_date,dats_is_valid( fldate ) AS valid_date,
* tims_is_valid( sy-uzeit ) AS valid_time,dats_days_between( fldate , lv_date ) AS between,dats_add_days( fldate , 10 ) AS add_days,dats_add_months( fldate , 3 ) AS add_monthsFROM sflightINTO TABLE DATA(lt_data)UP TO 3 ROWS.4.4 时间戳
在 SELECT LIST 使用内嵌表达式来处理时间戳
TSTMP_IS_VALID校验时间戳有效性有效时返回 1否则返回 0TSTMP_CURRENT_UTCTIMESTAMP返回当前时间戳TSTMP_SECONDS_BETWEEN计算时间戳 t1 和 t2 相隔的秒数需要用赋值语句进行传参可以添加相应的错误处理TSTMP_ADD_SECONDS为指定时间戳加上 N 秒N 必须为 timestamp 类型
DATA(lv_stamp_now) CONV timestamp( 20190603133559 ).
DATA(lv_stamp_past) CONV timestamp( 20190602161408 ).SELECT tstmp_is_valid( lv_stamp_now ) AS valid_stamp,tstmp_current_utctimestamp( ) AS current_stamp,tstmp_seconds_between( tstmp1 lv_stamp_past,tstmp2 lv_stamp_now,on_error sql_tstmp_seconds_betweenset_to_null ) AS between,tstmp_add_seconds( tstmp lv_stamp_now,seconds ( CONV timestamp( 999 ) ),on_error sql_tstmp_add_secondsset_to_null ) AS add_secondFROM sflightINTO TABLE DATA(lt_data)UP TO 1 ROWS.4.5 时区
ABAP_USER_TIMEZONE获取用户时区不传参时默认获取当前用户当前 Client 的时区 ABAP_SYSTEM_TIMEZONE获取系统时区不传参时默认获取当前 Client 的时区
SELECT abap_user_timezone( user ( CONV uname( JIANGRE ) ),client 130,on_error sql_abap_user_timezoneset_to_null ) AS user_zone,abap_system_timezone( client 130,on_error sql_abap_system_timezoneset_to_null ) AS sys_zoneFROM sflightINTO TABLE DATA(lt_data)UP TO 1 ROWS. 4.6 日期/时间转换
在 SELECT LIST 使用内嵌表达式来转换日期/时间/时间戳
TSTMP_TO_DATS将时间戳转换成对应时区的日期TSTMP_TO_TIMS将时间戳转换成对应时区的时间TSTMP_TO_DST根据时间戳获取对应时区的夏令时标识DATS_TIMS_TO_TSTMP将日期和时间根据时区转换成时间戳
DATA(lv_stamp) CONV timestamp( 20190603133559 ).SELECT tstmp_to_dats( tstmp lv_stamp,tzone ( CONV tznzone( CET ) ) ) AS dats,tstmp_to_tims( tstmp lv_stamp,tzone ( CONV tznzone( CET ) ) ) AS tims,tstmp_to_dst( tstmp lv_stamp,tzone ( CONV tznzone( CET ) ) ) AS dst,dats_tims_to_tstmp( date sy-datum,time sy-uzeit,tzone ( CONV tznzone( CET ) ) ) AS tstmpFROM sflightINTO TABLE DATA(lt_data)UP TO 1 ROWS. 5. Case
5.1 条件语句
在 SELECT 语句中使用 CASE 作为条件语句与一般条件判断使用的 CASE 类似但有所区别 该语句不仅可以用于单值判断也可以根据复杂条件进行判断 此外WHEN OTHERS 不再适用需要使用 ELSE 代替语句结束时使用 END而不是 ENDCASE且需要定义别名
SELECT CASE currcodeWHEN EUR THEN carrnameELSE urlEND AS case_simple, 单值判断CASEWHEN currcode EUR THEN urlWHEN carrname THEN carrnameELSE carrid currcodeEND AS case_complex 复杂条件判断FROM scarrINTO TABLE DATA(lt_data)UP TO 5 ROWS. 6. NULL Value
在使用 LEFT / RIGHT OUTER JOIN 关联外表时如果主表中存在记录但在外表中没有关联到数据则外表的这部分字段的值在取数过程中始终为 NULL在取数完成后传入数据对象时NULL 会再转换成系统兼容的值通常为初始值 NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值可以在条件语句中用 IS [ NOT ] NULL 判断以及处理
DATA: lr_carrid TYPE RANGE OF s_carr_id.lr_carrid VALUE #( sign I option EQ ( low AA )( low CO ) ).
SELECT DISTINCTr~carrid,CASEWHEN t~seatsocc IS NULL THEN IS NULLWHEN t~seatsocc IS NOT NULL THEN IS NOT NULLEND AS field_statusFROM scarr AS rLEFT OUTER JOIN sflight AS t ON t~carrid r~carridINTO TABLE DATA(lt_data)WHERE r~carrid IN lr_carrid.