天天看點

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

(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,如下圖:

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

(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,并沒有一個開關,形如下面的語句來選擇性地進行調用:

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究
關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

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的另一處執行)

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

這樣determination API被call到的時候,裡面會去檢查這個flag,如果為A,則EXIT,這樣真正的determination step不會執行。

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

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完成三件事情:

建立一個新的process type為SC1的service contract

call partner determination的API,完成determination 邏輯(這個例子裡determine出來的是employee responsible:Jerry)

将step2 得到的partner assign到step1建立的service contract裡,同時hard code 另一個Bill to party:Wuji

call order save将建立的service contract儲存到DB

如何使用該report請參考附件的video。

下圖是一個使用POC report建立的service contract的截圖,紅色是report hard code的,黑色是partner determination API計算出來的。

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

Organization unit determination的實際和Partner determination稍有不同。

首先要明确,Organization unit determine的API(A),是每次document上partner 資料發生change後,由one order framework注冊的一個callback(B)調用的。

我們沒有辦法阻止B去call A。

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

關于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到。

關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究
關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究
關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究
關于用 ABAP 代碼手動觸發 SAP CRM organization Model 自動決定的研究

針對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了)

繼續閱讀