0
我试图将表格从Excel导入到Access并保持这些表格之间的关系。导入并追加数据
我在Access中有一些空表与外键连接到彼此,我基本上想要做的是用Access中的数据填充这些表而不会丢失任何关系。例如。在添加数据时,“ProductsTests”表仍将继承表“Products”的外键。
您认为最好的方法是做什么?感谢您的任何帮助。
我试图将表格从Excel导入到Access并保持这些表格之间的关系。导入并追加数据
我在Access中有一些空表与外键连接到彼此,我基本上想要做的是用Access中的数据填充这些表而不会丢失任何关系。例如。在添加数据时,“ProductsTests”表仍将继承表“Products”的外键。
您认为最好的方法是做什么?感谢您的任何帮助。
那么,如果您只是将Excel文件导入到不同的表中,然后使用SQL查询将数据添加到所需的表中,则没有问题(只要按正确的顺序导入, t违反参照完整性,不要做一对一的关系)。
覆盖一个表的关系是较为困难的,这是我的一个项目:
下面的代码添加到模块:
'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
正如你所看到的,经常收拾桌子和追加更容易,但是这可能是具有参照完整性问题(其它表也可以被清除),或者表格结构的变化。确保当你使用这段代码时,在你的表被替换之后,所有关系的所有必需字段都在那里,否则你将遇到运行时错误,这些关系将会消失。
取决于您是否与参照完整性存在多重关系,您可能首先需要复制所有涉及表的关系(可以将它们放入集合中),然后执行所有删除和替换表,然后恢复所有人,
您认为可以在VBA中使用ADO.NET来克服关系问题吗? –
VBA中没有ADO.NET这样的东西,只是ADO。但是我刚刚向您展示了VBA代码,可以克服导入带关系的数据集时的常见问题。显然,它可以完成。做一些研究,尝试一些事情,然后回来问你是否有一个特定的问题(例如代码错误)。 –
非常感谢,使用ADO解决了问题。 –