更改表格';单击命令按钮访问2013 vba时的s记录集

更改表格';单击命令按钮访问2013 vba时的s记录集,vba,ms-access,Vba,Ms Access,我已经多年没有做过任何vba了,完全忘记了如何做——这就像重新学习vba一样 我有一个表单,它有一个“打开”事件来填充ado记录集中的数据 我试图做的是在顶部提供一些文本框,允许用户输入一些条件并更改他们正在查看的记录集 这是我的“开放”代码 bindFormData子系统是 Public Sub bindFormData(ByVal qString As String, ByVal qStringAppend As String, ByVal formName As String) Dim

我已经多年没有做过任何vba了,完全忘记了如何做——这就像重新学习vba一样

我有一个表单,它有一个“打开”事件来填充ado记录集中的数据

我试图做的是在顶部提供一些文本框,允许用户输入一些条件并更改他们正在查看的记录集

这是我的“开放”代码

bindFormData子系统是

Public Sub bindFormData(ByVal qString As String, ByVal qStringAppend As String, ByVal formName As String)

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = CurrentProject.AccessConnection
Set rs = New ADODB.Recordset
With rs
 Set .ActiveConnection = cn
     .Source = qString + qStringAppend
     .LockType = adLockBatchOptimistic
     .CursorType = adOpenKeyset
     .CursorLocation = adUseClient

     .Open
End With
Set Forms(formName).Recordset = rs

Set rs = Nothing
Set cn = Nothing

End Sub
下面是我试图在命令按钮上执行的操作

Private Sub cmdApplyFilter_Click()

Dim qStringAppend As String, qString As String

qStringAppend = ""

If IsNull(Me.txtNameFilter) = False Then
qStringAppend = qStringAppend + " and (lcase(personFname) like '*" & LCase(Me.txtNameFilter) & "*' or lcase(personLName) like '*" & LCase(Me.txtNameFilter) & "*' )"

End If

qString = "SELECT tblPerson.personID, [personLName]+', '+[personFName] AS fullName, tblFamily.familyAFCID, tblAddress.addressLine1, " & _
        " tblFamily.personAFCID, refSource.sourceDescription AS personSource " & _
        " FROM refSource RIGHT JOIN (((tblPerson LEFT JOIN tblFamily ON tblPerson.personID = tblFamily.personID) " & _
        " LEFT JOIN lnkAddressPerson ON tblPerson.personID = lnkAddressPerson.personID) " & _
        " LEFT JOIN tblAddress ON lnkAddressPerson.addressID = tblAddress.addressID) ON refSource.sourceID = tblPerson.personSource " & _
        " WHERE lnkAddressPerson.addresslinkend is null "

qStringAppend = qStringAppend + " order by personLName, personFName;"
bindFormData qString, qStringAppend, "frmPerson"

Me.Repaint

End Sub
“我的表单”在打开事件中正确填充,但在命令按钮单击时返回零记录。我已在命令按钮上单击debug.print sql,并验证它是否返回查询中的记录


非常感谢您的帮助。

Urrgh,真烦人-在VBA中,我需要使用ADO记录集%而不是*作为通配符。。。。。。就这么简单

一些想法

Changes:

Public Sub bindFormData(ByVal qString As String, ByVal qStringAppend As String, ByVal formName As String)
to
Public Sub bindFormData(ByVal qString As String, ByVal qStringAppend As String, ByVal form as Form)

Set Forms(formName).Recordset = rs
to
Set form.Recordset = rs

bindFormData qString, qStringAppend, "frmPerson"
to 
bindFormData qString, qStringAppend, me.form 

OR if you keep your existing code use this (in case you rename the form) 
bindFormData qString, qStringAppend, me.form.Name 
编写一个函数来构建并返回命令按钮和打开表单(这是最常见的!)之间常见的SQL文本

并使用我在答案中概述的技术使SQL更具可读性

以下是要使用的SQL读取:

Public Sub aa(ByRef a As String, ByVal b As String)
    ' This is deliberately not a function, although it behaves a bit like one
    a = a & vbCrLf & b

End Sub


' The function is called in code like this:

Dim a as string 

a = ""
aa a,  "    SELECT tblPerson.personID "
aa a,  "         , [personLName]+', '+[personFName] AS fullName "
aa a,  "         , tblFamily.familyAFCID "
aa a,  "         , tblAddress.addressLine1 "
aa a,  "         , tblFamily.personAFCID "
aa a,  "         , refSource.sourceDescription AS personSource "
aa a,  "      FROM refSource "
aa a,  "           RIGHT JOIN (((tblPerson "
aa a,  "                       LEFT JOIN tblFamily "
aa a,  "                              ON tblPerson.personID = tblFamily.personID) "
aa a,  "                       LEFT JOIN lnkAddressPerson "
aa a,  "                              ON tblPerson.personID = lnkAddressPerson.personID) "
aa a,  "                       LEFT JOIN tblAddress "
aa a,  "                              ON lnkAddressPerson.addressID = tblAddress.addressID) "
aa a,  "                   ON refSource.sourceID         = tblPerson.personSource "
aa a,  "     WHERE lnkAddressPerson.addresslinkend IS NULL"

谢谢Harvey-我同意,我的代码有效率,但这是一个“快速n脏”的方法,仅由两个用户使用,只有几百条记录,因此在优化代码所花费的时间和对最终用户的显著差异之间有一个折衷。。。。。一旦一切顺利,我可能会回顾一遍,看看效率,因为毫无疑问,一开始是“快n脏”的东西在某个时候会成为关键任务,知道这些人的工作方式。
Public Sub aa(ByRef a As String, ByVal b As String)
    ' This is deliberately not a function, although it behaves a bit like one
    a = a & vbCrLf & b

End Sub


' The function is called in code like this:

Dim a as string 

a = ""
aa a,  "    SELECT tblPerson.personID "
aa a,  "         , [personLName]+', '+[personFName] AS fullName "
aa a,  "         , tblFamily.familyAFCID "
aa a,  "         , tblAddress.addressLine1 "
aa a,  "         , tblFamily.personAFCID "
aa a,  "         , refSource.sourceDescription AS personSource "
aa a,  "      FROM refSource "
aa a,  "           RIGHT JOIN (((tblPerson "
aa a,  "                       LEFT JOIN tblFamily "
aa a,  "                              ON tblPerson.personID = tblFamily.personID) "
aa a,  "                       LEFT JOIN lnkAddressPerson "
aa a,  "                              ON tblPerson.personID = lnkAddressPerson.personID) "
aa a,  "                       LEFT JOIN tblAddress "
aa a,  "                              ON lnkAddressPerson.addressID = tblAddress.addressID) "
aa a,  "                   ON refSource.sourceID         = tblPerson.personSource "
aa a,  "     WHERE lnkAddressPerson.addresslinkend IS NULL"