观察者模式在One Order回调函数中的应用

例如需求是搞清楚function module CRM_PRODUCT_I_A_CHANGE_ORGM_EC在什么样的场景下会被调用。当然最费时间的做法是设一个断点,然后跑对应的场景,观察断点何时被触发。也有另一种不通过调试的分析方法:

使用事务码CRMV_EVENT, 输入函数名称CRM_PRODUCT_I_A_CHANGE_ORGM_EC:

得到结果:

上述结果的业务含义是:每当Sales area被创建或者更新时,我们查询的function module都会自动被One Order框架调用。

观察如下调用栈:

那么为什么从业务上来说,每当一个订单的Organization Model组织架构数据发生变化之后,就需要调用这个回调函数呢?打开这个函数的源代码,在102行看到了CRM Product的settype之一, CRMM_PR_SALESG(Set type allowing you to group products for various purposes. As this set type is dependent on distribution chains, a distribution chain has to be selected before data can be maintained)的数据被读取。

关于这个settype更多说明,请参考SAP Help.

这个settype是一个Distribution Chain相关的settype, 离开了某个具体的Sales area则无意义。

因此每当订单的Organization model数据发生变化时,CRMM_PR_SALESG的数据必须根据变化后最新的Organization model数据重新读取。利用One Order框架,这种Organization model的变化和CRMM_PR_SALESG的读取这种依赖关系实际上通过设计模式里的"观察者模式"来完成的。CRM_PRODUCT_I_A_CHANGE_ORGM_EC是Organization model数据变化的众多观察者之一,通过事务码CRMV_EVENT订阅了Organization model数据变化这一事件。每当Organization ,model数据发生变化时,这个变化通过下图的CRM_EVENT_PUBLISH_OW发布出去,其他观察者就能基于这个发布者发布的事件进行对应处理,在我文章的这个例子里,就会调用CRM_PRODUCT_I_A_CHANGE_ORGM_EC根据最新的Organization model读取settype CRMM_PR_SALESG的数据。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

原文地址:https://www.cnblogs.com/sap-jerry/p/8513657.html

时间: 2024-11-10 15:43:56

观察者模式在One Order回调函数中的应用的相关文章

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

ajax回调函数中使用$(this)取不到对象的解决方法

如果在ajax的回调函数内使用$(this)的话,实践证明,是取不到任何对象的,需要的朋友可以参考下 $(".derek").each(function(){ $(this).click(function(){ var params = $(this).parent().serialize(); var obj=$(this).parent().siblings("div#caskContent"); var form=$(this).parent(); $.aja

理解 JS 回调函数中的 this

理解 JS 回调函数中的 this:https://www.cnblogs.com/gavinyyb/p/6286750.html 原文链接:http://www.tuicool.com/articles/z2Yvaq 任何变量或对象都有其赖以生存的上下文.如果简单地将对象理解为一段代码,那么对象处在不同的上下文,这段代码也会执行出不同的结果. 例如,我们定义一个函数 getUrl 和一个对象 pseudoWindow . function getUrl() { console.log(this

wx: wx.showModal 回调函数中调用自定义方法

一.在回调函数中调用自定义方法: 回调函数中不能直接使用this,需要在外面定义 var that = this 然后 that.自定义的方法.如下: //删除 onDelete: function (e) { var that = this; wx.showModal({ title: '提示', content: '确定要删除?', success: function (res) { if (res.confirm) { that.onEdit(e); } } }) }, //编辑 onEd

vue中this在回调函数中的使用

this在各类回调中使用: 如果是普通函数是没法使用的 所以需要先将this.变量赋值给新的变量,然后才能在回调函数中使用 例如: refund: function (id) { if (!this.url.refund) { this.$message.error("请设置url.refund属性!") return } var that = this; this.$confirm({ title: "确认退款", content: "是否要进行退款?&

hiredis aeStop仅在redis命令的回调函数中生效 分析

hiredis 是 redis 的client端C语言 lib,  hiredis拥有同步和异步的API, 异步API的实现有多种方法,分别依赖libev, libevent, libuv, ae等等,其中ae是redis内部实现的一个异步事件处理模块. 稍微修改了hiredis的example-ae.c代码:在一个线程里面循环10次执行命令ping, 检查redisserver, 如下所示, 线程发完10次ping后,调用disconnect, 发现aeMain函数并未退出,程序一直阻塞住.

前端小组分享会之异步回调函数中的上下文

异步加载:又叫非阻塞加载,浏览器在下载执行js的同时,还会继续进行后续页面的处理.实现如:回调函数 .setTimeout . setInterval  回调函数(callback): 自己理解就是函数A里嵌套函数B B可能用到A中的变量,,B成为回调函数 function a (){ var x = 1; function b(){ console.log(++x) } b() } a() //2 上下文(Execution Context): 执行上下文(简称上下文)决定了Js执行过程中可以

=> 应用在js回调函数中

=> 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略{} 如果这一句话还是return,可省略return 3. 如果只有一个参数: 可省略() 但是,如果没有参数,必须保留空() 更大用途: 箭头函数内外共用同一个this--取代bind 特殊: 如果不希望内外共用this,就不能用箭头函数 比如事件处理函数: elem.addEventListener(&

Swoole 关于reload重启与回调函数中代码的重载

Swoole 的 Server 中可以通过 PHP 来执行 reload 很方便的热重载, 但也有很多限制 需要注意的是, 直接写在 server.php 即 你的服务器启动脚本文件中的PHP代码即便是写在 WorkerStart 的事件回调中的代码 reload 也不会重载的, 必须是通过加载另一个文件来执行这样 reload 才会有意义 下面是测试代码和结果说明: <?php /** * Author: ZHOUZ * Blog: http://blog.csdn.net/zhouzme *