Newsgroup: it.comp.appl.access
Titolo: Tabelle collegqate da VBA

SAlve,
vorrei gestire le Tabelle collegate tramite VBA, in questo modo posso 
cambiare senza troppi click, le tabelle collegate di un DB di Produzione con 
quello di TEST o fare altre cose al VOLO.
Avete qualche link da suggerirmi , per adesso non ho trovato molto di ben 
fatto o almeno spiegato bene.
Grazie mille. 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4924 (20100308) __________
Il messaggio � stato controllato da ESET NOD32 Antivirus.
www.nod32.it


Non so se ti ho risposto ma perdonami se l'ho gi� fatto.
Il 3d "Tabelle ODBC Collegate" spazia un po'.
Ciao
Daniele


Capisco che l'argomento sia vasto , ma non c'� un modo semplice per linkare 
al volo delle tabelle di un DB invece di un altro ?
Cambia solo il riferimento al DB.
Se hai qualche link da passare...
Comunque grazie.
Saluti
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4927 (20100309) __________



Perch� non cambi la connessione ODBC al volo cambiando il database da 
quello di produzione a quello di test?
Oppure ti cambi la stringa di connessione e modifichi solo 
l'informazione del db.
Cmq io terrei DUE connessioni diverse e due mdb per sicurezza... se 
lanci una delete in produzione pensando che sia quelle di test.... non 
oso immaginare
Ciao
Daniele

 
www.nod32.it
Io uso delle sub che mi sono fatto,
vedi se ti possono essere utili.
La stringa di connessione (strConn) dipende dall'ODBC a cui ti
colleghi
(puoi collegare una tabella a mano e poi vedere in struttura ->
visualizza -> proprietà)
1.
Public Function CollegaTabella(strConn As String, strTbOrig As String,
strTBDest As String)
Dim tdfTbOrig As TableDef
Set tdfTbOrig = CurrentDb.CreateTableDef(strTBDest)
tdfTbOrig.Attributes = dbAttachSavePWD
tdfTbOrig.Connect = strConn
tdfTbOrig.SourceTableName = strTbOrig
CurrentDb.TableDefs.Append tdfTbOrig
End Function
2.
Public Function ScollegaTabella(strTBDest As String)
CurrentDb.TableDefs.Delete (strTBDest)
End Function
3.
Public Function ScollegaLeTabelle()
Dim rstScratch As Recordset
Set rstScratch = CurrentDb.OpenRecordset("SELECT MSysObjects.Connect,
MSysObjects.Name" _
    & " FROM MSysObjects" _
    & " WHERE (((MSysObjects.Connect) Is Not Null))")
If rstScratch.RecordCount > 0 Then
    rstScratch.MoveFirst
    Do While Not rstScratch.EOF
        Call ScollegaTabella(rstScratch!Name)
        rstScratch.MoveNext
    Loop
End If
End Function
per sintesi ho eliminato la gestione degli errori
Dovrebbe essere quello che ti serve
HTH, mpio.

 
www.nod32.it
Io uso delle sub che mi sono fatto,
vedi se ti possono essere utili.
La stringa di connessione (strConn) dipende dall'ODBC a cui ti
colleghi
(puoi collegare una tabella a mano e poi vedere in struttura ->
visualizza -> propriet�)

Dim tdfTbOrig As TableDef

End Function

CurrentDb.TableDefs.Delete (strTBDest)
End Function
3.
Public Function ScollegaLeTabelle()
Dim rstScratch As Recordset

End Function


___
E se dopo aver cancella la tabelle per qualsiasi motivo si interrompe il 
codice?
come hai l'elenco delle tabelle dal sysobject?
Usa una tab di elenco delle tabelle

 Grazie mille.
Fatti una tabella nel BE o Server con l'elenco delle Tabelle da
Linkare.
Apri una connessione al Database accedi alla tabella Elenco ed inizia
a ciclare
i Record tentando di connettere le Tabelle con Nome recuperato dal
Recordset.
Chiudi la connessione e le tabelle sono collegate... GESTIONE ERRORI
prima di tutto.
Ricorda di rimuovere i collegamenti alla chiusura.
@Alex

 si interrompe il codice
Da quello che ho capito deve lavorare alternativamente su delle
tabelle oppure altre,
dopo aver connesso la tabella bisogna fare adeguati controlli prima di
proseguire con il codice,
non conosco l'applicazione, per questo credo che ne sappia di più
Pisinho.
Ovviamente serve anche la gestione degli errori, come dice Alex@,
io l'ho eliminata per il post, ma deve essere fatta.
Inoltre è da seguire l'altro consiglio di Alex@ di fare una tabella
con l'elenco,
ho i BE salvati sempre senza connessioni,
le faccio sempre all'avvio dell'applicazione.
Io uso una tabella sul server che come campi ha nome applicazione,
tabella da linkare, stringa di connessione
se Pisinho preferisce può anche aggiungere una flag per il link in
fase di test.
Comunque il mio intervento si limitava a dare un'indicazione su come
sonnettersi/sconnettersi.
Spero di essere stato utile.
Saluti, mpio.
NOTA a margine: leggendo quello che ho riportato è più bello se si
sostituisce tdfTbOrig con tdfTb


Grazie a tutti, ma a parte che non c'ho capito niente come devo procedere 
con il codice....
Mi manca un esempio semplice di una tabella con lo stesso nome su due 
databases diversi, stesso server.
L'uso di questi cambiamenti al volo come ho spiegato � solo per utilizzare 
in fase di Sviluppo del codice, il Databases di TEST,
quando rilascio il software, modifico solo una variabile e all'apertura 
dell'applicazione vengono linkate le tabelle di produzione.
Di sicuro � banale e si pu� fare ma non ho codice diciamo di semplice 
lettura per capire come operare sulle tabelle.
Grazie comunque a tutti. 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4931 (20100310) __________


 
www.nod32.it
Ci riprovo con un esempio per una tabella,
prova e fai sapere se ti riesce il tutto.
Se funzia, poi è più performante il discorso di tenere l'archivio
delle tabelle da linkare (e delle stringhe di connessione)
in una tabella e non nel codice.
Allora:
inserisci in un modulo queste tre funzioni:
Public Function EsisteTabella(NomeTabella As String) As Boolean
On Error GoTo Err_Handler
Dim dbsTb As Database
Dim tdfTb As TableDef
Dim intTab As Integer
Set dbsTb = CurrentDb
For Each tdfTb In dbsTb.TableDefs
    If tdfTb.Name = NomeTabella Then
        EsisteTabella = True
    End If
Next tdfTb
Exit_Handler:
    Exit Function
Err_Handler:
    MsgBox Err.Number & Chr(10) & Err.Description & Chr(10) &
"Contattare Pisinho"
    Resume Exit_Handler
End Function
Public Function CollegaTabella(strConn As String, strTbOrig As String,
strTBDest As String)
On Error GoTo Err_Handler
Dim tdfTb As TableDef
Set tdfTb = CurrentDb.CreateTableDef(strTBDest)
tdfTb.Attributes = dbAttachSavePWD
tdfTb.Connect = strConn
tdfTb.SourceTableName = strTbOrig
CurrentDb.TableDefs.Append tdfTb
Exit_Handler:
    Exit Function
Err_Handler:
    MsgBox Err.Number & Chr(10) & Err.Description & Chr(10) &
"Contattare Pisinho"
    Resume Exit_Handler
End Function
Public Function ScollegaTabella(strTBDest As String)
On Error GoTo Err_Handler
CurrentDb.TableDefs.Delete (strTBDest)
Exit_Handler:
    Exit Function
Err_Handler:
    MsgBox Err.Number & Chr(10) & Err.Description & Chr(10) &
"Contattare Pisinho"
    Resume Exit_Handler
End Function
poi, sull'evento click del pulsante per il test (o altro a tuo
piacere) per il test:
if EsisteTabella("NomeTuaTabella") Then
   ScollegaTabella("NomeTuaTabella")
end if
strConn =
"ODBC;DSN=NomeDSN;UID=NomeUtente;PWD=password;DATABASE=DBTEST"
CollegaTabella(strConn , "NomeTuaTabella", "NomeTuaTabella")
poi, all'avvvio della tua applicazione rilasciata (se preferisci con
altro evento):
if EsisteTabella("NomeTuaTabella") Then
   ScollegaTabella("NomeTuaTabella")
end if
strConn =
"ODBC;DSN=NomeDSN;UID=NomeUtente;PWD=password;DATABASE=DBWORK"
CollegaTabella(strConn , "NomeTuaTabella", "NomeTuaTabella")
come vedi cambia solamente il database.
puoi avere anche tabelle con nomi diversi (ma stessa struttura)
se così devi dare valori appropiati a strTbOrig e strTBDest
ricordati che devi costruirti un sistema sicuro per sapere dove stai
lavorando e non far confusione nei dati
HTH, mpio.


IMHO Volendo separare il testing dalla produzione, terrei separate le 
due connessioni non con il codice ma definendola proprio da 
amministrazione odbc.
In pi� per ribadire la differenza utilizzare come rafforzativo nomi di 
tabella con un prefisso del tipo TEST e poi creerei un utente apposito 
per il testing.
COn la switching delle connessioni sono alti i rischi.
Non ce la faccio devo dirtelo. Con le qpt puoi ribadire il concetto con 
"SELECT * FROM DBTesting.MyTable" lasciando inttatta la connessione 
(initial catalogue magari di default su DBTesting non si sa mai). A 
ridaie con le qpt. ;-)
Ciao