一、引言
目前,多數(shù)國內(nèi)SAP(企業(yè))用戶在完成了ERP系統(tǒng)實施、應用深化后,繼續(xù)開展其它業(yè)務領域信息化建設,如客戶關系管理(CRM)、供應商關系管理(SRM)、商品計劃管理(MAP)等。期間,這些用戶毫不猶豫的選擇了SAP旗艦下的其它產(chǎn)品,開始了本企業(yè)后ERP時代信息化應用實施。事實上,就產(chǎn)品集成而言,SAP運用中間件技術實現(xiàn)ERP、CRM、MAP等系統(tǒng)之間的業(yè)務集成與應用整合。因此,SAP中間件技術應用水平?jīng)Q定著業(yè)務集成的廣度和深度。筆者一直從事SAP中間件應用研究和部署實踐,就筆者了解的情況而言,國內(nèi)企業(yè)SAP中間件應用水平較為欠缺,這種缺陷不是來自軟件技術的本身,而是對軟件技術實現(xiàn)方式的理解存在偏差。為此,筆者總結了一套中間件應用方法,與讀者分享。
二、基礎設置
解決實際業(yè)務需求,筆者假設了一個集成的業(yè)務場景:即:ERP(ECC 6.0 EHP1)與CRM(7.0, EHP1)之間的“主數(shù)據(jù)”與銷售憑證集成場景。
- 定義邏輯系統(tǒng):
邏輯系統(tǒng)在中間件技術中有著舉足輕重的地位,因此,必須為客戶端(Client)配置邏輯系統(tǒng)。
事務碼:SALE。
在創(chuàng)建邏輯系統(tǒng)并分配至相應客戶端之后,需將進行數(shù)據(jù)交互客戶端的邏輯系統(tǒng)在此處定義。
- 遠程目標以及遠程用戶:
使用SM59創(chuàng)建遠程目標;
使用SU01創(chuàng)建遠程用戶,用戶權限暫時使用SAP_ALL,用戶類型為服務用戶。
- 中間件管理控制臺
事務碼:SMOEAC。
創(chuàng)建兩個R/3類型的SITE節(jié)點,并分別指定節(jié)點屬性。
定制通過中間件交互的數(shù)據(jù)對象;
對象類型選擇Subscription,目前,僅定制BP“主數(shù)據(jù)”以及BP關系兩個對象。
- 上載對象定義:
在CRM系統(tǒng)中,可以通過R3AC3對初始裝載對象設置過濾條件,之后,通過R3AS進行對象的初始裝載。但,前提需要在ERP系統(tǒng)中定制是否允許該對象上載。
ERP系統(tǒng)事務碼SM30: CRMRFCPAR。維護參數(shù)如下圖所示:
在這里,定義允許所有對象上載。另外,需要在視圖CRMCONSUM中激活CRM用戶。
在視圖CRMPAROLTP中定義CRM系統(tǒng)版本(該值可以和CRM的實際版本不一致)。
三、數(shù)據(jù)交互
在進行客戶交互之前,首先要對ERP銷售組織以及客戶“主數(shù)據(jù)”的基礎配置信息進行初始上載。
同步組織架構:
使用該路徑創(chuàng)建組織架構根節(jié)點,以便于從ERP傳遞的銷售組織及分配節(jié)點。(若根節(jié)點未生成BP編號,激活BP與HR集成)。
通過該事務在CRM端生成與ERP 端統(tǒng)一的組織架構模型。在此,建議一次性生成全部組織。
同步之后,回到修改組織模型的事務中,維護銷售組織相關節(jié)點的功能和屬性。
- 基本定制對象上載:
針對客戶數(shù)據(jù)而言,在使用中間件同步客戶前,以下對象需從ERP上載至CRM。
DNL_CUST_KTOKD
DNL_CUST_S_AREA
DNL_CUST_SALES
如果出現(xiàn)定制對象不能上載或在R3AM1中一直處于“Running”狀態(tài),請進行以下處理:
檢查RFC用戶權限是否存在權限對象“SCRMMW”,且設置如下圖:
檢查ERP端數(shù)據(jù)表CRMATAB是否為空,若為空,在CRM端執(zhí)行Report:
“SMOF_FILL_CRMATAB”,選擇相應的對象和RFC目標,執(zhí)行,即可在ERP端將被上載的數(shù)據(jù)表維護在CRMATAB中。
- ERP中維護賬戶組及編號范圍:
客戶端 賬戶組 編號范圍 是否內(nèi)部編號
700 ZA01 0005100000-----005199999 否
900 ZA03 0005300000-----005199999 否
- CRM維護BP組及編號范圍:
客戶端 BP組 編號范圍 是否內(nèi)部編號
700 ZA01 0005100000-----005199999 否
700 ZA03 0005300000-----005199999 否
- ERP系統(tǒng)中維護客戶交互映射關系:
事務碼:PIDE(需分別在900和700維護)。
客戶端(700):
客戶端(900):
這里的映射關系可以有很多種,此處使用了最簡單的方法。同時,過濾沒有銷售組織的客戶數(shù)據(jù)。
ERP中事務碼:PIVV(原則上將該功能也可以在CRM系統(tǒng)中通過R3AC1中的過濾條件來實現(xiàn))
檢查雙方的字段設置是否一致。(ERP中按照賬戶組,CRM中按照BP角色)。
四、關鍵技術實現(xiàn)
阻止向錯誤的SITE發(fā)送BDOC:
對于一個CRM與一個ERP的兩個客戶端交互,SAP提供Multiple Exchange Projects (MEP),應該是可以解決這個問題的,但是,配置相對較為復雜。且需要引入Solution Manager系統(tǒng),故放棄。具體可以參照Help:Configuring the Multiple Back-End Scenario 。
簡單辦法如下:
SE38:/1CRMGC/SAPLBUPA_MAIN;
在IDES中該函數(shù)組包含了兩個FUNCTION,但是在DEV中僅包含一個。
IDES中代碼修正放在FUNCTION“/1CRMGC/HTBUPA_MAIN_RRR”。
DEV中代碼修正放在FUNCTION“/1CRMGC/CGBUPA_MAIN_RRR”。
以下代碼僅為實例:具體視實際需求而定。
* fill the recipient list: get dependent sites / sitetypes
FREE recipients[].
CALL FUNCTION 'SMOH_FILL_RECIPIENT_LIST'
EXPORTING
i_calcrec = lt_sites
i_sendrec = send_to_sites
CHANGING
ct_recipients = recipients.
*get bp information by rootid or queue name of header add by yueshuai
select single * from but000 into ls_but000 where partner_guid = header-root_id.
if sy-subrc = 0.
*delete the site by the bp number from header
loop at recipients into ls_recipient.
if ls_recipient-SITE_ID = '20CF3083320C1EE18AC88598551B453D' and ls_but000-partner not BETWEEN '0005300000' and '0005399999'.
delete TABLE recipients from ls_recipient.
elseif ls_recipient-SITE_ID = '20CF3083320C1EE18AC34FD07153653D' and ls_but000-partner not BETWEEN '0005100000' and '0005199999'.
delete TABLE recipients from ls_recipient.
endif.
endloop.
endif.
向BDoc中添加CRM增強信息或修改BDOC
復制函數(shù)SAMPLE_PROCESS_SMOUTIL2為Z_SAMPLE_PROCESS_SMOUTIL2
SM30——》TBE24添加Product“ZBP_ADD”,并設置激活(很重要)。
SM34——》TPS34維護Process“SMOUTIL2”,維護Function Z_SAMPLE_PROCESS_SMOUTIL2,以及Product“ZBP_ADD”。
具體代碼如下:(以下代碼僅為示例)
CALL FUNCTION 'CRM_BUPA_BAPIMTCS_TO_MAIN'
IMPORTING
et_bp_extern = lt_complex
CHANGING
ct_bapimtcs = t_bapimtcs[].
LOOP AT lt_complex INTO ls_complex.
* set customer
ls_partner = ls_complex-header-object_instance.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_partner-bpartner
IMPORTING
output = lv_customer.
* get Extension Company Field from database
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF ls_ci_eew_but000
FROM but000
WHERE partner = lv_customer.
CHECK sy-subrc = 0.
* --------------------
IF ls_ci_eew_but000-zzfld000000 IS INITIAL.
ls_ci_eew_but000-zzfld000000 = ls_ci_eew_but000- zzfld000000.
ENDIF.
IF ls_ci_eew_but000-zzfld000001 IS INITIAL.
ls_ci_eew_but000-zzfld000001 = ls_ci_eew_but000- zzfld000001.
ENDIF.
DESCRIBE TABLE t_bapimtcs[] LINES sy-tfill.
READ TABLE t_bapimtcs INDEX sy-tfill.
ls_mtcs_lite-currdno = t_bapimtcs-currdno + 1.
ls_mtcs_lite-objkey = t_bapimtcs-objkey.
ls_mtcs_lite-relkey = t_bapimtcs-relkey.
CLEAR t_bapimtcs.
MOVE-CORRESPONDING ls_mtcs_lite TO t_bapimtcs.
t_bapimtcs-tabname = 'CI_EEW_BUT000'.
* input format "2公司代碼
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_ci_eew_but000-zzfld000000
IMPORTING
output = ls_ci_eew_but000-zzfld000000. "3統(tǒng)馭科目
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_ci_eew_but000-zzfld000001
IMPORTING
output = ls_ci_eew_but000-zzfld000001.
CONCATENATE lv_customer ls_ci_eew_but000-zzfld000000 ls_ci_eew_but000-zzfld000001 sy-uname INTO t_bapimtcs-data.
APPEND t_bapimtcs.
ENDLOOP.
在ERP中接收并處理BDoc:
復制函數(shù)SAMPLE_INTERFACE_DE_BALE為Z_SAMPLE_INTERFACE_DE_BALE。
SM30——》TBE24 添加Product“ZBP_ADD”.
SM30——》TBE34 添加Process“DE_BALE”
具體代碼如下:
READ TABLE ct_idoc_data WITH KEY segnam = 'E1KNA1M'.
ls_e1kna1m = ct_idoc_data-sdata.*
*map BAPIMTCS table to complex structure table (partners)
CALL FUNCTION 'PI_BP_BAPIMTCS_TO_MAIN'
EXPORTING
it_bapimtcs = it_bapimtcs[]
IMPORTING
et_bp_extern = lt_complex
et_not_processed_bapimtcs = lt_not_processed.
LOOP AT lt_complex INTO ls_complex.
* set customer
ls_partner = ls_complex-header-object_instance.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_partner-bpartner
IMPORTING
output = lv_customer.
*-----------------------------------------------------------------------------------------
* 公司代碼數(shù)據(jù)
CONCATENATE lv_customer '*' INTO lv_company_data.
LOOP AT it_bapimtcs WHERE tabname = 'CI_EEW_BUT000' AND data CP lv_company_data.
MOVE it_bapimtcs-data TO ls_crm_data.
REFRESH lt_knb1.
IF ls_crm_data-bukrs IS NOT INITIAL.
lt_knb1-kunnr = ls_crm_data-kunnr.
lt_knb1-bukrs = ls_crm_data-bukrs. "2公司代碼
lt_knb1-akont = ls_crm_data-akont. "3統(tǒng)馭科目
lt_knb1-ernam = ls_crm_data-ernam. "8CRM中的用戶名
lt_knb1-erdat = sy-datum.
CALL FUNCTION 'Z_CUSTOMER_KNB1_OUT'
CHANGING
IT_KNB1 = lt_knb1 .
ENDIF.
ENDLOOP. "'CI_EEW_BUT000'
ENDLOOP. "end loop ls_complex
- 實現(xiàn)公司代碼數(shù)據(jù)創(chuàng)建
SE38:LVV02F42;
實現(xiàn)增強點:
ENHANCEMENT-POINT EHP603_LVV02F42_01 SPOTS ES_SAPLVVO2_P2P.
ENHANCEMENT 1 Z_BP_COMPANY. "active version
DATA : it_knb1 TYPE knb1,is_knb1 type knb1.
DATA : ls_DYNTAB like LINE OF DYNTAB.
DATA : ls_DYNPROP LIKE LINE OF DYNPROP.
DATA : lv_index type i.
CALL FUNCTION 'Z_CUSTOMER_KNB1_IN'
CHANGING
IT_KNB1 = it_knb1 .
*填充BKN00中的公司代碼
IF BKN00-BUKRS = '/' AND IT_KNB1-BUKRS IS NOT INITIAL.
BKN00-BUKRS = IT_KNB1-BUKRS.
*填充KNB1中的數(shù)據(jù)
BKNB1-AKONT = IT_KNB1-AKONT.
ENDIF.
READ TABLE DYNTAB TRANSPORTING NO FIELDS WITH key DYNNR = '0360'.
if sy-subrc = 0.
lv_index = sy-tabix + 1.
endif.
check IT_KNB1-BUKRS is not INITIAL.
*添加公司代碼屏幕
LS_DYNTAB-DYNNR = '0210'. LS_DYNTAB-DTYPE = 'F'.insert LS_DYNTAB into DYNTAB INDEX lv_index. lv_index = lv_index + 1.
LS_DYNTAB-DYNNR = '0215'. LS_DYNTAB-DTYPE = 'F'.insert LS_DYNTAB into DYNTAB INDEX lv_index. lv_index = lv_index + 1.
LS_DYNTAB-DYNNR = '0220'. LS_DYNTAB-DTYPE = 'F'.insert LS_DYNTAB into DYNTAB INDEX lv_index. lv_index = lv_index + 1.
LS_DYNTAB-DYNNR = '0230'. LS_DYNTAB-DTYPE = 'F'.insert LS_DYNTAB into DYNTAB INDEX lv_index. lv_index = lv_index + 1.
*添加屏幕中需要維護的字段
LS_DYNPROP-DNUM = '0210'.
LS_DYNPROP-FNAM = 'KNB1-AKONT'.
LS_DYNPROP-TABNAME = 'KNB1'.
LS_DYNPROP-FIELDNAME = 'AKONT'.
LS_DYNPROP-RESULT = '.'.
LS_DYNPROP-MASK = 'F'.
APPEND LS_DYNPROP to DYNPROP.
LS_DYNPROP-DNUM = '0215'.
LS_DYNPROP-FNAM = 'KNB1-ZTERM'.
LS_DYNPROP-TABNAME = 'KNB1'.
LS_DYNPROP-FIELDNAME = 'ZTERM'.
LS_DYNPROP-RESULT = '.'.
LS_DYNPROP-MASK = 'F'.
APPEND LS_DYNPROP to DYNPROP.
LS_DYNPROP-DNUM = '0220'.
LS_DYNPROP-FNAM = 'KNB1-MAHNA'.
LS_DYNPROP-TABNAME = 'KNB5'.
LS_DYNPROP-FIELDNAME = 'MAHNA'.
LS_DYNPROP-RESULT = '.'.
LS_DYNPROP-MASK = 'F'.
APPEND LS_DYNPROP to DYNPROP.
LS_DYNPROP-DNUM = '0230'.
LS_DYNPROP-FNAM = 'KNB1-VRSNR'.
LS_DYNPROP-TABNAME = 'KNB1'.
LS_DYNPROP-FIELDNAME = 'VRSNR'.
LS_DYNPROP-RESULT = '.'.
LS_DYNPROP-MASK = 'F'.
APPEND LS_DYNPROP to DYNPROP.
perform check_BKNB1 .
ENDENHANCEMENT.
五、其他增強方法
CRM和ERP中相關隊列處理增強;
ERP中SM30——》COM_BUPA_CALL_FU;
CRM中SM30——》CRMC_BUT_CALL_FU;
在這里分配自定義函數(shù)以及合適的項目編號和處理事件以及對象,可以自行處理一些交互信息,不再細述。
PIDE中CRM——》ERP映射增強
不難發(fā)現(xiàn)在事務碼PIDE中維護CRM-》ERP的映射時,系統(tǒng)只能維護一條(這個是有道理的,并且必須如此),如果我們需要CRM中的B類型客戶映射多個ERP賬戶組,就需要使用下邊這個BTE。
事件DE_KTOKD 函數(shù)COM_INTERFACE_DE_KTOKD_ISU
處理方法類似上邊處理BDoc。
六、應用效果
客戶端(700)效果:
客戶端(900)效果:
七、中間件問題處理舉例
CRM系統(tǒng)中創(chuàng)建完客戶之后,觀察SMW01顯示:
通過SMW02A分析:
提示必輸字段沒有輸入,但檢查ERP中相關賬戶組的屏幕字段設置以及CRM中相關的字段設置,均為發(fā)現(xiàn)異常。出現(xiàn)此類情況可以使用下述方法解決:
選中SMW01中出錯的條目,在命令行處輸入/H,點擊重新處理Bdoc消息。 ,之后進入調(diào)試模式。
點擊setting按鈕,選中In background task: Do not process Transaction ID。
點擊鍵盤F8。
事務碼SMQ1中會產(chǎn)生隊列如下圖所示:
雙擊隊列名:
再次雙擊隊列名:
選中改行,點擊調(diào)試:
進入調(diào)試模式后:按下圖路徑為語句CALL TRANSACTION設置斷點。
確定后。點擊鍵盤F8.
此時屏幕顯示如圖:
雙擊CALL_TRANSACTION_MODE,將N改為A,并點擊修改按鈕。
點擊F8。
此時,進入ERP客戶維護界面:根據(jù)日常維護客戶信息的習慣,不難發(fā)現(xiàn)是哪個地方在作怪。
轉載請注明出處:拓步ERP資訊網(wǎng)http://m.hanmeixuan.com/
本文網(wǎng)址:http://m.hanmeixuan.com/html/consultation/10820210639.html