2017-07-09 69 views
0

我试图将表格从Excel导入到Access并保持这些表格之间的关系。导入并追加数据

我在Access中有一些空表与外键连接到彼此,我基本上想要做的是用Access中的数据填充这些表而不会丢失任何关系。例如。在添加数据时,“ProductsTests”表仍将继承表“Products”的外键。

您认为最好的方法是做什么?感谢您的任何帮助。

回答

0

那么,如果您只是将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 

正如你所看到的,经常收拾桌子和追加更容易,但是这可能是具有参照完整性问题(其它表也可以被清除),或者表格结构的变化。确保当你使用这段代码时,在你的表被替换之后,所有关系的所有必需字段都在那里,否则你将遇到运行时错误,这些关系将会消失。

取决于您是否与参照完整性存在多重关系,您可能首先需要复制所有涉及表的关系(可以将它们放入集合中),然后执行所有删除和替换表,然后恢复所有人,

+0

您认为可以在VBA中使用ADO.NET来克服关系问题吗? –

+0

VBA中没有ADO.NET这样的东西,只是ADO。但是我刚刚向您展示了VBA代码,可以克服导入带关系的数据集时的常见问题。显然,它可以完成。做一些研究,尝试一些事情,然后回来问你是否有一个特定的问题(例如代码错误)。 –

+0

非常感谢,使用ADO解决了问题。 –