ABAP 新语法--Data Processing

news2024/9/29 11:42:35

1. String Template

新语法引入了字符串模板,用于处理字符串连接以及格式转换
字符串模板在 | … | 之间定义,主要分为两部分,固定文本和变量
其中,变量只能在 { … } 内使用,大括号之外的所有字符均作为固定文本使用,空格始终不会被忽略,见例1
在使用变量时,可以通过控制语句来指定数据的显示格式,如例2,将日期用系统格式输出
在固定文本中,如果出现 | ,{ } 或 \ 等特殊字符时,需要使用转义符 \

  DATA: lv_str TYPE char5 VALUE '123'.

  " 在竖线中间没有被大括号包裹的部分将始终被视为固定文本,空格始终不被忽略
  lv_str = |  { lv_str }|.
  WRITE: / lv_str.

  lv_str = '123'.
  " 尾部被截断
  lv_str = |567{ lv_str }|.
  WRITE: / lv_str.

在这里插入图片描述

2. Format Option

2.1 COUNTRY

根据指定国家 cty 格式化数据(数值/日期/时间),参考表 T005X 【 COUNTRY = cty 】

  DATA lv_str TYPE string.
  DATA lv_num TYPE p DECIMALS 3.

  " country可以根据t005x国家的配置表自动选择合适的日期/时间/数值
  DATA(lv_date) = CONV d( '20230614' ).
  DATA(lv_time) = CONV t( '161810' ).
  lv_num  =  '123456.123'.

  WRITE: / '中国:'.
  lv_str = |{ lv_date COUNTRY = 'CN ' }|.
  WRITE: / lv_str.
  lv_str = |{ lv_time COUNTRY = 'CN ' }|.
  WRITE: / lv_str.
  lv_str = |{ lv_num  COUNTRY = 'CN ' }|.
  WRITE: / lv_str.

  WRITE: / .
  WRITE: /  '美国:'.
  lv_str = |{ lv_date COUNTRY = 'US ' }|.
  WRITE: / lv_str.
  lv_str = |{ lv_time COUNTRY = 'US ' }|.
  WRITE: / lv_str.
  lv_str = |{ lv_num  COUNTRY = 'US ' }|.
  WRITE: / lv_str.

在这里插入图片描述

2.2 ALPHA

添加/移除前导零,返回值与字段类型一致,可使用CONV转换成其他的类型进行处理。默认不做变更(RAW)【 ALPHA = [ IN | OUT | RAW ] 】
以物料号加前导0作为示例

  DATA lv_matnr_in  TYPE mara-matnr VALUE '123456'.
  DATA lv_matnr_out TYPE mara-matnr VALUE '012345'.

  " 这种方式会直接按数据元素的长度补前导0
  " 物料号直接补齐40位前导0,不太对劲
  lv_matnr_in  = |{ lv_matnr_in  ALPHA = IN }|.
  lv_matnr_out = |{ lv_matnr_out ALPHA = OUT }|.

  lv_matnr_in  = '123456'.
  lv_matnr_out = '012345'.

  " 这个是专用于料号编码转换的函数
  " 删前导0无所谓两种方法都行,补前导0特殊字段特殊处理
  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input  = lv_matnr_in
    IMPORTING
      output = lv_matnr_in.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
    EXPORTING
      input  = lv_matnr_out
    IMPORTING
      output = lv_matnr_out.

在这里插入图片描述
在这里插入图片描述

2.3 CASE

将字符串进行大小写转换,默认为 RAW,该选项不会更改大小写格式【 CASE = [ RAW | LOWER | UPPER ] 】

  " CASE 在String Template当中可以转换字母的大小写
  DATA(lv_str) = 'AbCdEfG'.

  WRITE / |{ lv_str CASE = LOWER }|.  " 小写
  WRITE / |{ lv_str CASE = UPPER }|.  " 大写
  WRITE / |{ lv_str CASE = RAW }|.    " 默认

2.4 ZERO

  " ZERO 关键字的存在类似与一个if else语句,若为0则置空,否则保留源字符串
  DATA(lv_zero) = |{ 0 ZERO = NO }|.
  DATA(lv_str)  = |{ 123 ZERO = NO }|.

3. String Functions

3.1 STRLEN

获取字符串长度,当字符串类型为 CHAR 时,尾部空格会被忽略,当字符串类型为 STRING 时,尾部空格不会被忽略,仍会按字符被计入长度内

DATA(lv_strlen_c) = strlen( CONV char10( |1234567    | ) ).		" 7
DATA(lv_strlen_s) = strlen( CONV string( |ACDEFGH    | ) ).     " 10

3.2 FIND

搜索指定字符串并计算偏移量,没有遍历到时返回 -1
可以使用 SUB ( 固定文本 ) 或者 REGEX ( 正则表达式 ) 作为指定条件进行搜索
CASE = [ abap_true | abap_false ]:大小写检查,默认为 abap_true,即区分大小写
OCC = N:指定字符串在第 N 次出现,当 N 是负数时,从字符串右边开始遍历
OFF = N LEN = M:指定搜索区域,从第 N+1 为字符开始长度为 M 的范围

DATA(lv_find_sub) = find( val = 'ABA123CAD' sub = 'a' case = ' ' occ = 3 ).
DATA(lv_find_reg) = find( val = 'ABA123CAD' regex = '\d' off = 0 len = 3 ). 

3.3 COUNT

  • COUNT
    用法与 FIND 类似,但是返回值是指定字符串出现的次数,因此不能指定 OCC 参数
  • COUNT_ANY_OF
    计算指定字符串中的任一字符出现的总次数
  • COUNT_ANY_NOT_OF
    计算非指定字符串中任意字符出现的总次数
    例:
DATA(lv_count) = count( val = 'ABA123CAD' sub = 'a' case = ' ' ).
DATA(lv_count_any) = count_any_of( val = 'ABA123CAD' sub = '1B' ).
DATA(lv_count_not) = count_any_not_of( val = 'ABA123CAD' sub = '1B' ).

3.4 REPLACE

替换字符串,可以指定位置进行替换,也可以查找指定字符串并替换
WITH = new 指定用于替换的字符串
OCC = N 指定字符串第 N 次出现时进行替换,N 为 0 时表示需要全部替换
其他参数可参照 FIND 表达式
例:

DATA(lv_replace) = replace( val = 'ABA123CAD' off = 0 len = 4 with = '@12@' ).
DATA(lv_replace_sub) = replace( val = 'ABA123CAD' sub = 'a' with = '@' case = ' ' ).
DATA(lv_replace_reg) = replace( val = 'ABA123CAD' regex = '\d' with = '#' occ = 0 ). 

3.5 INSERT

插入字符串,可以使用 OFF 指定插入的位置,默认为 0
例:

DATA(lv_insert) = insert( val = 'ABCD' sub = '123' off = 2 ). 

3.6 CONDENSE

压缩字符串,默认会移除头部/尾部的空格,其他部分的空格都会被压缩至 1 位
DEL = del 指定需要删除的字符,指定后,从字符串两侧开始遍历并删除字符,直到出现非指定字符
FROM = from TO = to 处理完 DEL 后,再遍历字符串,将 from 中出现的字符,替换成 to 的第一位字符
在遍历过程中,当同一个字符连续出现时,会被当成一个整体进行替换,所有字符均区分大小写
例:

DATA(lv_condense_space) = condense( |  This  is   test | ).

DATA(lv_condense) = condense( val  = '  XXThis ISSS X sTringXX'
                              del  = |X |
                              from = 'TS' 
                              to   = 'to' ). 

3.7 CONCAT_LINES_OF

将内表中所有的记录连接起来,通过 sep 指定分隔符
例:

DATA: lt_data TYPE TABLE OF char10.
lt_data = VALUE #( ( 'ABC' ) ( '123' ) ( 'DEF' ) ).
DATA(lv_concat_lines) = concat_lines_of( table = lt_data sep = '@' ). 

3.8 REVERSE

字符串反转
例:

DATA(lv_reverse) = reverse( 'DEMO' ). 

3.9 TO_UPPER/TO_LOWER

将字符串转换成大写/小写
例:

DATA(lv_to_mixed) = to_mixed( val = 'THIS is @A STRIN@G' sep = '@' case = 'X’ min = 10 ).
DATA(lv_from_mixed) = from_mixed( val = 'This IS a string' ).
DATA(lv_to_upper) = to_upper( val = 'this IS a string' ).
DATA(lv_to_lower) = to_lower( val = 'THIS IS A STRING' ). 

4. Internal Table

4.1 Expressions

内表读取不再需要使用 READ TABLE,直接使用类似于数组的方式去读取
与READ TABLE读表方式类似,可以通过 INDEX 去读取指定位置的行,也可以根据条件去获取行,但无法指定BINARY SEARCH
默认情况下如果没有读到记录,会抛出异常 CX_SY_ITAB_LINE_NOT_FOUND
使用 OPTIONAL 语句时,没有读到记录也不会抛异常,而是返回空的结构
使用 DEFAULT 语句,在没有读到记录时,返回一个默认值,如果系统不支持这两种,则需要使用 TRY 语句来捕获异常

SELECT carrid, connid, countryfr, cityfrom
  FROM spfli INTO TABLE @DATA(lt_table) UP TO 3 ROWS.

DATA(lv_line_index) = lt_table[ 1 ]-carrid.

DATA(lwa_line_field) = lt_table[ carrid = 'AZ'
                                 connid = '0555' ].

DATA(lwa_line_optional) = VALUE #( lt_table[ 4 ] OPTIONAL ).

DATA(lwa_line_default) = VALUE #( lt_table[ 4 ] DEFAULT VALUE #( carrid = 'ZZ'
                                                                 connid = '0239'
                                                                 countryfr = 'SU'
                                                                 cityfrom = 'CITY_NO' ) ). 

4.2 Functions

LINES 计算内表总行数
LINE_EXISTS 判断根据特定条件能否在内表中读取到记录,返回值为布尔型数据
LINE_INDEX 获取内表中满足特定条件的记录所在的行数( INDEX )
例:

SELECT * FROM spfli INTO TABLE @DATA(lt_table) UP TO 3 ROWS.

DATA(lv_lines) = lines( lt_table ).
DATA(lv_exist) = xsdbool( line_exists( lt_table[ carrid = 'AZ' ] ) ).
DATA(lv_index) = line_index( lt_table[ carrid = 'AZ' ] ). 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows以管理员的身份运行CMD

电脑在装系统的时候,我的用户不是最高权限的管理员。 今天在工作的时候,使用CMD。运行失败,提示我需要使用管理员的身份运行CMD才可以。 使用右键点击左下角的windows图标 选择红框标注的那项。 以普通身份运行: 以管理员身份运行…

【iMessage频發软件苹果群发技术开源原创】当 APNs 发送通知到一个离线设备时,APNs 会把通知存储起来(一定的时间内),当设备上线时再递送给设备。

推荐内容IMESSGAE相关 作者✈️IMEAE推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容3.日历推 *** …

睿趣科技:抖音开网店现在做还来得及吗

随着社交媒体的迅速发展,抖音作为一款短视频平台,已经在年轻人中间取得了巨大的成功。而近年来,越来越多的人开始考虑在抖音上开设网店,以迎合这一潮流。那么,抖音开网店现在还来得及吗? 首先,要明确的是&…

C语言实现哈希搜索算法

一、哈希搜索算法原理 哈希搜索,也叫散列查找,是一种通过哈希表(散列表)实现快速查找目标元素的算法。哈希搜索算法通常适用于需要快速查找一组数据中是否存在某个元素的场景,其时间复杂度最高为 O(1),而平…

CSS(JavaEE初阶系列14)

目录 前言: 1.CSS是什么 1.1CSS基本语法 2.引入样式 2.1内部样式表 2.2行内样式表 2.3外部样式 3.选择器 3.1选择器的种类 3.1.1基础选择器 3.1.2复合选择器 4.常用元素属性 4.1字体属性 4.2文本属性 4.3背景属性 4.4圆角矩形 4.5元素的显示模式 4…

docker+haror

docker 2013年诞生,推荐单容器只运行一个程序或进程,形成一个分布式的应用模型。 总结下来就是:docker带来启动流程更快,运行效率较高、资源损耗较小,属于轻量级的服务。 docker的安装 推荐的一键化安装的脚本&#…

2022年第八届美亚杯个人赛

1.[单选题] 王晓琳在这本电子书籍里最后对哪段文字加入了重点标示效果(Highlight)?(2分) A. 卿有何妙计 B. 宝玉已是三杯过去了 C. 武松那日早饭罢 D. 就除他做个强马温罢 结合最后一题 2.[多选题] 王晓琳的手机里有一个 MTR Mobile (港)的手机程序(Mobile App)。 检视其数…

《QT+PCL》点云的点选与框选

《QT+PCL》点云的点选与框选 效果展示关键代码对应Qt6与pcl1.13对应Qt6与pcl1.12对应Qt5与pcl1.12对应Qt5与pcl1.11资源效果展示 关键代码 对应Qt6与pcl1.13 点选 //点选--------------回调函数 void MainWindow::pp_callback_PointsSelect(const

python中使用xml快速创建Caption和URL书签管理器应用程序

导语: 本文介绍如何使用wxPython库创建一个Caption和URL管理器应用程序。该应用程序具有图形用户界面,允许用户输入Caption和URL,并将其保存到XML文件中。此外,还提供了浏览文件夹并选择HTML文件的功能,并可以运行另一…

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了,今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构:小程序原生前端小程序云开发。 经历了前面教程的学习,大家有了一定的基础,所以本次分享重心主要是…

SOFABoot——基本使用(笔记)

文章目录 一、前言二、快速开始2.1 基本搭建2.2 测试是否成功2.3 其他部分日志测试异步启动 三、SOFABoot的模块化开发3.1 基于Spring上下文的隔离3.2 Root Application Context3.3 模块并行化启动3.4 JVM服务与RPC服务的发布与引用3.5 模块配置Module-NameRequire-ModuleSprin…

深入理解JVM——垃圾回收与内存分配机制详细讲解

所谓垃圾回收,也就是要回收已经“死了”的对象。 那我们如何判断哪些对象“存活”,哪些已经“死去”呢? 一、判断对象已死 1、引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加一&…

在IDEA中创建properties配置文件

第一步:在 src路径下找到resources文件 第二步:右击选择新建Resource Bundle配置文件 第三步:为Resource Bundle配置文件命名 完成创建

高效反编译luac文件

对于游戏开发人员,有时候希望从一些游戏apk中反编译出源代码,进行学习,但是如果你触碰到法律边缘,那么你要非常小心。 这篇文章,我针对一些用lua写客户端或者服务器的编译过的luac文件进行反编译,获取其源代码的过程。 这里我不赘述如何反编译解压apk包的过程了,只说重点…

k8s的pv和pvc创建

//NFS使用PV和PVC 1、配置nfs存储 2、定义PV 实现 下图的pv和pvc测试 pv的定义 这里定义5个PV,并且定义挂载的路径以及访问模式,还有PV划分的大小 vim /pv.yamlapiVersion: v1 kind: PersistentVolume metadata:name: pv001 spec:capacity:storage: …

【目标检测】目标检测 相关学习笔记

目标检测算法 PASCALVOC2012数据集 挑战赛主要分为 图像分类 目标检测 目标分割 动作识别 数据集分为四个大类 交通(飞机 船 公交车 摩托车) 住房(杯子 椅子 餐桌 沙发) 动物(鸟 猫 奶牛 狗 马 羊) 其他&a…

Java 单例模式简单介绍

何为单例模式 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 实现思路 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必…

MBR400100CT-ASEMI肖特基模块MBR400100CT

编辑:ll MBR400100CT-ASEMI肖特基模块MBR400100CT 型号:MBR400100CT 品牌:ASEMI 封装:M2 正向电流:400A 反向电压:100V 引线数量:2 芯片个数:2 芯片尺寸:102MIL…

计算机竞赛 python+深度学习+opencv实现植物识别算法系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的植物识别算法研究与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:4分 🧿 更多…

FPGA: RS译码仿真过程

FPGA: RS译码仿真过程 在上一篇中记录了在FPGA中利用RS编码IP核完成信道编码的仿真过程,这篇记录利用译码IP核进行RS解码的仿真过程,带有程序和结果。 1. 开始准备 在进行解码的过程时,同时利用上一篇中的MATLAB仿真程序和编码过程&#x…