【问题标题】:Display Multiple Values in Text Boxes based on a Combo Box Value根据组合框值在文本框中显示多个值
【发布时间】:2020-10-18 08:17:48
【问题描述】:

我有一张桌子 - tblMAIN
我有 4 个 ID 字段 - mainID、FatherID、MotherID 和 FullName
1 个表格 - frmMAIN
1 个组合框 - cboMAIN
2 个文本框 - txtFATHER、txtMOTHER

我正在尝试在 VBA 中编写一条 SQL 语句,该语句将在组合框 cboMAIN 中选择一条记录,并通过该选择填充两个文本框。

罗伯特在 cboMAIN 中被选中,罗伯特的 MainID 为 20
Robert 的母亲是 Ruth,她的 MainID 为 30
罗伯特父亲的 MainID 是 40

所以在 txtFather 中它将显示记录 40 / FullName,在 txtMother 中它将显示记录 MainID30 的 FullName。

我想添加文本字段并显示 Ruth 的母亲和 Robert 的父亲的父亲。

这是我的一个想法,但不知道下一步该做什么。

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!

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

【问题讨论】:

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


    【解决方案1】:

    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. reference 查询作为组合框 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")

    【讨论】:

    • 嗨braX,这太棒了!我喜欢函数选项,但我对编写或理解函数一无所知。我想我有很多功课要做。谢谢!
    • 不是胸罩。将功能放入通用模块中。确保模块和函数的名称不同。如果答案解决了问题,请标记为已接受。点赞也不错。
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多