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解決了問題。 –