李林+王春波
【摘要】 SAP系統(tǒng)是一種企業(yè)資源管理軟件,其由德國(guó)SAP公司開(kāi)發(fā),并成功應(yīng)用于80%的世界500強(qiáng)企業(yè),而在SAP軟件的使用過(guò)程中,大部分公司都會(huì)使用SAP公司提供的ABAP高級(jí)開(kāi)發(fā)語(yǔ)言進(jìn)行了本地化系統(tǒng)改造, ABAP語(yǔ)言編寫(xiě)的SAP程序一般由多種類(lèi)型的程序?qū)ο蠼M成,這些程序?qū)ο箢?lèi)型之間ABAP語(yǔ)言定義了之間的關(guān)聯(lián)關(guān)系,但是SAP公司卻沒(méi)有明確說(shuō)明,本文通過(guò)對(duì)程序?qū)ο箢?lèi)型的分析,得到常用的程序?qū)ο箢?lèi)型之間的父子關(guān)系。這一點(diǎn)可以幫助我們理解ABAP語(yǔ)言的整體架構(gòu),有助于我們進(jìn)行程序開(kāi)發(fā)及企業(yè)對(duì)自己定制化開(kāi)發(fā)的程序?qū)ο筮M(jìn)行有效管理。
【關(guān)鍵詞】 SAP ABAP程序 程序?qū)ο?/p>
在SAP系統(tǒng)中,進(jìn)行本地化開(kāi)發(fā)與配置時(shí),會(huì)生成不同類(lèi)型的開(kāi)發(fā)對(duì)象,這些開(kāi)發(fā)對(duì)象以數(shù)據(jù)的形式,存儲(chǔ)在系統(tǒng)的數(shù)據(jù)庫(kù)表中,其通過(guò)PGMID、OBJECT、OBJ_NAME三個(gè)字段來(lái)唯一標(biāo)識(shí)一個(gè)開(kāi)發(fā)對(duì)象。
第一個(gè)字段PGMID是指程序標(biāo)識(shí)的一組編碼,一般包括: R3TR、LIMU、CORR幾個(gè)值,其各自的具體含義如下:
R3TR是表示其內(nèi)容是程序?qū)ο?,指SAP中各種類(lèi)型的開(kāi)發(fā)內(nèi)容的一種抽象叫法,是程序開(kāi)發(fā)內(nèi)容的一種載體,如類(lèi)、可執(zhí)行程序、接口等。
LIMU也是指其包含的內(nèi)容是程序?qū)ο螅渑cR3TR的區(qū)別在于,其標(biāo)識(shí)的是R3TR類(lèi)型的對(duì)象的子對(duì)象,舉例以“可執(zhí)行程序”這種程序?qū)ο髞?lái)說(shuō),一個(gè)“可執(zhí)行程序”類(lèi)型的對(duì)象,包括多個(gè)子類(lèi)型的對(duì)象,如“程序屏幕”,指可給用戶(hù)看到的主屏幕、子屏幕、選擇屏幕等;再如“源代碼”對(duì)象,指程序中執(zhí)行的主體ABAP代碼語(yǔ)句;可執(zhí)行程序還可以包括“文本元素”對(duì)象,用于在選擇屏幕上展示字段的標(biāo)簽,或在程序源代碼中作為文本常量進(jìn)行使用。
CORR是指?jìng)渥?、注釋之?lèi)的信息,其不包含具體的程序?qū)ο蠛烷_(kāi)發(fā)內(nèi)容。如一批對(duì)象所在的傳輸請(qǐng)求號(hào),對(duì)象釋放的具體日期、時(shí)間,以及開(kāi)發(fā)者信息。
第二個(gè)字段OBJECT是用來(lái)表明對(duì)象的類(lèi)型具體是什么的一組編碼,如為主程序(PROG)類(lèi)型、源代碼(REPT)類(lèi)型、文本元素(REPS)類(lèi)型、程序屏幕(DYNP)等。OBJECT所包含的類(lèi)型,涵蓋了ABAP程序語(yǔ)言所有已定義的程序?qū)ο箢?lèi)型,從而將所有的程序?qū)ο?,進(jìn)行了明確的分類(lèi),用以管理程序?qū)ο笤谲浖脚_(tái)中的存儲(chǔ)、分析、以及組織整個(gè)系統(tǒng)有效地運(yùn)行。
第三個(gè)字段OBJ_NAME就是指具體的程序?qū)ο竺Q(chēng)了,如程序的名稱(chēng),數(shù)據(jù)庫(kù)表的名稱(chēng),接口的名稱(chēng)等等。
當(dāng)一個(gè)程序?qū)ο蠹せ顣r(shí),SAP系統(tǒng)會(huì)從數(shù)據(jù)庫(kù)中讀取需要的對(duì)象內(nèi)容,然后根據(jù)其類(lèi)型不同,執(zhí)行不同的處理機(jī)制,形成不同的實(shí)際物理對(duì)象,如數(shù)據(jù)庫(kù)表、編譯后的程序文件等。
SAP中所有基于ABAP開(kāi)發(fā)的程序?qū)ο蠖加幸粋€(gè)對(duì)象類(lèi)型,不同的對(duì)象類(lèi)型與對(duì)象類(lèi)型之間,存在著特定架構(gòu)關(guān)系。如某個(gè)報(bào)表,其對(duì)象類(lèi)型可以是主程序(PROG)類(lèi)型,其可能包含源代碼(REPT)類(lèi)型、文本元素(REPS)類(lèi)型、程序屏幕(DYNP)類(lèi)型,這說(shuō)明他們之間是父子關(guān)系,而文本元素(REPS)類(lèi)型和程序屏幕(DYNP)類(lèi)型是相互獨(dú)立的關(guān)系,不存在關(guān)聯(lián)關(guān)系。因此可以理解為一個(gè)“主程序類(lèi)型”的父開(kāi)發(fā)對(duì)象,包含“源代碼類(lèi)型”、“文本元素類(lèi)型”、“程序屏幕類(lèi)型”幾個(gè)子類(lèi)型的開(kāi)發(fā)對(duì)象,也可以說(shuō)成“主程序”開(kāi)發(fā)對(duì)象由“源代碼”、“文本元素”、“程序屏幕”幾個(gè)子開(kāi)發(fā)對(duì)象組成。
以上只是列舉了其中的一個(gè)例子,來(lái)說(shuō)明對(duì)象類(lèi)型之間的關(guān)系,那么SAP系統(tǒng)中存在很多的開(kāi)發(fā)對(duì)象類(lèi)型,問(wèn)題來(lái)了,如此多的對(duì)象類(lèi)型,SAP是如何進(jìn)行有組織的管理呢?作為開(kāi)發(fā)者,該如何找到這些關(guān)系模型呢?
實(shí)際上SAP在開(kāi)發(fā)ABAP開(kāi)發(fā)平臺(tái)時(shí)已經(jīng)考慮到這一點(diǎn),其在ABAP平臺(tái)中設(shè)立了管理這些程序?qū)ο箢?lèi)型的方法。這里將SAP開(kāi)發(fā)對(duì)象類(lèi)型定義成兩種大的類(lèi)型集合,用以組織對(duì)象類(lèi)型之間的關(guān)系。一種以PGMID為R3TR 的父類(lèi)型集合,一種是以PGMID為L(zhǎng)IMU 的子類(lèi)型集合,根據(jù)這種定義方式,一個(gè)父類(lèi)型可以包含一個(gè)或者多個(gè)子類(lèi)型,一個(gè)子類(lèi)型只屬于一個(gè)父類(lèi)型。另外根據(jù)SAP數(shù)據(jù)視圖EUOBJV,可以查詢(xún)某個(gè)父類(lèi)型包含哪些子類(lèi)型,以及一個(gè)子類(lèi)型屬于哪個(gè)父類(lèi)型。
上圖1描述了實(shí)現(xiàn)流程,從ABAP的代碼角度具體的實(shí)現(xiàn)方法如下:
1.設(shè)計(jì)ABAP程序函數(shù),實(shí)現(xiàn)子類(lèi)型尋找父類(lèi)型的功能函數(shù)。函數(shù)輸入為子類(lèi)型OBJECT編碼,定義類(lèi)型為CHAR4,輸出為父類(lèi)型OBJECT編碼,定義類(lèi)型為CHAR4。
2.函數(shù)邏輯參考邏輯流程圖“子類(lèi)型尋找父類(lèi)型”,首先判斷輸入的類(lèi)型是否存在,再使用下列實(shí)例SQL語(yǔ)句取出父類(lèi)型
SELECT SINGLE tadir INTO ex_object
FROM euobjv WHERE id = in_object.
3.上述SQL語(yǔ)句輸出的ex_object變量作為返回參數(shù),即為父類(lèi)型OBJECT編碼。
4.設(shè)計(jì)ABAP程序函數(shù),實(shí)現(xiàn)父類(lèi)型尋找子類(lèi)型的功能函數(shù)。函數(shù)輸入為父類(lèi)型OBJECT編碼,定義類(lèi)型為CHAR4,輸出為子類(lèi)型OBJECT編碼列表,定義為內(nèi)表格式。
5.函數(shù)邏輯參考邏輯流程圖“父類(lèi)型尋找子類(lèi)型”,首先判斷輸入的類(lèi)型是否存在,再使用下列實(shí)例SQL語(yǔ)句取出子類(lèi)型內(nèi)表
SELECT e071 INTO CORRESPONDING FIELDS OF TABL E e071_object FROM euobjv WHERE tadir = object.
6.上述SQL語(yǔ)句輸出的e071_object即為子類(lèi)型內(nèi)表,但其中包含重復(fù)項(xiàng),使用下面的ABAP語(yǔ)句可以去除重復(fù)項(xiàng),得到父類(lèi)型的所有子類(lèi)型內(nèi)表。
DELETE ADJACENT DUPLICATES FROM e071_object
7.返回e071_object內(nèi)表,作為父類(lèi)型所有的子類(lèi)型集合。
通過(guò)這種方式,我們可以方便地得到程序?qū)ο箢?lèi)型與程序?qū)ο箢?lèi)型之間的關(guān)系,從而可以幫助使用SAP軟件的企業(yè),或從事SAP軟件開(kāi)發(fā)咨詢(xún)的軟件公司,了解SAP源程序的關(guān)系,理解系統(tǒng)將各種類(lèi)型的程序?qū)ο蠼M織運(yùn)行的機(jī)制。在國(guó)內(nèi)的企業(yè)中,尤其是在中國(guó)大型國(guó)有企業(yè),如中國(guó)石化、國(guó)家電網(wǎng)等,這些企業(yè)對(duì)SAP系統(tǒng)進(jìn)行大批量本地化開(kāi)發(fā),本文所闡述的對(duì)象與對(duì)象之間關(guān)系的分析方法,可以幫助企業(yè)更加有效地組織自己開(kāi)發(fā)代碼,管理自己的開(kāi)發(fā)對(duì)象,加強(qiáng)自開(kāi)發(fā)程序?qū)ο蟮陌姹竟芾?,從而幫助企業(yè)在系統(tǒng)分析、系統(tǒng)安全方面取得進(jìn)一步的提升。