订单中Territory的确定

之前一直以为单据中Territory的确定只能通过录入Employee Responsible来实现,这样的话操作流程就变成了:确定Territory后检查录入的Sold-to是否合规。难道系统标准就不支持先录入Sold-to自动带出Territory吗?

其实是可以的,通过对Employee Responsible分配Access Sequence: 0030可实现这个需求。不过整个过程有点绕:

  1. 在合作伙伴确定阶段,通过FM: CRM_TERRMAN_GET_TERR_BY_OBJ找到负责的Employee;
  2. 在UI展示的时候,通过FM: CRM_TERRMAN_GET_TERR_BY_SCOPE找到Territory;

综上Territory还真只能通过Employee Responsible得到,但是我们可以借助Territory从Sold-to得到Employee Responsible再得到Territory。。。

Data Determination in Access

近日在看SCM620 Pricing,Unit 4当中的Data Determination in Access只有数页,但却相当重要。不过SCM620简写得太厉害了,建议看Help文档。之所以重要,是因为原来Pricing在Access层面(Access Sequence中的一条称为Access)也是可以玩的,而且很强大。

Data Determination in Access主要用于这样的场景:取一个不在订单上的值用于Pricing。解决方法很多,SAP提供的方法是:

  • 第一步,Data Determination,就是获取这个值;
  • 第二步,Data Use,就是将上面得到的值用于Pricing中。

而根据值的获取方式,有三招:

  1. 使用KOMPAZD
  2. 使用Routines
  3. 针对Sales Deals的处理方式

上述文字比较抽象,其核心是我们不但可以用Access访问Condition Record获取价格、折扣,Condition Record还可以返回字符,而这个返回字符可以用于后续Condition Type去做Pricing。如果后续的Condition Type对应的Access Sequence直接使用这个返回值,那就是第一招,这招你不需要写Code,往KOMPAZD加Field(就是返回值),配Condition Table和Access Sequence就可以了。如果返回值不是直接用于后续的Access Sequence,那就是第二招,在Requirement里写Routine。Sales Deals不懂略过。

想象一下Condition Record可以返回字符,那它就不是条件记录了,而是一个Z表,这里有太多文章可以做了。

注意:Data determination at the level of access cannot be executed in SAP CRM.  >>

附件是一个例子

Determination Path

就Partner Determination,一直有个疑问:多个Partner Functions的determine次序是怎样的呢?我们知道Access Sequence有10,20,30的先后次序,但是在Partner determination procedure中我们没法指定Sold-to,Ship-to,Contact Person的次序。之所以有这样的疑问,是因为Partner function之间往往是有关联性的,比方说我们通过Sold-to决定Org,再通过Org Structure决定Responsible Employee。

就此深入研究,发现Partner Function的determine确实是有次序的,但是这个次序不是简单的从上到下,或者按字母、数字排序,而是根据Access Sequence的内容计算得来的。因为Access Sequence中的Details on the Source,Mapping/Restrictions等字段反映了Partner Function的相关性。

相应代码为Function Module: COM_PARTNER_DEADLOCK_CHECK_CB中的Form: DEADLOCK_CHECK_ON_FUNCTION。计算的结果就是Determination Path,当中的DETERM_LEVEL决定了determine的先后次序。

认识到这个机制的存在,我们可以放心的定义Partner Function和Access Sequence,先后次序的问题则交给系统考虑。同时也解释了为什么我们无法人为指定Partner Function的determine的次序。

题外话,Partner Determination是通过Event Handler触发的,Callback Function为:CRM_PARTNER_DETERM_INITIAL_EC。

Partner Determination

两个BADI可以用来做Partner Determination,传统的是COM_PARTNER_DETERM,需要在View: COMV_PARTNER_DOR中创建条目。CRM中现有的Access Sequence,也是通过这个BADI来Implementation。

另外一个叫COM_PARTNER_BADI,对应Access Sequence中Source的COM_PARTNER_X, Y, Z。

上述两个BADI,可以在Function Module: COM_PARTNER_DETERM_STEP_ONE_OW中看看是怎么一回事。