在过去的几周里,我一直在为我的工作制定一个非常非常规的问题解决方案。我快到了,但我需要知道做最后一步最有效的方法。我会把它记下来,这样我就不必写一篇文章来描述我一直在研究的问题的疯狂本质
我在MS Access中有四个大型本地表,总共有500000多条记录。每个表格代表不同类型的产品。表1的productID总是以";9〃;表2的productID总是以";8〃;表3的productID总是以";4〃;表4的productID总是以";3〃;我编写了一个vba过程,它完全完成了我需要它做的事情,只是到目前为止我只使用table1查询信息。基本上,用户输入一个productID,过程在表中搜索该记录,并将信息发送到共享点列表。在我的情况下,执行速度非常重要。那么,最快的跑步方式是什么呢?我应该写一份声明,说";如果ID以9开头,则搜索此表,ElseIF。。。。。等等;或者,我应该把所有的表合并为一个表,而不是让它看ID的第一位吗?
我知道这听起来像是一个简单的问题,但相信我,这是对真实问题的过度简化,需要2000个字才能解释它实际上有多荒谬;我不是在开玩笑。然而,我很有信心,以上问题的答案将为我提供成功完成该项目所需的所有信息。我已经走了这么远,我所剩下的就是找出将其应用于其他3个表的最有效方法。
谢谢!
由于表是本地的,请使用速度极快的Seek
方法:
记录集查找方法(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