SAP软件中的程序对象管理
2017-03-01李林王春波
李林+王春波
【摘要】 SAP系统是一种企业资源管理软件,其由德国SAP公司开发,并成功应用于80%的世界500强企业,而在SAP软件的使用过程中,大部分公司都会使用SAP公司提供的ABAP高级开发语言进行了本地化系统改造, ABAP语言编写的SAP程序一般由多种类型的程序对象组成,这些程序对象类型之间ABAP语言定义了之间的关联关系,但是SAP公司却没有明确说明,本文通过对程序对象类型的分析,得到常用的程序对象类型之间的父子关系。这一点可以帮助我们理解ABAP语言的整体架构,有助于我们进行程序开发及企业对自己定制化开发的程序对象进行有效管理。
【关键词】 SAP ABAP程序 程序对象
在SAP系统中,进行本地化开发与配置时,会生成不同类型的开发对象,这些开发对象以数据的形式,存储在系统的数据库表中,其通过PGMID、OBJECT、OBJ_NAME三个字段来唯一标识一个开发对象。
第一个字段PGMID是指程序标识的一组编码,一般包括: R3TR、LIMU、CORR几个值,其各自的具体含义如下:
R3TR是表示其內容是程序对象,指SAP中各种类型的开发内容的一种抽象叫法,是程序开发内容的一种载体,如类、可执行程序、接口等。
LIMU也是指其包含的内容是程序对象,但其与R3TR的区别在于,其标识的是R3TR类型的对象的子对象,举例以“可执行程序”这种程序对象来说,一个“可执行程序”类型的对象,包括多个子类型的对象,如“程序屏幕”,指可给用户看到的主屏幕、子屏幕、选择屏幕等;再如“源代码”对象,指程序中执行的主体ABAP代码语句;可执行程序还可以包括“文本元素”对象,用于在选择屏幕上展示字段的标签,或在程序源代码中作为文本常量进行使用。
CORR是指备注、注释之类的信息,其不包含具体的程序对象和开发内容。如一批对象所在的传输请求号,对象释放的具体日期、时间,以及开发者信息。
第二个字段OBJECT是用来表明对象的类型具体是什么的一组编码,如为主程序(PROG)类型、源代码(REPT)类型、文本元素(REPS)类型、程序屏幕(DYNP)等。OBJECT所包含的类型,涵盖了ABAP程序语言所有已定义的程序对象类型,从而将所有的程序对象,进行了明确的分类,用以管理程序对象在软件平台中的存储、分析、以及组织整个系统有效地运行。
第三个字段OBJ_NAME就是指具体的程序对象名称了,如程序的名称,数据库表的名称,接口的名称等等。
当一个程序对象激活时,SAP系统会从数据库中读取需要的对象内容,然后根据其类型不同,执行不同的处理机制,形成不同的实际物理对象,如数据库表、编译后的程序文件等。
SAP中所有基于ABAP开发的程序对象都有一个对象类型,不同的对象类型与对象类型之间,存在着特定架构关系。如某个报表,其对象类型可以是主程序(PROG)类型,其可能包含源代码(REPT)类型、文本元素(REPS)类型、程序屏幕(DYNP)类型,这说明他们之间是父子关系,而文本元素(REPS)类型和程序屏幕(DYNP)类型是相互独立的关系,不存在关联关系。因此可以理解为一个“主程序类型”的父开发对象,包含“源代码类型”、“文本元素类型”、“程序屏幕类型”几个子类型的开发对象,也可以说成“主程序”开发对象由“源代码”、“文本元素”、“程序屏幕”几个子开发对象组成。
以上只是列举了其中的一个例子,来说明对象类型之间的关系,那么SAP系统中存在很多的开发对象类型,问题来了,如此多的对象类型,SAP是如何进行有组织的管理呢?作为开发者,该如何找到这些关系模型呢?
实际上SAP在开发ABAP开发平台时已经考虑到这一点,其在ABAP平台中设立了管理这些程序对象类型的方法。这里将SAP开发对象类型定义成两种大的类型集合,用以组织对象类型之间的关系。一种以PGMID为R3TR 的父类型集合,一种是以PGMID为LIMU 的子类型集合,根据这种定义方式,一个父类型可以包含一个或者多个子类型,一个子类型只属于一个父类型。另外根据SAP数据视图EUOBJV,可以查询某个父类型包含哪些子类型,以及一个子类型属于哪个父类型。
上图1描述了实现流程,从ABAP的代码角度具体的实现方法如下:
1.设计ABAP程序函数,实现子类型寻找父类型的功能函数。函数输入为子类型OBJECT编码,定义类型为CHAR4,输出为父类型OBJECT编码,定义类型为CHAR4。
2.函数逻辑参考逻辑流程图“子类型寻找父类型”,首先判断输入的类型是否存在,再使用下列实例SQL语句取出父类型
SELECT SINGLE tadir INTO ex_object
FROM euobjv WHERE id = in_object.
3.上述SQL语句输出的ex_object变量作为返回参数,即为父类型OBJECT编码。
4.设计ABAP程序函数,实现父类型寻找子类型的功能函数。函数输入为父类型OBJECT编码,定义类型为CHAR4,输出为子类型OBJECT编码列表,定义为内表格式。
5.函数逻辑参考逻辑流程图“父类型寻找子类型”,首先判断输入的类型是否存在,再使用下列实例SQL语句取出子类型内表
SELECT e071 INTO CORRESPONDING FIELDS OF TABL E e071_object FROM euobjv WHERE tadir = object.
6.上述SQL语句输出的e071_object即为子类型内表,但其中包含重复项,使用下面的ABAP语句可以去除重复项,得到父类型的所有子类型内表。
DELETE ADJACENT DUPLICATES FROM e071_object
7.返回e071_object内表,作为父类型所有的子类型集合。
通过这种方式,我们可以方便地得到程序对象类型与程序对象类型之间的关系,从而可以帮助使用SAP软件的企业,或从事SAP软件开发咨询的软件公司,了解SAP源程序的关系,理解系统将各种类型的程序对象组织运行的机制。在国内的企业中,尤其是在中国大型国有企业,如中国石化、国家电网等,这些企业对SAP系统进行大批量本地化开发,本文所阐述的对象与对象之间关系的分析方法,可以帮助企业更加有效地组织自己开发代码,管理自己的开发对象,加强自开发程序对象的版本管理,从而帮助企业在系统分析、系统安全方面取得进一步的提升。