需要比较两个访问数据库 . 请指导1.如何使用VBA连接多个数据库2.如何动态选择连接哪个数据库3.如何查找匹配是否唯一/如果没有将结果插入到不同的表中4.查询匹配
First Database (Actually set of database files of same type - date wise)
(Called Database 1 for easy understanding):
File Names are :
2013-03-01.mdb
2013-03-02.mdb
2013-03-03.mdb
Each file will have over a million records - Hence speedy comparison required.
Fields
ID RowInfo Description Value Region
Database 2 :
2013-03.mdb
Fields
Table 1 : InvoiceNumber Value CompanyName Date
Table 2 : InvoiceNumber Region
Table 3- Match Result:InvoiceNumber Value ID RowInfo Description CompanyName Date
Table 4- Match Result:InvoiceNumber Value ID RowInfo Description CompanyName Date
对于Database2中的每个Invoice,在数据库1中查找(在Date Column中指定的文件中) . 根据Region和Value在Database1中找到相应的匹配项 . 如果未提及区域,则仅基于值 . 如果未找到匹配项,则还要检查日期1文件 . 但必须确保唯一匹配 . No Two InvoiceNumbers应匹配Database1中的相同ID(在同一日期内) .
对于每个Invoice,如果DB1中存在唯一匹配,则将结果插入DB2的表3中 . 如果有多个匹配(单个发票的DB1中有多个ID),则将结果插入表4中 .
3 回答
re: 1. how to use VBA to connect multiple database
在Access中,您可以使用链接表(
External Data > Import & Link
)来操作驻留在另一个数据库文件中的表 . 实际上,多用户Access数据库应始终使用"split"数据库格式,其中"back-end"文件包含表,"front-end"包含其他所有内容(查询,表单,报告等) . 前端使用链接表来访问后端的"real"表 . (请参阅下一点,了解VBA如何适应这一点 . )re: 2. how to dynamically choose which database to connect
手动方法涉及使用Access中的“链接表管理器”将现有表链接“指向”不同的文件 . 如果需要,也可以(毫不奇怪)使用VBA自动化,但使用链接表管理器是合乎逻辑的起点 .
re: 3. how to find if match is unique / and if not insert result into different table
如果两个“目标表”具有完全相同的结构,那么您应该考虑只使用一个额外的列来维护一个这样的表来区分它包含的记录 . 在这种情况下,额外列将类似于[SourceRowCount],其中值= 1将对应于“表3”,值> 1将对应于“表4” . 您仍然可以通过创建已保存的查询将它们视为查询和报告中的单独“表”...
查询名称:[Invoice_unique_match],条件:“WHERE [SourceRowCount] = 1”
查询名称:[Invoice_non_unique_match],条件:“WHERE [SourceRowCount]> 1”
...并且仍然可以在同一个表中提供所有记录,以防有时您想要对记录进行选择(或聚合或报告),而不管其“唯一性”状态如何 .
在2013-03-01.mdb文件中添加2013-03-02.mdb和2013-03-03.mdb数据库中的链接表并使用DLookup搜索链接表是不是更简单?
文件 - >获取外部数据 - >链接表
最好创建一个UNIONs来自所有“数据库1”数据库的表的查询 .
我想你说你的匹配标准是:
建议代码:
有几种方法 .
一种是编写两个INSERT查询,一个用于填充表3,另一个用于填充表4 .
另一种方法是编写一个VBA脚本,从“数据库2”中的发票中执行大的SELECT,迭代它们,并逐个处理它们 . “一对一”的做法会很慢 . 有很多开销 . 但它为您提供了控制权并允许您在运行时进行调试 .