一、引言
目前,多数国内SAP(企业)用户在完成了ERP系统实施、应用深化后,继续开展其它业务领域信息化建设,如客户关系管理(CRM)、供应商关系管理(SRM)、商品计划管理(MAP)等。期间,这些用户毫不犹豫的选择了SAP旗舰下的其它产品,开始了本企业后ERP时代信息化应用实施。事实上,就产品集成而言,SAP运用中间件技术实现ERP、CRM、MAP等系统之间的业务集成与应用整合。因此,SAP中间件技术应用水平决定着业务集成的广度和深度。笔者一直从事SAP中间件应用研究和部署实践,就笔者了解的情况而言,国内企业SAP中间件应用水平较为欠缺,这种缺陷不是来自软件技术的本身,而是对软件技术实现方式的理解存在偏差。为此,笔者总结了一套中间件应用方法,与读者分享。
二、基础设置
解决实际业务需求,笔者假设了一个集成的业务场景:即:ERP(ECC 6.0 EHP1)与CRM(7.0, EHP1)之间的“主数据”与销售凭证集成场景。
- 定义逻辑系统:
逻辑系统在中间件技术中有着举足轻重的地位,因此,必须为客户端(Client)配置逻辑系统。
事务码:SALE。
在创建逻辑系统并分配至相应客户端之后,需将进行数据交互客户端的逻辑系统在此处定义。
- 远程目标以及远程用户:
使用SM59创建远程目标;
使用SU01创建远程用户,用户权限暂时使用SAP_ALL,用户类型为服务用户。
- 中间件管理控制台
事务码:SMOEAC。
创建两个R/3类型的SITE节点,并分别指定节点属性。
定制通过中间件交互的数据对象;
对象类型选择Subscription,目前,仅定制BP“主数据”以及BP关系两个对象。
- 上载对象定义:
在CRM系统中,可以通过R3AC3对初始装载对象设置过滤条件,之后,通过R3AS进行对象的初始装载。但,前提需要在ERP系统中定制是否允许该对象上载。
ERP系统事务码SM30: CRMRFCPAR。维护参数如下图所示:
在这里,定义允许所有对象上载。另外,需要在视图CRMCONSUM中激活CRM用户。
在视图CRMPAROLTP中定义CRM系统版本(该值可以和CRM的实际版本不一致)。
三、数据交互
在进行客户交互之前,首先要对ERP销售组织以及客户“主数据”的基础配置信息进行初始上载。
同步组织架构:
使用该路径创建组织架构根节点,以便于从ERP传递的销售组织及分配节点。(若根节点未生成BP编号,激活BP与HR集成)。
通过该事务在CRM端生成与ERP 端统一的组织架构模型。在此,建议一次性生成全部组织。
同步之后,回到修改组织模型的事务中,维护销售组织相关节点的功能和属性。
- 基本定制对象上载:
针对客户数据而言,在使用中间件同步客户前,以下对象需从ERP上载至CRM。
DNL_CUST_KTOKD
DNL_CUST_S_AREA
DNL_CUST_SALES
如果出现定制对象不能上载或在R3AM1中一直处于“Running”状态,请进行以下处理:
检查RFC用户权限是否存在权限对象“SCRMMW”,且设置如下图:
检查ERP端数据表CRMATAB是否为空,若为空,在CRM端执行Report:
“SMOF_FILL_CRMATAB”,选择相应的对象和RFC目标,执行,即可在ERP端将被上载的数据表维护在CRMATAB中。
- ERP中维护账户组及编号范围:
客户端 账户组 编号范围 是否内部编号
700 ZA01 0005100000-----005199999 否
900 ZA03 0005300000-----005199999 否
- CRM维护BP组及编号范围:
客户端 BP组 编号范围 是否内部编号
700 ZA01 0005100000-----005199999 否
700 ZA03 0005300000-----005199999 否
- ERP系统中维护客户交互映射关系:
事务码:PIDE(需分别在900和700维护)。
客户端(700):
客户端(900):
这里的映射关系可以有很多种,此处使用了最简单的方法。同时,过滤没有销售组织的客户数据。
ERP中事务码:PIVV(原则上将该功能也可以在CRM系统中通过R3AC1中的过滤条件来实现)
检查双方的字段设置是否一致。(ERP中按照账户组,CRM中按照BP角色)。
四、关键技术实现
阻止向错误的SITE发送BDOC:
对于一个CRM与一个ERP的两个客户端交互,SAP提供Multiple Exchange Projects (MEP),应该是可以解决这个问题的,但是,配置相对较为复杂。且需要引入Solution Manager系统,故放弃。具体可以参照Help:Configuring the Multiple Back-End Scenario 。
简单办法如下:
SE38:/1CRMGC/SAPLBUPA_MAIN;
在IDES中该函数组包含了两个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
复制函数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统驭科目
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:
复制函数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.
*-----------------------------------------------------------------------------------------
* 公司代码数据
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统驭科目
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
- 实现公司代码数据创建
SE38:LVV02F42;
实现增强点:
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中的数据
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;
在这里分配自定义函数以及合适的项目编号和处理事件以及对象,可以自行处理一些交互信息,不再细述。
PIDE中CRM——》ERP映射增强
不难发现在事务码PIDE中维护CRM-》ERP的映射时,系统只能维护一条(这个是有道理的,并且必须如此),如果我们需要CRM中的B类型客户映射多个ERP账户组,就需要使用下边这个BTE。
事件DE_KTOKD 函数COM_INTERFACE_DE_KTOKD_ISU
处理方法类似上边处理BDoc。
六、应用效果
客户端(700)效果:
客户端(900)效果:
七、中间件问题处理举例
CRM系统中创建完客户之后,观察SMW01显示:
通过SMW02A分析:
提示必输字段没有输入,但检查ERP中相关账户组的屏幕字段设置以及CRM中相关的字段设置,均为发现异常。出现此类情况可以使用下述方法解决:
选中SMW01中出错的条目,在命令行处输入/H,点击重新处理Bdoc消息。 ,之后进入调试模式。
点击setting按钮,选中In background task: Do not process Transaction ID。
点击键盘F8。
事务码SMQ1中会产生队列如下图所示:
双击队列名:
再次双击队列名:
选中改行,点击调试:
进入调试模式后:按下图路径为语句CALL TRANSACTION设置断点。
确定后。点击键盘F8.
此时屏幕显示如图:
双击CALL_TRANSACTION_MODE,将N改为A,并点击修改按钮。
点击F8。
此时,进入ERP客户维护界面:根据日常维护客户信息的习惯,不难发现是哪个地方在作怪。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:SAP ERP系统中间件技术应用
本文网址:http://www.toberp.com/html/consultation/10820210639.html