【问题标题】:Access 2007: DLookup for Autofill not returning valuesAccess 2007:自动填充的 DLookup 不返回值
【发布时间】:2015-02-04 06:03:55
【问题描述】:

为视障人士开发一个数据库,用于安排领取捐款(使用音频阅读器进行字段)。有一个简单的表“Truck_Routes”,其中包含客户 ID、街道地址、套房、公司、城市、州、邮编、联系人姓名、联系电话号码和几个捐赠信息字段。

尝试根据现有的组合框:cboAddress ....(街道地址)开发一个自动填写的表单:套房、公司、城市、州、邮编、联系人姓名和联系电话号码。花了几个小时在网上模拟其他示例,但无法让 vba 工作。

街道地址 - 带有“After_Update 事件过程”​​的组合框

Private Sub cboAddress_AfterUpdate()
  PopulateFields
End Sub

Private Sub PopulateFields()
  Me.Suite = DLookup("Suite", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.Company = DLookup("Company", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.City = DLookup("City ", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.State = DLookup("State ", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.zip = DLookup("zip ", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.ContactName = DLookup("ContactName ", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
  Me.ContactPHone = DLookup("ContactPhone ", "Truck_Routes", "Street Address=" & Me.[cboAddress & "'"])
End Sub

表单中的字段使用“tab”键导航,音频阅读器读取字段。每个字段的默认值是字段的名称,因此可以将其读取给操作员。有什么想法/建议吗?

【问题讨论】:

    标签: ms-access vba ms-access-2007


    【解决方案1】:

    您的 DLookup 有点偏离,方括号在引号之外。它们也应该用单引号括起来,因为它们是文本类型。我已经为你修好了。

    Private Sub cboAddress_AfterUpdate()
        PopulateFields
    End Sub
    
    Private Sub PopulateFields()
        Me.Suite = DLookup("Suite", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.Company = DLookup("Company", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.City = DLookup("City ", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.State = DLookup("State ", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.zip = DLookup("zip ", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.ContactName = DLookup("ContactName ", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
        Me.ContactPHone = DLookup("ContactPhone ", "Truck_Routes", "[Street Address] = '" & Me.cboAddress & "'")
    End Sub
    

    另一方面,Domain 函数是一项相当昂贵的操作。这是一个简化的 SQL。因此,每次使用 DLookup 时,您都在对上例中的表执行 READ 操作,在一次 AfterUpdate 中查询该表 7 次。如果您要使用 RecordSet 对象,这可能会大大减少。

    类似的,

    Private Sub cboAddress_AfterUpdate()
        PopulateFields
    End Sub
    
    Private Sub PopulateFields()
        Dim rsObj As DAO.Recordset
    
        Set rsObj = CurrentDB.OpenRecordset("SELECT Suite, Company, City, State, zip, ContactName, ContactPhone " & _
                                        "FROM Truck_Routes WHERE [Street Address] = '" & Me.cboAddress & "'")
    
        If Not rsObj.EOF Then
            Me.Suite = rsObj.Fields("Suite")
            Me.Company = rsObj.Fields("Company")
            Me.City = rsObj.Fields("City")
            Me.State = rsObj.Fields("State")
            Me.zip = rsObj.Fields("zip")
            Me.ContactName = rsObj.Fields("ContactName")
            Me.ContactPHone = rsObj.Fields("ContactPhone")
        Else
            MsgBox "No Information matched."
        End If
    
        Set rsObj = Nothing
    End Sub
    

    还有其他优点,例如,

    1. 使用 RecordSet 对象的 RecordCount 属性检查 Recordset 是否返回多行。
    2. 这不仅减少了对数据库的访问,而且与域函数不同,此代码还可以自行清理。

    希望这会有所帮助!

    【讨论】:

    • (stackoverflow.com/questions/28314516/…) PaulFrancis....非常感谢。我使用了代码,但出现编译错误:“Set rsObj = CurrentDb.Execute”处的预期函数或变量...“Execute”被突出显示...
    • 抱歉@Michael,我使用了Execute 我应该使用 OpenRecordset 我已经编辑了我的答案。
    • 似乎他的表包含一个字段,其名称包含一个空格,街道地址。将该名称括在方括号中,以便 db 引擎正确识别:WHERE [Street Address] = 请注意,该问题也适用于 DLookup 方法。
    • 您是说域函数不会“自行清理”吗?这是什么意思?
    • (stackoverflow.com/questions/28314516/…) PaulFrancis...感谢您的更新。我将街道地址创建为一个组合框,在查找表中只有街道地址。当志愿者输入新记录 (Ctr+Shf++) 时,街道地址字段“突出显示”并大声读出“街道地址”。然后工人可以输入地址。 (续)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2012-05-11
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多