SAP(Systems Applications and Products in Data Processing)是一套功能比较强大的ERP系统,目前世界500强的企业中已有超过80%在使用SAP;他们都会进入由SAP公司提供的管理和协同商务平台,进行高效率的工作。SAP的主打产品R/3是用于分布式客户机/服务器环境的集成化企业管理应用软件,主要功能模块包括:销售和分销、物料管理、生产计划、质量管理、工厂维修、人力资源、工业方案、办公室和通信、项目系统、资产管理、控制、财务会计。
SAP的人力资源管理模块HR(Human Resource)是采用涵盖所有人员管理任务和帮助简化与加速处理的整合式应用程式,可以为公司提供人力资源规划和管理解决方案,包括 薪资、差旅、工时、招聘、发展计划、人事成本等。然而,在开发HR模块全球系统时,将会碰到全球各个国家的员工数据从原来非一个SAP系统导入到同一个SAP系统的问题,目前大多数开发人员采用的方法是:通过看Infotype录入屏幕显示的输入字段,用手工方法将字段做出来;对每个国家通过函数导出单一Infotype的结构。但是这些方法会给开发过程以及后期维护带来巨大的工作量和开发成本,而采用本文阐述解决方案,则可以将各国不同的Infotype结构通过同一个程序导出,再运用Batchinput(批量输入)程序,将能实现各国人员数据的有效、快速导入。
一、数据导入
将全球各个国家的员工数据从原来非一个SAP系统导入到同一个SAP系统的时,一般采用的方法是:通过看Infotype录入屏幕显示的输入字段,用手工方法将字段做出来;对每个国家通过函数导出单一Infotype的结构。第一种方法是通过录入屏幕的显示得到需录入数据的字段,再通过手工把字段导出,最后制作Batchinput程序把相应的数据导入,这种方法适宜针对少量的Infotye情况,简单有效,缺点是不适用大批量的操作,再之,Batchinput程序只能通过不断的复制、粘贴、修改来完成,程序灵活性严重不足。第二种方法是对每个国家通过函数导出单一Infotype的结构,没有和Feature相连,这样做手段简单,但不适合现代的全球企业。例如,由于各个国家中同一个Infotype在录入画面上的输入字段不尽相同,如图1和图2所示,中国和美国的人员“性别”字段项就不相同,为此,若使用以上方法,通常就必须将每一个国家的每一个Infotype数据通过不同的Batchinput程序进行导入,若要为某跨国公司开发一个可以给其管理64个国家的分公司人员信息系统,而每个国家常用的Infotype和Subtype共约32种,开发人员就必须完成32*64=2048个Infotype数据的导入工作,并且必须编写2048个Batchinput程序来进行数据导入,虽然说程序可能会是大同小异,但这足以给开发过程以及后期的维护带来巨大的工作量和开发成本。
图1 中国职员个人信息情况(Infotype0002)的 Infotype录入画面
图2 美国职员个人信息情况(Infotype0002)的 Infotype录入画面
因此,在开发过程中探索出了下面这种通用的解决方案,即不管有多少个国家,多少种Infotype,只要使用这种解决方案,就都能把每个国家不同的Infotype结构(包括每个字段是否为必输字段、其数据类型、数据长度等)导出,开发人员就可以在导出结构的基础上把数据通过Batchinput一次性地、快速地、有效地导入,也不再需要对每个国家的Infotype录入画面进行结构的确认。
二、通用方案
1.必需条件
在导出Infotype结构前,必须先清楚下面这些必需条件:哪些输入字段在做导入时是可以通过Batchinput进行录入的。哪些是必输字段,必输字段就是在做Batchinput时必须具有输入值。导出时须包含字段的说明、是否必输、数据类型以及数据长度。
如图3所示,要对中国职员的Infotype结构进行导出,就要从图3中左侧Infotype录入画面中知道哪些字段是可以被输入的,哪些字段是必须输入的。比如“头衔”字段,该字段是输入字段,“头衔”就是该字段的说明,查看其字段描述,如图3中右侧,就能知道其字段名:P0002-TITEL,这个在做Batchinput的时候就须用到。在方案设计中我们就是根据“屏幕数据”中指定的“程序名-MP000200”和“屏幕号-2028”,再从SAP中调查出来的函数取得我们想要的字段名,将取出的这些字段用逗号连接起来就形成CSV文件,这个文件就是数据导入的基础。我们的方案就是要通过设计的程序运行来取得这个“程序名”和“屏幕号”,然后再对取出的结构进行加工,最终得到导出结构的CSV文件。
图3 中国职员 “头衔”字段的具体信息画面
2.技术难点
本解决方案的两大技术难点如下:如何读到Feature的设置从而做到从录入界面输入一个人事领域就导出该人事领域对应国家的infotype结构。只能导出infotype显示的字段,不显示的字段不能导出。
3. 设计思路
图4 解决方案流程图
针对上面提出的解决方案两大技术难点,如图4是本解决方案的流程图,下面将对解决方案的具体步骤进行阐述。
(1)读取Feature的设置实现从录入界面输入一个人事领域就可导出该人事领域对应国家的infotype结构根据录入界面输入的Personnel Area(人事领域)导出该国的国家代码,比如中国在SAP系统中的国家代码是CN,而语言代码是ZH,这就需要从系统表T500P中取出国家代码CN后,用国家代码CN作为条件从T005中取出语言代码ZH。取出语言代码后再根据输入的Infotype从系统表T582A取出该Infotype对应的Screen Number。再根据输入Infotype从系统表T777D取出相应的Module Pool。
根据取出的Module Pool 和Screen Number从系统表T588M取到相应的Feature代码,都取到后设置全体结构变量PME04的语言和Screen Number以及其他一些通用数据,把PME04作为全局变量调用Include程序RPUMKC00里面的子程序RE549D,通过RE549D里面的FUNCTION 'HR_FEATURE_BACKFIELD'读出Feature里面对应国家的该Infotype的VARKY。如图5所示,这样就取到了T588M表的三个KEY(Module Pool,Screen Number,VARKY),从而可以确定T588M里的唯一一条记录,取出该记录的替代屏幕(ADYNR),屏幕控制(DBILD)两个字段。
图5 Feature P0001画面
把取出来的Module Pool 和替代屏幕还有语言代码作为参数,调用FUNCTION 'IMPORT_DYNPRO'就可以导出替代屏幕的字段和相应的语言说明,这样就有了Infotype的初步结构。
(2)导出infotype显示的字段,不显示字段不导出。
下面是对导出来的Ipfotype结构进行准确性的调整,包括对字段的描述信息是否适当进行调整,对导出字段是否真正在画面上显示做出判断,将不显示字段不要出现在生成的最终文件里。
取出来的Infotype结构的每个字段中包含其所在的表名,为此我们要得到这个字段的相应语言的准确说明,要调用FUNCTION 'NAMETAB_GET',把语言代码、表名作为参数,把整个表的相应语言说明给取出来。
字段是否显示的信息在屏幕控制里存在,因此我们要对取出来的整个结构进行循环,然后判断每个字段对应的屏幕控制里是否是显示信息,如果是则把该字段放到输出文件的结构里,反之则不放。
判断好是否显示后,就用该字段作为一个key去读通过FUNCTION 'NAMETAB_GET'取出来的内表,把该字段的相应说明取出来。
4.结果分析
(1)实验环境
本程序采用ABAP编程,在下面环境调试通过:Windows XP 英文版,SAP ECC6.0,内存1GB,硬盘120GB,CPU 1.83GHz。
(2)实验过程主要程序代码
根据录入画面输入的人事领域取得国家代码(LAND1)及国家分组(MOLGA),然后根据取得的国家代码(LAND1)取出语言代码(SPRAS)。程序如下所示:
* Get SPRAS From T005
SELECT SINGLE SPRAS
FROM T005
INTO I_WRK_SPRAS
WHERE LAND1 = I_WRK_LAND1.
根据录入画面输入的Infotype从系统表T582A取出对话模块名称(DNAME)及单一屏幕号(EDYNR)。
然后根据录入画面输入的Infotype取出Module Pool(REPID)。程序如下所示:
* GET HR: Infotype Module Pool from T777D
SELECT SINGLE REPID
FROM T777D
INTO I_WRK_REPID
WHERE INFTY = UP_INFTY.
根据上面取得的Module Pool(REPID)及单一屏幕号(EDYNR)取出Feature(ZYKLS)及屏幕控制(DBILD)程序如下所示:
* GET Feature for determining variable key from T588M
SELECT SINGLE ZYKLS DBILD
FROM T588M
INTO (I_WRK_ZYKLS, I_WRK_DBILD)
WHERE REPNA = I_WRK_REPID AND
DYNNR = I_WRK_EDYNR AND
VARKY = SPACE.
将取得的数据设置到结构PME04中,然后利用标准程序RE549D取得变量码(VARKY)。程序如下所示:
* Set structure
PME04-MOLGA = I_WRK_MOLGA.
PME04-TCLAS = I_CON_TCLAS.
PME04-ITBLD = I_CON_ITBLD.
PME04-DYNNR = I_WRK_EDYNR.
PME04-FCODE = I_CON_IOPER-INS.
* READ FEATURE
PME04-SUBTY = I_WRK_SUBTY.
PERFORM RE549D USING I_WRK_ZYKLS
I_CON_3
L_WRK_VARKY
L_WRK_RC.
根据以上步骤取得的Module Pool(REPID),单一屏幕号(EDYNR)及变量码(VARKY)取出替代屏幕(ADYNR)及屏幕控制(DBILD)。程序如下所示:
SELECT SINGLE ADYNR DBILD
FROM T588M
INTO (CP_DYNUMB, I_WRK_DBILD)
WHERE REPNA = UP_REPNA AND
DYNNR = UP_DYNNR AND
VARKY = UP_VARKY.
根据以上步骤取得的Module Pool(REPID), 替代屏幕(ADYNR))及语言代码(SPRAS)取出该替代屏幕上的所有字段。程序如下所示:
CALL FUNCTION 'IMPORT_DYNPRO'
EXPORTING
DYLANG = UP_DYLANG
DYNAME = UP_DYNAME
DYNUMB = UP_DYNUMB
TABLES
FTAB = I_TAB_FTAB
EXCEPTIONS
DYLANGUAGE_INVALID = 1
DYLANGUAGE_NOT_INST = 2
DYNAME_INVALID = 3
DYNPROLOAD_NOT_FOUND = 4.
对导出的画面上的所有字段进行是否显示的判断,若字段显示在画面上那么就去取该字段的文字说明,数据类型以及长度。根据标准函数取得显示字段的说明、数据类型和字段长度。程序如下所示:
CALL FUNCTION 'NAMETAB_GET' "#EC *
EXPORTING
LANGU = L_WRK_LANGU
ONLY = SPACE
TABNAME = L_WRK_TABNAME
TABLES
NAMETAB = I_TAB_DNTAB
EXCEPTIONS
INTERNAL_ERROR = 1
TABLE_HAS_NO_FIELDS = 2
TABLE_NOT_ACTIV = 3
NO_TEXTS_FOUND = 4
OTHERS = 5.
(3)实验结果
通过上面所述程序段的运行,即可以把程序取得的字段、字段说明、数据类型、是否必输、字段长度组织起来,就构成了我们想要的各国不同Infotype结构导出的文件―CSV文件。
(4)分析讨论
本解决方案编写的程序段运行之后可以一次性导出64个国家的常用Infotype,Subtype 32种结构,在开发过程使用中获得了成功,为全球企业的职员数据导入解决了很大问题,为开发过程和后期维护节约了很大成本,缩短了开发周期,获得了客户的一致好评。
本方案是笔者在长期的软件开发和使用SAP中,根据开发HR模块全球系统时遇到的问题而提出的解决方案,并通过大量的实践证实本方案和程序代码的可行性和实用性,为软件的开发和后期维护节省了巨大的工作量和开发成本。另外,要注意在系统上线后,Feature的设置不要随意改动,开发过程中一定要和BASIS人员协商好,才不会导致不良后果的产生。
|