2015-12-10 35 views
0

----------- UPDATE ---------將焦點設置爲子窗體會導致錯誤2449(表達式中存在無效方法) - VBA - Access 2013

我想出瞭如何把重點放在我的子表單上。如果它是一個子窗體,然後:

ParentFormName = frm.Parent.Name 
SubFormName = frm.Name 

Forms(ParentFormName).Form(SubFormName).SetFocus 

這似乎是工作(雖然Andre451的帖子更有效)。但是這導致了我的子表單導致暫停狀態的潛在問題。我的子表格相對較大(194條記錄),當在較大記錄的記錄集上執行MoveFirst/Last時,出現錯誤3021 (no current record)。這可能與子窗體的整個記錄​​集沒有加載到主窗體的加載事件上有關。較小的記錄集可以更快地循環,因此不會產生錯誤(儘管這只是一個假設)。

的問題是:我怎樣才能避免3021 error,讓子窗體記錄負載完全是這樣的,我可以通過他們與任何移動:

  1. DoCmd.RunCommand acCmdRecordsGoToLast

OR

  1. frm.RecordsetClone.MoveLast

--------------------------------------------- -------------------------------------

雖然我們遷移了Access數據到SQL服務器,仍然使用Access作爲前端。我們通過使用Access連接SQL Server表來實現這一點,並且這一切都可以(幾乎)很好地工作。然而,最近我們遇到了SQL服務器上的suspended state訪問查詢問題(主要發生在組合框中的查詢上)。

經過一番研究,我們發現這可以通過在表單的負載上循環查詢記錄來解決(所以通過簡單的acCmdRecordsGoToLastacCmdRecordsGoToFirst),這似乎工作。 因此,爲了對付這種暫停狀態,我們爲每個表單加載了一個init,其中運行了recordsourcerowsource(主要表單記錄源,comboxes行源等)的記錄。

所以上的形式負載:

modFunctions.InitForm(Me) 

此初始化是在一個模塊中,看起來像這樣:

Dim InitFormResult As Boolean 

    InitFormResult = InitFormRecordSource(frm) ' Initialize the recordsource of the form 
    InitFormComboBoxes frm   ' Initialize all the comboboxes on the form 
    InitFormCommandButton frm  ' Initialize all the buttons on the form 

的形式記錄源(其中,錯誤發生)看起來像第一初始化這個:

Public Function InitFormRecordSource(frm As Form) As Boolean 

    If frm.RecordSource <> "" Then ' if recordsource found 
     On Error GoTo ErrHandler 

     frm.SetFocus 

     DoCmd.RunCommand acCmdRecordsGoToLast 
     DoCmd.RunCommand acCmdRecordsGoToFirst 

     GoTo EndSuccess 

ErrHandler: 
     MsgBox (Err.Number) 
     Debug.Print "ERROR during InitFormRecordSource in form : " & frm.Name 
     InitFormRecordSource = False 
     Exit Function 
EndSuccess: 
    InitFormRecordSource = True 

    Else 
     InitFormRecordSource = True 
    End If 
End Function 

要運行窗體記錄集與第一個和最後它需要有焦點。這對所有表單都很有用,但不適用於主表單中的表單。在子表單中,我們還想通過遍歷子表單記錄來對付暫停狀態,但是當使用上面的代碼時,我們會繼續獲得error 2449

經過一番研究,我遇到了這個帖子:Module Function frm.setfocus runtime 2449 error這或多或少都是一樣的問題。所以我發現一個子表單需要以不同的方式來關注它,但是我所有的努力都無法實現。

我試過至今:在上面的代碼

If frm.RecordSource <> "" Then ' if recordsource found 
     On Error GoTo ErrHandler 

     Dim HasParent As Boolean 
     Dim sParentForm 
     HasParent = TypeName(frm.Parent.Name) = "String" 

     If HasParent = True Then 'The form is a subform 
      'sParentForm = frm.Parent 
      'sParentForm.frm.SetFocus 
      'frm.Parent.frm.SetFocus 
      'sParentForm!frm.SetFocus 
     Else 
      frm.SetFocus 
     End If 


     DoCmd.RunCommand acCmdRecordsGoToLast 
     DoCmd.RunCommand acCmdRecordsGoToFirst 

     GoTo EndSuccess 

將嘗試修復都被註釋掉了。 HasParent確實工作,與此我可以檢查如果窗體是一個子窗體(它有一個父窗體)或不,並設置不同的焦點。

雖然我似乎無法專注於子窗體,但我不知道如何修復它!

回答

1

我有類似的問題,查詢Sql Server 2008 R2進入「ASYNC_NETWORK_IO」等待狀態,直到最後一條記錄被加載。

我的解決辦法:不要使用窗體本身去最後一個記錄,但其.RecordsetClone

frm.RecordsetClone.MoveLast 
+0

謝謝Andre451您的解決方案是不是我用的是什麼,所以更容易一點我複製了!雖然在等待對此消息的回覆時,我已經想出瞭如何將注意力集中在我的子表單上,但我發現真正的問題不在於此。真正的問題是,我的兩個子表單有一個相對較大的記錄集--194條記錄,我不能做'frm.RecordsetClone.MoveLast'我也不能做我以前用過的這些(給出錯誤3021 - 沒有當前記錄) 。這是可能的。與子窗體數據做的事情沒有加載到主窗體的加載事件上。那麼現在該怎麼辦?;) – Nicolas

+0

同時更新了上面的文字,並且您的建議在主帖中更新了! – Nicolas

相關問題