(1) 研究partner determination的逻辑能否抽出来,以API的行驶被我们Odata service implementation code里调用?

Yes. 我在AG3写了一个小的report ZPARTNER_DETERMINE_VIA_CODE,partner determination的核心是function module CRM_PARTNER_DETERMINATION_OW,关于如何使用这个FM,runtime时需要传递哪些参数,请参考该report的代码。
最后determination的output是一个internal table,里面包含了每个determine出来的BP id即partner function。在我的这个例子里,determine出来的是employee responsible,如下图:

(2)将Partner determination的逻辑抽出来之后,研究能否在CRM_ORDER_MAINTAIN里suppress住里面内嵌的partner determination call?

Technically speaking,我们的需求是在callstack 28的CRM_ORDER_MAINTAIN的整个sub callstack里,不应该出现partner determination API的调用。
但是现在callstack 36出现了,从代码发现callstack 35 , line 374静态地调用了这个FM,并没有一个开关,形如下面的语句来选择性地进行调用:

IF iv_partner_determination_active = ‘X’.
CALL FUNCTION ‘CRM_PARTNER_DETERMINATION_OW’ENDIF.

所以我需要做的research就是,看是否有方法让CRM_ORDER_MAINTAIN里的这个determination call执行但不生效。我已经有了一些idea,需要写个POC验证。

  1. CRM_ORDER_MAINTAIN里的partner determination也可以disable,方法如下:

如下面邮件第二个截图,我们虽然没法阻止CRM_PARTNER_DETERMINATION_OW 这个FM本身被调用,但我们可以做到让这个FM被call到了之后,不做任何事情,直接return,从而也就达到了disable determination的目的。

我们只需在call order maintain时传个switch参数进去:(A代表不执行partner determination, 我试过传B不行,传B的话,partner determination会在CRM_ORDER_MAINTAIN subcallstack的另一处执行)


这样determination API被call到的时候,里面会去检查这个flag,如果为A,则EXIT,这样真正的determination step不会执行。

Last step:写一个report,将partner_determ置为inactive,然后用CRM_ORDER_MAINTAIN创建一个order,
hard code一个BP进去,如果最后call CRM_ORDER_SAVE之后order仍然能够看到这个BP,说明这条路没问题。

POC做完了,AG3 report ZDETER_AND_CREATE

这个report完成三件事情:

  1. 创建一个新的process type为SC1的service contract
  2. call partner determination的API,完成determination 逻辑(这个例子里determine出来的是employee responsible:Jerry)
  3. 将step2 得到的partner assign到step1创建的service contract里,同时hard code 另一个Bill to party:Wuji
  4. call order save将创建的service contract保存到DB

如何使用该report请参考附件的video。

下图是一个使用POC report创建的service contract的截图,红色是report hard code的,黑色是partner determination API计算出来的。

Organization unit determination的实际和Partner determination稍有不同。
首先要明确,Organization unit determine的API(A),是每次document上partner 数据发生change后,由one order framework注册的一个callback(B)调用的。

我们没有办法阻止B去call A。

关于organization unit determination(以下简称OUD)的disable,以WebUI为例,分三种scenario讨论:

新建一个opportunity,手动输入organization unit,回车,trigger CRM_ORDER_MAINTAIN
OUD不会触发,user 的manual input具有更高优先级。Technically speaking,在call OUD API之前有个条件判断。
我在AG3上写了一个report,用hard code sales org的方式来模拟user 手动输入,发现API确实不会被call到。

如果一个Opp已经存盘,且organization unit不为空,那么当partner信息发生change后,OUD API不会触发。
如果一个Opp已经存盘,user从UI手动把org unit信息置为空,回车:

我的测试结果是OUD API会触发:

Determine出4个candidate 以popup的形式让user选择:

如果直接关掉popup,可以成功保存,此时org unit数据成功被清空:

针对FIORI的情况
CASE 1:
在创建OPPT的时候,输入ACCOUNT,触发DETERMINATION。 如果ORG被DETERMING出来了,存盘时,对后台来说这其实是个手动输入的ORG,不会触发OUD,没问题。

CASE 2:
在创建OPPT的时候, 输入ACCOUNT,触发DETERMINATION。ORG没有被DETERMING出来,但用户手工输入了,存盘时,对后台来说这是个手动输入的ORG,不会触发OUD,没问题。

CASE 3:
在创建OPPT的时候ORG没有被DETERMING出来,但用户没有手工输入,存盘时,OUD是否触发关系不大,因为大概率事件是OUD DETERMING不出来任何东西,不会改变订单,没问题。(小概率事件是由于在OPPT中输入了其他PARTNER,导致存盘的时候能DETERMING出来ORG了)

更多Jerry的原创文章,尽在:“汪子熙”:

关于用 ABAP 代码手动触发 SAP CRM organization Model 自动决定的研究相关推荐

  1. SAP CRM organization Model(组织架构模型)自动决定的逻辑分析

    看一下标准的OPPT是如何determine organization的: 查看Transaction Type OPPT的配置,找到Organization Data Profile: SPRO-& ...

  2. 如何使用原生的 JavaScript 代码,触发 SAP UI5 按钮控件的点击事件处理函数

    我的技术交流群里,有朋友提问: 我有个 UI5 按钮,想用原生 js 去触发 click 事件.在 dom 上检测到 click 已经触发了,但是按按钮的动作响应没有发生.请问如何解决,谢谢. 解决这 ...

  3. SAP CRM Business Partner 自动决定Determination的执行逻辑

    1.当创建opportunity时, 选定transaction type就会触发一次determination(实际上,在选定Prospect的时候也会触发,不过只触发Partner Determi ...

  4. SAP CRM note的自动拷贝

    From: Wang, Jerry Sent: Thursday, December 11, 2014 12:34 PM Subject: [wave8 backend research] one e ...

  5. 关于SAP CRM Organization Unit组织结构单元自动决定的一些调试

    The creation of appointment executes the organizational data profile "Z00000000016" with s ...

  6. 使用ABAP代码提交SAP CRM Survey调查问卷

    Jerry之前曾经写过两篇关于SAP CRM Survey调查问卷的技术文章: SAP CRM Survey调查问卷的模型设计原理解析 如何使用SAP CRM Marketing Survey创建一个 ...

  7. 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输

    SAP ABAP顾问朋友们,应该都使用过SAPLink这个工具.如果两个ABAP Netweaver系统没有建立起传输路径时,我们无法使用标准的SE10事务码创建传输请求的方式进行这两个系统间的代码传 ...

  8. 在SAP CRM WebClient UI中用javascript触发ABAP event

    环境:SAP CRM WebClient UI 需求:在WebClient UI里不通过用户手动点击,而是使用JavaScript代码自动触发ABAP后台的代码. 解决方案: 1. 定义一个hidde ...

  9. SAP CRM user参数CRM_UI_PROFILE是在哪行ABAP代码里读取的

    Sent: Friday, September 26, 2014 4:00 PM Since you are doing operation in backend, so framework will ...

最新文章

  1. 系统架构设计:平滑发布和ABTesting
  2. 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用
  3. Python非递归实现二叉树的后续遍历
  4. MVVM Light Toolkit使用指南
  5. 阿里投资网红茶饮“茶颜悦色” 进军茶饮市场?官方回应:爸爸的爸爸叫爷爷...
  6. 前端工作、学习中常用工具推荐
  7. 智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统
  8. WiFi 接口创建过程
  9. [转]MapX 操作总结
  10. HTML期末学生大作业-最新QQ音乐、网易云音乐、酷狗音乐、虾米音乐、咪咕音乐网站html+css+javascript
  11. API激光跟踪仪SDK基础使用
  12. Intel SGX开发者参考书(三)—— 使用Intel SGX SDK工具(二)
  13. php生成word并下载
  14. jQuery高级选择器
  15. #Paper Reading# Stochastic Optimization of Sorting Networks via Continuous Relaxations
  16. 吐槽智能手机上那些不爽的事
  17. 实现百度下拉菜单实例(利用jsonp跨域请求百度数据接口)
  18. 张家界计算机学院排名,张家界初中没读学人工智能机器人2021年专业排名
  19. Speedoffice(excel)如何隐藏行号和列标
  20. QT软件开发: QProcess启动进程完成交互并获取输出

热门文章

  1. MyBatis(三)
  2. oracle中用户连接相关
  3. Python rfind()方法
  4. AIM Tech Round 3 (Div. 2) A B C D
  5. 学习如何写PHP MVC框架(1) -- 路由
  6. 带标题和导航点的ViewPager
  7. android 启动第三方程序的代码(利用ComponentName)
  8. 数据中心扩张和产能计划
  9. phpstorm破解安装
  10. 5-4日 socket套接字