我的BRF+自学教程(二):跟踪模式(trace mode)
使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况。
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
我的BRF+自学教程(二):跟踪模式(trace mode)的更多相关文章
- 我的BRF+自学教程(三):动态技术
开发者们可以在编程中使用各种动态技术,比如RTTS,比如通过动态的类创建和多态来实现功能的平滑扩展.BRF+开发中也存在一些动态手段.本文将介绍3种不同场景下的动态实践方式.其中第一种是纯配置的,第二 ...
- 我的BRF+自学教程(一):公式(formula)
Business Rule Framework Plus(业务规则框架,以下简称BRFplus或BRF+)是一个强大的工具, 它允许用户以直观的方式对规则建模,并在不同的应用程序中重用这些规则.通过它 ...
- 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 教程 的翻译,作者功底很深,翻译得很精彩 ...
随机推荐
- CoreJava(一)—— Java迭代语句
本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...
- TypeScript学习(2)
自己动手敲代码的重要性不用多说.敲代码自然是参考TypeScript官方中文文档.编辑器推荐使用Visual Studio Code. Visual Studio Code 更新 更新完成之后很可能会 ...
- 第一册:lesson sixty three。
原文: Thank you docter. A:How's Jim today? B:Better, thank you docter. A:Can I see him ,please? B:Cert ...
- 所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市
今天是春节假期的最后一天,在这里给全国的朋友们拜个晚年,祝大家身体健康,晚年幸福啊.这个春节大家过的怎么样啊,我自己是在老家过的年,家乡的年味还是比较浓的,也再次感谢朋友圈的大家给我看了各地的风光 ...
- DataTable与List<T>相互转换
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- App测试流程及测试点(个人整理版)
1 APP测试基本流程 1.1流程图 1.2测试周期测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向主 ...
- 【Java每日一题】20170317
20170316问题解析请点击今日问题下方的“[Java每日一题]20170317”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...
- Java学习笔记之——封装
1. 属性和方法放到类中 2. 信息的隐藏 (1) 属性的隐藏 (2) 方法实现的细节隐藏 3. 权限修饰符: 从小到大的顺序:private->默认的(什么都不写)->protected ...
- Maven(六)Eclipse使用Maven插件创建项目
1. 创建Maven版Java工程 1.1 具体步骤 1.2 更改默认JDK版本 默认JDK版本过低 可以通过配置setting.xml来更改JDK版本 加入如下代码 <profile> ...
- webpack4 系列教程(十二):处理第三方JavaScript库
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十二):处理第三方 JavaScript 库>原文地址.或者来我的小站看更多内容:godbm ...