【发布时间】:2020-07-13 21:12:50
【问题描述】:
在我问这个问题之前,我必须承认我是 SQL 新手,但这里是这样的:
我有 3 个表:Crown Facility、tblSubProjects 和 lnkSubProjectFacility。
我使用 lnkSubProjectFacility 将设施分配给子项目,反之亦然。当用户从表单中的组合框 (cboAddFacSubProject) 中选择子项目时,组合框中的AfterUpdate 事件会导致 2 个列表框填充 lnkSubProjectFacility 表记录中的关联记录.
左侧列表框 (lstAddSubProjectFacilities) 显示与子项目关联的所有设施,右侧 (lstAddSubProFac) 显示用户可以分配的所有可用剩余设施,其中一个命令按钮,然后从右侧列表框中删除一个可用设施并将其移动到左侧(从而在 lnkSubProjectFacility 表中创建一个新记录)。
一切正常,除了我似乎无法使用下面的 VBA 代码在组合框的 AfterUpdate 事件中使用正确的可用工具填充正确的列表框:
Private Sub cboAddFacSubProject_AfterUpdate()
Dim strSQL As String, strSQL2 As String
'String SQL statment variable for the LEFT listbox - to display all ASSIGNED facilities
strSQL = "SELECT [CROWN Facility].FACILITY_ID, " & _
"[CROWN Facility].FACILITY_NAME, " & _
"lnkSubProjectFacility.SUBPROJECT_ID " & _
"FROM [CROWN Facility] INNER JOIN lnkSubProjectFacility " & _
"ON [CROWN Facility].FACILITY_ID = lnkSubProjectFacility.FACILITY_ID " & _
"WHERE lnkSubProjectFacility.SUBPROJECT_ID =" & Me.cboAddFacSubProject & " " & _
"ORDER BY [CROWN Facility].FACILITY_NAME"
'String SQL statment variable for the RIGHT listbox - to display all AVAILABLE facilities
strSQL2 = "SELECT [CROWN Facility].FACILITY_ID, " & _
"[CROWN Facility].FACILITY_NAME, " & _
"lnkSubProjectFacility.SUBPROJECT_ID " & _
"FROM [CROWN Facility] LEFT JOIN lnkSubProjectFacility " & _
"ON [CROWN Facility].FACILITY_ID = lnkSubProjectFacility.FACILITY_ID " & _
"WHERE lnkSubProjectFacility.SUBPROJECT_ID <>" & Me.cboAddFacSubProject & " " & _
"ORDER BY [CROWN Facility].FACILITY_NAME"
'RowSource for the LEFT listbox - to display all assigned facilities
lstAddSubProjectFacilities.RowSource = strSQL
'RowSource for the RIGHT listbox - to display all available facilities
lstAddSubProFac.RowSource = strSQL2
'This is just updating a label showing the count of items in the left listbox
lblListCt.Caption = lstAddSubProjectFacilities.ListCount & " Facilities Selected"
End Sub
执行此代码后,左侧列表框中的一切正常,该子项目的所有分配记录都正确显示。然而,尽管右侧列表框排除了左侧显示的所有设施,但它也排除了分配给该表中任何其他子项目的任何设施。
除了搜索这个问题的时间之外,我还尝试了 strSQL2 变量,尝试在末尾添加 IS NULL(这当然不起作用)以及许多其他事情,例如更改 JOIN 类型.最近,我将 WHERE 更改为 AND,但没有返回任何内容。
我确信有一个相当简单的解决方案,但我将非常感谢任何帮助我到达那里!
注意:我使用的是 Access 2010,但我认为这没有任何区别。
编辑:这是 lnkSubProjectFacility 表的结构:
SUBPROJECT_ID FACILITY_ID
7 20000003
7 20000025
7 20000027
8 20010302
8 20021781
9 20040035
9 20044392
10 20045465
17 10000282
17 10000452
17 10000844
21 20000005
21 20000019
21 20000026
CROWN Facility 表结构:
FACILITY_ID FACILITY_NAME
20000003 Barnes
20000025 Bio-Medical Applications
20000027 Barnes Center
20010302 Atlantic
20021781 Anthonys Hospital
20040035 Black Hawk
20044392 Ames
20045465 Arnold
10000282 BETHANY
10000452 ANDOVER
10000844 Ankeny
20000005 Columbia
20000019 Baptist
20000026 Childrens Hospital
tblSubProjects 表结构:
SUBPROJECT_ID SUBPROJECT
7 Service Project1
7 Service Project1
7 Service Project1
8 Service Project2
8 Service Project2
9 Service Project3
9 Service Project3
10 Service Project4
17 CatheterReduction1
17 CatheterReduction1
17 CatheterReduction1
21 Patient Access3
21 Patient Access3
21 Patient Access3
【问题讨论】:
-
cboAddFacSubProject是什么数据类型? -
cboAddFacSubProject是一个对象,是用来执行上面代码的组合框的属性名。 -
当您删除
where子句时,它会返回数据,对吗? -
是的,它会返回 Crown Facility 中列出的所有设施,这些设施与已分配的设施重复了多少次。
-
你能用两个表的实例更新你的帖子吗?如果您无法共享任何真实数据,请使用虚假数据
标签: sql ms-access vba ms-access-2010