SAP-CPI-SF问题收集005 继承成本中心集成增强方案
导读
成本中心继承:在SAP组织架构中,部门和财务的成本中心是有关联关系,但是现实生活中,部门也存在大部门与小部门,所以有可能多个部门对于同一个成本中心,为减少成本中心与组织维护的工作量,系统提供一个成本中心继承的概念,用这个概念带来一个问题,就是数据不会存数据库,需要动态读取。今天分享的就是sap2ec的集成成本中心继承增强方案。
作者:vivi,来源:osinnovation
1 osinnovation
例如下图中的岗位,成本中心是继承上级部门的,所以本身自己这层是没有维护对应数据。SAP有继承的概念,因为成本中心在SAP里面是个财务核心概念,所以赋予它很多属性与功能,但是SF系统是个单纯的人力资源系统,成本中心只是一个辅助字段,系统就没有这么复杂的功能,当我们需要把数据传输到SF系统,就需要通过递归找到对于的数据。
在debug标称程序的时候,发现程序是有考虑到这要的情况,但是不知道为什么只是针对职务C类型,对岗位标准的集成代码没有处理,所以思考下,是不是可以参考标准程序复制下面的代码?其实下面这段代码的核心就是436行的函数,这个函数ppome的时候也会进入,所以就是一个帮我们递归找成本中心的函数。找到函数后面就是找到对应的的增强点。
SAP2EC的数据复制增强点主要是下面这个badi,这个badi里面有好几个子节点,分别处理对于的功能,我们需要的是黄色标记的,这里面是状态好的ec字段与sap字段的对于关系与值,所以我们只需要在这个地方修改数据即可。
这个增强有两个方法,一个是关于人事主数据,一个是关于组织主数据的,OM是组织相关的,EMP是人事的,注意这个地方是个循环调用的过程,因为标准集成的SAP2EC是一个表一个表的调用,这个不存在事物的概念,即使一张表出现问题,不影响其他,ec2sap则不然,只要一个错误,整个人的数据不会复制。
增强点只有输入变量,配置的模版,还有就是当前的模版数据,但是我们实际操作的时候,我们发现需要读取其他模版的数据,但是这个地方没有输入变量,所以觉得这个badi设计有点不合理。不过我们可以借用sap的隔山打牛的方法获取变量数据。
比如下图中的我需要读取内表0000的数据,29行就是读取P0000内表的数据,这要即使badi的接口没传入变量的数据,可以借用这个方法解决此问题。
METHOD if_ecpao_erp_emp_data_update~modify_om_object_data. DATA: ls_om_data LIKE LINE OF ct_om_object_data. DATA: lt_costcenters TYPE TABLE OF rhom_costcenters, ls_costcenter TYPE rhom_costcenters, lt_message TYPE TABLE OF bapiret2. data ls_field type ECPAO_S_ECEE_MAP_EMP_DATA. data T_OBJID TYPE HROBJID. LOOP AT ct_om_object_data INTO ls_om_data. IF iv_template_id = if_ecpao_data_constants=>gc_odata_om_department AND ls_om_data-ec_field_id = 'cust_Company' AND iv_otype = 'O'. ls_om_data-value = '1000'. MODIFY ct_om_object_data FROM ls_om_data TRANSPORTING value. ELSEIF iv_template_id = if_ecpao_data_constants=>gc_odata_om_position AND ls_om_data-ec_field_id = 'costCenter' AND iv_otype = 'S'. IF ls_om_data-value IS INITIAL. TRY . CLEAR T_OBJID. ls_field = ct_om_object_data[ ec_field_id = 'code' ]. T_OBJID = CONV #( ls_field-value ). CATCH cx_sy_itab_line_not_found . " MESSAGE '未找到数据' TYPE 'E' . ENDTRY. IF ls_field-value IS NOT INITIAL. CALL FUNCTION 'RH_READ_COSTCENTER_OF_OBJECT' EXPORTING plvar = '01' otype = 'S' objid = T_OBJID keydate = ls_om_data-begda TABLES costcenters = lt_costcenters messages = lt_message. ENDIF. READ TABLE lt_costcenters INTO ls_costcenter INDEX 1. IF ls_costcenter-costcenter IS NOT INITIAL. "CONCATENATE ls_costcenter-contrlarea ls_costcenter-costcenter INTO <fs_objc_data>-value. SAP Note 3449637 - MWCK097658 ls_om_data-value+0(4) = ls_costcenter-contrlarea. ls_om_data-value+4(*) = ls_costcenter-costcenter. ENDIF. MODIFY ct_om_object_data FROM ls_om_data TRANSPORTING value. ENDIF. ELSEIF iv_template_id = if_ecpao_data_constants=>gc_odata_om_position AND ls_om_data-ec_field_id = 'company' AND iv_otype = 'S'. ls_om_data-value = '1000'. MODIFY ct_om_object_data FROM ls_om_data TRANSPORTING value. ENDIF. ENDLOOP. ENDMETHOD.