处理数据

学习目标

  • 执行算术计算。

  • 应用字符串处理。

算术计算

算术表达式是具有值、运算符和函数组合的 ABAP 表达式,运行时系统对其进行处理以计算结果。对于算术表达式,结果类型取决于用作表达式输入的操作数类型。

可以在任何读取操作数位置使用算术表达式,例如,值分配的右侧。

以下视频介绍了算术表达式的基础知识。

视频:本节含 SAP 官方视频(视频 ID 1_kr2xs45i),需在 learning.sap.com 在线观看。

试试看:算术计算

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 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 ).
  1. 按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。

  2. 浏览源代码以熟悉概念。

  • 取消对不同计算和类型定义的注释。

  • 实施自己的计算。

字符串处理

字符串模板是结果类型为字符串的 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,您可以从多个预定义样式中进行选择,例如科学样式或工程样式。

可以使用连接操作符 && 将字段连接在一起。可以连接数据对象和字符串表达式的任意组合。

表达式的构成部分之间没有空格或其他分隔符进行连接。如果您需要空格或其他分隔符,则必须记住自己将其作为表达式的一部分插入,如第二个示例所示。

试用:字符串处理

  1. 与本课程的第一个练习一样,创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类。

  2. 将以下代码片段复制到方法 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 ).
  1. 按 CTRL + F3 激活类,按 F9 将其作为控制台应用执行。

  2. 浏览源代码以熟悉概念。

  • 取消注释行内声明变量 文本 的不同值分配以查看不同的结果。

  • 尝试您自己的分配。

声明变量和处理数据

在本练习中,您将创建一个基于两个数字执行计算的程序,然后格式化并输出结果。

模板:

解决方案:

  • /LRN/CL_S4D400_BTS_COMPUTE(全局类)

任务 1: 变量声明

在您自己的包中,创建新的全局类并为输入定义数字变量。

步骤

  1. 创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类(建议名称:ZCL_##_COMPUTE,其中 ## 代表组编号)。

  2. 选择 文件新建ABAP 类

  3. 在包字段中输入的名称。在名称字段中,输入名称 ZCL_##_COMPUTE,其中 ## 代表组编号。

  4. 输入描述。

  5. 接口组框中,选择添加

  6. 输入 IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。

  7. 选择下一步

  8. 选择传输请求,然后选择完成

  9. IF_OO_ADT_CLASSRUN~MAIN 方法中,为整数值声明两个变量(建议名称:number1number2)。

  10. 添加以下代码:

DATA number1 TYPE i.
DATA number2 TYPE i.
  1. 为两个数字变量中的每个变量实施值赋值。为第一个变量分配一个负值,为第二个变量分配一个正值。

  2. 添加以下代码:

number1 = -8.
number2 =  3.

任务 2: 数据处理

计算比率并将结果写入控制台。

步骤

  1. 实现计算两个数字比率的算术表达式。将结果存储在您使用内联声明声明的变量中(建议名称:result)。

  2. 添加以下代码:

DATA(result) = number1 / number2.
  1. 实施一个字符串模板,将如下文本放在一起:"6 / 3 = 2",其中变量的实际值不是 6、3 和 2。将结果存储在您使用内联声明声明的变量中(建议名称:输出)。

  2. 添加以下代码:

DATA(output) = |{ number1 } / { number2 } = { result }|.
  1. 调用方法 out->write(…) 将文本写入控制台。

  2. 按照上一练习中的操作继续。

任务 3: 激活并测试

激活并测试控制台应用。

步骤

  1. 激活此类。

  2. Ctrl + F3 激活类。

  3. 执行控制台应用。

  4. F9 执行控制台应用。

  5. 使用不同的输入值测试应用。

  6. 编辑值分配,然后像以前一样激活并执行。

任务 4: 控制结果精度

确保结果舍入为具有 2 个小数位的值,而不是整数值。

步骤

  1. 不使用内联声明,而是使用变量 result 的显式声明。使用允许指定小数位数的数字类型。

  2. 在方法 if_oo_adt_classrun~main 的开头,添加以下代码:

DATA result TYPE p LENGTH 8 DECIMALS 2.
  1. 在具有内联声明的代码行中,将 DATA(result) 替换为 result

  2. 激活类并再次测试。

  3. 按照先前的操作继续操作。

  4. 将您的代码与模型解决方案中的以下提取内容进行比较:

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.