我有一个包含约1000个表的MS Access数据库。这些表彼此独立,即它们彼此不链接。基本上,每个表都包含特定商品的库存记录。每个表的名称是项目的名称,例如125克肥皂,200毫升油等,并包含以下各列:-
每天,所有商品的销售/购买都记录在会计软件中。结束日期报告摘要以Excel格式生成。此报告是按行的所有商品的每日销售/购买的合并报告。 Excel中的列为:
目前,我必须手动打开Access中的每个表,然后从excel报告中复制并粘贴各自的每日销售/购买数据。我想自动执行此过程,以便将记录自动添加到每个相应的表中,并以项目名称为基础。
总而言之,我想从 1 Ms Excel电子表格中包含的数据更新Ms Access数据库文件中的多个表。
有可能吗?非常感谢您的帮助。
谢谢, 蒂鲁·克拉克(Thiru V. Klack)
答案 0 :(得分:1)
我对您的第一个问题是,为什么Access数据库不能匹配Excel电子表格的数据结构?从1个电子表格更新1个Access表比您要尝试的操作简单得多。拥有1,000个具有相同数据结构的表(每个表均以产品命名)对我来说似乎很麻烦。
话虽如此,如果您需要保留1,000个表(老实说,您没有达到Access的数据库最大阈值),有多种方法可以使它起作用。我建议您使用一个查找表,该查找表将产品(在电子表格中显示)与要访问的Access中的表进行匹配。然后,您将Excel数据导入到临时表中,并运行一些VBA代码在查找表中循环,运行查询以将Excel中的所有数据附加到适当的Access表中。像这样:
private const STAGING_TABLE_NAME as string = "tDataFromExcel"
private Const LOOKUP_TABLE_NAME as String = "tGoodsToTableNames"
public sub AddData()
Dim db as DAO.Database
Dim rsItemLookup as DAO.Database
Dim strSQL as string
Dim GoodName as string, TableName as string
set db = CurrentDB
set rsItemLookup = db.OpenRecordset("select good_name, table_name from " & LOOKUP_TABLE_NAME)
do while not rsItemLookup.EOF
GoodName = rsItemLookup.fields("good_name").Value
TableName = rsItemLookup.fields("table_name").value
strSQL = _
"insert into " & TableName & " (" & _
"[date], " & _
"[Daily Opening Stock], " & _
"[Daily Sales], " & _
"[Daily Purchases], " & _
"[Daily Closing Stock]) "
"select " & _
"[date], " & _
"[Daily Opening Stock], " & _
"[Daily Sales], " & _
"[Daily Purchases], " & _
"[Daily Closing Stock]) " & _
"from " & STAGING_TABLE_NAME & " " & _
"where [Item Name] = """ & GoodName & """"
db.Execute strSQL
rsItemLookup.MoveNext
loop
end sub
同样,我当然不建议您采用这种方法:如果可以,我强烈恳请您将数据库重构为不具有几乎1000个几乎相同的表。
答案 1 :(得分:0)
Zack的答案提供了一种方法来完成您要问的事情,但建议您做其他事情。我将尝试证明他的建议适合您的情况,并向您展示如何实现。
您希望将excel电子表格中的数据传输到保存相同数据的关系数据库中-通常是为了提供更好的访问/操作。数据存储在一天的大表中,每个产品都有单独的一行,并且您希望能够查看单个产品的全部历史记录,因此您已经将表分开了。
这将大大减慢自动传输过程的速度-漫长的循环不断地重写和处理SQL。您可以以这种方式 来查看数据,而无需进行此设置。让我们称之为tblProductDetails
一个表包含您的产品信息-诸如产品名称,价格等信息。另一个表具有所购商品的进/出记录,随时可以跟踪库存。第二个表将有很多记录,因为它是每天购买和/或出售的每种产品的新记录。我们可以称其为tblInOut。
使用Select
查询,您可以保存在Access中,可以随时查看任何一种产品的历史记录-您甚至可以将其设置为变量,以便在打开时唯一的查询保存后,它会提示您输入要查找的产品的名称。
我为您模拟了一个4 product sample schema,其中包含一个查询以显示所有数据,另一个显示一个产品的历史记录。您可以像在Access的查询构建器(SQL视图)中一样使用第二个查询,其中在查询名称中提到了'125g Soap'
(在第二行),因此您知道哪个查询。
如果您只想使用一个查询,请执行相同的操作,但有一个例外:在第二行中,它说'125g Soap'
用Product_Name
替换整个内容(不带逗号)。当您打开查询时,Access会给您一个消息框,要求您输入产品名称。
该功能仅在您输入正确的名称时才有效,因此您可能更喜欢仅构建表单,以便为用户提供一个组合框,用于选择确切的产品名称。