Ricollegare tabelle con VBA

domenica 12 giugno 2011 - 20.35
Tag Elenco Tags  Access (.mdb)  |  Office 2003

renarig Profilo | Expert

Saluti a tutti
Ho una domanda che per me è difficile, cerco di esemplificare il problema.
___________________________________________________________________________________
Ho una applicazione costruita con Access2003 le cui tabelle
sono "COLLEGATE" a un DB di SQLServer che si trova in rete nel tramite ODBC

La stringa di connessione di una qualunque tabella è:
ODBC;DRIVER=SQL Server;SERVER=SerA;UID=sa;APP=Microsoft Office 2003;WSID=PCIOOR;DATABASE=Ar03A;LANGUAGE=Italiano;TABLE=dbo.Co

___________________________________________________________________________________________________________________________________

Devo generare un secondo DB identico ( nella struttura ma non nei dati contenuti )
posizionato in un secondo server ma devo mantenere la stessa applicazione gestionale
da utilizzare alternativamente sui 2 DB

per cui la stringa di connessione deve diventare:
ODBC;DRIVER=SQL Server;SERVER=SerB;UID=sa;APP=Microsoft Office 2003;WSID=PCIOOR;DATABASE=Ar03B;LANGUAGE=Italiano;TABLE=dbo.Co
___________________________________________________________________________________________________________________________________

In parole semplici il server cambia da "SerA" a "SerB"
mentre il DB cambia da "Ar03A" a "Ar03B"
( La pass di sql nei 2 server è identica )
____________________________________________________________________________________________________________________________

Devo ( ma non riesco ) creare una semplice riga di codice VBA
che si attivi manualmente con un pulsante su mascherina specifica
e che mi corregga le suddette stringhe ODBC im funzione della scelta dell'utente


è una cosa possibile?
Vorrei un esempio

Grazie

micto27 Profilo | Senior Member

ciao,
io avevo una situazione analoga (anche se nel mio caso il link era verso un altro mdb, anziche SQL Server,
credo però cambi poco.

Io avevo scritto il seguente metodo per spostare i link ai dati da un database ad un altro,
prova a vedere si ti può andar bene.

Michele

Public Sub RefreshLink(ByVal currdb As String, ByVal newdb As String) Dim db As Database Dim tbl As TableDef, tb1 As TableDef Dim connstr As String Dim wks As Workspace DoCmd.Beep Trace "RefreshLink" Set wks = DBEngine.Workspaces(0) 'Set db = wks.OpenDatabase(currdb) ' , , , "PWD=xxxxxxxx") connstr = ";DATABASE=" & newdb For Each tbl In CurrentDb.TableDefs If tbl.Connect <> "" Then On Error Resume Next CurrentDb.TableDefs.Delete tbl.Name On Error GoTo 0 Set tb1 = CurrentDb.CreateTableDef(tbl.Name) tb1.Connect = connstr tb1.SourceTableName = tbl.Name CurrentDb.TableDefs.Append tb1 End If Next tbl DoCmd.Beep End Sub

renarig Profilo | Expert

Ti ringrazio per la risposta certamente funziona ma non e quello che cercavo
( colpa mia per la domanda mal esposta )

________________________________________________________________________________________

Noto che mi hai inserito anche il ciclo " For Each / Next " e per conseguenza
hai omesso il riferimento alla tabella dbo.Co



La mia esigenza invece ( scusa se non ho detto tutto all'inizio ) e di ricollegare
solo 9 delle 35 tabelle complessive in quanto le altre 26 sono
gia " felicemente " ben collegate in modo continuo ad altri DB



Per cui di quella funzione che mi hai scritto ho bisogno di estrarre
(e io non ne sarei capace ) solo la parte che si occupa di
ricollegare una singola tabella ( dbo.Co )

che poi andrei a ricopiare per 9 volte senza cicli For Each / Next

Grazie

micto27 Profilo | Senior Member

>Ti ringrazio per la risposta certamente funziona ma non e quello
>che cercavo
>( colpa mia per la domanda mal esposta )
>
>________________________________________________________________________________________
>
>Noto che mi hai inserito anche il ciclo " For Each / Next "
>e per conseguenza
>hai omesso il riferimento alla tabella dbo.Co
>
>
>
>La mia esigenza invece ( scusa se non ho detto tutto all'inizio
>) e di ricollegare
>solo 9 delle 35 tabelle complessive in quanto le altre 26 sono
>gia " felicemente " ben collegate in modo continuo ad altri DB
>

il ciclo For Each scorre l'elenco delle tabelle presenti

il test "If tbl.Connect <> "" Then" serve per distinguere se si tratta di una tabella collegata (a memoria credo che la proprietà
tbl.Connect contenga la stringa di connessione).

quindi, se ho capito, potresti lasciare così il ciclo arricchendo il test andando a valutare i nomi delle sole tabelle che ti serve "spostare".

es.
If tbl.Connect <> "" and (tbl.Name = "aaaa" Or tbl.Name = "bbb" Or ....)

oppure forse, potresti valutare il contenuto di "tbl.Connect" (nel caso ad esempio tu avessi tabelle collegate su database diversi e ti servisse
spostare solo quelle di uno di questi).

Per vedere il contenuto della stringa di connessione attualmente presente potresti, per curiosità, fare così:

imposti l'opzione (se non lo fosse già) per vedere anche le tabelle di sistema

a questo punto fra le tabelle dovresti trovare una tabella sysobjects o msysobjects (non ricordo bene)

in tale tabella, se la apri, le righe corrispondenti alle tabelle collegate presentano in una colonna la stringa di connessione utilizzata.



Hai valutato anche l'idea di collegare le tabelle in questione mediante ODBC?
In questo caso i collegamenti rimarrebbero sempre immutati, semplicemente agiresti sul "datasource" ODBC
che gestirebbe su che database andare a prendere i dati di tali tabelle.

Ciao, Michele
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5