如有轉載請註明出處:http://blog.csdn.net/donkey2004112103/archive/2009/04/13/4070996.aspx
1.sap numbe range在標準程式中使用
之前一直不明白會計憑證編號sap是怎麼做到連續編號,還以為是簡單的做個全域變數,雖然形式差不多,但是sap有專門的TCODE和方法,可以保證號碼不重複且可以做到只在某一個區間。甚至每年都會重新編號,像會計憑證編號,當達到某一程度的時候還會提醒。
2.如何自己建立
TCODE:SNRO。可以自己建立。
短文本和長文本用來說明這個編號範圍對象,輸入任意描述即可。
子物件資料元素我們這裡不填。這裡需要說明一下,所謂子物件,多數指一個組織圖,比如公司代碼、銷售組織、工廠等,這樣編號就在對應的每個組織下面獨立編號,最典型的例子是財務憑證,每個公司代碼下的財務憑證都是獨立編號的(其對應的資料表 BKPF,也必定把公司代碼做為一個鍵欄位)。而我們這個調度單對應於銷售訂單,銷售訂單沒有按照組織層級分別編號,因此相應的調度單也就不需要了。
到期年標記是指編號按年度歸零,每當開始一個新年度時,相應的編號也需要從頭開始,比如財務憑證和物料憑證都是這樣(比如表BKPF 和MKPF,都把年度做為一個鍵欄位) ,而我們的調度單不需要對應年度,因此這裡也不打勾。
編號長度域就填建立的域,但是一定要先啟用。指定這個編號範圍對象 ZDIAODUDAN 的長度,我們定義域長度為 10,因此這個編號範圍對象產生的編號長度也是 10 位。
無翻滾間隔是指如果編號達到最大,是否自動從頭開始,勾上就不從頭開始,而在擷取編號的時候提示出錯。我們這裡應該打勾。
編號範圍處理,屬於翻譯問題,實際就是編號範圍的事務碼,如果指定這個事務碼,就可以不需要通過 SNUM 或者 SNRO 的主畫面然後輸入編號範圍對象的名字來維護這個編號範圍,而可以輸入事務碼直接進入它的號碼範圍維護螢幕。
警告百分比是指如果編號使用到一定比例,就發出系統警告,提示管理員增大範圍或者進行曆史資料歸檔,避免編號全部用完後影響正常業務,這裡我們填寫 95,就是95%的時候提示。
主記憶體緩衝是指系統為了提高效能而預先取出一些編號放在應用伺服器上,當程式取用編號時直接從應用伺服器擷取,而無需再讀取資料庫了。通常,如果對號碼的連續性要求不高的情況下可以使用這種方式,而如果是財務憑證等要求連續的編號,則應該把主記憶體緩衝關閉,方法是通過菜單“編輯-設定緩衝-無緩衝”。
接著就可以在
間隔中添加編號範圍。
3.程式中如何使用
程式中我們也可以使用number range。使用三個函數即可。下面做以說明。
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
object = 'ZSDDNR'
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 3
OTHERS = 4.
* **如果號碼範圍存在
if sy-subrc eq 0 .
* ****得到一個號碼,
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'ZSDDNR'
IMPORTING
number = L_SEQNO
* quantity = quant
* returncode = code
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
* ***將號碼累加
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
object = 'ZSDDNR'
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
else .
raise NUM_RANGE_ERROR .
endif .
很容易理解,首先判斷是否有這個number range,如果存在的話,就獲得下個序號,最後一個函數我估計意思是釋放這個全域變數的記憶體。’ZSDDNR’就是我們建立的number range。如此就可以像會計憑證編號那樣每次都可以自動產生流水號了!流水號可以在自建表中用作主鍵,它的產生就靠上面的函數。