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.
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) __________
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.
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
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) __________
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