Fork me on GitHub

我的BRF+自学教程(一):公式(formula)

Business Rule Framework Plus(业务规则框架,以下简称BRFplus或BRF+)是一个强大的工具, 它允许用户以直观的方式对规则建模,并在不同的应用程序中重用这些规则。通过它,业务顾问甚至业务用户可以自行在系统中实现自定义业务逻辑,而不必求助于程序开发者。

我在早些时间翻译过一篇BRF+的介绍文章:SAP中的BRF+。如果读者对这一工具还没什么概念的话,可以先读这篇文章。

我打算花些时间掌握这个工具,并将自己学习到的东西写下来,作为一个文章系列。主要的学习方法是看SAP官方文档和SCN文章,以及动手操作。本文是这个系列的第一篇,学习内容是公式。

如果你不喜欢理论内容,可以略过第一部分“基础知识”,直接读“示例部分”,但我还是建议你在创建好你的第一个Demo之后,回过头来读一遍基础知识部分。

 

本文链接:https://www.cnblogs.com/hhelibeb/p/9451960.html

转载请注明

 

基础知识

公式功能在BRF+中属于表达式(Expression)的一种,所以它也被称为公示表达式。公式表达式用于执行各种计算。 它能提供基本的数学运算(加法,减法,乘法,除法)、更高级的运算(如取幂或二进制AND)、比较(大于,小于等)、以及用于不同目的的各种公式函数,它们支持各种数据类型(日期和时间计算,字符串处理和操作,转换功能,系统功能等)。 使用者还可以在公式中输入注释,以帮助其他人更好地理解特定的计算步骤的目的。

编辑模式

系统提供两种编辑模式:正常模式和专家模式。它们的主要区别是:专家模式下,用户可以自由地手动修改公式文本;而正常模式下,用户只能通过点击按钮来输入公式内容。专家模式提供了更好的自由度和效率,而正常模式可以避免非法输入的风险。

运算数(Operands)

在公式表达式中,用户可以使用基本数据对象和表达式作为操作数。此外,如果公式包含以复杂类型的数据对象作为参数的函数(例如,所有表函数都会将表类型作为参数),则也可以在公式中使用结构或表数据对象

上下文数据(Context Data)

在BRFplus工作台中,系统会显示可被用作公式运算数的数据对象列表。列表中的数据对象继承自分配了公式表达式的函数的上下文。换句话说,尚未分配给函数的独立公式表达式无法使用任何上下文数据对象。

总之,公式的运算是对上下文数据的运算。

公式函数(Formula Functions

在公式表达式中,用户选择使用各种公式函数,以帮助检索,转换和分析数据。 为了更好地概述,函数被分为以下类别:

函数类别

例子

日期时间

以各种单位计算2个时间之间的差值;判断闰年;从给定的时间中提取任一部分;等等。

字符串处理

拼接、提取字符串;计算字符串长度;计算字符串相似度;等等。

数学函数

对数;幂; 三角函数; 等等。

注意:

传递给三角函数的参数必须以弧度给出(一个完整的圆 = 2 Pi)。

系统函数

检索特定系统信息,比如工厂日历,操作系统,登陆语言,等等。

表函数

检索有关在BRFplus表数据对象中的信息,如最大值或最小值,总和,平均值,行数等。

其它功能

转换数量和金额;数字取整;判断初始值。

在BRF+工作台,用户可以按分类查找自己需要的函数,也可以使用过滤器,如下图:

每个函数都有自己的文档,其中需求描述、使用示例、参数和注释信息等,点击“文档”列的显示链接,即可以查看,如图:

用户可以定义自己的函数,这需要进行一些编程工作,具体可以参考:

How to Create Formula Functions  ( http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/10e9c96f-0c8b-2b10-6885-f00adbeb314b).

金额数据的取整

在内部,BRF+永远在数据计算中使用在最大精度,最大精度根据数据对象的定义决定。然而,在涉及到公示表达式的结果是金额数据对象的时候,最大精度不会在结果上面表现出来。在该情况下,BRF+会使用为当前货币定义的小数位数,就算为数据对象定义了更多的小数位数,也会被无视。比如,

在一个公示表达式中存在这样的计算:25 € / 8

虽然内部结果是3.125 €,但是实际得到的结果数据是3.13 €,因为对于欧元而言,自定义表中只定义了2位小数位。

数量的量纲检查

系统会对包含量纲的数量运算进行特别的检查,因为实际上只有部分度量单位之间的计算是有意义的,比如:

公式

结果数据对象

有效性

长度 / 时间

速度

长度 / 质量

数字

×

示例部分

上面的内容也许略显冗长枯燥,下面是一个轻松的step by step的示例,我会创建一个公式,并把它分配给函数,其功能是将两个输入参数相加、并输出结果。此外我也会贴出调用这个BRF+函数的简单的ABAP代码。

1,打开BRF+工作台

输入事务代码BRF+或者BRFPLUS,如果能够打开一个包含左侧导航栏、有着欢迎界面的浏览器页面(Web Dynpro)应用,说明你可以使用BRF+。如果打不开或者系统提示某些错误的话,说明有可能存在配置问题,也可能是你的系统尚不支持BRF+,这种情况下请联系你的BASIS同事。

2,创建应用程序

点击图中左上角的“创建应用程序”,在弹出对话框内输入应用程序的名字、描述,存储类型选择定制(关于选项的区别,参考前文),开发包$tmp。填完后,点击右下角按钮“创建并导航到对象”

3,创建数据对象

想要在公式中计算,就要有用于被计算的数据对象。也就是上面提到的上下文数据(Context Data)。

右键点击应用名,选择创建->数据对象->元素(批量创建),如下图

 

因为我们要用到3个数据对象(两个输入对象,一个输出对象),所以选择批量创建。

在弹出窗口中输入数据技术信息,如下图,

创建3个数据对象,分别是amount_1,amount_2,amount_result,都是金额类型。点击确定。

展开左侧的应用,可以看到存在三个数据对象,对象状态是白色菱形,即未激活。依次选择它们,点击编辑->激活,激活成功后,对象状态会变为绿色方块,

4,创建公式

接下来,右键应用程序,选择创建->表达式->公式,在弹出对话框中输入公式名,点击“创建并导航到对象”,

 

点击“上下文对象”,此时,系统会提示我们尚未把公式分配给函数或规则集,因此无法使用上下文对象,因此我们需要先创建个函数,

 

5,创建函数并分配公式

右键应用程序,选择创建->函数,

在创建好的函数中,选择模式为“功能模式”,选择“顶层表达式”为上一步创建的公式,之后点击“添加现有数据对象”,

在弹出对话框中选中两个输入对象,

选择“结果金额”为结果对象(输出对象),

点击“保存”,

6,编辑公式

前往创建的公式,点击“上下文概览”,可以看到之前在函数中添加的数据对象,可以使用它们在公式中进行运算,

接下来,为公式分配一个结果数据对象,

这里我们使用的是普通模式的编辑模式,因此,公式的编辑要靠鼠标点击选项进行,点击“上下文”区域中的上下文,相应的对象会被添加到公式中,如下图

依次点击 金额1,+,金额2,可以得到一个加法公式,

激活公式,

7,模拟函数运行

在导航区域可以看到各个对象的激活情况,将全部对象激活后,函数已经处于可用状态。我们需要对它的功能进行测试。前往上面创建的函数,

点击“详细”中的“模拟”按钮,就可以模拟函数的运行,测试其工作效果了,

 

在下一屏幕,点击“继续”按钮,

在“模拟数据”部分输入测试数据,点击“执行”,

可以看到函数运行后的结果,至此,这个简单示例就完成了。

8,在ABAP中调用BRF+函数

配置工作已经完成,接下来是开发方面的工作,开发者不需要写业务逻辑,需要做的是在合适的地方调用已经配置好的函数。

每个BRF+都有一个唯一标识作为ID,可以通过ID来调用函数。可以在函数的“一般”属性中看到它的ID,如图,

在SE38创建程序,代码如下,

REPORT ztest_brfplus.

DATA(lo_fuction) = cl_fdt_factory=>if_fdt_factory~get_instance(
  )->get_function( '005056A477601EE8A7856D04576B0280' ).

DATA: i_amount1 TYPE if_fdt_types=>element_amount,
      i_amount2 LIKE i_amount1.

i_amount1 = VALUE #( number = '12.23' currency = 'EUR' ).
i_amount2 = VALUE #( number = '12.00' currency = 'EUR' ).

" Set the BRFplus function context ( input variables )
DATA(lo_context) = lo_fuction->get_process_context( ).
lo_context->set_value( : iv_name = 'AMOUNT_1' ia_value = i_amount1 ),
                         iv_name = 'AMOUNT_2' ia_value = i_amount2 ).

" Process the BRFplus function
lo_fuction->process(
  EXPORTING io_context = lo_context
  IMPORTING eo_result  = DATA(lo_result) ).

" Retrieve the BRFplus function result

DATA result LIKE i_amount1.

lo_result->get_value( IMPORTING ea_value = result ).

cl_demo_output=>display( result ).

运行程序,可以在弹出窗口中观察到结果为两个输入变量之和,如下图,

总结

以上是BRF+中公式表达式的基础知识和简单示例创建过程,配置的步骤顺序不是唯一的,可以按照你的实际使用情况调整。关于公式表达式相关的更多内容,可以参考:

Formula Expression - SAP Document

BRFplus Basics – How to call a function

BRFplus Basics – Handling of Amounts

在下一篇文章中,我会介绍Decision Table Expression相关的内容。

 

posted @ 2018-08-10 08:59  氢氦  阅读(5414)  评论(0编辑  收藏  举报