【问题标题】:import and append data导入和追加数据
【发布时间】:2017-07-10 01:24:42
【问题描述】:

我正在尝试将表格从 Excel 导入 Access 并保持这些表格之间的关系。

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

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

【问题讨论】:

    标签: excel ms-access vba


    【解决方案1】:

    好吧,如果只是将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
    

    如您所见,经常清除表并附加它更容易,但这可能是参照完整性(其他表也可能被清除)或表结构更改的问题。确保当您使用此代码时,所有关系的所有必填字段在您的表被替换后都在那里,否则您将遇到运行时错误并且这些关系将消失。

    取决于您是否有多个具有参照完整性的关系,您可能首先要复制所有相关表的关系(您可以将它们放在一个集合中),然后执行所有表的删除和替换,然后恢复所有其中,

    【讨论】:

    • 您认为可以在 VBA 中使用 ADO.NET 来克服关系问题吗?
    • VBA 中没有 ADO.NET 这样的东西,只有 ADO。但是我刚刚向您展示了 VBA 代码,它可以克服导入具有关系的数据集的常见问题。显然,这是可以做到的。做一些研究,尝试一些事情,然后回来询问您是否有特定问题(示例代码说明出了什么问题)。
    猜你喜欢
    • 2019-04-06
    • 2011-08-06
    • 1970-01-01
    • 2016-06-21
    • 2014-11-23
    • 2016-03-26
    • 2012-10-23
    • 2015-05-06
    • 2013-04-04
    相关资源
    最近更新 更多