2017-07-09 67 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解決了問題。 –