2014-02-12 121 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并不理想。我更喜欢另一个答案。