首页 > 解决方案 > 访问搜索特定记录

问题描述

我有一个访问数据库(作为 SharePoint 列表保存的表)。

我有一个名为“Review”的表单,它有一个包含公司名称的组合框 - 用户可以在此处选择一个公司名称,该名称填充一个名为“ReviewDetail”的子表单。表单“Review”记录源是一个名为“Companies”的表。

当用户从组合框中选择公司时,将返回所有记录(所有月份)。然后,用户可以使用子表单上的按钮在评论之间切换。此子表单记录源是一个名为“评论”的表。

在表单审核中,我使用以下(更改时),它带回了记录。

DoCmd.SearchForRecords , "", acFirst, "[Company] = " & "'" & [Forms]![Review]![Company] & "'"

我需要能够从组合框中合并月份以恢复该特定记录。

我努力了:

DoCmd.SearchForRecords , "", acFirst, "[Company] = " & "'" & [Forms]![Review]![Company] & "' AND [Month] = '" & Me.Month & "'"

但这不起作用。

这是我被赋予维护的应用程序(不是由我创建的)。

我怎样才能找回特定的记录?我想我对 2 个不同的表感到困惑(请注意,表 Companies 不包含月份值)。

标签: ms-accessvbams-access-2010

解决方案


好的,您对表单和子表单的描述有点模糊,所以让我列出我认为您在描述的内容,然后提出解决方案,您可以告诉我们这是否正确。

您的主窗体,命名Review为 RecordSource 绑定到Company表,并显示单个公司的详细信息字段。您在此主窗体上还有一个组合框,其中包含所有公司的列表。

您有一个子表单,命名ReviewDetail为绑定到Reviews表,其中包含所有公司的所有评论。子窗体使用子窗体链接将主窗体上的公司链接到子窗体上的公司,以便在运行时,子窗体仅显示主窗体上显示的当前公司的评论。

当用户从 Combobox 中选择 Company 时,您在 [OnChange] 事件中有代码有效地导致两件事发生。首先,主窗体跳转到所选公司以显示该公司的详细信息(通过您的代码)。其次,按公司链接到主窗体的子窗体立即过滤以仅显示所选公司的评论。

现在,您想在子窗体上添加一个组合框,以进一步过滤特定月份的子窗体。

我不确定您如何在组合框中获取月份列表,但我会执行以下操作:我将有一个小表,其中tblMonths包含两列调用的月份,MonthID并且MonthName

MonthID  MonthName
=======  =============
      1  January
      2  February
      3  March
   etc...
     12  December

然后我将子表单上的月份组合框的行源设置为:

SELECT 0 AS MonthID, "(ALL)" AS MonthName FROM tblMonths
UNION SELECT MonthID, MonthName FROM tblMonths
ORDER BY MonthID;

这将为您提供一个组合框,其中包含所有月份和顶部的“全部”选项,以允许用户显示所有月份,或仅显示单个月份。而且,您的 Combobox 将有两列,因此您需要对其进行适当的格式化以仅显示第二列,其属性类似于以下内容:

单击时隐藏第一列 (MonthID) 并显示第二列 (MonthName) 的组合框格式示例

现在,在子窗体上的 ComboBox 的 [AfterUpdate] 事件中,您将使用以下代码(假设 Combobox 名称为cboMonth

Dim mssql As String    

'Note, by concatenating a zero length string to the current value of the
'    Combox and making sure the length is greater than zero, we can
'    easily confirm that the user actually selected one of the items
'    in the list, as opposed to accidentally clearing out the Combobox
'If we did not check this before relying on the value of the Combobox,
'    our code would produce an error at runtime if the user did clear the Combobox
If Len(Me.cboMonth & "") > 0 Then
    If Me.cboMonth = 0 Then   'They chose "ALL"
        Me.FilterOn = False
    Else
        mssql = "[Month] = """ & Me.cboMonth.Column(1) & """"
        Me.Filter = mssql
        Me.FilterOn = True
    End If
Else
    'Since the user cleared the Combobox, let's set the value
    'back to "ALL" and display ALL records
    Me.cboMonth = 0
    Me.FilterOn = False
End If

使用此代码,子表单将按选定的月份进行过滤,或者根据用户选择的内容显示所有月份。如果包含“月份”的子表单上的字段没有Month像您在示例代码中所指示的那样命名,那么您需要[Month]在我上面的代码中将其更改为正确的名称,并用方括号括起来。

最后,为了改进主窗体上的公司组合框,我将更改事件和用于跳转到特定公司的代码。同样,我将使用AfterUpdate事件而不是OnChange事件。在这些情况下更可靠。而且,我会使用以下代码(假设 Company Combobox 名为cboCompany):

Dim rst As DAO.RecordSet
Dim mssql As String

If Len(Me.cboCompany & "") > 0 Then
    Set rst = Me.RecordsetClone
    mssql = "[Company]=""" & Me.cboCompany & """"
    rst.FindFirst mssql
    Me.Bookmark = rst.Bookmark
    'If you then want to default the "Months" Combobox on the Subform to "ALL"
    Me.ReviewDetail.Form.cboMonth = 0
    me.cboCompany = Null
End If
Set rst = Nothing

使用此代码,主窗体跳转到选定的公司(如果用户只是清除组合框,则不执行任何操作)并将Months子窗体上的组合框设置回“ALL”值,以便最初显示所有评论。此外,它会清除公司组合框,以便为用户的下一次选择做好准备。


推荐阅读