業務對象和BAPI


業務對象和BAPI59

SAP業務對象(SWO1... 59

業務對象類型的組成... 62

測試業務對象... 66

BAPI68

BAPIABAP OO.. 70

BAPI的查找... 70

通過業務對象創建器SWO1查看BAPI70

通過BAPI瀏覽器查找BAPIBAPI... 70

直接查找BAPI函數... 71

查找某個事務碼相對應的BAPI72

根據BAPI函數查找對應的業務對象... 74

調用BAPI75

事務性... 75

ABAP中調用BAPI函數... 76

BAPI調用成功與否一般通過RETURN參數返回(約定俗成)... 76

實例:通過BAPI修改資產數據

業對象和BAPI

Term/Synonym

Definition

Business object BO

1.      業務對象,封裝了與該對象相關的數據與方法;

2.      每個業務對象都必須定義關鍵字段,用於唯一確定一個特定的業務對象;

3.      業務對象中某些通用的方法具有標准的定義格式(如getlist);

4.      業務對象中定義的方法分為Instancedependent方法與instanceindependent兩類。

Business Object Repository

業務對象倉庫。

Business Application Programming InterfaceBAPI

1       訪問R3中業務對象與業務過程的標准編程接口。

2       BAPIs 定義了BOR中業務對象的方法。

3       BAPIs 通過RFCenable的功能模塊實現。

4    用戶可以自行開發新的BAPI以滿足業務需求。

SAP業務對象(SWO1

業務對象是現實世界中對象在SAP系統中的抽象,其內部封裝了業務邏輯,並可以通過BAPI方法從外部進行訪問,為SAP系統中的數據和流程提供了面向對象的視圖。SAP中業務對象最初是為工作流系統的實現而開發的,但到目前,已廣泛應用於整個SAP系統中的各個領域,如ArchiveLink、數據傳輸、GOSGeneric Object Service)系統等

業務對象通過組件存儲信息,包括接口、關鍵字段、屬性、方法和事件等,其中,關鍵字段和屬性對應底層數據庫表中的字段,具體的業務對象實例存儲在相關的數據庫表中。方法分為同步和異步兩種,可以通過ABAP代碼、事務、函數和報表來實現,通過BAPI函數實現的方法稱為BAPI方法。上述組件通過一個ABAP程序與業務對象類型進行集成,在技術上實現SAP業務對象的構架:

image163

 

業務對象類型是業務對象的定義和描述,面向對象架構的實現基礎,也就是SAP系統中的“類”,它封裝了業務功能和數據,一個業務對象即為一個業務實體,其中不僅包含業務對象本身的數據,還包含其功能的實現,根據業務規則來組織數據和業務過程。例如一個物料業務對象,其數據傳輸方法和具體業務應用的實現都整合在該對象中

業務對象整體架構包含四層:

l       最內層SAP業務對象內核層,包含對象本身的內部數據結構及標准設定,如一個職員的姓名年齡、地址等

l       整合層,包含對象的業務邏輯。如一個職員的性別屬性只能輸入特定值、一個銷售組織只能將貨物銷售給已經定義的業務伙伴等

l       接口層,提供該業務對象類型的外部訪問接口,包括屬性、方法、BAPI方法、事件等,這些方法代表着業務對象的行為,它們可以訪問對象的數據,並改變一個對象的當前“狀態”

l       外部訪問層,定義了支持對業務對象數據訪問的具體技術,如RFC\JCo\NCo等位於該層,這些技術通過接口層中定義的接口操作數據對象

image164

 

業務對象倉庫瀏覽器的事務代碼是SWO3

image165

業務對象在業務對象瀏覽器中定義,業務對象創建器SWO1

image166

SWO1中可以根據業務對象類型來查看它所對應的業務對象,知道業務對象后就可以在BAPI瀏覽器查找了

image167

 

面向對象中的“類”和“對象”的區別在於,一個是抽象化的概念,一個是具體的實例。SAP系統也是如此,系統中每個單獨的業務對象即為這類業務對象的實例,包含具體的數據。如物料A01B02均為“物料”類的實例。業務對象類型也是可以繼承的,如業務對象類型BUS1001006(標准物料)和BUS1001001(零售物料)的父類型都是BUS1001(物料):

image168

SAP業務對象不支持多重繼承,即一個業務對象類型只能制定唯一的父類型,但一個對象可以實現多個接口,如下圖中的物料業務對象類型BUS1001就實現了多個SAP接口,這些接口中定義的方法將在該對象類型中重新實現:

image169

接口中僅定義屬性和方法的名稱,但不能包含具體實現

業務對象類型的組成

業務對象類型組件:SAP對象的接口、屬性、方法、事件

l       接口:本身就是一種特殊的業務對象類型,不能生成對象實例,但可以作為其它業務對象類型的接口組件, 其屬性和方法或事件會自動添加到實現它的業務對象類型中

l       關鍵字段:用於唯一確定一個業務對象類型的實例,通常是業務對象底層數據庫表的對應主鍵

l       屬性:業務對象的數據部分, 可以是數據表中的字段、運行值(又稱虛擬屬性, virtual attribute) 或指向其它業務對象的指針(對象引用, object reference)等。其中,對象引用多用於工作流設計過程

l       方法:用於操作業務對象屬性,可以通過調用事務、function module report ABAP 代碼來完成。方法是外界對業務對象進行訪問的接口

l       事件:定義了SAP系統中與該業務對象相關的某種行為,通常是狀態的改變。事件往往與工作流系統相關聯。可通過事件觸發工作流或任務。

image170

 

1)下圖為業務對象類型BUS1001的組件列表:

image171

上圖中的關鍵字段Material.Material即為數據庫表MARA中的關鍵字段:

image172

2)在瀏覽某個業務對象類型基本數據時,可以修改Defaults選項卡中業務對象的默認方法和屬性,如果對業務對象訪問時沒有指定其他具體參數,則將執行默認的方法(具體是這樣的嗎?如何測試?):

image173

3)在方法列表中,其名稱后有綠色標記的方法,表示該方法是通過BAPI實現;如果有“Stop”標識則表示該方法已經過時,有新的替代方法,不應再使用:

image174

4)雙擊某個方法(GetDetail),可以查看其名稱、版本信息,並可以設定方法的一些特性:

image175

上面General選項卡的各個選項的意義如下:

l  Dialog:表示方法中包含用戶交互對話,這種類型的方法不能在后台模式中執行

l  Synchronous:設定方法的處理為同步模式;否則為異步模式。在工作流系統中,基於異步方法所創建的任務必須包含至少一個終止事件

l  Result parameter:設定方法將返回一個參數作為結果。可能結果的值列表可以在Result type選項卡中的參照數據字典類型或對象類型來設定。只有同步方法才能夠設定返回結果

l  Instance-independent:表示該方法為實例無關的對象類型方法,即並不關聯到特定物業的操作,例如Create(創建物料)、Getlist(顯示列表)等方法,使用時並不需要指定具體操作的物料代碼;而GetDetail等方法就需要在輸入參數中設定關鍵字段,確定所操作的對象實例

Reuslt type選項卡用於設定方法的返回類型,只有選中Result parameter選項后才需要設定該選項卡:
image176

ABAP選項卡中還可以選擇業務對象方法的實現方式,具體包括功能模塊、BAPI函數、事務、報表等(業務對象方法如果是通過BAPI方法來實現的,則實現方式要選擇API function,另外還需要指定對應到的BAPI功能模塊,如下圖):

image177

雙擊上圖中的BAPI功能函數模塊,即可進入到BAPI功能模塊的源代碼屏幕。該功能模塊是一個支持遠程調用的功能模塊(RFM),其功能是將從數據庫中選擇物料的數據,並通過表參數返回結果,並在下面第(6)步的業務對象實現程序RBUS1001的方法GetDetail所對應的代碼段中調用該BAPI功能函數模塊

 

5)把光標放在某方法名上,選擇Parameters按鈕,可以查看方法的輸入輸出參數設定。對於同步方法可以設定輸入、輸出參數、返回值以及異常;而對於異步方法則只能設定輸入參數

image178

image179

6)把光標放在某組件上,選擇Program按鈕,可以查看該組件在業務對象程序中相關代碼段。業務對象BUS1001的系統程序名為RBUS1001,業務對象組件中關鍵字段、屬性的定義,以及方法和事件的實現,都在該程序的代碼完成。該程序及其中的代碼,一部分是在創建業務對象時自動生成的,一部分是通過手工添加進行完善的。下圖為方法Material.GetDetail的代碼,因為GetDetail是一個BAPI方法,所以圖中的代碼段將調用BAPI功能模塊BAPI_MATERIAL_GET_DETAIL,而普通的方法(非BAPI)不一定需要通過BAPI功能模塊實現:

image180

測試業務對象

(1)       通過SWO1界面,輸入業務對象 BUS1001,選擇image181按鈕,進入測試界面,此時業務對象還沒被實例化,因此只顯示與實例無關的屬性和方法(即靜態屬性與方法):

image182

(2)       如果需要測試與實例相關的方法,則需要點擊Instance按鈕,指定一個物料業務對象實例,即輸入特定的物料號,就可以對實例方法進行測試了:
image183

(3)       選擇GetDetail方法后面的image184按鈕,並根據需求輸入該BAPI方法的Import參數值:

image185

(4)       輸入參數后,點擊執行,會界面結果屏幕:

image186

image187表示是一個結構可內表

(5)       返回到初始測試頁面,並選擇Display方法,按同樣的步驟進行測試,執行后系統將進入事務MM03界面,該方法不是一個BAPI方法,沒有輸入輸出參數及返回值,而是直接調用一個事務:

image188

BAPI

image189

BAPI是在BOR(業務對象倉庫)中為SAP業務對象類型或接口類型定義的特殊方法,通過具有RFC屬性的ABAP功能模塊(即RFM )來實現,這種和業務對象關聯的RFM也稱為BAPI功能模塊,俗稱BAPI。因此,BAPI本意指代業務對象方法,但也常常可以指代其實現的功能模塊

 

SAP業務對象的方法可以通過多種方式實現,BAPI實質上是一種特殊的、支持遠程調用的業務對象方法,是通過具有“可遠程調用”屬性的函數實現

 

BAPI作為建立在RFC協議之上的、通過業務對象類型進行組織的系統接口,是在業務級別而不是技術層次定義的,因此可作為任意外部系統或應用訪問SAP系統的標准途徑,具有開放優點。一旦SAP為對象發布一個BAPI,則保持在后續所有軟件版本對該BAPI的支持

 

BAPIBusiness Application Process Interface(業務應用編輯接口)它實質上就是一種特殊的RFC比如修改資產數據的BAPI函數

image190

 

RFCRemote Function Call不僅是一個函數,也是一個數據通信協議,與外部程序調用

 

RFC與普通的本地函數(也就是上面第一項:Normal Function Module)不同的是,RFC所有參數只能是傳值Pass Value,原因是因為遠程調用時,參數值的傳遞都是值,而不是引用,因為變量的引用都在本地內存中才能引用並指向

image191

 

與前面介紹的BDCCATTLSMW的應用不同,前三者是通過錄制屏幕的方式來實現數據維護,而BAPI則需要通過ABAP程序來調用,只需要向指定的接口中傳遞數據,即可完成數據的維護操作。當然,不是所業務都提供了BAPI,有的還是需要通過BDC等方式來實現數據的批量維護

 

ü  它實際上是一種特殊的Remote Function Modules (RFC),在SAP內部組件及非SAP組件之間的技術整合與業務數據交換過程中起很大的作用。SAP通過該標准接口把整個系統鏈接為一個整體。外部程序可以通過BAPI訪問SAP系統中的業務對象、數據、應用

ü  它提供的基於企業目標(Business Object業務對象) 技術的接口應用界面

ü  SAP采用了Object-oriented技術,邏輯定義了SAP R/3系統的所有功能目標,並且將所有的目標(Objects) BAPIs存儲於企業目標庫BOR(Business Objects Repository).

ü  SAP R/3 企業業務對象的對象類型(Object Type) 相當於對象設計語言中類(Class) 的概念,其定義結構由以下幾部分組成:基本數據、接口界面、鍵(Key Fields)、方法(Methods)、特征(Attributes)、事件(Events)

ü  BAPI支持同步、異步的數據通信過程

ü  通過基於RFC協議實現的BAPI接口,可以從應用層直接對SAP業務對象進行訪問

ü  BAPI建立在RFC協議基礎上,外部語言需要進行RFC調用,即通過外部RFC接口來調用BAPI

ü  在第三方開發環境中,我們既能夠直接訪問BAPI,也能夠通過RFC訪問BAPI。在面向對象語言中(如:JavaC++),我們既直接訪問BAPI也能夠通過RFC訪問BAPI,而在非面向對象語言中(如:C),只能利用RFC訪問BAPI

BAPIABAP OO

image192

BAPI的查找

通過業務對象創建器SWO1查看BAPI

具體操作可查看前面SAP業務對象中前部分SWO1的講解

通過BAPI瀏覽器查找BAPIBAPI

事務碼BAPI

image193

image194

Documentation選項卡中的說明文檔提供了使用相關BAPI的詳細說明。

 

可以通過業務對象名來查找某個業務對象類型(如下圖可以直接找出業務對象類型為 Material 的業務對象):

image195

直接查找BAPI函數

BAPI對應的功能模塊命名規則BAPI_<bo>_<method><bo>即為業務對象名),因此可以直接在SE37中通過前綴BAPI加對象名稱或方法名稱作為關鍵字,快速查找一個BAPI功能模塊函數。如檢索 BAPI*Material*Get*

image196

查找某個事務碼相對應的BAPI

如果只知道事物代碼,可以通過下面的方式查詢相應的BAPI。例如找創建銷售(物料模板根據此方法好像找不出)訂單的BAPI,我們知道事物代碼是VA01

1.         我們進入VA01 界面,找到system ? status

2.         在事物代碼位置上雙擊注:不是程序上雙擊),找到PACKAGE  VA

image197image198

3.         SE80打開包 VA ,或點擊 Display Object List按鈕直接進入到SE80對象列表:

image199

4.         打開業務工程(引擎)——業務對象類型。根據我們的業務需求。我們要找銷售訂單的創建,所有BUS2032 銷售訂單的可能性最大。

image200

5.         雙擊打開業務對象類型BUS2032,尋找和創建銷售訂單名字相同的方法這里我們要找的就SalesOrder.CreateFromDat2

image201

雙擊SalesOrder.CreateFromDat2 行,在彈出的窗口中找到 ABAP 選項卡,如果單選按鈕是 API功能,則名稱一欄即為我們要找BAPI,如果是函數模塊即為一個FM,即BAPI_SALESORDER_CREATEFROMDAT2

image202

注:上面是SalesOrder為業務對象名,而BUS2032為業務對象類型名:

image203

根據BAPI函數查找對應的業務對象

BAPI 函數跟業務對象的關系存儲在表SWOTLV中,對於一個業務對象,除了函數外,還存儲了一些其它信息。這個表的 ABAPNAME 字段存儲的就是函數名稱,而 LOBJTYPE 字段則存儲了業務對象類型名稱。這樣,當我們找到一個 BAPI 函數后,就可以到這個表里查找它對應的業務對象了:

image204

SAP 在給業務對象命名的時候僅有一部分用了縮寫命名法,可以從縮寫中猜測到業務對象的作用。接下來就是找表TOJTB,它的 NAME 字段存儲了業務對象類型名稱,而 EDITELEM 則是業務對象,這個描述就是事務碼BAPI 中看到的名稱。此外,從它的文本表 TOJTT 中還可以得到關於這個業務對象的詳細描述:

image205

調用BAPI

事務性

BAPI功能模塊是BAPI方法的具體實現。

 

根據事務的ACID原則,一個獨立的BAPI實現必須具有事務性,同時,BAPI事務模型還必須允許開發者在調用多個BAPI時可以將它們綁定到同一個LUW上。因此,如果同時調用幾個BAPI,開發者需要在程序中進行的事務控制,決定何時執行數據庫提交或回滾操作;而BAPI內部則通常不包含COMMIT WORKROLLBACK WORK命令

 

操作多個BAPI時必須遵循以下原則(注:都是指在外部程序即主調程序中,而非BAPI功能模塊內部):

l  如果有更新操作的BAPI,如創建、修改或刪除一個業務對象實例,則對該實例進行另外的讀取操作的BAPI只能訪問上一個COMMIT WORK執行后的最新數據

l  在同一個LUW中,不能對同一個業務對象實例時行超過一次的更新操作。例如,不允許在一個LUW中創建一個新實例,隨后就修改它。但可以創建多個相同的類型的不同實例

 

BAPI內部,數據庫更新操作必須通過同步或異步的更新過程實現,因為否則可能出現不必要的數據庫提交過程,從而破壞了BAPI調用的ACID原則。同樣原因,BAPI內部也不能觸發新的LUW,因而其內部程序代碼中不能包含以下命令:

l  CALL TRANSACTION

l  SUBMIT REPORT

l  SUBMIT REPORT AND RETURN

 

因此,BAPI事務中的數據庫提交和回滾必須在主調程序中通過調用SAP標准業務對象BapiService(對象類型為SAP0001)的BAPI方法BapiService.TransactionCommitBAPI方法實際上還是通過調用BAPI函數BAPI_TRANSACTION_COMMIT來實現的)BapiService.TransactionRollback(此BAPI方法實際上還是通過調用BAPI函數BAPI_TRANSACTION_ROLLBACK來實現的)來完成。在R/3 4.5之前,可以使用遠程功能模塊BAPI_TRANSACTION_COMMITBAPI_TRANSACTION_ROLLBACK完成相同的功能

 

在外部程序調用BapiService.TransactionCommit方法前,外部程序調用BAPI時並不觸發數據庫提交

 

對於BAPI的操作都要用BAPI_TRANSACTION_COMMIT來提交的,所以要判斷BAPI的執行情況的返回值(參數RETURN),如果有錯誤要用BAPI_TRANSACTION_ROLLBACK取消所做的操作。建議在調用BAPI_TRANSACTION_COMMIT函數進行提交BAPI操作時,加上wait參數(如在該函數調用處后面代碼需要讀取前面剛提交的數據時),這樣會減少某些錯誤: 

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
   
EXPORTING
     
wait = 'X'.

WAITX時,會執行COMMIT WORK AND WAIT語句,否則執行COMMIT WORK語句

ABAP中調用BAPI函數

BAPI調用成功與否一般通過RETURN參數返回(約定俗成)

因為需要支持事務性RFC調用,所以BAPI功能模塊中不包含異常處理參數(以及Changing也是沒有的,只有ImportExportTables參數)。其成功調用或出錯信息通過Export中的特定輸出參數RETURN返回。該參數的數據結構可以參照數據字典結構BAPIRETURNBAPIRETURN1BAPIRET1BAPIRET2BAPIRET2_FIX等來定義,各種RETURN結構中的通用字段包括:

l  TYPE,消息類型,如SEWI

l  ID,消息類型

l  NUMBER,消息編號

l  MESSAGE,消息文本

l  MESSAGE_V1MESSAGE_V2MESSAGE_V3MESSAGE_V4,消息變量

image206

 

BAPI返回結果時,必須通過與所調用的BAPIRETURN參數相同類型的程序變量接收該參數返回值,並查看其結果。如果BAPI調用過程成功完成,RETURN字段可能為空,也可能在TYPE字段中包含S值,這需要在調用程序自行判斷處理

實例:通過BAPI修改資產數據

BDC錄制時,只需要輸入資產編號就可以從系統自動抓出該資產分類,而該BAPI有三個參數是必輸入的:公司代碼、資產編碼、資產分類,在調用BAPI時只能通過資產編號與公司代碼到相應表(ANLA)中查找分類了。

image207

BAPI的參數結構有個特點:一般會將類似的字段放在同一個結構中,同時,還會存在一個與該結構名類似(后面以X結尾)標識結構,該標識結構中的字段名與賦值的結構中的字段名一致,但是其字段類型只是一個長度為1的字符,用於標識某個字段的數據是否需要通過BAPI來變更,例如:資產中的“一般數據”都通過BAPIGENERALDATA字段來維護,若使用GENERALDATA接口,則需要傳遞GENERALDATAX結構。如這里要修改資產描述,資產描述對應的字段是GENERALDATA-DESCRIPT,若該字段被賦值,那么必須同時賦值GENERALDATAX-DESCRIPT=X,該字段才會被修改

 

TYPE-POOLS:truxs.
DATA:it_raw TYPE truxs_t_text_data.

DATA: companycode LIKE bapi1022_1-comp_code VALUE '0005',
      asset
LIKE bapi1022_1-assetmaino  VALUE '11000001',
      subnumber
LIKE bapi1022_1-assetsubno VALUE '0',
      generaldata
LIKE bapi1022_feglg001 ,
      generaldatax
LIKE bapi1022_feglg001x,
     
return LIKE bapiret2.

START-OF-SELECTION.
  generaldata
-descript = '資產描述'.
  generaldatax
-descript = 'X'.
  generaldata
-descript2 = '資產主號說明'.
  generaldatax
-descript2 = 'X'.

 
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
   
EXPORTING
     
input  = asset
   
IMPORTING

     
output = asset.

 
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
   
EXPORTING
     
input  = subnumber
   
IMPORTING

     
output = subnumber.

 
CALL FUNCTION 'BAPI_FIXEDASSET_CHANGE'

  
 DESTINATION 'NONE'"根據設定的目標值,可以遠程調用,也可本地調用
    EXPORTING
      companycode 
= companycode
      asset       
=
asset
      subnumber   
=
subnumber
      generaldata 
=
generaldata
      generaldatax
=
generaldatax
   
IMPORTING

     
return       = return.
 
IF return-type <> 'S'.
   
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
 
ELSE.
   
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     
EXPORTING
       
wait = 'X'.
 
ENDIF.

 
WRITE: / return-type , return-message.

image208


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM