ms-access - 访问搜索特定记录
问题描述
我有一个访问数据库(作为 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 不包含月份值)。
解决方案
好的,您对表单和子表单的描述有点模糊,所以让我列出我认为您在描述的内容,然后提出解决方案,您可以告诉我们这是否正确。
您的主窗体,命名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 将有两列,因此您需要对其进行适当的格式化以仅显示第二列,其属性类似于以下内容:
现在,在子窗体上的 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”值,以便最初显示所有评论。此外,它会清除公司组合框,以便为用户的下一次选择做好准备。
推荐阅读
- c# - 根据数据改变背景
- java - 无法解析方法“writeJson(java.lang.String,javax.servlet.http.HttpServletResponse)”
- r - 在 R 中设置颜色条限制
- python - 当python没有返回时,如何访问另一个函数中的值?
- ios - SwiftUI:NavigationView/NavigationLink:启动并推送目的地?
- kentico - Kentico 13 上缺少字典
- javascript - 如何从 document.write 内的脚本访问 document.body
- mysql - 将数据帧转换为 SQL 时出错 - Pandas
- r - 为什么使用函数命名空间会大大增加开销?
- reactjs - React Native 项目 - 只有 15 个活跃用户的重要 Cloud Firestore 读取