原文連結:Analyzing a Business Object
在ABAP RESTful API 模型中,Business Object(BO)被用來定義特定的實體,例如一家旅行社。BO的定義分成兩個部分:
行為定義(behavior definition )包含了如增刪改查等的基本操作,亦可定義validation、determination及action的方式,validation會在新增或變更資料時檢查正確性,determination則是會根據觸發條件修改BO實體,action則包含了非基本操作的客製化行為,例如核准採購單或取消航班等。
行為實例(behavior implementation) 由一或多個class組成,為前述validation、determination及action的實例化。而其中的基本操作可分成兩種情境:非管理(unmanaged)與管理(managed)情境,非管理情境中的增刪改查會在行為實例中就先建立實例,管理情境則是在運行時才處理。
BO通常用來為Fiori app 或 web API提供商業邏輯與功能,但也可以透過Entity Manipulation Language (EML)來從ABAP中存取BO,這是一系列可讓你用BO來增刪改查的ABAP語法。
EML還能讓你在BO中的行為實例中存取應用程式資料。
在這章將透過建立一個class,並用BO來修改之中的旅行社資料,其CDS視圖將包含key field AgencyID
,以及其他關於旅行社的諸多欄位。
行為定義區段負責定義有哪些事是BO能做的,而行為實例則是運行時實際會跑的程式碼。
行為實例是一個class,透過managed implementation in class <class> unique
來進行宣告,而行為實例則會寫在全域類別的區域類別。
行為定義在BO中是必要的,包含了前述的增刪改查及validation等,在上圖中以旅行社為例,可以看到CDS view 名稱/DMO/R_AgencyTP
以及其別名/DMO/Agency
,之後EML都會透過這個別名來尋址。
行為定義也會連結CDS與資料表,BO會使用兩張表,活動資料與草稿(未檢查的不完整資料),包含資料鎖定、檢查授權等資訊。
本章並不會深入探討這些資訊,只需要知道BO於運行時會一並處理上述議題即可,並且這些都可以根據資料表定義自動產生。
在行為實例中的全域類別,只是一個在名稱後帶有特殊關鍵字FOR BEHAVIOR OF
的空類別,實際實例則定義在區域類別中,可以點Local Types選單查看。
實例中包含了BO的主要程式碼,例如前述的validation、determination及action,而是否包含增刪改查等基本操作,則取決於行為定義時的資訊。例如,當使了會於運行時才處理增刪改查的管理類型(managed)情境,就不用額外於實例中定義基本操作。
舉例而言,validation會在運行時檢查資料是否被改變,如上例,當新資料創建時會由左側create
觸發,如果既存的資料被改變則由field Name
觸發驗證。
validation寫在行為定義之中(左),每個validation都有相對應的method(右)。validation與determination需要手動添加,其撰寫方式會在更後面的天數中提及,敬請期待。
原文中有檢視內建BO的流程影片,有興趣的可以去上方連結看。
在ABAP RESTful 應用中,主要有兩種存取BO的工具:
於存取技術而言,直接存取BO雖然可行,但一般都是強烈建議應使用BO Projections 與 BO Interfaces來存取:
BO Projection
服務需要在BO定義該服務的相關投影(Projection),BO Projections 定義了BO中的那些資料與操作可由此服務取得,並可包含特定服務的行為定義與實作。BO Projection直接基於BO或由BO Interface建立。
BO Interface
提供穩定存取BO資料與操作的管道,通常Interface會在其他軟體中被發布及使用。如果BO 中存在BO Interface,則需要使用EML來存取該介面。
BO Projection與BO Interface都具有和BO相似的結構:一到多個CDS view以及行為定義。區分這兩者簡單方式就是觀察兩者的行為定義,分別以projection
與interface
作為開頭。
而兩者的CDS view都是 CDS Projection Views。相異於原始CDS view使用as select from
,定義上則會加上as projection on
字段。
並且projection中,會在視圖名稱後方分別加上:
provider contract transactional_interface
在BO Interface名稱後。provider contract transactional_query
在BO Projection名稱後。另外在命名規則上,也有以下規定:
<namespace>C_<…>
<namespace>I_<…>
<namespace>R_<…>
明天來介紹如何使用EML!