2014-02-12 180 views
0

我有一個數據表視圖的子表單。在父窗體上,我試圖根據子數據表中選擇的內容編輯記錄。表單不使用主/子字段鏈接。從數據表中的選定記錄獲取記錄集

我能夠得到所選的最上面的一行以及使用SelTop和SelHeight所選擇的行數如下。

Dim rs As New ADODB.Recordset 
Set rs = Me.Child_Form.Form.RecordsetClone 
If SelHeight > 0 Then 
    rs.MoveFirst 
    rs.Move SelectionTop - 1 
    For i = 1 To SelectionHeight 
     If Not rs.EOF Then 
      Debug.Print rs("ID") 
      rs.MoveNext 
     End If 
    Next i 
End If 

我不能做的就是,比如說,選擇子窗體上的10條記錄,如果我有過濾或排序形式的。 Filter s和Sort s處於表單級別,不能應用於基礎記錄集。

我試着查詢像這樣

sql = "Select * from [" & Me.RecordSource & "] where " & Replace(Me.Filter, """", "'") & " order by " & Me.OrderBy 

創造一個新的記錄,但這裏有多個問題。 1)ADO不支持表單過濾器有時會生成的IN子句,2)訂單順序不總是相同且可預測的。

如何獲得已排序的過濾記錄集並僅查找用戶在數據表視圖中選擇的記錄?

我正在使用ADP文件連接到Sql Server。

回答

0

我想出了一個令人沮喪的解決方案,但它似乎工作。

  • 添加一個未綁定(到我的記錄集)複選框控件到我的子窗體。
  • 將它命名爲chkSelect
  • 作出的控件=IsChecked(ID)

我有這樣的代碼在子窗體

Dim selectedRecords As Dictionary 


Private Sub chkSelect_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 
    If selectedRecords.Exists(Me("Analytical_ResultID").Value) Then 
     selectedRecords.Remove Me("Analytical_ResultID").Value 
    Else 
     selectedRecords.Add Me("Analytical_ResultID").Value, Me("Analytical_ResultID").Value 
    End If 
    chkSelect.Requery 
End Sub 

Private Function IsChecked(Analysis_ResultID As Long) As Boolean 
    IsChecked = selectedRecords.Exists(Analysis_ResultID) 
End Function 

Private Sub Form_Load() 
    If selectedRecords Is Nothing Then 
     Set selectedRecords = New Dictionary 
    End If 
End Sub 

這工作運行,但它flickery並不理想。我更喜歡另一個答案。