上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
小寶寶
註冊時間: 2004-08-20 文章: 57
第 1 樓
|
發表於: 星期一 五月 02, 2005 2:32 pm 文章主題: 重建索引-PACK-多人使用系統(續) |
|
|
小弟使用OPEN DATABASE STOK EXCL
之後開啟每個資料表....來做PACK與REINDEX....
可是我使用USED()函數來判別是否有其他使用開啟...
結果無效....
發現USERD()函數是判斷自己是否開啟...
不知是不是要用其他函數來測試資料表是否被其他使用者開啟呢 ???
----------------------------------------------------------------------------
使用FLOCK OR LOCK OR RLOCK 好像也是不能!!!
其他使用者開著程式,也是用分享模式開啟...
這是要重建索引....使用FLOCK OR LOCK OR RLOCK 回傳也等於.T.
也不能判別資料庫或資料別是否被其他使用者開啟...... |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 2 樓
|
發表於: 星期一 五月 02, 2005 2:39 pm 文章主題: |
|
|
簡單的說,
用FLOCK () 不是用來檢查 是否被其他使用者開啟,
再想想看.
為了作到某一件事,
不是唯一一種方法才做得到. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 3 樓
|
發表於: 星期一 五月 02, 2005 4:01 pm 文章主題: |
|
|
可以請教一下嗎?
userd()是什麼函數 |
|
回頂端 |
|
 |
bigear

註冊時間: 2004-12-19 文章: 162 來自: 網路的另一端
第 4 樓
|
發表於: 星期一 五月 02, 2005 4:12 pm 文章主題: |
|
|
bin1x 寫到: | 可以請教一下嗎?
userd()是什麼函數 |
USED() 的好朋友 _________________ 以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉 |
|
回頂端 |
|
 |
小桑•無痕

註冊時間: 2003-07-08 文章: 304 來自: Tainan, Taiwan
第 5 樓
|
發表於: 星期一 五月 02, 2005 5:42 pm 文章主題: |
|
|
bin1x 寫到: | 可以請教一下嗎?
userd()是什麼函數 |
userd() <<< 這是 小寶寶 的筆誤吧,他本來是要打USED() _________________ 用力 Try 一下...可以發現很多好玩的事.... |
|
回頂端 |
|
 |
小桑•無痕

註冊時間: 2003-07-08 文章: 304 來自: Tainan, Taiwan
第 6 樓
|
發表於: 星期一 五月 02, 2005 5:48 pm 文章主題: |
|
|
TO 小寶寶:
如果TABLE已經被其他程式(人)開啟了,那後面的程式就無法以專用模式開啟。
如果一定要做REINDEX和PACK,那麼操作者一定要以專用模式開啟;也就是說,其他人必須先結束程式,讓某一個人可以取得專用權。 _________________ 用力 Try 一下...可以發現很多好玩的事.... |
|
回頂端 |
|
 |
小桑•無痕

註冊時間: 2003-07-08 文章: 304 來自: Tainan, Taiwan
第 7 樓
|
發表於: 星期一 五月 02, 2005 5:52 pm 文章主題: Re: 重建索引-PACK-多人使用系統(續) |
|
|
小寶寶 寫到: | 其他使用者開著程式,也是用分享模式開啟...
這是要重建索引....使用FLOCK OR LOCK OR RLOCK 回傳也等於.T.
也不能判別資料庫或資料別是否被其他使用者開啟...... |
要判斷資料庫是否已被別人開啟,只需以專用模式開啟TABLE,再攔截錯誤。
如果開啟不成功,就顯示檔案已被使用;開啟成功就可以做PACK和REINDEX了。
「攔截錯誤」參考ON ERROR _________________ 用力 Try 一下...可以發現很多好玩的事.... |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 8 樓
|
發表於: 星期一 五月 02, 2005 6:14 pm 文章主題: |
|
|
再說了
USED() 是USE TABLE 之後 以別名來判斷
TABLE 是否被開啟
也可以USE AGAIN啊
在實務確實有可能會發生USE AGAIN
似乎是在CALL 很多視窗時,就會發生吧
忘記了,只用過一次 |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 9 樓
|
發表於: 星期一 五月 02, 2005 6:27 pm 文章主題: |
|
|
贊同小桑•無痕兄的方法
我們要注意的是檔案是否以Exclusive開啟成功
而不是注意是否有人使用了這個檔案, 因為只要能以Exclusive開檔案成功;就已表示
目前沒其他人在使用這個檔案; 以後也不會有其他人會開啟這個檔案;直到你關閉這個檔案
為止; 同樣網路上只要有人在使用的檔案; 你也不可能以Exclusive方式來開啟.
然而FoxPro對於檔案開啟成功與否; 並沒有提供很好的方式來測試; ISEXCLUSIVE()
算是唯一的了; 我個人也是使用 小桑•無痕兄的方式以ON ERROR 來「攔截錯誤」
(如果你試圖以Exclusive來開啟檔案, 失敗時會引發ON ERROR) |
|
回頂端 |
|
 |
小桑•無痕

註冊時間: 2003-07-08 文章: 304 來自: Tainan, Taiwan
第 10 樓
|
發表於: 星期一 五月 02, 2005 7:23 pm 文章主題: |
|
|
題外話:
在VFP中打DIR(或DISPLAY FILES),如果.DBF已被「專用模式開啟」,則會顯示「Can't read file」,否則會顯示該DBF的資料筆數。
DISPLAY FILES 的結果可以輸出至印表機或檔案(沒試過)。
不過,若要以此方法來檢查檔案是否被別人開啟,不如使用我和小賴所使用的方法。
另外,我不太贊成一開啟檔案就做PACK和REINDEX,若要過濾DELETE的資料,可以下SET DELETE ON;
若只是要知道筆數,用SELECT取得即可;我想,小寶寶你在開檔後馬上要做PACK只是為了要取資料的筆數,
若用SELECT會等很久的話,不如就用我上次說的賤招(用一個統計檔,新增時+1,刪除時-1;若要知道有幾筆,只要把統計檔的欄位叫出來。),雖然有點麻煩,可是保證很快可以取得結果。  _________________ 用力 Try 一下...可以發現很多好玩的事.... |
|
回頂端 |
|
 |
小寶寶
註冊時間: 2004-08-20 文章: 57
第 11 樓
|
發表於: 星期一 五月 02, 2005 10:38 pm 文章主題: |
|
|
on error的函數...
假如說:我是按下command1做重見索引
use cust excl -->有其他使用者在線上...會出錯!!
不過on error的指令...不知道要放在何處才能觸發到???
今天有放再form的error event上面...
好像沒有作用~~~ |
|
回頂端 |
|
 |
bigear

註冊時間: 2004-12-19 文章: 162 來自: 網路的另一端
第 12 樓
|
發表於: 星期二 五月 03, 2005 12:23 am 文章主題: |
|
|
在 main.prg 或是 form.init 裡
ON ERROR DO C:\XXX\PRG\ERROR.PRG WITH ERROR(),MESSAGE()
WITH 後面的參數可要可不要,有參數的話記的在 ERROR.PRG 裡的第一行加上 para 收參數 _________________ 以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉 |
|
回頂端 |
|
 |
小賴
註冊時間: 2004-12-27 文章: 476
第 13 樓
|
發表於: 星期二 五月 03, 2005 12:25 am 文章主題: |
|
|
小寶寶兄:
試試以下方式 :
IF NetUseDBF("c:\Temp\Test", .T.) && 以專用模式開 C:\Temp\Test.DBF
看你要幹嘛 && 開檔成功
ELSE
.......... && 開檔不成功
ENDIF
FUNCTION NetUseDBF
PARAMETER cTableName, lExclusive
ON ERROR RETURN .F.
SELECT 0
IF lExclusive && 專用或公用
USE (cTableName) EXCLUSIVE
ELSE
USE (cTableName)
ENDIF
RETURN .T. |
|
回頂端 |
|
 |
|