在MS访问表单中设置列表框--逐行设置。

问题描述 投票:0回答:1

在MS Access中,我有一个要求,即一个表格在表单中显示为几行。我已经创建了一个表格详细记录(多个字段),它将重复表1中的每一行。假设我在Table1中有五列。基于Column3的值,我想在form_load期间为Column4和Column5提供一个值列表。我还创建了一个单独的Table2来建立Column3、Column4和Column5之间的关系。我已经设置了Event过程来使用子函数填充值。我所面临的挑战是,不能为不同的行设置不同的列表框 "值列表"。任何关于通过处理Table1中的每一行来填充表单字段IMRecomExIns和AmendReasonExIns的提示都将是一个巨大的帮助。

Private Sub IMRecomExIns_Click()

Dim CoverType As String
Dim ListRecomm As String
Dim ListAmend As String
Dim db As DAO.Database
Dim tablevar As Recordset

Set db = CurrentDb
Set tablevar = db.OpenRecordset("Table2")

CoverType = "*" & Me.CoverTypeExIns.Value & "*"

ListRecomm = ""
ListAmend = ""

If tablevar.EOF = False And tablevar.BOF = False Then
    tablevar.MoveFirst
    Do Until tablevar.EOF
        If tablevar!CoverType Like CoverType Then
            ListRecomm = tablevar!Recommendation
            ListAmend = tablevar!AmendReason
            tablevar.MoveLast
        End If
        tablevar.MoveNext
    Loop
End If

Me.IMRecomExIns.RowSourceType = "Value list"
Me.IMRecomExIns.RowSource = ListRecomm

Me.AmendReasonExIns.RowSourceType = "Value list"
Me.AmendReasonExIns.RowSource = ListAmend

End Sub

1)我已经将所有的值列表存储在一个单元格中。例如,tablevar!RecomExIns.RowSource的所有值都将被存储在Me.IMRecomExIns.RowSource中,这意味着输出将是 "Rec1"; "Rec2"; "Rec3";等等。同样适用于tablevar!AmendReason "AR1"; "AR2'; "AR3";ETC......。明白这不是规范化的数据存储形式。我想在用规范化表构建完整的解决方案之前,先POC一下.2)前面已经回答了......rowsource将在第一次匹配时设置所有可能的值,所以没有必要一直到表的最后3)CoverTypeExIns是一个字符串,表2有许多不同的可能性,如 "Mortgage Income "和 "Family Income",然而对于所有来自Table1的 "Income "类别来说,Recommendation和Amendreason是相同的。这就是为什么要用通配符搜索。

我的问题不在于设置单行的RowSource,而是在MS Access屏幕上设置同一IMRecommmendation和AmendReason的多次出现的RowSource。

这里是表单的设计视图。这个表单与MS Access表相连。对于多行的详细记录会重复多次。MS Access Form Design

屏幕中显示的两行的例子。Form Display view

vba ms-access ms-access-2010 ms-access-forms
1个回答
0
投票

我不知道你到底想做什么。

我可以看到你的代码有几个问题。

  • 你使用的是 tablevar.MoveLast 循环中,这将自动带你到记录集的末端。
  • 另外,你并没有连接(连接在一起)。ListRecommListAmend你只是将它们设置为一个值,所以每个匹配的循环都会覆盖之前的任何值。
  • 最后,我不知道你为什么要试图找到 CoverTypeExIns - 您正在使用 LIKE这将表明它是文本,但不是用单引号来包装该值。如果它是一个数字值,那么你应该使用"="。

然而,比起打开一个记录集,循环它并检查是否匹配以建立一个值的列表,最好的办法是将列表框的RowSource设置为一个SQL字符串(实际上是一个查询)。

类似于(假设CoverType是数字型)。

Private Sub IMRecomExIns_Click()
   Dim strSQL As String
   strSQL = "SELECT Recommendation FROM Table2 WHERE CoverType=" & Me!CoverTypeExIns
   Me!AmendReasonExIns.RowSource = strSQL
End Sub

我更倾向于声明一个字符串来保存SQL语句,而不是设置为 .RowSource 直接,因为它使故障排除更容易。

请注意。


0
投票

根据给出的新信息,下面是一些VBA代码,根据在 "封面 "中输入的信息,打开一个记录集,然后设置了 .RowSource 属性作为两个组合框的值列表。在我的例子中,不要费心设置两个组合框的 .RowSourceType,因为这应该在设计时完成。

Private Sub IMRecomExIns_Click()
    Dim db As DAO.Database
    Dim rsData As DAO.Recordset
    Dim strSQL As String
    Set db = DBEngine(0)(0)
    strSQL = "SELECT Recommendation, AmendReason FROM Table2 WHERE CoverType LIKE '*" & Me!cboCover & "*';"
    Set rsData = db.OpenRecordset(strSQL)
    If Not (rsData.BOF And rsData.EOF) Then
        Me!IMRecomExIns.RowSource = rsData!Recommendation
        Me!AmendReasonExIns.RowSource = rsData!AmendReason
    End If
    rsData.Close
    Set rsData = Nothing
    Set db = Nothing
End Sub

就像我之前说的,你应该真正规范化设计你的数据库。现在而不是到了需要重写的地步。

请注意。

© www.soinside.com 2019 - 2024. All rights reserved.