将两个Microsoft Access数据库合并成一个,并使用表单在它们之间进行选择。

3
所以,我被分配到工作在两个非常糟糕的相同数据库上。它们都被分为前端和后端,但数据不同。
是否可能将这两个数据库合并成一个,并创建一个表单,允许用户选择他们要与哪个“数据库”交互?
澄清一下,使用这些数据库的学校有一个秋季学期和春季学期的数据库。两者都包含完全相同的表单/查询/表,但具体数据不同。例如,也许一位老师在秋季教授3门课程,但在春季教授4门课程(但是数据库比这个复杂得多)。数据结构保持不变,但具体数据取决于数据库。
因此,如果他们需要访问数据,则需要打开相应的数据库。结果,他们不断地打开/关闭不同的数据库。他们想做的是能够只使用一个数据库并在秋季/春季之间切换。
这是否可能?
4个回答

1

如果不知道您的数据结构的确切情况,很难给出具体的答案,但我的直觉是这两个数据库肯定可以合并。将所有相同名称的表中的数据合并,但对于任何会导致重复数据的表格添加一个“学期”列。然后简单地创建应用程序前端,以便在必要时用户可以选择他们想要查看的学期,并将其传递给检索数据的查询。您甚至可以从一开始就携带“学期”值,像您指出的那样,将其从屏幕传递到屏幕(使用全局应用程序级变量)。

我已经有一段时间没有在我的职业生涯中编写Access代码了,但我相信有一种方法可以实现您的目标。也许发布更多关于您特定数据结构的详细信息,我们都可以跳进来提供指针!


我相信你是完全正确的,我也考虑过这个问题。我可以像你说的那样,在数据库表中添加一个“学期”列,并用“fall”标记秋季学期,“spring”标记春季学期。然后,我只需要基本上合并表格并更新所有查询/表单等,以添加感兴趣的学期值即可。但是,我需要手动更改成百上千个查询和表单,这是非常麻烦的。我希望有一种解决方法。 - user542485
应该强烈建议合并 - Tony Toews
咬紧牙关,做好工作。事情将会更加高效,用户会喜欢节省下来的时间。 - Tony Toews

1

这是一个我多年来使用过很多次的表链接函数。为了使用它,您需要提供一些函数:

  1. ThisTableShouldBeChanged将传递表名并返回true,如果应将表的链接作为数据库切换的一部分重新链接。这将允许您选择性地排除表格。
  2. GetConnectionString应返回新连接字符串的名称。构建到另一个Access数据库的连接字符串很简单,只需将完整的数据库路径放入此格式中:“;DATABASE=path”

要做你想要的事情,你只需要在用户选择打开新数据库时运行此函数。一个忠告:我会在UI中放置一个不可混淆的元素,或者例如屏幕的背景颜色,以向用户发出哪个数据库他们正在处理的信号,以便没有混淆。

此功能还可用于将表格链接到部署生产环境时的ODBC或SQL Server连接。这就是我通常使用它的方式。

Public Function LinkTables() As Boolean
On Error GoTo HandleError

    Dim tdf As TableDef
    Dim tdfNew As TableDef
    Dim strName As String
    Dim tdfs As TableDefs
    Dim strSource As String
    Dim strConnect As String

    Dim blnThrowErr As Boolean

    Dim arr() As Variant

    Set tdfs = CurrentDb.TableDefs

    Dim intCount As Integer
    Dim i As Integer

    intCount = tdfs.Count

    strConnect = GetConnectionString()

    i = 1

    'Save a copy of the existing table names'
    ReDim arr(tdfs.Count, 2)
    For Each tdf In tdfs
        strName = tdf.Name

        If ThisTableShouldBeChanged(strName) Then
            If tdf.Connect <> "" Then

                strSource = tdf.SourceTableName

                arr(i, 1) = strName
                arr(i, 2) = strSource
                i = i + 1
            End If
        End If
    Next tdf

    tdfs.Refresh

    Dim strNameRep As String

    'Create new linked tables'
    For i = 1 To UBound(arr)

        If arr(i, 1) <> "" Then

            Set tdfNew = New TableDef

            strName = arr(i, 1)

            tdfNew.Name = arr(i, 1)
            tdfNew.SourceTableName = arr(i, 2)
            tdfNew.Connect = strConnect

            strNameRep = strName & "_temp"

            'rename the old table'
            tdfs(strName).Name = strNameRep

            tdfs.Refresh

            tdfs.Append tdfNew

            If Err.Number <> 0 Then

                Debug.Print Err.Description
                 tdfs(strNameRep).Name = strName

                Err.Clear
            Else
                tdfs.Delete strNameRep
            End If

            On Error GoTo HandleError

        End If
    Next i

    tdfs.Refresh
    LinkTables = True

ExitHere:
    Exit Function
HandleError:
    MsgBox Err.Description & " (" & Err.Number & ")"

    LinkTables = False
    Resume ExitHere
End Function

0

我认为可以针对每个表使用原始表名创建查询,并使用一个或两个额外的字母命名新的组合表。比如说,如果你有一个名为“学生”的表,那么新表将变成“联合学生”,并且你可以创建一个名为“学生”的查询:

SELECT F1, F2, F3 FROM JointStudents WHERE Semester=Forms!PickSem!txtSemester

这意味着任何引用表格“学生”的表单或查询现在都将使用内置过滤器来获取“学生”查询。


0
一个成本最小化的解决方案是设置一个接口链接到适当的学期,但仍需要修改所有表单并添加另一个(用于“活动”数据库的用户友好控制),而且如果需要后续更改,仍会产生额外的成本(因为更改将发生在两个地方而不是一个)。
您不必手动更改表格:您可以编写 SQL 来完成。可以编写一个过程来遍历现有表格并添加“学期”列并填充它…最好在两个数据库中运行,以便您还可以在同一过程中填充列。如果两个数据库中的表格名称相同,则甚至可以运行一个过程来遍历它们所有,更新秋季、更新春季,并将春季附加到秋季中,以便您在一个数据库中拥有所有内容。
更安全的方法可能是将秋季结构复制到新表格并修改该表格,以防万一发生了什么事情,您需要“回退”所做的操作。
考虑到这个问题是几个月前提出的,而且你正在与一所学校合作,你可能已经以某种方式解决了这个问题或不得不把它放在一边,但如果仍然需要,我可以发布应该有帮助的 VBA。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接