Newsgroup: it.comp.appl.access
Titolo: Collegamenti ODBC: cambio del vnode di riferimento

Buongiorno a tutto il NG.
Ho un problema di questo tipo: un tot di applicazioni contengono
tabelle collegate via ODBC. Per questioni di organizzazione interna ora
devono puntare ad un differente virtual node. Siccome non ho voglia di
aprirle tutte, cancellare i collegamenti e ricollegare le tabelle al
nuovo vnode, pensavo di creare una query di aggiornamento che,
all'apertura del db, sostituisca nella tab MSysObjects, là dove la
trova, la parte di stringa "SERVER=Nome1" con "SERVER=Nome2": il resto
della stringa di connessione rimarrebbe uguale.
Prima di procedere e rischiare di rovinare tutto, mi piacerebbe
ricevere qualche consiglio e magari una riga di codice che mi possa
aiutare.
Grazie in anticipo.
chippo

chippo ha scritto:

... scusate, ho postato prima di verificare se posso aggiornare da
query la MSysObjects ...
... come potrei fare, diversamente? ...
Grazie ancora
chippo

 chippo
non potresti mai farlo... la MSyssObjects non è una Tab aggiornabile perchè 
è collegata olloggetto "Connect", per cui è bloccata...
potresti al massimo automaticcare la connessione delle tabelle ORBC... se ti 
può servire, ti dico come. 

 può servire, ti dico come.
Mi può servire sì, moltissime grazie.
Ciao e buona giornata
chippo

 può servire, ti dico come.
Mi può servire sì, moltissime grazie.
Ciao e buona giornata
chippo
_______________________________________________________________________
Risposta :
Creati una Form... apri la gestione codice della stessa e mettigli questo :
Private Const fForm = "Forms"
Private Const fReport = "Reports"
Private Const fMacro = "Scripts"
Private Const fModulo = "Modules"
Private Const fTabella = "Tables"
Private Const fQuery = "Queries"
' *********** Devi settare la connessione con i tuoi dati ***********
Private Const cCnnString As String = 
"ODBC;DSN=Tuo_Nome_Connessione;DRIVER={MySQL};SERVER=Tuo_Nome_Server;DATABASE=Tuo_Percorso;"
Private Const cLnkTbl As String = "_LinkedTables"
Private Function LinkODBCTbl() As Boolean
   On Error GoTo Err_RlnkODBCTbl
   Dim tdf As DAO.TableDef
   Dim rs As DAO.Recordset
   Dim S As String
   Dim strSQL As String
   LinkODBCTbl = False
   strSQL = cLnkTbl
   Set rs = CurrentDb.OpenRecordset(strSQL)
   rs.MoveFirst
   Do Until rs.EOF
      S = rs.Fields(0).Value
      If Esiste_Oggetto(S, fTabella) Then _
            CurrentDb.TableDefs.Delete S
      Set tdf = CurrentDb.CreateTableDef(S)
      tdf.Connect = cCnnString
      tdf.SourceTableName = S
      CurrentDb.TableDefs.Append tdf
      Set tdf = Nothing
      rs.MoveNext
   Loop
   LinkODBCTbl = True
Exit_Here:
   rs.Close
   Set rs = Nothing
   Set tdf = Nothing
   Exit Function
Err_RlnkODBCTbl:
   LinkODBCTbl = False
   MsgBox "Impossibile connettersi al Server"
   Resume Exit_Here
End Function
Private Function Esiste_Oggetto(ByVal Nome_Ogg As String, _
                               Typ_Ogg As String, Optional ByVal Nome_Dbs As 
String = "") As Boolean
   Dim dbs As Database
   Dim tdf As TableDef
   Dim qdf As QueryDef
   Dim X, num_ogg As Integer
   If Nome_Dbs = "" Then
      Set dbs = CurrentDb
   Else
      Set dbs = OpenDatabase(Nome_Dbs)
   End If
   Select Case Typ_Ogg
      Case fTabella
         For Each tdf In dbs.TableDefs
            If tdf.Name = Nome_Ogg Then
               Esiste_Oggetto = True
               dbs.Close
               Set dbs = Nothing
               Exit Function
            End If
         Next tdf
      Case fQuery
         For Each qdf In dbs.QueryDefs
            If qdf.Name = Nome_Ogg Then
               Esiste_Oggetto = True
               dbs.Close
               Set dbs = Nothing
               Exit Function
            End If
         Next qdf
      Case fForm, fModulo, fMacro, fReport
        num_ogg = dbs.Containers(Typ_Ogg).Documents.Count
        For X = 0 To num_ogg - 1
           If dbs.Containers(Typ_Ogg).Documents(X).Name = Nome_Ogg Then
             Esiste_Oggetto = True
             dbs.Close
             Set dbs = Nothing
             Exit Function
           End If
        Next
   End Select
Esci:
   Esiste_Oggetto = False
   dbs.Close
   Set dbs = Nothing
End Function
Da un pulsante della Form ti richiami la funzione con Call LinkODBCTbl
...
poi ti crei una Tabella che chiami _LinkedTables, con un solo campo "Name"
Nella tabella appena creata ci registri i Nomi di tutte le tabelle ODBC da 
collegare....
Fato questo basterà cliccare sul pulsante e ti ricollegherà le tabelle.
;-)
Fammi sapere
-- 
-- 
Ciao
Pablitomf (Maurizio Facciuti)
-----------------------------------------------------------------
Access: 97, 2000, XP e 2003
ASP
-----------------------------------------------------------------
http://www.accessgroup.it/
-----------------------------------------------------------------
Il mio motto :
""Non mi fido molto delle statistiche, perchè un uomo con la testa nel forno
acceso e i piedi nel congelatore statisticamente ha una temperatura media." 

 Pablitomf (Maurizio Facciuti)
Al più presto e grazie ancora.
ciao
chippo