從數據庫中取數據有三種方式:OPEN SQL NATIVE SQL和LOGICAL DATABASE,LOGICAL DATABASE相對於前兩種方式,有下列優勢:
l 它是按照primary key sequence來取數據的
l 可以在logic database program加入權限檢查
l 可以自動產生selection screen使查詢更加靈活
l 程序員不需要知道logical database中表之間的具體關係
l 對於logical database的性能優化可以影響到使用它的任何程序
l 維護和增強可以實現中央處理
4.6C中SAP提供了大約190個logical database。如果logical database有三個字符,前兩個是logical database的名字第三個是logical database的application area。看每個字符代表的那個application area可以通過程序的attribute的application field的F4來查看。只有executable或report可以使用logical database。關鍵字NODE <node>,決定了logical database中的那個node要被使用,NODES爲這個node準備響應的存儲空間(work area或table area由node type來決定)。在4.6中tables仍然可以被使用。當logical database從數據庫中讀取數據時就會執行PUT <node>從而觸發GET事件,GET <node>並不取數據。事件的執行順序是由logical database本身的結構決定的。在get event中使用fields很很重要就像OPEN SQL中儘量避免SELECT *一樣。Logical database是由很多subobjects組成的,structure決定了hierarchy以及數據的讀取順序。Node name最多有14個字符組成,有四種Node type:
l Table(type T):node name是一個transparent table name,node name和table name的名稱必須一致,不允許deep types。
l DDIC type(type S):任何Node name都可以,node type由dictionary中的structure或table type來決定,允許deep types。
l Type groups(type C):node type是在type group中定義,type group name必須在Type group field中維護。應當優先使用DDIC TYPE以便像SAP QUERY這樣的應用也可以使用。
l Dynamic nodes(type A):沒有固定的type,它在程序運行時才能夠確定。
報表的START-OF-SELECTION在所有的get events之前發生,END-OF-SELECTION在所有的get events之後發生。GET <node> events一旦從logical database中取得數據時都回觸發,所以這個事件會被多次觸發。Get events的執行順序由logical database的結構決定。當節點的所有子節點都被處理後再節點的下一個數據被處理之前就會觸發GET <node> LATE事件,在事件開始系統會自動創建一line feed,並把color,font和intensity設爲系統默認,如果在其他事件中設置了color,也會被重設爲系統默認。CHECK結束當前事件,STOP結束程序處理執行END-OF-SELECTION,在END-OF-SELECTION中的STOP,則之際顯示list buffer。EXIT結束程序處理,也不執行END-OF-SELECTION,直接顯示list buffer中的內容。
還可以使用REJECT,當前的處理被終止,還可以在下一次數據讀取時觸發。Logical database程序有一個include:db<name>sel,這裏定義了logical database的selection screen。For node把selection分配給單個的logical node。Selection screen的屏幕形式由程序中的nodes表達式決定。Field selection可以由Logical database程序中的node決定,這個通過SELECTION-SCREEN中的FIELD SELECTION FOR NODE決定。Logical database程序中的這段代碼可以使application program中通過GET <node> FIELD <field list>來限制取出數據的數量,logical database程序中可以爲某個Node設置dynamic selection,在語句中可以通過addition:DYNAMIC SELECTIONS FOR NODE來實現,這樣Dynamic selection button就會在你的報表的selection screen中出現。另外logical database還可以定義不同的selection screen version。如果你在報表程序中指定了一個logical database,你就可以使用logical database的selection screen了。如果在report程序中你只指定了logical database的子節點,其上層的節點的篩選條件也可以被使用。對於T(table)類型的node,可以通過TABLES來聲明它的work area。值得注意的是logical database總是按照自己的結構來讀取數據的,所以當你需要讀取logical database的比較深層次的node的數據的時候,你需要考慮換一個其所在層次比較高的logical database或者自己寫取數邏輯。Selection view決定了什麼樣的字段會顯示在selection screen。可以創建類型爲CUS的自己的view,或者覆蓋類型爲SAP的view。
Logical database程序的命名規則是:SAPDB<ldbname>其中ldbname是logical database的名稱。這些程序是由subroutine組成的,每個subroutine對應於一個事件。例如subroutine <init>是在logical database程序啓動前執行,用來初始化變量和屏幕選擇。還有其他的一些subroutine也是在屏幕的PBO或PAI事件中發生的。例如AUTHORITY CHECK是在PAI中發生的。數據庫訪問是在put_<node> subroutine中實現的。這個subroutine可能會被多次執行,這取決於屏幕的選擇條件。這些subroutine的執行順序由logical database的structure來決定。使用logical database的report在執行時控制權首先屬於logical database program。每個事件在logical database program中都有一個對應的subroutine。在LDB和相應的report之間交互的時候LDB中的subroutine都會先執行。Logical database program讀取數據的順序是按照其structure執行的,總是從最頂部向下循環。LDB program是通過PUT_<NODE> subroutine來訪問數據的,在PUT event中,control由LDB program傳向report program的GET EVENT。取出來的數據或放到report program相應的work area中。GET event一旦執行完畢control就會還給LDB program。Data read的depth是由report program的GET event來決定的。如果node的某個field沒有篩選條件,可以在report program中增加這個字段select-options在這個node的GET event中通過check來篩選。