Объединение двух баз данных Microsoft Access в одну с формой на выбор между ними - PullRequest
3 голосов
/ 14 декабря 2010

Так что мне поручили работать над двумя одинаковыми базами данных, которые очень плохо сделаны.Обе они разделены на внешние и внутренние части, но у них разные данные.

Можно ли объединить обе базы данных в одну и создать форму, позволяющую пользователю выбирать, с какой "базой данных" они будут взаимодействовать?

Чтобы уточнить, школа, которая использует эти базы данных, имеет базу данных для осеннего семестра и весеннего семестра.Оба содержат одинаковые формы / запросы / таблицы, но конкретные данные различаются.Например, может быть, учитель преподает 3 класса осенью, но 4 класса весной (хотя база данных намного сложнее, чем эта).Структура данных остается прежней, но конкретные данные изменяются в зависимости от базы данных.

Таким образом, если им требуется доступ к данным, им необходимо открыть соответствующую базу данных.В результате они постоянно открывают / закрывают разные базы данных.То, что они хотят сделать, это иметь возможность просто использовать одну базу данных и переключаться между Fall / Spring.

Возможно ли это вообще?

Ответы [ 4 ]

1 голос
/ 17 декабря 2010

Вот функция связывания таблиц, которую я использовал много раз за эти годы.Чтобы использовать это, вам нужно будет предоставить несколько функций:

  1. ThisTableShouldBeChanged передается имя таблицы и возвращает true, если ссылка на таблицу должна быть повторно связана как частьпереключателя базы данных.Это позволит вам выборочно исключать таблицы из коммутатора.
  2. GetConnectionString должен возвращать имя новой строки подключения.Построить строку подключения к другой базе данных Access просто, просто введите полный путь к базе данных в следующем формате: "; DATABASE = путь"

Чтобы сделать то, что вы хотите, вам просто нужно запуститьфункция, когда пользователь выбирает новую базу данных для открытия.Один совет: я бы поместил в пользовательский интерфейс безошибочный элемент или, например, цвет фона экранов, который будет сигнализировать пользователю о том, над какой базой данных он работает, чтобы не было путаницы.также может использоваться для связи таблиц с подключением 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
1 голос
/ 14 декабря 2010

Не зная точной структуры ваших данных, сложно дать конкретные ответы, но мое интуитивное чувство, безусловно, состоит в том, что эти две базы данных можно объединить.Объедините все данные в таблицах с одинаковыми именами, но добавьте столбец «Семестр» к любой таблице, что приведет к дублированию данных.Затем просто создайте интерфейс приложения, чтобы при необходимости пользователь выбирал семестр, который он хочет просмотреть, и передавал его в ваши запросы для получения данных.Вы могли бы даже нести значение «Семестр» с самого начала, как вы указали, и передавать его с экрана на экран (с глобальной переменной уровня приложения).писать код в Access в моей профессиональной жизни, но я уверен, что есть способ достичь вашей цели.Возможно, опубликуйте более подробную информацию о вашей конкретной структуре данных, и мы все можем перейти и дать указатели!

0 голосов
/ 05 апреля 2011

Решение с наименьшими начальными затратами, настройка интерфейса для связи с соответствующим семестром, все еще будет включать в себя касание всех форм и добавление другой (для удобного управления «активной» БД), и вы Вы все равно будете нести дополнительную плату за любые изменения, необходимые в будущем (так как они будут сделаны в двух местах, а не в одном).

Вам не нужно менять таблицы вручную: вы можете написать SQL для этого. Можно написать процедуру, которая просматривает существующие таблицы, добавляет столбец «Семестр» и заполняет его ... лучше всего запускать его в обеих базах данных, чтобы вы также могли заполнять столбцы в одной и той же процедуре. Если таблицы названы одинаково в обеих базах данных, можно было бы даже запустить процедуру, которая пошагово пройдет через все из них, обновив Fall, обновив Spring и добавив Spring в Fall, чтобы у вас было все в одной базе данных.

Более безопасный метод, вероятно, состоит в том, чтобы скопировать структуру Fall в новую таблицу и изменить эту таблицу на случай, если что-то произойдет, и вам нужно "откатить" то, что вы сделали.

Учитывая, что этот вопрос был задан несколько месяцев назад, и вы работаете со школой, вы, вероятно, либо решили проблему каким-то образом, либо вынуждены были отложить ее в сторону, но если она все еще нужна, я могу опубликовать VBA это должно помочь.

0 голосов
/ 15 декабря 2010

Я думаю, что должно быть возможно создать запросы для каждой из таблиц с исходным именем таблицы и назвать новые, комбинированные таблицы дополнительной или двумя буквами.Допустим, у вас есть таблица учеников, новая таблица становится JointStudents, и вы создаете запрос учеников:

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

Это означает, что любая форма или запрос, относящийся к таблице учеников, теперь получит запрос учеников.со встроенным фильтром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...