gpt4 book ai didi

sql - 在表单内的Access中的三个子表单中显示基于相同ID的记录

转载 作者:行者123 更新时间:2023-12-04 22:16:35 30 4
gpt4 key购买 nike

我知道我正在寻找一个快速解决方案,主要问题出在数据库设计上,但目前我对此无能为力。

所以这是我的愿望:

我有三个表 TableA、TableB、TableC,它们都共享 ID 作为键并启用了参照完整性(事实上,它是一个大表,有超过 255 列,这是我必须找到解决方法的限制)。我想要实现的是将所有记录同时显示为彼此相邻的数据表,并具有以下行为:

  • 如果我在表 A 中进行筛选,表 B 和 C 应该显示相同的行
  • 排序也应该相等,并且应该按表A中的某些列进行排序
  • 我已经设法让光标位于所有表的同一行

desired layout

我想制作一个 select * from tableB where id in filteredrecordset of tableA 或对该记录集进行某种连接,但未能实现。

旁注:该数据库中大约有 10 万条记录,性能必须很快,因为此 View 主要用于需要这种扁平数据结构的多列和多行的数据输入/更新。

预先感谢您的帮助!

最佳答案

您可以使用表单 On Filter 事件来同步过滤器。但是,我假设您已将子表单直接绑定(bind)到表格。

因为您已经将子表单直接绑定(bind)到表格,所以您无法监听事件。但是,我最近 encountered that issue ,并有一个 hacky 解决方法,但如果您的字段名称和表名称是常量,则不需要使用它。您只需将 TableA 包装成数据表形式即可。

打开 TableA,然后转到 Create 选项卡,然后选择 More Forms -> Datasheet。您现在有一个数据表表单,可以捕获 TableA 中的所有字段。然后,将模块添加到该数据表表单。您不需要该模块中的任何代码。

然后,我们不将第一个子表单绑定(bind)到 TableA,而是将其绑定(bind)到此数据表表单。

现在,在父表单上,我们将为过滤器设置一个事件处理程序。

在父窗体上(我假设 tableA 的子窗体控件名称是 SubA,tableB 是 SubB,TableC 是 SubC):

Private WithEvents tblAForm As Form 'Declare tblAForm to handle events

Private Sub Form_Load()
'Initialize event handler, sync initially
Set tblAForm = Me.Controls("subA").Form
tblAForm.OnApplyFilter = "[Event Procedure]"
SyncFilters 'Not needed if you're not persisting filters, which you likely aren't
End Sub

Private Sub tblAForm_ApplyFilter(Cancel As Integer, ApplyType As Integer)
'Sync filters
SyncFilters(ApplyType)
End Sub

Private Sub SyncFilters(ApplyType As Integer)
Dim srcB As String
Dim srcC As String
Dim strFilter As String
Dim strOrder As String
'If filter or sort are on on TableA, we need to join in TableA for sorting and filtering
If tblAForm.FilterOn Or tblAForm.OrderByOn Then
srcB = "SELECT TableB.* FROM TableB INNER JOIN TableA On TableA.ID = TableB.ID"
srcC = "SELECT TableC.* FROM TableC INNER JOIN TableA On TableA.ID = TableC.ID"
'Filter to SQL
strFilter = " WHERE " & tblAForm.Filter
'Sort to SQL
strOrder = " ORDER BY " & tblAForm.OrderBy
If tblAForm.FilterOn And tblAForm.Filter & "" <> "" And ApplyType <> 0 Then
'If the filter is on, add it
srcB = srcB & strFilter
srcC = srcC & strFilter
End If
If tblAForm.OrderByOn And tblAForm.OrderBy & "" <> "" Then
'If order by is on, add it
strB = srcB & strOrder
srcC = srcC & strOrder
End If
Else
srcB = "SELECT TableB.* FROM TableB"
srcC = "SELECT TableC.* FROM TableC"
End If
If srcB <> Me.SubB.Form.RecordSource Then Me.SubB.Form.RecordSource = srcB
If srcC <> Me.SubC.Form.RecordSource Then Me.SubC.Form.RecordSource = srcC
End Sub

请注意,您确实需要一些备用字段以允许过滤和排序。用于此目的的任何字段都计入最多 255 个字段。如果你能做到这一点,你可以考虑将数据集分成 4 个表而不是 3 个

关于sql - 在表单内的Access中的三个子表单中显示基于相同ID的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381744/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com