【发布时间】:2017-07-10 01:24:42
【问题描述】:
我正在尝试将表格从 Excel 导入 Access 并保持这些表格之间的关系。
我在 Access 中有一些空表,它们通过外键相互连接,而我基本上想要做的是用 Access 中的数据填充这些表,而不会丢失任何关系。例如。添加数据时,“ProductsTests”表仍将继承“Products”表的外键。
您认为最好的方法是什么?感谢您的帮助。
【问题讨论】:
我正在尝试将表格从 Excel 导入 Access 并保持这些表格之间的关系。
我在 Access 中有一些空表,它们通过外键相互连接,而我基本上想要做的是用 Access 中的数据填充这些表,而不会丢失任何关系。例如。添加数据时,“ProductsTests”表仍将继承“Products”表的外键。
您认为最好的方法是什么?感谢您的帮助。
【问题讨论】:
好吧,如果只是将Excel文件导入到不同的表中,然后使用SQL查询将数据添加到所需的表中,就没有问题(只要按正确的顺序导入就不会违反参照完整性,不要建立一对一的关系)。
用关系覆盖表格有点困难,这是我的一个项目:
将以下代码添加到模块中:
'This function makes a duplicate of the provided relation
Public Function DuplicateRelation(SourceRelation As Relation) As Relation
Set DuplicateRelation = CurrentDb.CreateRelation(SourceRelation.NAME, SourceRelation.Table, SourceRelation.ForeignTable)
DuplicateRelation.Attributes = SourceRelation.Attributes
Dim i As Integer
Dim fldLoop As Field
Do While i < SourceRelation.Fields.Count
Set fldLoop = DuplicateRelation.CreateField(SourceRelation.Fields(i).NAME)
fldLoop.ForeignName = SourceRelation.Fields(i).ForeignName
DuplicateRelation.Fields.Append fldLoop
i = i + 1
Loop
End Function
'This function creates a collection containing duplicates of all relations involving strTablename, and then deletes those relations
Public Function DeleteRelationshipsCreateBackup(strTablename As String) As Collection
Dim ReturnCollection As Collection
Set ReturnCollection = New Collection
Dim i As Integer
Dim o As Integer
Do While i <= (CurrentDb.Relations.Count - 1)
Select Case strTablename
Case Is = CurrentDb.Relations(i).Table
ReturnCollection.Add DuplicateRelation(CurrentDb.Relations(i))
o = o + 1
CurrentDb.Relations.Delete CurrentDb.Relations(i).NAME
Case Is = CurrentDb.Relations(i).ForeignTable
ReturnCollection.Add DuplicateRelation(CurrentDb.Relations(i))
o = o + 1
CurrentDb.Relations.Delete CurrentDb.Relations(i).NAME
Case Else
i = i + 1
End Select
Loop
Set DeleteRelationshipsCreateBackup = ReturnCollection
End Function
'This function restores the duplicate created by DeleteRelationshipsCreateBackup
Public Sub RestoreRelationBackup(collRelationBackup As Collection)
Dim relBackup As Variant
If collRelationBackup.Count = 0 Then Exit Sub
For Each relBackup In collRelationBackup
CurrentDb.Relations.Append relBackup
Next relBackup
End Sub
然后,在 VBA 中替换表格时,请执行以下操作
dim collRelationBackup As Collection
Set collRelationBackup = DeleteRelationsCreateBackup("MyTable")
'Delete MyTable here
'Then make sure you create a drop-in replacement with the right field names and field types for the relation to be created
RestoreRelationBackup collRelation
如您所见,经常清除表并附加它更容易,但这可能是参照完整性(其他表也可能被清除)或表结构更改的问题。确保当您使用此代码时,所有关系的所有必填字段在您的表被替换后都在那里,否则您将遇到运行时错误并且这些关系将消失。
取决于您是否有多个具有参照完整性的关系,您可能首先要复制所有相关表的关系(您可以将它们放在一个集合中),然后执行所有表的删除和替换,然后恢复所有其中,
【讨论】: