Database 版 (精华区)

发信人: sleep (休息休息), 信区: Database
标  题: 3.在 row bufferring mode下,如何在Primary key 欄
发信站: 哈工大紫丁香 (2000年12月04日13:51:51 星期一), 站内信件

3.在 row bufferring mode下,如何在Primary key 欄位輸完後,立即進行重覆性檢查 ?
       VFP提供的buffer mode能夠提供開發人員無比的彈性,如果您為某一個Table建立了Primary key,在資料存檔時,VFP便會自動替您進行重覆性的檢查。但在實務開發上,開發人員都希望能夠在使用者一輸入主鍵時,立即進行重覆性的檢查。 
例如:在客戶主檔中,客戶編號為其Primary key,所以在FORM上,希望使用者一輸入客戶編號時,要立即進行代碼的重覆性檢查。為了維護上的方便,大多數人都會把客戶主檔設成為row bufferring ,這是一個明智的做法,但是會遇到幾個難題:


     把代碼重覆性檢查的程式碼放在FORM上的客戶代碼欄位的Valid event中,那麼您可能會這樣來撰寫:

SELECT <客戶主檔>
SEEK THIS.VALUE
IF FOUND()
    =MESSAGEBOX("客戶代碼重覆!")
    RETURN 0
ENDIF
RETURN .T.
由於row bufferring的關係, 
當您的記錄指標一移動時,VFP會自動幫您COMMIT(把Buffer中的資料存入table)。所以,如果使用者所輸入的代碼是合法,則不會出現錯誤訊息,但是因為SEEK命令會已把您的記錄指標移動,VFP自動COMMIT的關係,資料已經存入檔案中,此時使用者如果選擇取消,就算您執行了 
TABLEREVERT(.T.),也會發現它並沒有作用(因為並無資料在 row buffer中)。 

     把代碼重覆性檢查的程式碼放在table的Insert Trigger 。
這是一個較正規的做法,不過因為Insert Trigger是在資料存檔(Commit)時才會被觸發,所以如果使用者輸入的客戶代碼是重覆的,那麼他在存檔之前是不會知道,一直到他按下存檔按鈕時,VFP才會觸發Insert Trigger,然後才去執行您的處理程式。


技巧說明:
為了要能夠讓使用者一輸完客戶代碼後,立即進行重覆性檢查,這段程式碼勢必要放在Valid Event中,另外,要避免row buffer情況下,SEEK指令會移動記錄指標,而導致VFP會自動COMMIT,筆者利用USE <table> 
AGAIN的方式,在另一個工作區開啟相同的檔案,如此便能夠利用SEEK命令來搜尋,又能解決上述的問題。 

程式範例
此處所列的為一範例,希望各位會員能夠融會貫通,自行來運用。


FORM1.custom_id.VALID


LOCAL   lValid
lValid = .T.
USE <custom> AGAIN ALIAS custom2
SELECT custom2
SEEK THIS.VALUE
IF FOUND()
    = MESSAGEBOX("客戶代碼重覆 !",48)
    lValid = 0
ENDIF
SELECT custom2
USE
SELECT custom
RETURN  lValid
 

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.174毫秒