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