我有一张桌子-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
答案 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;
然后使用该查询的选项:
作为组合框RowSource的引用查询,然后文本框ControlSource按索引引用组合框的列
=[cboMain].Column(2)
文本框ControlSource使用DLookup()表达式,例如:
=DLookUp("Father", "qryAncestors", "mainID=" & mainID)
文本框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")