我的BRF+自学教程(一):公式(formula)
Business Rule Framework Plus(业务规则框架,以下简称BRFplus或BRF+)是一个强大的工具, 它允许用户以直观的方式对规则建模,并在不同的应用程序中重用这些规则。通过它,业务顾问甚至业务用户可以自行在系统中实现自定义业务逻辑,而不必求助于程序开发者。
函数类别 |
例子 |
---|---|
日期时间 |
以各种单位计算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相关的内容。