根据组合框值在文本框中显示多个值

时间:2020-06-27 23:27:27

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

我有一张桌子-tblMAIN

我有4个ID字段-mainID,FatherID,MotherID和FullName

1个表格-frmMAIN

1个组合框-cboMAIN

2个文本框-txtFATHER,txtMOTHER

我要实现的目标是在VBA中编写一条SQL语句,该语句将在组合框cboMAIN中选择一条记录,并通过选择填充2个文本框。

在cboMAIN中选择了Robert,Robert的MainID为20 罗伯特母亲是露丝,她的MainID为30,罗伯茨父亲的MainID为40 因此在txtFather中将显示记录40 / FullName,在txtMother中将显示FullName用于记录MainID30

我还想添加更多txt字段,并显示露丝的母亲和罗伯特的父亲的父亲。

这是我的一个主意,但不确定下一步该怎么做!请任何有好的想法的人!

Dim sqlME As String
Dim sqlFATHER As String
Dim db As Database
Dim rs As DAO.Recordset

sqlFATHER = "SELECT * FROM tblMAIN WHERE MainID = " & Forms![MAIN]![cboMAIN] & ";"

'AND NOT SURE WHAT I NEED TO DO HERE!!! LOL

 Set db = CurrentDb
 Set rs = db.OpenRecordset(sqlFATHER)
 Me.txtFather.Value = rs!FullName
 Set rs = Nothing
 Set db = Nothing

1 个答案:

答案 0 :(得分:0)

UNBOUND文本框的VBA设置值将为每条记录显示相同的值。

此数据本质上是递归的,Access SQL并不容易操纵递归性质的数据。其他数据库平台具有可以更好地处理的实用程序。

构建一个名为qryAncestors的自联接查询对象:

SELECT tblMain.mainID, tblMain.FullName, tblMain_1.FullName AS Father, 
tblMain_2.FullName AS Mother, tblMain_3.FullName AS PGFather, 
tblMain_4.FullName AS PGMother, tblMain_5.FullName AS MGFather, tblMain_6.FullName AS MGMother
FROM tblMain AS tblMain_6 
RIGHT JOIN (tblMain AS tblMain_5 
RIGHT JOIN (tblMain AS tblMain_4 
RIGHT JOIN (tblMain AS tblMain_3 
RIGHT JOIN (tblMain AS tblMain_2 
RIGHT JOIN (tblMain AS tblMain_1 
RIGHT JOIN tblMain 
ON tblMain_1.mainID = tblMain.FatherID) 
ON tblMain_2.mainID = tblMain.MotherID) 
ON tblMain_3.mainID = tblMain_1.FatherID) 
ON tblMain_4.mainID = tblMain_1.MotherID) 
ON tblMain_5.mainID = tblMain_2.FatherID) 
ON tblMain_6.mainID = tblMain_2.MotherID;

然后使用该查询的选项:

  1. 作为组合框RowSource的引用查询,然后文本框ControlSource按索引引用组合框的列 =[cboMain].Column(2)

  2. 文本框ControlSource使用DLookup()表达式,例如:
    =DLookUp("Father", "qryAncestors", "mainID=" & mainID)

  3. 文本框ControlSource调用VBA自定义函数以返回值,例如:
    =GetAncestor(mainID, "Father")

Function GetAncestor(intID As Integer, strAnc As String)
GetAncestor = DLookUp(strAnc, "qryAncestors", "mainID=" & intID)
End Function

如果您想超越祖父母到任何水平,方法都必须完全不同。递归过程很棘手。返回祖先全名的函数可能像这样:

Function GetAncestor(intID As Integer, intGen As Integer, strParent As String)
Dim x As Integer
GetAncestor = intID
For x = 1 To intGen
    GetAncestor = DLookup(strParent, "tblMain", "mainID=" & Nz(GetAncestor,0))
Next
GetAncestor = DLookup("FullName", "tblMain", "mainID=" & Nz(GetAncestor,0))
End Function

要获取特定世代的祖先,请调用函数:GetAncestor(mainID, 1, "MotherID")