Newsgroup: it.comp.appl.access
Titolo: collegamento tabelle a nuovo backend da vba

buongiorno a tutti, ho un client accdb che ha diversi collegamenti a tabelle presenti su diversi back end, per esempio
 
il collegamento clienti è collegato alla tabella clienti del file c:\miodb1.accdb
 
il collegamento fornitori è collegato alla tabella fornitori del file c:\miodb2.accdb
 
utilizzavo il codice riportato qui di seguito ma funzionava perchè le tabelle erano tutte nello stesso file backend se i backend sono diversi come posso modificare il codice vba qui sotto? grazie a tutti.
 
 
*** inizio codice ***
'connette le tabelle al percorso indicato
Public Function ConnettiTabelle(path As String)
Dim miatable As TableDef
Dim miodb As Database
Dim I As Integer
 
Set miodb = CurrentDb()
For I = 0 To miodb.TableDefs.Count - 1
        Set miatable = miodb.TableDefs(I)
        If miatable.Connect <> "" Then
            'versione con password
            'miatable.Connect = ";DATABASE=" & path & ";UID=sa;PWD=1234;"
            'versione senza password
            miatable.Connect = ";DATABASE=" & path & ";UID=sa;"
            miatable.RefreshLink
        End If
Next I
End Function
*** fine codice ***

Non ho capito... la Funzione supporta il PATH ti basta cambiare quello...?
Oppure devi Linkare Contemporaneamente Tabelle diverse da PIU' BE...?
 
A prescindere la tua tecnica prevede che tu abbia Residenti le Tabelle, cosa che è da evitare come si è già detto...!
Questo imporrebbe che ci fosse una LOCALTABLE oppure ogni BE abbia una LOCALTABLE con l'elenco delle Tabelle da Linkare..., quindi ti colleghi da codice al BE, leggi l'elenco delle Tabelle da Linkare e le CREI da ZERO...!
Hai 2 BE da Linkare, apri anche il 2° e fai la stessa cosa...
 
Se trovi più comodo avere una LOCALTABLE nel Client dovrà avere 2 Campi:
NomeBE
NomeTabella
fai il ciclo, usando CreateTableDefs(....) e Linki tutto.
 
Quando il Client si chiude si DISTRUGGONO le LINKED, e questo è da tenere in considerazione quando si distribuisce in Aziende Multiutente con più persone che possono usare il Client, se lo usi solo tu a casa va bene lasciare le Linked. 
 
@Alex

Leggi questo:
 
https://groups.google.com/forum/?hl=it#!searchin/it.comp.appl.access/Tabledefs%7Csort:date/it.comp.appl.access/HpDZ9by-u4o/yndPthg7AQAJ
 
 
@Alex


si ho più link a tabelle che si trovano in BE diversi
provo come hai indicato e ti faccio sapere l'esito, grazie.


non so se è attuabile ma mi è venuta un idea per evitare la tabella LOCALTABLE
ho notato che se mi posiziono con il cursore del mouse sul link alla tabella mi viene mostrato il percorso completo del BE c:\miacartella\miofile.accdb
 
se in qualche modo è possibile da codice vba reperire quella informazione, potrei prelevare il nome del file con il codie qui sotto riportato
 
*** codice per prelevare solo nome file da percorso completo ****
 
Public Function CalcolaNomeFile(ByVal strPath As String) As String
    Dim nomef As String
    nomef = Right(strPath, Len(strPath) - InStrRev(strPath, "\"))
 
    CalcolaNomeFile = nomef
End Function
 
*** codice per prelevare solo nome file da percorso completo ****
 
poi una volta ricavato il nome del file aggiungo il nuovo path al nome del file ed eseguo la connessione al nuovo percorso
 
 
esempio:
link alla tabella clienti del file BE c:\miacartella\miodb.accdb
 
prelevo con il codice qui sopra riportato il nome miodb.accdb
 
supponiamo che la variabile string NuovoPath sia \\mioserver\cartella\
Path = NuovoPath & miodb.accdb
 
infine assegno nuovo collegamento con l'istruzione
miatable.Connect = ";DATABASE=" & path & ";UID=sa;"
miatable.RefreshLink
 
voi che ne dite? fattibile?


aggiungo che questo metodo mi eviterebbe di dover ricordarmi di aggiornare ogni volta che aggiungo qualche nuova tabella alla tabella LOCALTABLE

 ogni volta che aggiungo qualche nuova tabella alla tabella LOCALTABLE
 
Nella circostanza la LOCALTABLE è come la Corazzata Potemkin:
https://www.youtube.com/watch?v=XAQ5jjSbfaI
 
 
Bruno


cioè scusa? :D
 
dici che non è una buona soluzione? in quel caso puoi motivare? grazie.
tu sai come leggere il controltiptext che si visualizza quando ti posizioni con il cursore del mouse sulle tabelle collegate? ovvero il path completo del back end?
 

Mario stai cercando di fare una cavolata.
Il percorso è contenuto nella proprietà CONNECT dell'oggetto Tabledefs("nometabella")... quindi lo vedi in chiaro...
Il problema è che le Linked andrebbero cancellate ad ogni chousura e riattivate ad ogni apertura... sicché la tua strategia è sbagliata di base.
Ora come sempre su questa logica ci sono varie scuole di pensiero, ma la verità è che se lavori in ambienti multiutente e non a casa tua le tabelle vanno eliminate in quanto rappresentano una falla nella sicurezza del tuo prodotto soprattutto quando il tuo applicativo è chiuso.
 
Di questo argomento si è già parlato con troppo...
Per tutti questi motivi, più o meno giusti, chi comprende gli aspetti di sicurezza e, ha bisogno di tutelarli, deve operare in modo differente.
 
Sei libero di sperimentare tutto quello che ti passa per la testa ovviamente ma almenonfallo su basi tecniche, almeno ne hai consapevolezza.
 
@Alex


purtroppo non riesco a capire cosa intendi per rischi di sicurezza, a me serve  un pulsante che su click mi collega il fronte end in locale perchè è più veloce nello sviluppo poi appena prima di trasformarlo in accde e consegnarlo in rete ai vari client premo il pulsante che riconnette tutte le tabelle collegate agli stessi backend su cui lavoravo in locale ma che si trovano "pari pari in rete su server"
 
la soluzione per te migliore è quella della localtable? io sto seguendo quella strada da te consigliata con i campi nometabella e nomeBE

....
 
La soluzione migliore è quella che funziona sempre con iul minimo sforzo.
Il FE ed i BE sul Server vanno Linkati con una Logica ed un Codice.
Lo stesso codice deve essere usato per LINKARE al BE in LOCALE, non vorrai metter ein piedi 2 procedure differenti...?
 
Quindi ti basta usare la procedura fatta sostituendo il PATH.
 
@Alex


Certo ovvio che uso la stessa procedura infatti è per questo che volevo leggere il tooltiptext che esce quando vai sopra con il cursore del mouse alla tabella colleggata che da quanto mi hai scritto è la proprietà connect, a quel punto estraggo a runtime il file BE e sostituisco solo il path iniziale
 
quando è in locale sarà c:\miacartella\mioBE.accdb
quando è in server sarà \\mioserver\miacartellacondivisa\mioBE.accdb
 
ciao, grazie.


se a qualcuno dovesse servire ho fatto cosi:
 
ciclo tutte le tabelle collegate e prelevo il backend passando alla funzione qui sotto il parametro miatable.connect
 
*** CODE ***
 
'preleva dal percorso il nome del file con estensione
Public Function CalcolaNomeFileConEstensione(ByVal strPath As String) As String
    Dim nomef As String
    nomef = Right(strPath, Len(strPath) - InStrRev(strPath, "\"))
 
    CalcolaNomeFileConEstensione = nomef
End Function
 
*** END CODE ***
 
una volta prelevato il backend dal percorso miatable.connect
uso la funzione qui sotto:
 
*** CODE ***
 
'connette le tabelle collegate al percorso passato come parametro
Public Function ConnettiTabelle(path As String)
Dim miatable As TableDef
Dim miodb As Database
Dim I As Integer
 
Set miodb = CurrentDb()
For I = 0 To miodb.TableDefs.Count - 1
        Set miatable = miodb.TableDefs(I)
        If miatable.Connect <> "" Then
            Dim backend As String
            Dim PathConnect As String
 
            'prelevo il file backend a cui la tabella attuale del ciclo for è connessa
            backend = CalcolaNomeFileConEstensione(miatable.Connect)
            'aggiungo al path nuovo il backend per ottentere il path completo del nuovo backend
            PathConnect = path & backend
 
            'connetto le tabelle collegate al nuovo path
            'miatable.Connect = ";DATABASE=" & PathConnect & ";UID=sa;PWD=1234;"
            miatable.Connect = ";DATABASE=" & PathConnect & ";UID=sa;"
            miatable.RefreshLink
        End If
Next I
End Function
 
*** END CODE ***
 
 
 


dimenticavo, prima di eseguire la Sub ConnettiTabelle eseguo la sub che chiude tutte le FORM aperte altrimenti non permette la connessione della tabella collegata ad un altro backend
 
**** CODE ****
 
Public Sub ChiudiTutteForm()
    Dim frm As Form
 
    For Each frm In Forms
        DoCmd.Close acForm, frm.Name, acSaveYes
    Next
End Sub
 
**** END CODE ****