zoukankan      html  css  js  c++  java
  • 我的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相关的内容。

  • 相关阅读:
    单例模式的五种实现模式
    JAVA基础语法
    买卖股票的最佳时机 III
    leetcode 正则表达式 (动态规划)
    leetcode LRU缓存机制(list+unordered_map)详细解析
    leetcode 下一个排列(C++,STL源码解析)
    leetcode 编辑距离(动态规划)
    leetcode 字典序排数
    leetcode 字典序第K小数字
    leetcode 有效的括号(栈模拟)
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/9451960.html
Copyright © 2011-2022 走看看