比较两个Access数据库VBA - 唯一连接

时间:2013-03-24 16:51:03

标签: vba ms-access access-vba

需要比较两个访问数据库。 请指导 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中的每个发票, 在数据库1中查找(在日期列中指定的文件中)。 根据Region和Value在Database1中找到相应的匹配项。 如果未提及区域,则仅基于值。 如果未找到匹配项,则还要检查日期+ 1文件。 但必须确保唯一匹配。 No Two InvoiceNumbers应匹配Database1中的相同ID(在同一日期内)。

对于每个Invoice,如果DB1中存在唯一匹配,则将结果插入DB2的表3中。 如果有多个匹配(单个发票的DB1中有多个ID),则将结果插入表4中。

3 个答案:

答案 0 :(得分:0)

从2013-03-02.mdb& amp;添加链接表格不会更简单。在2013-03-01.mdb文件中的2013-03-03.mdb数据库并使用DLookup搜索链接表?

答案 1 :(得分:0)

  
      
  1. 如何使用VBA连接多个数据库
  2.   

档案 - >获取外部数据 - >链接表

  
      
  1. 如何动态选择要连接的数据库
  2.   

最好创建一个UNIONs来自所有“数据库1”数据库的表的查询。

  
      
  1. 如何找到匹配是否唯一/如果没有将结果插入到不同的表中
  2.   

我认为你说你的匹配标准是:

  

对于Database2中的每个Invoice,在数据库中查找1   (在日期列中指定的文件中)。找到相应的匹配   Database1基于Region和Value。如果区域没有提到那么   仅基于价值。如果未找到匹配项,请检查日期+ 1文件   也。但必须确保唯一匹配。没有两个InvoiceNumbers应该   匹配到Database1中的相同ID(在同一日期内)。

建议代码:

INSERT INTO Table3
WHERE DCOUNT("[InvoiceNumber]", "[big_union_query]", _
    "( [Region] = " & [Region] & " AND [Value] = " & [Value] & " ) OR " & _
    "( [Region] IS NULL AND [Value] = " & [Value] & " )" _
    ) = 1;

INSERT INTO Table4
WHERE DCOUNT("[InvoiceNumber]", "[big_union_query]", _
    "( [Region] = " & [Region] & " AND [Value] = " & [Value] & " ) OR " & _
    "( [Region] IS NULL AND [Value] = " & [Value] & " )" _
    ) = 1;
  
      
  1. 要匹配的查询
  2.   

有几种方法。

一种是编写两个INSERT查询,一个用于填充表3,另一个用于填充表4.

另一种方法是编写一个VBA脚本,该脚本从“数据库2”中的发票中执行大型SELECT,迭代它们,并逐个处理它们。 “一对一”的做法会很慢。有很多开销。但它为您提供了控制权并允许您在运行时进行调试。

答案 2 :(得分:0)

re:1。如何使用VBA连接多个数据库

在Access中,您可以使用链接表(External Data > Import & Link)来操作驻留在另一个数据库文件中的表。实际上,多用户Access数据库应始终使用“拆分”数据库格式,其中“后端”文件包含表,“前端”包含其他所有内容(查询,表单,报告等)。前端使用链接表来访问后端的“真实”表。 (请参阅下一点,了解VBA如何适应这一点。)

re:2。如何动态选择要连接的数据库

手动方法涉及使用Access中的“链接表管理器”将现有表链接“指向”另一个文件。如果需要,也可以(毫不奇怪)使用VBA自动化,但使用链接表管理器是合乎逻辑的起点。

re:3。如何查找匹配是否唯一/如果没有将结果插入到不同的表中

如果两个“目标表”具有完全相同的结构,那么您应该考虑仅使用额外的列维护一个这样的表来区分它包含的记录。在这种情况下,额外列将类似于[SourceRowCount],其中值= 1将对应于“表3”并且值> 1将对应于“表4”。您仍然可以通过创建已保存的查询将它们视为查询和报告中的单独“表”...

  • 查询名称:[Invoice_unique_match],条件:“WHERE [SourceRowCount] = 1”

  • 查询名称:[Invoice_non_unique_match],条件:“WHERE [SourceRowCount]> 1”

...并且仍然可以在同一个表格中提供所有记录,以防有时您想要对记录进行选择(或汇总或报告),而不管其“唯一性”状态如何。