BSEG於一般的透明表不同,它是一個簇表。對於一個簇表來說,除了主鍵項目外,其他項目都被編輯到一個長文本項目中,一起儲存在表簇RFBLG中的vardata項目中,這就決定了作為簇表的BSEG無法再建立索引值以外的索引(INDEX),所以一般我們對於透明表來說當主鍵項目不全或完全沒有時,追加索引的作法對於BSEG表來說就不好用了。而BSEG簇表又是SAP系統中FI
會計模組中最常被使用的資料表,所以運用好對BSEG表的訪問技術對於FI會計模組的擴充開發(ADDON)至關重要。
這篇文章我們就來談談如何高效地對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 BSEGWHERE VBEL2 = 'XXXXXXXXXX' “ 銷售憑證編號AND POSN2 = 'YYYYYY'. “ 銷售憑證明細編號在這個例子中,對BSEG的檢索條件中因為沒有主鍵項目,所以執行起來,程式很慢。變通的方法:1)首先根據銷售憑證編號和明細編號,從BSID中檢索出未清帳明細行項目。SELECT
BURKS “ 公司代碼BELNR “ 財務憑證編號GJAHR “ 會計年度BUZEL “ 會計憑證中的行項目FROM BSIDINTO TABLE TAB_KEY “ 存放主鍵項目的內部表WHERE VBEL2 = 'XXXXXXXXXX' “ 銷售憑證編號AND POSN2 = 'YYYYYY'. “ 銷售憑證明細編號2)再根據銷售憑證編號和明細編號,從BSAD中檢索出已清帳明細行項目。SELECT BURKS “ 公司代碼BELNR “ 財務憑證編號GJAHR “ 會計年度BUZEL “ 會計憑證中的行項目FROM
BSADAPPEND TABLE TAB_KEY “ 存放主鍵項目的內部表WHERE VBEL2 = 'XXXXXXXXXX' “ 銷售憑證編號AND POSN2 = 'YYYYYY'. “ 銷售憑證明細編號3)然後再根據上面檢索出的主鍵列表,從BSEG中檢索出相應的明細行項目。SELECT BSCHL "転記キーKOART "勘定タイプUMSKZ "特殊仕訳コSHKZG "借方/貸方HKONT "総勘定元帳GSBER "事業領域DMBTR "國內通貨額WRBTR "伝票通貨額ZUONR "ソートキーSGTXT
"明細テキスZFBDT "期日計算のZTERM "支払條件キZLSCH "支払方法ZLSPR "支払保留キHBKID "取引銀行のBVTYP "取引先銀行FROM BSEGINTO TABLE TAB_BSEG “ 存放檢索結果的內部表FOR ALL ENTRIES IN TAB_KEY “ 存放主鍵項目的內部表WHERE BUKRS = TAB_KEY-BUKRS. “ 公司代碼AND GJAHR = TAB_KEY-GJAHR “ 財務憑證編號AND BELNR = TAB_KEY-BELNR “ 會計年度AND
BUZEI = TAB_KEY-BUZEI. “ 會計憑證中的行項目4)這麼處理之所以能夠提高效率,關鍵還得對透明表BSID和BSAD追加以VBEL2(銷售憑證編號)和POSN2(銷售憑證明細編號)為索引值的索引(對於透明表可追加索引)。這樣一來,1)和2)步驟地操作有索引,3)步驟的操作有全主鍵項目,檢索速度應該有保證。採購方面的業務、物料方面的業務等都可如法炮製。最後需要說明一點,不是所有的SAP體統都可以使用這種方法,能否使用取決於R/3系統的設計和配置。所以在試圖使用該方法時應充分調查相關透明表與BSEG中的紀錄是否相符,別速度提高了,結果處理物件範圍減小了或增大了,那就與初衷背道而馳了,效率的提升一定要在確保業務資料正確的基礎上再加以考慮。SAP
R/3系統中也有幾個專門用來讀取BSEG表資訊的函數,可適當參考使用,它們是:READ_BSEGGET_ALL_BSEG另外最有效率的方法是改善你的應到最高化。用和需求,要使需求合理規範,這才能使效率達到最高化。
BSAD:應收明細(已清帳)BSID:應收明細(未清帳)BSAS:總帳明細(已清帳)BSIS:總帳明細(未清帳)BSAK:應付明細(已清帳)BSIK:應付明細(未清帳) BSEG主要通過“憑證號”“會計年度”“行號”和這六張表關聯 一般情況下一筆業務產生的憑證都是未清的,那麼:如果該業務行是客戶相關的,則被記錄到BSID;如果該業務行是供應商相關的,則被記錄到BSIK;無論和客戶相關還是和供應商相關,都是和總帳相關,所以也會有記錄到BSIS;但是如果這筆業務被清帳了,則相應的記錄會從BSIS轉移到BSAS
一般情況下:應收賬款、預收賬款、其他應收款、應收匯票等科目既和客戶相關,又和未清項管理的總帳科目相關;應付賬款、預付賬款、其他應付款、應付匯票等科目既和供應商相關,又和未清項管理的總帳科目相關; 其他總帳科目一般不啟用未清項管理,所以記錄一般都放在BSIS中。SAP R/3系統中也有幾個專門用來讀取BSEG表資訊的函數,可適當參考使用,它們是: READ_BSEG和 GET_ALL_BSEG.