使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况。

BRFplus可以通过配置的方式实现业务逻辑,使得业务人员把业务逻辑的实现掌握在自己手中,此外,跟踪(tracing)功能的存在使得业务逻辑应用的执行情况也变得清晰可见。

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

目的

跟踪模式有以下用处:

  • 有助于找到BRF+应用运行结果与预期不一致的原因。
  • 统计各规则的使用情况,从而理解规则调整的影响和风险。
  • 统计输出结果的分布情况。

跟踪信息可以帮助人们进一步理解业务的实际执行情况,确定哪些场景是常见的、哪些是偶然的甚至永不出现的,从而进一步优化业务逻辑实现。

实现

虽然跟踪模式可以服务业务,但是因为BRF+应用需要通过ABAP代码来调用,所以实现部分会是和ABAP相关的内容。

我创建了一个简单的BRF+应用,其功能是根据输入的采购订单编号,到数据库表EKKO中查询采购组和采购订单类型,根据这两个字段的组合,来决定是否需要审批。涉及到2个表达式,1个是数据库查找(DB lookup),还有一个是决策表(decision table)

调用

ABAP调用代码,

REPORT ztest_brf3.

PARAMETERS: p_ebeln TYPE ebeln.

START-OF-SELECTION.

*获取function实例
DATA(lo_fuction) = CAST cl_fdt_function(
cl_fdt_factory=>if_fdt_factory~get_instance(
)->get_function( '005056A4CCA61ED8AAF183894A92CC2B' ) ). *获取context实例
DATA(lo_context) = CAST cl_fdt_context(
lo_fuction->if_fdt_function~get_process_context( ) ). *将将采购订单号输入到context
lo_context->if_fdt_context~set_value(
: iv_name = 'EBELN' ia_value = p_ebeln ) . *处理,获取结果和跟踪数据
lo_fuction->if_fdt_function~process(
EXPORTING io_context = lo_context
iv_trace_mode = if_fdt_constants=>gc_trace_mode_lean
IMPORTING eo_result = DATA(lo_result)
eo_trace = DATA(lo_trace) ).

如代码所示,可以通过IF_FDT_FUNCTION~PROCESS方法的IV_TRACE_MODE参数控制跟踪模式。跟踪信息会存储在系统数据库中中,可以在任何时间点进行查看。 跟踪功能仅将最少的数据写入系统数据库。 这是通过记录对象引用和数据更改而不是在某个特定时间点显式写下有关给定对象的所有可用信息来实现的。 此策略可使数据库内容较少,并降低性能上的负面影响。

如果要在内存中直接获得跟踪结果,可以在返回对象lo_trace的属性IF_FDT_LEAN_TRACE~MTS_RECORD中看到

ID是BRF+应用中的各个对象的ID,PARENT_ID用来表示它们间的层级关系,REF字段则是各步骤的运行结果的值的引用。

跟踪的读取和显示

可以增加一些代码,获取ID对应的BRF+对象的描述文本,让跟踪记录的可读性更好些:

DATA: lo_admin_data TYPE REF TO cl_fdt_admin_data,
id_initial TYPE if_fdt_types=>id VALUE ``. data: l_result TYPE string. FIELD-SYMBOLS: <data> TYPE any. DATA(lo_fdt_trace) = CAST cl_fdt_trace( lo_trace ). DATA(lo_brf_query) = CAST if_fdt_query( cl_fdt_factory=>get_instance( )->get_query( ) ). DATA(out) = cl_demo_output=>new( ). LOOP AT lo_fdt_trace->if_fdt_lean_trace~mts_record INTO DATA(ls_record). DATA(l_id) = CONV if_fdt_types=>id( ls_record-id ). IF l_id <> id_initial. *查询BRF+对象的类型,并获取描述
lo_brf_query->get_object_type(
EXPORTING iv_id = l_id
IMPORTING ev_object_type = DATA(l_type) ). lo_admin_data = NEW #(
iv_id = l_id
iv_object_type = l_type ). lo_admin_data->if_fdt_admin_data~get_texts(
IMPORTING
ev_text = DATA(desc) ). out->begin_section( desc ).
ASSIGN ls_record-ref->* TO <data>.
IF <data> IS ASSIGNED.
out->write( <data> ).
ENDIF. ENDIF. ENDLOOP. lo_result->get_value( IMPORTING ea_value = l_result ). out->begin_section( '结果' ). out->write( l_result ). out->display( ).

再次运行程序,可以看到,

这只是个简单示例,效果远远不如BRF+工作台的跟踪结果输出,

如果想要实现更好的跟踪记录输出效果,可以试试使用前端类库。当然实际的应用情况是按需的,也许你只需要获取到跟踪结果中的某一条数据,然后展示或者把它存储到数据库里。

应用

跟踪模式级别

在接口IF_FDT_CONSTANTS的常量中可以看到跟踪级别和它们的描述,

其中常用的是lean trace和technical trace,

  • 在lean trace模式下,系统只记录直接导致过程结束的那些步骤。 例如,如果程序包含CASE语句,其中输入值可以针对五个不同的值进行测试,并且只有最后一次尝试可以匹配到结果,则lean trace不会记录四次不成功的尝试,只会记录第五次尝试。
  • 相反,technical trace则记录了流程的每个步骤,无论步骤是导致过程结束。 例如,如果程序遍历20个不同的步骤,最后证明这是错误的路径,则在technical trace模式下可以看到整个过程,而在lean trace模式下这些步骤不会被显示。

technical trace会使BRF+应用在解释模式下运行,不应在生产环境下使用该模式。

使用parameter ID来灵活的控制跟踪级别

有SAP CRM开发经验的读者可能知道,在CRM中,可以通过设置parameter ID来控制消息的详细技术信息是否在Web UI界面展示。这是一种灵活的控制方式,我们也可以把它应用在BRF+跟踪模式的控制上。

在事务代码SM30维护TPARA

创建新的SET/GET PARAMETER

在事务代码SU3中维护它,

在代码中获取并判断PARAMETER ID的值,从而决定调用方式,

  DATA: l_trace TYPE c LENGTH .
GET PARAMETER ID 'ZBRF_TRACE' FIELD l_trace. IF l_trace = .
lo_fuction->if_fdt_function~process(
EXPORTING io_context = lo_context
IMPORTING eo_result = DATA(lo_result) ).
ELSE.
lo_fuction->if_fdt_function~process(
EXPORTING io_context = lo_context
iv_trace_mode = if_fdt_constants=>gc_trace_mode_lean
IMPORTING eo_result = lo_result
eo_trace = DATA(lo_trace) ).
ENDIF.

其它

需要注意的是,跟踪功能的使用存在前提条件,那就是BRF+对象全部版本化,或者BRF+对象的时间戳早于跟踪的时间戳。因为跟踪数据的解析依赖于BRF+对象的元数据。如果在跟踪的前后BRF+对象已经发生了变化,那么要依据版本或时间戳来确定跟踪时的BRF+对象的情况。

参考内容:

Tracing in  SAP Decision Service Management

SAP Document

Trace mode in BRF+

我的BRF+自学教程(二):跟踪模式(trace mode)的更多相关文章

  1. 我的BRF+自学教程(三):动态技术

    开发者们可以在编程中使用各种动态技术,比如RTTS,比如通过动态的类创建和多态来实现功能的平滑扩展.BRF+开发中也存在一些动态手段.本文将介绍3种不同场景下的动态实践方式.其中第一种是纯配置的,第二 ...

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

    Business Rule Framework Plus(业务规则框架,以下简称BRFplus或BRF+)是一个强大的工具, 它允许用户以直观的方式对规则建模,并在不同的应用程序中重用这些规则.通过它 ...

  3. HMM 自学教程(三)隐藏模式

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  4. HMM 自学教程(二)生成模型

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  5. HMM 自学教程(八)总结

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在HMM 学习最佳范例,这是针对国外网站上一个 HMM 教程的翻译,作者功底很深,翻译得很精彩,且在 ...

  6. HMM 自学教程(七)前向后向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  7. HMM 自学教程(六)维特比算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  8. HMM 自学教程(五)前向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  9. HMM 自学教程(四)隐马尔科夫模型

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

随机推荐

  1. 【转载】使用Jquery操作Cookie对象

    Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.jQuery是一个封装好的JavaScript库,使用jQuery可以极大地简化了Java ...

  2. IdentityServer4客户端JWT解密实现(基于.net4.0)

    情景:公司项目基于.net4.0,web客户端实现单点登录需要自己解密id_token,对于jwt解密,.net提供了IdentityModel类库,但是4.0中该类库不可用,所以自己实现了解密方法. ...

  3. Android Studio 使用Toast

    Toast 是Android系统中体重的一种非常好的提醒方式 在程序中可以将很小的一段消息提醒给用户 在一段时间后自动消失,不会占用如何屏幕空间 Button button1=(Button) fin ...

  4. 推荐数据库、Web、Net、架构的PDF数据,书不在多,在看!

    先收藏,后看:千万不要做一个屯书的人,一定要坚持有选择性的看下去: 数据库类 SqlServer Oracle .NET  更多... Web  更多... 架构 不刮了,直接可以看到了. 链接: h ...

  5. [android] 表格布局和绝对布局

    /*****************2016年4月28日 更新*************************************/ 知乎:为什么Android没有像iOS一样提供autolay ...

  6. struts2_struts.xml配置文件讲解

    1.bean Bean详细讲解:https://www.cnblogs.com/lulu638/p/4340703.html 2.constant constant属性配置,可配置的属性可以参考def ...

  7. 改变Tomcat在地址栏上显示的小猫图标

    部署在Tomcat上的项目通常在地址栏会显示一个小猫的图标,那么如何改变这个图标呢? 第一步.制作自己显示的图标 这里使用的是在线制作的方式,推荐一个在线制作的网站---比特虫:http://www. ...

  8. Excel通用类工具(二)

    前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就 ...

  9. lnmp环境切换php版本,并安装相应redis扩展

    ubuntu+nginx+mysql+php+redis,其中php装两个版本,php7和php56 1.让nginx支持不同站点可以选择不同的php版本 1>创建fastcgi.conf文件 ...

  10. jQuery效果之jQuery实现图片的依次加载图片

    css代码: ;;} ul#portfolio li{float: left;margin:0 5px 0 0;width:250px;height: 250px;list-style: none;} ...