我的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相关的内容。
我的BRF+自学教程(一):公式(formula)的更多相关文章
- 我的BRF+自学教程(三):动态技术
开发者们可以在编程中使用各种动态技术,比如RTTS,比如通过动态的类创建和多态来实现功能的平滑扩展.BRF+开发中也存在一些动态手段.本文将介绍3种不同场景下的动态实践方式.其中第一种是纯配置的,第二 ...
- 我的BRF+自学教程(二):跟踪模式(trace mode)
使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况. BRFplus可以通过配置的方式实现业务逻辑,使得业务人员把业 ...
- HMM 自学教程(八)总结
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在HMM 学习最佳范例,这是针对国外网站上一个 HMM 教程的翻译,作者功底很深,翻译得很精彩,且在 ...
- HMM 自学教程(七)前向后向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(六)维特比算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(五)前向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(四)隐马尔科夫模型
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(三)隐藏模式
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(二)生成模型
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
随机推荐
- 【转载】C#将图片以二进制流的方式存入数据库
在C#开发应用程序的过程中,图片一般会存放在文件系统中,当然图片也可以二进制的方式存放到数据库中,不过一般不建议存放在数据库中,因为图片占用的空间还是挺大的,特殊情况下可以考虑将图片存在数据.此文将介 ...
- IIS配置文件上传大小限制
2018-08-28 IIS配置文件上传大小限制 问题:上传文件过大导致上传不了,直接在webconfig里做以下配置会导致程序出错,这个需要在IIS里配置 <system.web> &l ...
- Android BrocastReceiver解析
简介 BroadcastReceiver(广播接收器)是Android四大组件之一,是一个用来响应系统范围内的广播组件,可以从Android系统和其它app发送或接收广播消息,类似于发布 - 订阅设计 ...
- Java垃圾回收器的工作原理
上课,老师照本宣科,实在难以理解,干脆就看书包里的Java书,正好看了Java的垃圾回收器是如何工作的,觉得有必要记录一下. 参考于 Java编程思想第四版(Thinking in Java) 老年代 ...
- angular $watch 一个变量的变化
$scope.$watch('custArea', function(newValue, oldValue) { angular.forEach(newValue, function(item, ke ...
- web移动端,需要清楚设备像素比devicePixelRatio的应用
我们这里所说的devicePixelRatio其实指的是window.devicePixelRatio, 被所有WebKit浏览器以及Opera所支持. 概念 devicePixelRatio ,它是 ...
- BZOJ4804: 欧拉心算(莫比乌斯反演 线性筛)
题意 求$$\sum_1^n \sum_1^n \phi(gcd(i, j))$$ $T \leqslant 5000, N \leqslant 10^7$ Sol 延用BZOJ4407的做法 化到最 ...
- Python模块之信号(signal)
在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...
- 1.Odoo产品分析系列 – 目录
Odoo产品分析 (一) – 一切为零 Odoo产品分析 (二) – 商业板块(1) – 销售(1) Odoo产品分析 (二) – 商业板块(1) – 销售(2) Odoo产品分析 (二) – 商业板 ...
- View的getMeasuredWidth和getWidth有什么区别?
getMeasuredWidth 为view的测量宽度. getWidth为view的最终宽度. (这里只讨论宽度,高度也是一样的道理) 那么它们之间有什么区别呢? 测量宽度是在view的measur ...