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

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. [JavaScript] 前端模块编程实现

    前端模块化 前端早期写代码都是全局变量满天飞,这种情况会造成全局命名空间污染,变量冲突等问题 var a = 1; var b = 2; function c(){} function d(){} 后 ...

  2. “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境

    Visual Studio Code 免费跨平台文本编辑器,插件资源丰富,我把其作为Debug的首选. 下载地址:https://code.visualstudio.com/Download 安装之后 ...

  3. centos 安装sbt

    1.yum install sbt 2.如果不行,则 curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo sudo mv bi ...

  4. 【译】《Clean C#》

    本文是<Clean C#>一书译文的序言,阅读译文请移步至:<Clean C#>译文. <Clean C#>的副标题是Readable,Maintainable,P ...

  5. 第一讲 从头开始做一个web qq 机器人,第一步获取smart qq二维码

    新手教程: 前言:最近在看了一下很久很久以前做的qq机器人失效了,最近也在换工作目前还在职,时间很挺宽裕的.就决定从新搞一个web qq机器人 PC的协议解析出来有点费时间以后再做. 准备工作: 编译 ...

  6. 模块热替换 HMR

    devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...

  7. Android Navigation使用

    简介 Navigation导航编辑器旨在简化Android开发中导航的实现,可以帮助我们很好的处理Activity和fragment之间通过FragmentTransaction交互的复杂性,也可以很 ...

  8. php生成xml数据

    1.php生成xml数据一般有2种方式, 一个是组装字符串,另一个就是使用php内置的系统类 2.使用php内置类生成xml数据 3.拼装字符串生成xml数据 public function stat ...

  9. 浅析 JavaScript 中的 Function.prototype.bind() 方法

    Function.prototype.bind()方法 bind() 方法的主要作用就是将函数绑定至某个对象,bind() 方法会创建一个函数,函数体内this对象的值会被绑定到传入bind() 函数 ...

  10. vue+vuecli+webpack中使用mockjs模拟后端数据

    前言 使用mockjs可以事先模拟数据,前提是和后端约定好了数据接口,怎样的数据.使用mock就可以生成你要的数据了,从而实现开发时前后端分离. 其主要功能是: 基于数据模板生成模拟数据. 基于HTM ...