這篇文章我們就來談談如何高效地對BSEG進行訪問處理。
對於簇表來說,在數據庫中沒有與之同名的實體物理表相對應,所以雖然其可在ABAP中使用,但還是有一些限制的:
1. 不能使用Select distinct語法
BSEG中的字段存儲在VARDATA中,所以不能使用distinct語句對單個項目去除重復。
2. 不能使用Native SQL
在數據庫中沒有與之同名的實體物理表相對應,所以不能使用Native SQL 對BSEG操作。
3. 不能使用Order by 語法
BSEG中的字段存儲在VARDATA中,所以不能使用Order by語句對單個項目排序。
4. 不能再追加創建索引
BSEG中的字段存儲在VARDATA中,所以不能再追加創建索引。
除此之外,對BSEG的訪問要使用主鍵項目,如果沒有主鍵項目雖然語法調試能夠通過,但是程序執行起來,耗時長,效率低,而且隨著業務量的增加執行時間問題會越發嚴重,甚至導致程序不能正常執行結束。
那么如果當鍵值不足時怎么辦呢?回答,使用二次索引透明表,具體方法如下描述。
比如和銷售憑證有關的業務,根據銷售憑證編號和明細編號,選取相關會計憑證明細信息。
SELECT *
FROM BSEG
WHERE VBEL2 = 'XXXXXXXXXX' “ 銷售憑證編號
AND POSN2 = 'YYYYYY'. “ 銷售憑證明細編號
在這個例子中,對BSEG的檢索條件中因為沒有主鍵項目,所以執行起來,程序很慢。
變通的方法:
1)首先根據銷售憑證編號和明細編號,從BSID中檢索出未清帳明細行項目。
SELECT BURKS
BELNR “ 財務憑證編號
GJAHR “ 會計年度
BUZEL “ 會計憑證中的行項目
FROM BSID
INTO TABLE TAB_KEY
WHERE VBEL2 = 'XXXXXXXXXX'
AND POSN2 = 'YYYYYY'.
2)再根據銷售憑證編號和明細編號,從BSAD中檢索出已清帳明細行項目。
SELECT BURKS
BELNR “ 財務憑證編號
GJAHR “ 會計年度
BUZEL “ 會計憑證中的行項目
FROM BSAD
APPEND TABLE TAB_KEY
WHERE VBEL2 = 'XXXXXXXXXX'
AND POSN2 = 'YYYYYY'.
3)然后再根據上面檢索出的主鍵列表,從BSEG中檢索出相應的明細行項目。
SELECT BSCHL
4)這么處理之所以能夠提高效率,關鍵還得對透明表BSID和BSAD追加以VBEL2(銷售憑證編號)和POSN2(銷售憑證明細編號)為鍵值的索引(對于透明表可追加索引)。
這樣一來,1)和2)步驟地操作有索引,3)步驟的操作有全主鍵項目,檢索速度應該有保證。
采購方面的業務、物料方面的業務等都可如法炮制。
最后需要說明一點,不是所有的SAP體統都可以使用這種方法,能否使用取決于R/3系統的設計和配置。所以在試圖使用該方法時應充分調查相關透明表與BSEG中的紀錄是否相符,別速度提高了,結果處理對象范圍減小了或增大了,那就與初衷背道而馳了,效率的提升一定要在確保業務數據正確的基礎上再加以考慮。
SAP R/3系統中也有幾個專門用來讀取BSEG表信息的函數,可適當參考使用,它們是:
另外最有效率的方法是改善你的應用和需求,要使需求合理規范,這才能使效率達到最高化。
![]() |
不含病毒。www.avast.com |