访问搜索特定记录

时间:2018-10-01 12:26:58

标签: vba access-vba ms-access-2010

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

我有一个名为“ Review”的表单,该表单具有一个保存公司名称的组合框-用户可以在此处选择一个公司名称,该公司名称将填充一个名为“ ReviewDetail”的子表单。表格“审阅”记录源是一个名为“公司”的表。

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

在表单审阅中,我使用以下内容(更改时),它会带回记录。

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

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

我尝试过:

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

但这不起作用。

这是我一直要维护的应用程序(不是我创建的)。

我如何才能取回特定记录?我认为我对这2个不同的表感到困惑(请注意,“公司”表不包含月份值)。

1 个答案:

答案 0 :(得分:0)

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

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

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

当用户从组合框中选择一个公司时,您在[OnChange]事件中具有代码,可以有效地导致两件事发生。首先,主窗体跳至所选公司以显示该公司的详细信息(通过您的代码)。其次,子表单(由公司链接到主表单)会立即过滤以仅显示所选公司的评论。

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

我不确定您如何在“组合框”中获取“月份”列表,但是我将执行以下操作:我将有一个名为“ tblMonths”的小表,其中有两列,MonthIDMonthName

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 Format example which hides the first column (MonthID) and displays the second column (MonthName) when clicked

现在,在子窗体上的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]更改为正确的名称,在方括号。

最后,为了改善Main窗体上的Company Combobox,我将同时更改Event和您用于跳转到特定公司的代码。同样,我将使用AfterUpdate事件而不是OnChange事件。在这些情况下更可靠。而且,我将使用以下代码(假设公司组合框名为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”值,以便所有评论最初显示。此外,然后清除“公司组合”框,以便用户可以进行下一个选择。