2013-09-26 122 views
1

我有一個連續的表單嵌入在Access 2010數據庫中深兩層的NavigationSubform中。我使用連續表單中不可編輯文本框的onclick事件將當前導航子表單的源對象屬性更改爲應粘貼到用戶單擊的文本框指定的特定記錄的詳細表單。DoCmd.GoToRecord將1添加到目標記錄

問題是,訪問發送用戶+1記錄id(addr_id),而不是所需的addr_id。這在大多數情況下會產生錯誤的數據。當用戶點擊當前最高的addr_id時,它也會產生錯誤信息。奇怪的是接入向用戶發送到正確的addr_id當且僅當在addr_id = 1

下面是onclick事件,這是造成麻煩的代碼:

Private Sub AddressID_Click() 
    Dim addr_id As Long 
    addr_id = Me.AddressID 
    Forms!Main!NavigationSubform.Form!NavigationSubform.SourceObject = "AddressDetails" 
    DoCmd.GoToRecord , , acGoTo, addr_id 
End Sub 

我測試的黑客編輯

Private Sub AddressID_Click() 
    Dim addr_id As Long 
    Dim new_addr_id As Long 
    addr_id = Me.AddressID 
    Forms!Main!NavigationSubform.Form!NavigationSubform.SourceObject = "AddressDetails" 
    If addr_id = 1 Then 
     new_addr_id = addr_id 
    Else 
     new_addr_id = addr_id - 1 
    End If 
    DoCmd.GoToRecord , , acGoTo, new_addr_id 
End Sub 

但我的「修復」似乎是一個完整的黑客,因爲有明確必須有一個更好的解決方案:這是遵循「修復」的問題。任何人都可以告訴我如何解決這個代碼,以便我不必添加if-else邏輯來處理訪問正在進行的有趣重新路由?

+0

我敢打賭,它是事做改變形式源與該地址標識的結果。我知道當我過去需要類似的用戶行爲,而不是資源表單時,我打開了一個新表單,指出原始子表單的採購活動記錄。 –

回答

2

我將不得不看你的表是肯定的,但問題可能是GoToRecord偏移從記錄集開頭指定的數字。這意味着,如果您的地址標識爲51,那麼您將在理論上記錄51。

使用此方法的問題是,如果刪除任何AddressID,那麼51將不會成爲您想要的記錄,因爲它會將您帶到第51條記錄,而不管AddressID

例如,我將100個記錄添加到ID爲1-100的地址,然後刪除其中的前99個,如果我使用此命令,我剩下AddressID 100我將收到標準「您不能去指定記錄「。因爲我告訴訪問權限去找不存在的記錄。

請檢查你的表格,以確保所有的AddressID字段完全正確,並讓我知道。通常我不會推薦這種導航方法。

AddressID一個自動遞增的號碼在接入?你是否保證一個地址永遠不會被刪除?

試試這個

'expression.SearchForRecord(ObjectType, ObjectName, Record, WhereCondition) 
Docmd.SearchForRecord acForm,"NavigationSubform",,"AddressID=" & addr_id 

這實際上將搜索記錄集指定WHERE條件並轉到該記錄。請注意,這是由於您使用的是ID,因此找到的第一條記錄不應該成爲問題。

使用過濾器

With Me.NavigationSubForm.Form 
    .Filter = "AddressID=" & addr_id 
    .FilterOn = True 
End With 

這將只顯示在子窗體

+0

謝謝。 +1試圖幫助。我試過了你的DoCmd.SearchForRecord語法,但它給了我運行時錯誤2489,對象NavigationSubform沒有打開。當然,我也嘗試過表單的名稱,也是Forms!Main!NavigationSubform.Form!NavigationSubform.Form和其他,但我仍然得到運行時錯誤2489.任何有關如何引用導航子表單的建議,只要給出正確的信息如何在我上面的原始帖子中引用它的sourceobject? – CodeMed

+0

如果在子窗體中不需要導航功能,則可以使用過濾器。我這樣做是一個體面的數量,而不是直接連接訪問中的子表單。我已將代碼添加到我的答案中 – engineersmnky

+0

現在可以使用,所以我打算將您的答案標記爲答案。我確實必須用實際的Forms!Main!NavigationSubform.Form!NavigationSubform.Form替換你的Me,因爲Me在此上下文中引用了一個文本框。但是代碼在我做了那麼小的改變之後就可以工作。感謝您的幫助。 – CodeMed