Hallo liebe Gemeinde
Folgende Situation :
MS Access DB als Frontend und eine MSSQL Datenbank als Backend mit Linked Tables.
Das funktioniert alles bestens
Das die bestehenden Tabellen Links automatisch beim Start aktualisiert werden habe ich mit einem kleinen VB Script hinbekommen.
Frage 1
---------
Ist es auch möglich Tabellen die auf dem SQL Server neu erstellt wurden automatisch zu linken? bzw. Tabellen die nicht mehr existieren oder gelöscht wurden automatisch zu entfernen?
Frage 2 :
----------
Auch würde ich die Einstellungen wie SQL Server Name, User, Pw etc. in einer Config-Table hinterlegen... sollte der SQL Server mal ändern oder die Backend Instanz. Derzeit verbinde ich mich mit einer ODBC/DSN. komischerweise musste ich diese nur beim ersten rechner eingeben (File/Datei DSN) bei den weiteren Rechnern hat er den Pfad zum SQL Server selber gefunden.... woher auch immer.... ich nehme an das wird irgendwo in der FrontEnd DB hinterlegt.
Hat einer von euch GURU's eine Idee oder evt. ein kleines Beispiel? Oder ist das so wie ich mir das vorstelle gar nicht möglich?
Besten Dank bereits im Voraus
einen schönen Sonntag Abend
Grüsse aus der Schweiz
Andy
Zitat von: jecklan1 am März 04, 2018, 19:13:19Ist es auch möglich Tabellen die auf dem SQL Server neu erstellt wurden automatisch zu linken? bzw. Tabellen die nicht mehr existieren oder gelöscht wurden automatisch zu entfernen?
Prinzipiell ist das schon möglich.
Automatisch geht das natürlich nur über eigene Programmierung. Wenn du schon VBA-Code hast, um die Tabellen beim Start zu aktualisieren (was heißt das für dich genau?), dann solltest du die Kernfunktionalität bereits haben.
In der System-View
INFORMATION_SCHEMA.TABLES sind alle Tabellen der jeweiligen Datenbank auf dem SQL-Server aufgeführt. Du könntest also beim Start deiner Anwendungen eine Pass-Through-Abfrage auf diese View ausführen und alle SQL-Tabellen verknüpfen, die noch nicht in deine Access-Anwendung eingebunden sind. Analog löscht du jede lokal vorhandene SQL-Tabelle, die nicht mehr in
INFORMATION_SCHEMA.TABLES vorhanden ist.
Es stellt sich hier natürlich die Frage, ob dieses Vorgehen grundsätzlich sinnvoll ist. Tabellen stehen normalerweise ja nicht für sich allein, sondern es gibt Abfragen, Formulare und Berichte, die darauf aufbauen. Diese Abhängigkeiten entstehen durch deine Arbeit als Entwickler, so dass auch das Hinzufügen und Entfernen von verknüpften Tabellen eher als eine Teil der Entwicklungsarbeit zu sehen ist und somit der von dir gewünschte Automatismus bestenfalls als ein Entwickler-Tools zu sehen ist.
Zitat von: jecklan1 am März 04, 2018, 19:13:19Auch würde ich die Einstellungen wie SQL Server Name, User, Pw etc. in einer Config-Table hinterlegen... sollte der SQL Server mal ändern oder die Backend Instanz. Derzeit verbinde ich mich mit einer ODBC/DSN. komischerweise musste ich diese nur beim ersten rechner eingeben (File/Datei DSN) bei den weiteren Rechnern hat er den Pfad zum SQL Server selber gefunden.... woher auch immer.... ich nehme an das wird irgendwo in der FrontEnd DB hinterlegt.
Wenn du eine DSN für die ODBC-Verknüpfungen verwendest, werden die Detailinformationen
nicht in der Access-Datei gespeichert, sondern eben in der DSN. - Das ist ihr Zweck.
Wenn eine gleichnamige DSN auf jedem Rechner vorhanden ist, brauchst du aber nur einmalig die Tabellen einbinden und auf allen anderen Rechnern wird dann diese DSN für den Zugriff verwendet.
Du kannst aber die Tabellen auch ohne DSN-Verknüpfen, wenn du die wesentlichen Informationen, die sonst in der DSN stehen, direkt in dem Connection-String angibst. Dies erfordert dann die von dir bereits angedachte lokale Config-Tabelle.
Hallo Andy,
ich habe vor Jahren für das Problem eine handliche Lösung erarbeitet.
Damit können sogar Verknüpfungen zu verschiedenen Datenbanken erstellt werden.
Der einzige "Nachteil": die zu verknüpfenden Tabellen müssen in die Tabelle <connected> eingetragen werden. Ich habe testweise drei Access-Datenbanken verknüpft.
Formular <frmTabelleneinbindung> aufrufen.
In der obersten Liste sind die vorhandenen Verknüpfungen .
Ein Doppelklick auf einen Eintrag öffnet den Browser und eine andere Datenbank kann ausgewählt werden.
Dann auf <Datenbank verbinden> klicken.
Die Tabellen werden, sofern in dem Feld unter <Datenbank verbinden> nicht ,,zeige" eingegeben wurde, als Systemtabellen eingebunden.
Das Optionsfeld in der Mitte erlaubt die Tabellen via Odbc oder Access zu verknüpfen.
In der Regel lassen sich die Verknüpfungen auch während der Laufzeit der Anwendung verändern. Das ist praktisch wenn man mal eben was testen muss aber nicht mit den echten Daten arbeiten will.
Frithjof
Hi,
ich nutze ein SQL Server Backend und habe mir folgende Sub zusammengebaut, welche nicht nur die SQL Tabellen sondern auch die VIEWS (Abfragen) einbindet:
Public Sub TabellenVerknuepfen()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strSQL As String
Dim i As Integer
Dim z As Integer
z = 0
strSQL = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"
Set db = CurrentDb
For i = db.TableDefs.Count - 1 To 0 Step -1
Set tdf = db.TableDefs(i)
If Left(tdf.Connect, 4) = "ODBC" Then
db.TableDefs.Delete tdf.Name
End If
Next i
On Error Resume Next
db.QueryDefs.Delete "qryAlleTabellen"
db.QueryDefs.Delete "qryAlleAbfragen"
Set qdf = db.CreateQueryDef("qryAlleTabellen")
With qdf
.Connect = p_ODBCVerbZV
.sql = strSQL
.ReturnsRecords = True
Set rst = .OpenRecordset
End With
Do While Not rst.EOF
Set tdf = db.CreateTableDef(rst!TABLE_NAME, 0, rst!TABLE_NAME)
tdf.Connect = p_ODBCVerbZV
db.TableDefs.Append tdf
rst.MoveNext
Loop
Set qdf = db.CreateQueryDef("qryAlleAbfragen")
strSQL = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS"
With qdf
.Connect = p_ODBCVerbZV
.sql = strSQL
.ReturnsRecords = True
Set rst = .OpenRecordset
End With
Do While Not rst.EOF
Set tdf = db.CreateTableDef(rst!TABLE_NAME, 0, rst!TABLE_NAME)
tdf.Connect = p_ODBCVerbZV
db.TableDefs.Append tdf
rst.MoveNext
Loop
Application.RefreshDatabaseWindow
End Sub
Die Verbindungszeichenfolge wird über die öffentliche Variable p_ODBCVerbZV zugewiesen. Sie sieht wie folgt aus:
p_ODBCVerbZV = "ODBC;DRIVER={SQL Server Native Client 11.0};SERVER=SERVERIP;UID=BENUTZERNAME;PWD=PASSWORT;APP=SSMA;DATABASE=DATENBANKNAME;"
Beim Start meiner Datenbank lösche ich erstmal ALLE verknüpften Tabellen und Abfragen (Views):
Public Sub TabellenLöschen()
On Error Resume Next
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim i As Integer
Set db = CurrentDb
For i = 0 To db.TableDefs.Count
For Each tdf In db.TableDefs
If Left(tdf.Connect, 4) = "ODBC" Then
db.TableDefs.Delete tdf.Name
db.TableDefs.Refresh
End If
Next tdf
Next
End Sub
Danach binde ich alle Tabellen mit dem ersten Skript ein. Dabei werden alle Tabellen und Sichten des SQL Servers geladen und damit ja auch in Access aktualisiert - so wie Du es gewünscht hast.
LG
datekk.
Danke euch allen für die tollen Antworten
Ich habe es mit der Version von datekk gelöst und es funktioniert bestens!