Collegare via codice tabelle di un DB diviso in Be e Fe e messo in rete.

Anonimo
2015-11-20T08:42:13+00:00

Buongiorno a tutti, in occasione di una necessità lavorativa, di installare il database su più computer ho optato di collegare le tabelle via codice.

Ho utilizzato il codice sottostante dell'amico Giorgio Rancati e non mi collega a nessuna tabella.

Premessa:

  1. Innanzitutto vi chiedo, il codice sottostante  ( una volta andatao a buon fine) deve far visualizzare nel Fe le tabelle collegate come da ) immagine allegata oppure no?

  1. se cambio qualche dato per quanto riguarda il percorso del Be nel file Parametri.ini mi compare l'errore Parametri.ini non configurato correttamente diversamente ( quindi il percorso è giusto), appena lanciato il codice da pulsante di comando su maschera del Fe non accade nulla.
  2. con non accade nulla intendo che appena apro le rispettive maschere collegate mi vanno in errore segnalando l'assenza delle tabelle dalle quali dipendono.

In attesa di un vostro consiglio per poter capire i motivi per cui non vengono collegate le Tabelle al Fe, vi ringrazio anticipatamente per l'aiuto che vorrete darmi.

Ciao Nicola.

Option Compare Database

Option Explicit

Private Declare Function OSGetPrivateProfileString Lib "kernel32" _

                         Alias "GetPrivateProfileStringA" _

                         (ByVal lpApplicationName As String, _

                          ByVal lpKeyName As Any, _

                          ByVal lpDefault As String, _

                          ByVal lpReturnedString As String, _

                          ByVal nSize As Long, _

                          ByVal lpFileName As String) As Long

Sub RelinkTabelle()

    Dim db As DAO.Database

    Dim NomeBE As String

    Dim Password

    Dim NomeFileIni As String

    Dim Buffer As String

    Dim LenResult As Long

    Dim td As DAO.TableDef

    Set db = CurrentDb

    NomeFileIni = CurrentProject.Path & "\Parametri.ini"

    Buffer = String$(2048, 32)

    'Leggo il Percorso del database BE dal file INI

    LenResult = OSGetPrivateProfileString("Path", "NomeBE", "", Buffer, Len(Buffer), NomeFileIni)

    If LenResult <> 0 Then

        NomeBE = Left(Buffer, LenResult)

    Else

       MsgBox "File " & CurrentProject.Path & "\Parametri.ini non configurato correttamente !!", vbCritical

       Exit Sub

    End If

    'Password

    Password = "12345"

    On Error GoTo RelinkTabelle_Err

    'Scorro le tabelle

    For Each td In db.TableDefs

        'Se è una tabella allegata, la riallego al BE

        If (td.Attributes And dbAttachedTable) = dbAttachedTable Then

           td.Connect = "MS Access;PWD=" & Password & ";DATABASE=" & NomeBE

           td.RefreshLink

        End If

    Next

RelinkTabelle_Exit:

    Set td = Nothing

    Set db = Nothing

    Exit Sub

RelinkTabelle_Err:

    MsgBox Err.Description, vbExclamation

    Resume RelinkTabelle_Exit

End Sub


Il file Parametri.ini conterrà:


[Path]

NomeBe = C:\Documents and Settings\Giorgio\Documenti\DatabaseBe.accdb


questo potrebbe essere un metodo facile e di semplice personalizzazione, infatti basta aprire con notepad il file Parametri.ini per modificare il percorso del Be.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-11-24T09:22:57+00:00

ciao Nicola,

il post delle 20.51.07 del 19.10 non mostra la funzione che stai utilizzando.

Devi usare quella che ti riporto per tuo riferimento più sotto inserita nel post sopra indicato.

Come ti dicevo nel post precedente e mi sembrava dalla tua rispota fosse chiaro la funzione sotto riportata linka le tabelle del BE se non collegate e le RElinka se collegate.

Il codice di Giorgio effettua solo il RElink, questo siginfica che per valutarne il funzionamento le tabelle DEVONO essere già collegate, ma anche in quel caso non vedi nulla di diverso a meno di non cambiare il BE.

Più di così non riesco a spiegartelo, ma se metti in pratica quanto ti ho spiegato nel post del 20.11 ore 18.58.52 capisci meglio.

Inoltre se debuggi il codice, lo analizzai bene, lo studi con attenzione, come ti ho spiegato, puoi notare le differenze.

Ciao, Sandro.

rendi utilizzabile se il db non è protetto da PWD:

Option Compare Database

Option Explicit

Private Const StrPathDbBE As String = "C:\pathDeltupBe" '<-----personalizza

Public Function connectTables()

On Error GoTo errorHandler

Dim tdf      As DAO.TableDef

Dim tdfLocal As DAO.TableDef

Dim dbsBE    As DAO.Database

Dim dbsCU    As DAO.Database

Dim strconn  As String

strconn = "MS Access;DATABASE=" & StrPathDbBE

Set dbsCU = CurrentDb

' se il BE è protetto setti apri il database impostando la pwd

Set dbsBE = OpenDatabase(StrPathDbBE, False, False, "MS Access;PWD=tuaPWD") ' personalizza la Password

'se il BE non è protetto utilizzi la seguente istruzione:

'Set dbsBE = OpenDatabase(StrPathDbBE, False, False)

For Each tdf In dbsBE.TableDefs

    If Not dbSystemObject Then

        If tdf.Attributes = 0 Then

           On Error Resume Next

           If dbsCU.TableDefs(tdf.Name).Connect = "" Then

              If Err.Number = 3265 Then

                    Set tdfLocal = dbsCU.CreateTableDef(tdf.Name)

                    tdfLocal.Connect = strconn

                    tdfLocal.SourceTableName = tdf.Name

                    dbsCU.TableDefs.Append tdfLocal

               End If

           Else

               dbsCU.TableDefs(tdf.Name).Connect = strconn

               dbsCU.TableDefs(tdf.Name).RefreshLink

           End If

           On Error GoTo 0

        End If

    End If

Next

Application.RefreshDatabaseWindow

ext_errorLoadAccountHandler:

If Not dbsBE Is Nothing Then dbsBE.Close: Set dbsBE = Nothing

Set dbsCU = Nothing

Set tdf = Nothing

Set tdfLocal = Nothing

Exit Function

errorHandler:

    With Err

       MsgBox "ERR#" & .Number _

            & vbNewLine & .Description _

            , vbOKOnly Or vbCritical

     End With

     Resume ext_errorLoadAccountHandler

End Function

La risposta è stata utile?

0 commenti Nessun commento

13 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-11-20T17:58:52+00:00

    ciao Nicola,

    per il problema sicurezza prova a vedere se inserendo il percorso attendibile del BE risolvi.

    Per il resto, come di dicevo in precedenza, la routine di Giorgio effettua il relink delle tabelle qualora siano collegate...quella che ti ho suggerito le linka ex-novo oppure le relinka se già collegate.

    La differenza è tutta qua.

    Esempio.

    prendi il tuo be, fanne una copia, prendi una tabella a caso ed inserisci un nuovo campo.

    cambia il path del be nel tuo FE con le tabelle collegate e relinka il BE originale.

    relinka ora il be copia modificando il path, vedrai che la tabella in cui sei intervenuto per aggiungere il campo effettivamente mostra il campo aggiunto.

    Se effettui la stessa prova con la mia routine il risultato è lo stesso, la differenza sostanziale è che se l'FE è privo di tabella, comunque, le linka se vuoto, o relinka qualora cambi il path del BE come sopra indicato.

    Non sono un mostro in chiarezza ma spero che l'esempio sia sufficiente per capire un po' meglio.

    ciao, Sandro

    ps. buona raccolta di olive :-)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-11-20T14:45:56+00:00

    Ciao Sandro quanto a questo : il file parametri.ini lo hai creato nella stessa directory del FE ?

    ti rispondo SI.

    Il path del BE inserito nel file parametri.ini è corretto?: il percorso del Be è giusto perché se cambio qualcosina nel fili Parametri.ini  il codice di Giorgio mi dice che è sbagliato e mi da l'errore ecc. 

    Il mio Fe è privo di tabelle ed è per questo che ho usato il tuo codice e funziona.

    Comunque provo a debuggare il codice come tu mi segnali e ti faccio sapere, mi sto impegnando con tutte le mie forze nel seguire i vostri consigli.

    Ti aggiorno su quello che ho fatto.

    P.S. Sandro se mi faccio vivo lunedì è perché devo andare in campagna domani e domenica a raccogliere le olive. Ti auguro buon fine settimana, a lunedì e se riesco mi faccio sentire prima.

    Grazie infinite.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-11-20T13:49:43+00:00

    ciao Nicola,

    la routine di Giorgio funziona.

    qualche domanda.

    il file parametri.ini lo hai creato nella stessa directory del FE ?

    il path del BE inserito nel file parametri.ini è corretto?

    la password è settata a 12345 nel  codice che mostri, hai una password nel tuo be? se si è esattamente 12345? altrimenti modificala.

    hai provato a debuggare passo passo come ti consigliavo nel post di qualche giorno fa in modo da valutare cosa fa esattamente il codice?

    Aggiungo.la routine che stai utilizzando prevede che le tabelle linkate già ci siano nel FE la routine effettua un relink.

    Se l'FE è privo di tabelle collegate, ti consiglio la mia routine oppure un mix tra la mia routine e quella di Giorgio che leggi i parametri da un file .ini.

    Facci sapere.

    Ciao, Sandro

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-11-20T13:30:58+00:00

    Ciao Sandro provando e riprovando sono riuscito a risolvere il tutto, il tuo codice funziona benissimo, mi collega le tabelle.

    Il problema che ho proposto poco fa era dovuto al fatto che non ho inserito la funzione nel modulo e di conseguenza non  trovava la funzione .

    Ho notato una cosa, cioè che ogni volta devo confermare Apri come da immagine sottoriportata (ho 27 tabelle collegate e quindi lo devo fare 27 volte)  per poter collegare le tabelle. Non è possibile che il codice alleghi tutto in automatico senza chiedermi di farlo ogni volta?

    Grazie ancora una volta per avermi aiutato, comunque, per favore, dimmi cosa sbagliavo nel codice di Giorgio e perché non mi dava il risultato sperato?

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento