处理数据
学习目标
执行算术计算。
应用字符串处理。
算术计算
算术表达式是具有值、运算符和函数组合的 ABAP 表达式,运行时系统对其进行处理以计算结果。对于算术表达式,结果类型取决于用作表达式输入的操作数类型。
可以在任何读取操作数位置使用算术表达式,例如,值分配的右侧。
以下视频介绍了算术表达式的基础知识。
视频:本节含 SAP 官方视频(视频 ID
1_kr2xs45i),需在 learning.sap.com 在线观看。
试试看:算术计算
与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。
将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:
* Declarations
**********************************************************************
" comment/uncomment these line for different result types
TYPES t_result TYPE p LENGTH 8 DECIMALS 2.
* TYPES t_result TYPE p LENGTH 8 DECIMALS 0.
* TYPES t_result TYPE i.
DATA result TYPE t_result.
* Calculations
**********************************************************************
" comment/uncomment these lines for different calculations
result = 2 + 3.
* result = 2 - 3.
* result = 2 * 3.
* result = 2 / 3.
*
* result = sqrt( 2 ).
* result = ipow( base = 2 exp = 3 ).
*
* result = ( 8 * 7 - 6 ) / ( 5 + 4 ).
* result = 8 * 7 - 6 / 5 + 4.
* Output
**********************************************************************
out->write( result ).
按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。
浏览源代码以熟悉概念。
取消对不同计算和类型定义的注释。
实施自己的计算。
字符串处理

字符串模板是结果类型为字符串的 ABAP 表达式。可以在任何读取操作数位置(例如,值分配的右侧)使用字符串模板。
字符串模板以竖线符号 ( |) 开头和结尾。最简单的可能字符串模板仅包含文字文本。在这种形式中,字符串模板与字符串文字实际上并不不同。
将字符串模板与字符串文字区分开的功能是嵌入表达式的功能。嵌入式表达式是由一对花括号({ 和 })括起来的 ABAP 表达式。在运行时,ABAP 会评估嵌入式表达式并将结果转换为字符串。在最终结果中,此字符串将替换嵌入的表达式(连同花括号括起来)。
注意
ABAP 语法在左括号后至少需要一个空格,在右括号前至少需要一个空格。
当然,一个字符串模板可以包含多个嵌入式表达式。
在花括号内,您可以放置任何类型的 ABAP 表达式:算术表达式,如上例所示,但单个变量甚至文字都可以用作嵌入式表达式。

字符串模板的一个重要用例是控制输出数据的格式。
在第一个示例中,变量 the_date 的类型为 d,包含内部(原始)格式 YYYYMMDD 的日期(其中 YYYY 表示年,MM 表示两位数月份,DD 表示两位数日期)。在字符串模板中使用变量 the_date 作为嵌入表达式时,结果将与内部格式相同。但是,当您在花括号中添加格式选项 DATE = <date_format> 时,系统会将值格式化为日期。如果添加 DATE = ISO,则输出将为 ISO 格式。使用 DATE = USER 时,输出格式取决于当前用户的用户设置。
第二个示例说明了可用于格式化数字的一些选项。使用 NUMBER 控制数字的常规格式,例如,是使用小数点还是使用小数逗号。使用 SIGN 控制符号的位置以及是否显示加号 (+)。使用 STYLE,您可以从多个预定义样式中进行选择,例如科学样式或工程样式。

可以使用连接操作符 && 将字段连接在一起。可以连接数据对象和字符串表达式的任意组合。
表达式的构成部分之间没有空格或其他分隔符进行连接。如果您需要空格或其他分隔符,则必须记住自己将其作为表达式的一部分插入,如第二个示例所示。
试用:字符串处理
与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。
将以下代码片段复制到方法 if_oo_adt_classrun~main() 的实施部分:
METHOD if_oo_adt_classrun~main.
* Declarations
**********************************************************************
TYPES t_amount TYPE p LENGTH 8 DECIMALS 2.
DATA amount TYPE t_amount VALUE '3.30'.
DATA amount1 TYPE t_amount VALUE '1.20'.
DATA amount2 TYPE t_amount VALUE '2.10'.
DATA the_date TYPE d VALUE '19891109'.
DATA my_number TYPE p LENGTH 3 DECIMALS 2 VALUE '-273.15'.
DATA part1 TYPE string VALUE `Hello`.
DATA part2 TYPE string VALUE `World`.
* String Templates
**********************************************************************
" comment/uncomment the following lines for different examples
DATA(text) = |Hello World|.
* DATA(text) = |Total: { amount } EUR|.
* DATA(text) = |Total: { amount1 + amount2 } EUR|.
* Format Options
**********************************************************************
"Date
* DATA(text) = |Raw Date: { the_date }|.
* DATA(text) = |ISO Date: { the_date Date = ISO }|.
* DATA(text) = |USER Date:{ the_date Date = USER }|.
"Number
* DATA(text) = |Raw Number { my_number }|.
* DATA(text) = |User Format{ my_number NUMBER = USER }|.
* DATA(text) = |Sign Right { my_number SIGN = RIGHT }|.
* DATA(text) = |Scientific { my_number STYLE = SCIENTIFIC }|.
* String expression (concatenation Operator)
**********************************************************************
* DATA(text) = part1 && part2.
* DATA(text) = part1 && | | && part2.
* DATA(text) = |{ amount1 } + { amount2 }| &&
* | = | &&
* |{ amount1 + amount2 }|.
* Output
**********************************************************************
out->write( text ).
按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。
浏览源代码以熟悉概念。
取消注释行内声明变量 文本 的不同值分配以查看不同的结果。
尝试您自己的分配。
声明变量和处理数据
在本练习中,您将创建一个基于两个数字执行计算的程序,然后格式化并输出结果。
模板:
无
解决方案:
/LRN/CL_S4D400_BTS_COMPUTE(全局类)
任务 1: 变量声明
在您自己的包中,创建新的全局类并为输入定义数字变量。
步骤
创建一个实施接口
IF_OO_ADT_CLASSRUN的新全局类(建议名称:ZCL_##_COMPUTE,其中 ## 代表组编号)。选择 文件→新建→ABAP 类 。
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_COMPUTE,其中 ## 代表组编号。输入描述。
在接口组框中,选择添加。
输入
IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。选择下一步。
选择传输请求,然后选择完成。
在 IF_OO_ADT_CLASSRUN~MAIN 方法中,为整数值声明两个变量(建议名称:
number1和number2)。添加以下代码:
DATA number1 TYPE i.
DATA number2 TYPE i.
为两个数字变量中的每个变量实施值赋值。为第一个变量分配一个负值,为第二个变量分配一个正值。
添加以下代码:
number1 = -8.
number2 = 3.
任务 2: 数据处理
计算比率并将结果写入控制台。
步骤
实现计算两个数字比率的算术表达式。将结果存储在您使用内联声明声明的变量中(建议名称:
result)。添加以下代码:
DATA(result) = number1 / number2.
实施一个字符串模板,将如下文本放在一起:"6 / 3 = 2",其中变量的实际值不是 6、3 和 2。将结果存储在您使用内联声明声明的变量中(建议名称:
输出)。添加以下代码:
DATA(output) = |{ number1 } / { number2 } = { result }|.
调用方法
out->write(…)将文本写入控制台。按照上一练习中的操作继续。
任务 3: 激活并测试
激活并测试控制台应用。
步骤
激活此类。
按
Ctrl + F3激活类。执行控制台应用。
按
F9执行控制台应用。使用不同的输入值测试应用。
编辑值分配,然后像以前一样激活并执行。
任务 4: 控制结果精度
确保结果舍入为具有 2 个小数位的值,而不是整数值。
步骤
不使用内联声明,而是使用变量
result的显式声明。使用允许指定小数位数的数字类型。在方法
if_oo_adt_classrun~main的开头,添加以下代码:
DATA result TYPE p LENGTH 8 DECIMALS 2.
在具有内联声明的代码行中,将
DATA(result)替换为result。激活类并再次测试。
按照先前的操作继续操作。
将您的代码与模型解决方案中的以下提取内容进行比较:
METHOD if_oo_adt_classrun~main.
* Declarations
**************************
DATA number1 TYPE i.
DATA number2 TYPE i.
DATA result TYPE p LENGTH 8 DECIMALS 2.
* Input Values
**************************
number1 = -8.
number2 = 3.
* Calculation
**************************
* DATA(result) = number1 / number2. "with inline declaration
result = number1 / number2.
DATA(output) = |{ number1 } / { number2 } = { result }|.
* Output
**************************
out->write( output ).
ENDMETHOD.