2011-09-12 21 views
1

好吧,我有一個宏進入並檢查表以確定用戶設置的應用程序的格式。如果此格式設置爲歐洲格式,那麼它將運行一個函數,該函數將通過表格並將日期格式從MM/dd/yyyy切換到dd/MM/yyyy。一切似乎設置正確,當它在美國格式化宏正確運行(它應該考慮它跳過這一行,如果格式不設置爲歐洲。)但是,每當格式設置爲歐洲,我得到這個運行時錯誤彈出:超出文件共享鎖計數,運行時錯誤3052

Run-Time error '3052': 
File sharing lock count exceeded. Increase MaxLocksPerFile registry entry. 

現在,我始終持謹慎態度,每當我得到規定的解決方法是修改將註冊表一些錯誤。更不用說,我不希望客戶只是爲了讓應用程序正常工作。然而,我只是試圖通過遵循these步驟來確定是否確實解決了問題。雖然當我修改默認的MaxLocksPerFile從它的默認值(9500)到(30,000)並再次運行宏時,我仍然以稍大的計數得到相同的錯誤。

在運行約12,000行後,我會得到錯誤,在改變後它會出現大約15,0000行。

這使我相信,在每行被修改後,我錯誤地關閉了我的更新。

這是我下面的代碼:

Public Function UKDateFormat() As Variant 
Dim varPieces As Variant 
Dim strNew As String 
Dim varReturn As Variant 
Dim Strsql As String 
Dim db As dao.Database 
Dim rstAlarmdetDateMod As dao.Recordset 
Dim i As Long 

Set db = CurrentDb() 

Strsql = "select AlarmDate From AlarmdetDateMods;" 
Set rstAlarmdetDateMod = db.OpenRecordset(Strsql, dbOpenDynaset) 

If (rstAlarmdetDateMod.RecordCount > 0) Then 
    rstAlarmdetDateMod.MoveFirst 

i = 0 


    While (rstAlarmdetDateMod.EOF) = False 
    i = i + 1 
     rstAlarmdetDateMod.Edit 
     rstAlarmdetDateMod![alarmdate] = CDate(Format(rstAlarmdetDateMod![alarmdate], "dd/MM/yyyy")) 
     rstAlarmdetDateMod.Update 
     rstAlarmdetDateMod.MoveNext 
    Wend 
End If 
rstAlarmdetDateMod.Close 
db.Close 


End Function 

這是我的更新查詢:

UPDATE DISTINCTROW AlarmdetDateMods SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy")); 

我想知道的是:正是我做錯了我的功能,它會導致這個錯誤來了,我怎樣才能糾正它,讓我不必進入和修改註冊表以獲得此功能的工作?

任何幫助或建議,非常感謝。 謝謝。

+0

AlarmDate字段的數據類型是日期/時間還是文本? – HansUp

+0

這是一個文本,我應該將其更改爲日期/時間? – James213

+0

取決於你如何使用它我想。日期/時間值實際上是一種數字數據類型...無論您如何將其格式化以用於顯示,存儲的值都是相同的。我的直覺是爲日期/時間值使用日期/時間類型,因爲這樣可以更方便地進行日期操作。通過在窗體上設置綁定數據控件的格式屬性或在查詢中使用Format()函數,可以將值設置爲用於顯示目的的格式。您更改表中每個存儲的AlarmDate字符串的方法會嚇到我! – HansUp

回答

1

除了您的UKDateFormat函數,您向我們展示了此UPDATE語句。

UPDATE DISTINCTROW AlarmdetDateMods 
SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy")); 

但是,目前尚不清楚發生了什麼。它工作嗎?它是否與UKDateFormat函數一樣發生錯誤?一個不同的錯誤?

嘗試修改UPDATE語句。我認爲DISTINCTROW在這種情況下沒有用處;建議你放棄它。

此外,您的更新似乎依賴於隱式數據類型轉換。 AlarmDate是一個文本值。您將該文本傳遞給Format()函數,將其視爲日期/時間值並將其轉換爲不同的格式化字符串。然後你問CDate()將該字符串值轉換爲日期/時間值。最後,日期/時間值存儲回AlarmDate文本字段。

至少我會避免將格式化的字符串轉換回日期/時間值,然後將其存儲在文本字段中。但是,我也會使數據類型轉換顯式而不是隱式。並將UPDATE嘗試限制爲只有AlarmDate包含有效日期/時間值的文本表示的那些行。

UPDATE AlarmdetDateMods 
SET AlarmDate = Format(CDate(AlarmDate),"dd/mm/yyyy") 
WHERE IsDate(AlarmDate) = True; 

注意這個建議假定改變所有的存儲AlarmDate文本值是合理的。我對此有所懷疑。看起來像AlarmDate應該是日期/時間而不是文本。如果您在顯示這些日期/時間值時需要更改格式,請使用表單上的綁定控件的格式屬性或查詢中的格式()函數來執行此操作。

+0

從文本交換AlarmDate到日期/時間就是這樣,由於我甚至不需要上述代碼或更新,因爲它似乎訪問會自動格式化我想要它在現在的方法中的文本。謝謝! – James213

+0

好!我認爲這意味着用戶的區域設置會自動驅動適當的日期/時間顯示格式。當它能夠簡單地工作時最好! – HansUp

相關問題