微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据条件查询 4 ​​个大型 Access 表中的 1 个的最有效方法使用 VBA 模块

如何解决根据条件查询 4 ​​个大型 Access 表中的 1 个的最有效方法使用 VBA 模块

在过去的几周里,我一直在为我的工作中的一个问题制定一种非常规的解决方案。我快到了,但我需要知道完成最后一步的最有效方法。我会把它简单化,这样我就不必写一篇文章来描述我一直在研究的问题的疯狂性质。

我在 MS Access 中有四个大型本地表,总共有超过 500,000 条记录。 每个表代表不同类型的产品。 table1 的 productID 总是以“9”开头 table2 的 productID 总是以“8”开头 table3 的 productID 总是以“4”开头 table4 的 productID 总是以“3”开头 我编写了一个 vba 程序,它完全符合我的需要,但到目前为止我只使用 table1 查询信息。基本上,用户输入产品ID,过程在表中搜索该记录并将信息发送到共享点列表。在我的情况下,执行速度非常重要。那么,让它运行的最快方法是什么?我应该写一个声明,说“如果 ID 以 9 开​​头,则搜索此表,ElseIF ..... 等等。”或者,我应该将所有表合并为一个而不是查看 ID 的第一个数字?

我知道这听起来像一个简单的问题,但相信我,这是对真正问题的过度简化,需要 2,000 字才能解释它实际上是多么荒谬;我不是在开玩笑。但是,我相当有信心,上述问题的答案将为我提供成功完成此项目所需的所有信息。我已经走了这么远,剩下的就是找出将它应用到其他 3 个表的最有效方法

谢谢!

解决方法

由于表是本地的,所以使用非常快的 Seek 方法:

Recordset.Seek method (DAO)

如果表已链接,您仍然可以通过打开后端数据库来使用 Seek。这是一个例子:

Function SeekTable()

  Const cstrTable As String = "tblValue01"
  Const cstrAttached As String = ";DATABASE="
  
  Dim wks As Workspace
  Dim dbs As Database
  Dim tdf As TableDef
  Dim rst As Recordset
  
  Dim strConnect As String
  Dim strTablename As String
  
  Set wks = DBEngine(0)
  Set dbs = wks(0)
  Set tdf = dbs.TableDefs(cstrTable)
  
  strConnect = tdf.Connect
  strTablename = tdf.SourceTableName
  Set tdf = Nothing
  
  If InStr(1,strConnect,cstrAttached,vbBinaryCompare) = 1 Then
    strConnect = Mid(strConnect,Len(cstrAttached) + 1)
    ' Open database shared and read-only.
    Set dbs = wks.OpenDatabase(strConnect,False,True)
    Set rst = dbs.OpenRecordset(strTablename)
    '
    ' Perform Seek operation. Example.
    rst.Index = "ID"
    rst.Seek "=",10010
    Debug.Print rst!Value
    '
    rst.Close
    Set rst = Nothing
  End If
 
  dbs.Close
  Set dbs = Nothing
  Set wks = Nothing
  
End Function

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。