1. 程式人生 > >SAP abap與資料庫

SAP abap與資料庫

1.sap 資料庫表的主索引是:資料庫表的主鍵,他的好處是可以提升讀取資料庫表的速度,但是會增加更新資料庫表的時間。特別在建立次級索引的時候,一定要使用經常使用的欄位進行設定。

2.sap中常用資料庫型別:透明表(transparent table),共享表(pooled table),簇表(cluster table)。

透明表是和DB層的physical table相對應的表,而後兩者是不對應到DB表的;然後多個簇表(cluster table)或者共享表(pooled table),組成一個table cluster或者table pool,tablecluster和table pool是物理層的DB.

注:簇表是邏輯上關聯的幾個表,在定義的時候分配給一個表簇、比如BSEG.

3.更新模式(DB和BDC)

3-1.非同步模式
在這個模式下,DIALOG程式和UPDATE程式各自執行。DIALOG程式寫請求到LOG TABLE,用一個COMMIT WORK來關閉LUW。UPDATE程式被COMMIT觸發並開始執行來處理這些請求,DIALOG程式繼續執行,不會等待UPDATE程式結束。UPDATE程式在特殊的UPDATE WORK PROCESS中執行。
當資料庫更新花費比較長的時間,使用者DIALOG需要較少的響應時間,非同步更新顯得比較重要。在DIALOG處理中,非同步更新是標準的技術,意思就是DIALOG程式一般會採取非同步更新方式。
可以用VBLOG這個簇表來實現LOG TABLE,或者用透明表VBHDR,VBMOD,VBDATA,VBERROR來替代它。

3-2.同步模式
可以用COMMIT WORK AND WAIT語句來觸發一個同步更新,DIALOG程式要等待UPDATE程式結束再進行下一步的處理。
如果後續處理或者DIALOG程式的結束需要依靠更新的結果,這個時候要用同步模式。可以用SY-SUBRC來檢查同步更新的執行情況,在程式等待UPDATE程式執行的過程中,DIALOG程式的DIALOG WORK PROCESS被釋放,當更新結束之後,系統重新為DIALOG程式分配一個新的空閒的DIALOG WORK PROCESS做下一步的處理。

3-3.本地模式
使用SET UPDATE TASK LOCAL語句來使用UPDATE MODULE在本地執行,同樣的用COMMIT WORK來關閉SAP LUW,更新會在同一個DIALOG WORK PROCESS中進行,DIALOG程式等待更新完成(同步)。當LOCAL UPDATE完成之後,會提交一個顯示的DB COMMIT,DIALOG程式也得以繼續執行。

      如果更新執行有錯誤,並且其中一個UPDATE MODULE發出一個終止程式的MESSAGE,系統會執行一個自動的DB ROLLBACK來丟棄這個SAP LUW所有的改變,並且DIALOG程式會終止,並彈出一個程式終止資訊。
      LOCAL UPDATE模式中,更新請求不會寫到VBLOG表中,而是在MAIN MEMORY中,因為沒有IO的訪問,其速度要比同步和非同步模式的快一點。LOCAL UPDATE只適合批量模式。
      SET UPDATE TASK LOCAL工作到遇到COMMIT WORK語句,意思就是COMMIT WORK執行之後,SET UPDATE TASK LOCAL不再有效。

4.UPDATE MODULE的型別(V1&V2)

簡單而言,V1的更新型別比V2的級別要高, 因此V1比V2要先執行,同時V1包含同步,非同步,本地的更新方式,V2只能執行非同步更新。

FUNCTION MODULE的processing type有三種,NORMAL FUCNTION MODULE,REMOTE-CAPABLE MODULE和UPDATE MODULE。每種下面又包含4種分類,立即啟動,立即啟動(不可重啟),延遲啟動,collective run.前2種屬於V1型別,後兩種屬於V2型別。

UPDATE MODULE的型別決定了其處理的模式。所有的DIALOG程式裡的V1請求都會在單獨的DB LUW裡執行。只有當V1執行成功之後才會處理V2請求,V2也會在單獨的LUWS裡執行。

V2型別的UPDATE MODULE處理的DB CHANGES一般都是緊接著V1的CHANGES(MAIN CHANGES)之後進行的。

V1型別的UPDATE MODULE分可重新啟動或不可重新啟動的兩種。V2型別的當發生錯誤的時候總是可以重新啟動,再次處理。

V2型別的COLLECTIVE RUN是SAP內部使用。相應的V2請求並不是在V1執行之後直接執行,而僅僅是在程式RSM13005被呼叫之後才執行。

V1請求都是由V1型別的UPDATE MODULE來建立的,對於同步非同步模式來說,V1型別的UPDATE MODULE都會把請求建立到VBLOG這個TABLE,對於本地更新模式來說,V1請求是在MAIN MEMORY中建立的。V2型別的請求總是建立到VBLOG表中。

V1請求都會在一個V1型別的UPDATE WORK PROCESS(UPD)作為一個單獨的DB LUW來處理。如果V1更新成功,系統會刪除V1的請求和所有在V1更新任務上的鎖,並設定一個DB COMMIT,然後觸發V2更新。

V2請求也是在一個V2型別的UPDATE WORK PROCESS(UPD2)作為一個單獨的DB LUW來處理。如果SAP系統沒有設定V2型別的UPDATE WORK PROCESS,則V2請求會在一個V1型別的UPDATE WORK PROCESS裡進行處理。如果V2請求處理成功,將會從VBLOG刪除相關的請求,並設定一個DB COMMIT。V2請求一般都會執行在沒有鎖的情況下,因為這些鎖在V1完成之後就被刪除掉了。因此,V2更新總是執行在沒有SAP LOCKS的情況下。

如果V1 UPDATE MODULE用一個終止訊息終止了V1更新,那麼V1更新任務上的鎖講被刪除,資料庫將ROLLBACK,一個E-MAIL會發送給建立這個LUW的使用者,並且V1請求在VBLOG表中被標記為不正確。V2更新也就不會被觸發。

當然如果V2 UPDATE MODULE終止了V2更新,同樣的,資料庫ROLLBACK,屬於這個SAP LUW的V2更新都不會執行,V2請求在VBLOG表中被標記為不正確。

DIALOG程式用_SCOPE = 2建立的鎖會被傳遞到V1更新任務中,在V1更新的結束,不管V1更新是否成功或者終止,都會把這些鎖自動刪除。因此,在DIALOG程式中不能顯式的刪除這些鎖(太早),或者在UPDATE MODULE裡刪除(沒必要)。