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-24T08:54:44+00:00

    Ciao Sandro nel caso non riuscissi a venire a capo del problema sarei disposto ad inviarti il progetto intero liberato da ogni dato sensibile.

    Non posso metterlo su ONE DRIVE perché ha tantissime funzioni e relazioni, più volte ( e tu lo hai notato quando ti ho postato parte del progetto per altre problematiche ) ho provato ad allegare qualche pezzo di progetto ma con dei problemi e malfunzionamento, non riuscendo anche cosi a capire la problematica segnalata.

    Se vuoi te lo invio altrimenti proseguiamo in questo modo.

    Fammi sapere per favore.

    P.S. per gli altri utenti che dovessero avere la stessa mia esigenza metteremo alla fine la risposta e la soluzione al problema (qualora richiedi il mio DB sulla tua posta personale).

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-11-24T08:09:02+00:00

    Ciao Sandro, buongiorno, non so come mai ma appena lancio il tuo codice da un pulsante di comando si generano tabelle con il nr. 1 alla fine come da immagine allegata.

    Ti spiego e ti riporto il codice e come l'ho impostato.

    1. in un pulsante di comando, dal quale lancio la Sub ho inserito questo:

    Private Sub RelinkTables_Click()

    Call connectTables

    End Sub

    1. la Function tua l'ho trasformata in SUB in questo modo e l'ho inserita in un modulo:

    Public Sub connectTables()

    Dim tdf As DAO.TableDef

    Dim dbs As DAO.Database

    Set dbs = OpenDatabase(StrPathDbBE)

    For Each tdf In dbs.TableDefs

    If (tdf.Attributes And dbSystemObject) = False Then

    DoCmd.TransferDatabase acLink, "Microsoft Access", StrPathDbBE, acTable, tdf.Name, tdf.Name

    End If

    Next

    dbs.Close

    MsgBox "Tabelle collegate con successo"

    Set dbs = Nothing

    Set tdf = Nothing

    Application.RefreshDatabaseWindow

      End Sub

    1. nello stesso modulo in cima dove si dichiarano le variabili e costanti ho messo questo:

    Option Explicit

    Option Compare Database

    Private Const StrPathDbBE As String = "C:\Nuova cartella\GESTIONE RITENUTE_be.accdb"

    Da questo momento in poi ogniqualvolta lancio dal pulsante il codice mi ricollega le tabelle me le rinumera, cosa sbaglio?

    Invece per quanto riguarda il codice di Giorgio con il Debug, mi viene eseguito il codice senza nessun problema ma le tabelle non si collegano, come invece avviene con il tuo codice.

    Ti spiego cosa ho fatto per il codice di Giorgio.

     1) ho inserito in un modulo il codice di Giorgio:

    Public 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;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

    1. nel file Parametri.ini ho inserito il testo come da immagine  ed è salvato nella stessa cartella del Fe:

    Attendo tuoi consigli e spiegazioni circa quanto summenzionato.

    Ti saluto e ti ringrazio per l'aiuto che mi dai.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-11-23T16:02:51+00:00

    ciao Nicola,

    [...]

    Ho solo cambiato la tua funzione in una macro e la lancio da un pulsante di comando perché aprendo il DB ( con la macro Autoexec) mi genera sempre le tabelle collegate e me le rinumera aggiungeno1 alla fine.

    [...]

    la mia routine non genera tabelle collegate con _1 perché se ci sono già tabelle collegate, la routine le "vede" e ed effettua un refresh link esattamente come la routine di Giorgio.

    quindi...qualcosa ancora non va nel modo di applicarla.

    Analizza bene il codice proposto.

    Per quanto alla routine di Giorgio non riesco a capire cosa di c'è che non va.... da me funziona alla perfezione.

    se non hai password meglio così' :

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

    ma non è una modifica saliente.

    controlla e facci sapere.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-11-23T10:43:17+00:00

    Ciao Sandro, buongiorno, ho provato a debuggare il codice di Giorgio per poter riscontrare nel mio caso quale fosse l'errore ma non mi fa andare avanti con F8, cioè mi emette in continuazione un BEEP e l'esecuzione del codice è sempre fermo in quel punto. Ti allego l'immagine:

    per quanto riguarda il  tuo codice va benissimo, grazie anche alla tua splendida spiegazione.

    Ho solo cambiato la tua funzione in una macro e la lancio da un pulsante di comando perché aprendo il DB ( con la macro Autoexec) mi genera sempre le tabelle collegate e me le rinumera aggiungeno1 alla fine.

    Aiutami a capire, per favore, perché non riesco a debuggare il codice di Giorgio, vorrei utilizzare la sicurezza del File.ini.

    P.S. il mio DB non ha Password e ho modificato questa stringa dal codice di Giorgio:  

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

    con: td.Connect =";DATABASE=" & NomeBE

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento