業務對象和BAPI

業務對象和BAPI59web

SAP業務對象(SWO1... 59數據庫

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

測試業務對象... 66api

BAPI68瀏覽器

BAPIABAP OO.. 70數據結構

BAPI的查找... 70架構

經過業務對象建立器SWO1查看BAPI70異步

經過BAPI瀏覽器查找BAPIBAPI... 70ide

直接查找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

相關文章
相關標籤/搜索