2010-12-14 6 views
3

So wurde ich beauftragt, auf zwei identische Datenbanken zu arbeiten, die sehr schlecht gemacht werden. Beide sind in Front-/Back-End aufgeteilt, haben aber unterschiedliche Daten.Kombinieren von zwei Microsoft Access-Datenbanken in eine mit einem Formular, um zwischen ihnen zu wählen

Ist es möglich, beide Datenbanken zu einem zusammenzufassen und ein Formular zu erstellen, damit der Benutzer auswählen kann, mit welcher "Datenbank" er interagieren soll?

Um zu klären, hat die Schule, die diese Datenbanken verwendet, eine Datenbank für das Herbstsemester und das Frühlingssemester. Beide enthalten genau die gleichen Formulare/Abfragen/Tabellen, aber die spezifischen Daten unterscheiden sich. z.B. Vielleicht unterrichtet ein Lehrer 3 Klassen im Herbst, aber 4 Klassen im Frühling (die Datenbank ist jedoch viel komplizierter als dies). Die Struktur der Daten bleibt gleich, aber die spezifischen Daten ändern sich abhängig von der Datenbank.

Wenn sie also auf Daten zugreifen müssen, müssen sie die entsprechende Datenbank öffnen. Daher öffnen/schließen sie ständig verschiedene Datenbanken. Was sie tun wollen, ist in der Lage, nur eine Datenbank zu verwenden und zwischen Herbst/Frühling zu wechseln.

Ist das überhaupt möglich?

Antwort

1

Ohne die genaue Struktur Ihrer Daten zu kennen, ist es schwierig, spezifische Antworten zu geben, aber mein Bauchgefühl ist definitiv, dass diese beiden Datenbanken kombiniert werden könnten. Kombinieren Sie alle Daten in Tabellen mit demselben Namen, fügen Sie jedoch eine Spalte "Semester" zu jeder Tabelle hinzu, die doppelte Daten ergeben würde. Dann erstellen Sie einfach das Anwendungs-Frontend, so dass der Benutzer das gewünschte Semester auswählen und an Ihre Abfragen übergeben kann, um die Daten abzurufen. Sie könnten sogar den Wert "Semester" von Anfang an tragen, während Sie darauf hinweisen, und ihn von Bildschirm zu Bildschirm übergeben (mit einer globalen Variable auf Anwendungsebene).

Es ist schon eine Weile her, dass ich Access in meinem Berufsleben programmieren musste, aber ich bin mir sicher, dass es einen Weg gibt, Ihr Ziel zu erreichen. Vielleicht posten Sie mehr Details Ihrer spezifischen Datenstruktur, und wir können alle einspringen und Hinweise geben!

+0

Ich glaube, Sie sind absolut richtig und ich habe darüber nachgedacht. Ich könnte, wie Sie gesagt haben, eine Spalte "Semester" zu den Datenbanktabellen hinzufügen und das Herbstsemester mit "Herbst" und das Frühlingssemester mit "Frühling" kennzeichnen. Dann könnte ich einfach die Tabellen zusammenführen und alle meine Abfragen/Formulare/etc aktualisieren, um den Semesterwert von Interesse hinzuzufügen. Allerdings gibt es buchstäblich Hunderte von Abfragen und Formulare, die ich von Hand ändern müsste, um dies zu tun. Ich hatte auf einen Workaround gehofft. – user542485

+0

"könnte kombiniert werden" sollte "dringend aufgefordert werden, zu kombinieren" –

+0

Beißen Sie die Kugel. Mach die Arbeit. Die Dinge werden für die Nutzer so viel effizienter sein, dass sie die Zeit, die sie sparen, lieben werden. –

0

Ich denke, es sollte möglich sein, Abfragen für jede der Tabellen mit dem ursprünglichen Tabellennamen zu erstellen und die neuen kombinierten Tabellen mit einem oder zwei zusätzlichen Buchstaben zu benennen. Lassen Sie uns sagen, dass Sie einen Tisch Studenten haben, wird die neue Tabelle JointStudents und Sie erstellen eine Abfrage Studenten:

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

Das bedeutet, dass jede Form oder Abfrage, die die Abfrage Studenten mit den Pick-up wird nun auf die Tabelle Students bezieht eingebauter Filter

1

Hier ist eine Tabelle Verknüpfung Funktion, die ich im Laufe der Jahre oft verwendet habe. Um dies zu nutzen, werden Sie ein paar Funktionen bereitstellen müssen:

  1. ThisTableShouldBeChanged den Namen einer Tabelle geführt wird und gibt true zurück, wenn der Link auf die Tabelle sollte als Teil der Datenbank neu verknüpft werden Schalter. Dadurch können Sie selektiv Tabellen vom Switch ausschließen.
  2. GetConnectionString sollte den Namen der neuen Verbindungszeichenfolge zurückgeben. eine Verbindungszeichenfolge zu einem anderen Access-Datenbank Constructing ist einfach, einfach den vollständigen Datenbankpfad in dieses Format: „; DATABASE = path“

Um was Sie tun möchten, müssen Sie nur noch diese Funktion starten, wenn die Benutzer wählt eine neue Datenbank zum Öffnen. Ein Ratschlag: Ich würde ein unmissverständliches Element in die Benutzeroberfläche einfügen oder beispielsweise die Hintergrundfarbe der Bildschirme, die dem Benutzer signalisieren, an welcher Datenbank er arbeitet, so dass es keine Verwirrung gibt.

Diese Funktion kann auch zum Verknüpfen von Tabellen mit einer ODBC- oder SQL Server-Verbindung beim Implementieren in einer Produktionsumgebung verwendet werden. Dafür benutze ich es normalerweise.

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

A am wenigsten Anfangs kostengünstige Lösung, eine Schnittstelle der Einrichtung zum entsprechenden Semester zu verbinden, geht noch beinhaltet alle Formen berühren und das Hinzufügen von anderen (für benutzerfreundliche Steuerung des „aktiven“ db), und Sie werden immer noch zusätzliche Kosten für irgendwelche Änderungen im Laufe der Straße entstehen (wie sie an zwei Orten statt einer gemacht werden).

Sie müssen die Tabellen nicht manuell ändern: Sie können SQL schreiben, um es zu tun. Es ist möglich, eine Prozedur zu schreiben, die durch existierende Tabellen schreitet und eine "Semester" -Spalte hinzufügt und auffüllt ... am besten, um sie in beiden Datenbanken auszuführen, so dass Sie die Spalten auch in derselben Prozedur füllen können. Wenn die Tabellen in beiden Datenbanken gleich benannt sind, ist es sogar möglich, eine Prozedur auszuführen, die alle Schritte durchläuft, Fall aktualisiert, Spring aktualisiert und Spring to Fall anfügt, sodass alles in einer Datenbank vorhanden ist.

Eine sicherere Methode wäre wahrscheinlich, die Fall-Struktur in eine neue Tabelle zu kopieren und diese Tabelle zu modifizieren, falls etwas passiert und Sie "zurückrollen" müssen, was Sie getan haben.

Vorausgesetzt, dass diese Frage vor Monaten gestellt wurde und Sie mit einer Schule arbeiten, haben Sie wahrscheinlich entweder das Problem gelöst oder mussten es beiseite legen, aber wenn es noch einen Bedarf gibt, kann ich posten VBA, die helfen sollte.

Verwandte Themen