Database 将两个Microsoft Access数据库合并为一个数据库,并使用表单在其中进行选择

Database 将两个Microsoft Access数据库合并为一个数据库,并使用表单在其中进行选择,database,ms-access,Database,Ms Access,所以我被分配去处理两个相同的数据库,它们的制作非常糟糕。两者都分为前端/后端,但具有不同的数据 是否可以将两个数据库合并为一个,并创建一个表单,以允许用户选择与哪个“数据库”交互 为了澄清,使用这些数据库的学校有秋季学期和春季学期的数据库。两者包含完全相同的表单/查询/表,但具体数据不同。e、 也许一个老师在秋天教3节课,但在春天教4节课(尽管数据库比这个复杂得多)。数据的结构保持不变,但具体数据会根据数据库的不同而变化 因此,如果他们需要访问数据,他们需要打开相应的数据库。因此,他们不断地打开

所以我被分配去处理两个相同的数据库,它们的制作非常糟糕。两者都分为前端/后端,但具有不同的数据

是否可以将两个数据库合并为一个,并创建一个表单,以允许用户选择与哪个“数据库”交互

为了澄清,使用这些数据库的学校有秋季学期和春季学期的数据库。两者包含完全相同的表单/查询/表,但具体数据不同。e、 也许一个老师在秋天教3节课,但在春天教4节课(尽管数据库比这个复杂得多)。数据的结构保持不变,但具体数据会根据数据库的不同而变化

因此,如果他们需要访问数据,他们需要打开相应的数据库。因此,他们不断地打开/关闭不同的数据库。他们想要做的是能够只使用一个数据库并在秋季/春季之间切换


这有可能吗

在不知道数据的确切结构的情况下,很难给出具体的答案,但我的直觉是这两个数据库可以结合起来。合并同名表中的所有数据,但在任何会产生重复数据的表中添加“Serm”列。然后,只需创建应用程序前端,以便用户在必要时选择要查看的学期,并将其传递给检索数据的查询。正如您所指出的,您甚至可以从一开始就携带“学期”值,并将其从一个屏幕传递到另一个屏幕(带有全局应用程序级别变量)


在我的职业生涯中,我已经有一段时间没有在Access中编写代码了,但我相信有一种方法可以实现您的目标。也许可以发布更多关于您的特定数据结构的详细信息,我们都可以加入并给出一些建议

我认为应该可以使用原始表名为每个表创建查询,并使用额外的一两个字母为新的组合表命名。假设您有一个表Students,新表成为JointStudents,您创建了一个查询Students:

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

这意味着任何引用表Students的表单或查询现在都将使用内置的过滤器接收查询Students。

这是我多年来多次使用的表链接函数。为了使用它,您必须提供两个函数:

  • ThisTableShouldBeChanged被传递一个表的名称,如果指向该表的链接应该作为数据库开关的一部分重新链接,则返回true。这将允许您有选择地从交换机中排除表
  • 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
    
    Public函数LinkTables()作为布尔值
    关于错误转到HandleError
    将tdf调暗为TableDef
    将tdfNew变暗为TableDef
    将strName设置为字符串
    将tdfs变暗为TableDefs
    作为字符串的Dim strSource
    作为字符串的Dim strConnect
    Dim blnThrowErr作为布尔值
    Dim arr()作为变量
    设置tdfs=CurrentDb.TableDefs
    Dim intCount为整数
    作为整数的Dim i
    intCount=tdfs.Count
    strConnect=GetConnectionString()
    i=1
    '保存现有表名的副本'
    ReDim arr(tdfs.Count,2)
    对于tdfs中的每个tdf
    strName=tdf.Name
    如果该表需要更改(strName),则
    如果tdf.Connect为“”,则
    strSource=tdf.SourceTableName
    arr(i,1)=strName
    arr(i,2)=strSource
    i=i+1
    如果结束
    如果结束
    下一个tdf
    刷新
    作为字符串的Dim strNameRep
    “创建新的链接表”
    对于i=1至UBound(arr)
    如果arr(i,1)“,则
    设置tdfNew=新表格定义
    strName=arr(i,1)
    tdfNew.Name=arr(i,1)
    tdfNew.SourceTableName=arr(i,2)
    tdfNew.Connect=strConnect
    strNameep=strName&“临时”
    '重命名旧表'
    tdfs(strName).Name=strNameRep
    刷新
    追加tdfNew
    如果错误号为0,则
    调试.打印错误说明
    tdfs(strNameRep).Name=strName
    呃,明白了
    其他的
    删除strNameRep
    如果结束
    关于错误转到HandleError
    如果结束
    接下来我
    刷新
    LinkTables=True
    出口:
    退出功能
    手柄错误:
    MsgBox错误说明(“&Err.Number&”)
    LinkTables=False
    继续离开那里
    端函数
    
    一个初始成本最低的解决方案,即设置一个接口链接到适当的学期,仍然需要触摸所有表单并添加另一个表单(用于用户友好地控制“活动”数据库),并且您仍然需要为今后所需的任何更改承担额外成本(因为它们将在两个地方而不是一个地方制作)

    您不必手动更改表:您可以编写SQL来完成此操作。您可以编写一个过程,逐步遍历现有表,添加一个“学期”列并填充它…最好在两个数据库中运行它,以便您也可以填充同一过程中的列。如果两个数据库中的表名称相同