我正在为在Excel电子表格中获取数据但希望将数据导入Access表的客户工作。数据记录的字段是:
-InvoiceNum -发票日期 -顾客 -发货日期 -数量 -项目 -PriceEach
他每月收到两次数据,每次收到数据时,他都希望能够将数据导入Access中的表格。
有两个问题导致我出现问题:1)数据没有主键(最接近主键的字段是" InvoiceNum"但不幸的是多个记录可以有相同的该字段的字符串); 2)重复记录是可能的,其中"重复记录"我的意思是两个记录对每个字段都有相同的值。
问题是我们不希望数据表中有重复记录。
我不知道处理这个问题的最佳方法是什么。我希望对以下内容提出一些建议:
a)我应该将所有记录存储在链接到Access表的Excel电子表格中吗?我想如果我这样做,那么我可以将每组新数据附加到这个电子表格(包括重复数据),然后在Excel中写一个宏来删除重复项(我注意到我可以通过使用"删除在"数据"选项卡上复制"命令。
或
b)我应该将数据直接存储在Access表中吗?我可以编写一些VBA程序或宏来将每组新的Excel数据导入Access表,但有没有办法进行这种导入可以消除重复(同样,表中没有主键)?
或
c)是否有另一种选择比上述其他选项更好?
感谢您对此提供的任何帮助!我真的很感激!
答案 0 :(得分:0)
将其修复到根目录。
问题的根本原因是任何人或软件正在创建包含重复行的Excel电子表格。您可以做的最好的事情是在数据进入Excel之前消除重复项。
如果您不能这样做,请在将其导入Access之前删除Excel中的重复项。 (您不必为此编写宏。)由于您将没有重复项,因此将能够为目标表建立密钥。最好的情况,你的钥匙是InvoiceNum。在最坏的情况下,密钥将是{InvoiceNum,InvoiceDate,Customer,ShipDate,Quantity,Item,PriceEach}。
所有这些都假定重复是没有意义的。如果它们(应该是)有意义的话,那么你需要更多的列。但我无法想象会发生什么。
答案 1 :(得分:0)
如果你不能做@Catcall建议的事情(即修复产生欺骗的过程),我会这样做:
在Access中创建临时表。它的功能只是作为每个导入的缓冲表,并在使用后清除。
使用提供的@HansUp方法导入(即带有IN子句中连接字符串的SQL字符串)。
然后使用LEFT JOIN查询现有发票以查找新发票:
SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach FROM tblBuffer LEFT JOIN tblInvoices ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum WHERE tblInvoices.InvoiceNum Is Null
这将为您提供新发票,您可以轻松将其转换为INSERT命令以插入这些记录:
INSERT INTO tblInvoices (InvoiceNum, InvoiceDate, Customer, ShipDate, Quantity, Item, PriceEach) SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach FROM tblBuffer LEFT JOIN tblInvoices ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum WHERE tblInvoices.InvoiceNum Is Null