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-24T10:08:48+00:00

    Ciao Sandro ( tempo ci è voluto ma ho capito finalmente, sono un as........noooo), grazie per i tuoi preziosi insegnamenti.

    Provando ad inserire (come giustamente mi segnalavi l'altro giorno) un ulteriore campo in una tabella e a tabelle già collegate ho lanciato il codice di Giorgio e mi ritrovo la tabella con il nuovo campo ( ora ho capito quello che tu più volte mi hai suggerito).

    Il tuo codice, invece, appena lanciato mi collega le tabelle ( se non sono già collegate, diversamente non me le  rinomina più).

    Cit.   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.

    Sei stato esaustivo e bravo nella spiegazione, e questo, almeno da parte mia ti rende onore, soprattutto per la pazienza e la calma  che hai nel seguirmi e rispondermi.

    Per questo, ti stimo ancora di più e ti ringrazio infinitamente.

    Ciao Nicola.

    P.S. nel Debuggare sia il tuo codice che quello di Giorgio scorrevano le tabelle nello stesso punto cioè da qui.

    codice di Giorgio

    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 'REMMATA PER DB CON PASSWORD

                td.Connect = ";DATABASE=" & NomeBE

                td.RefreshLink

             End If

         Next

    codice tuo

    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

    La risposta è stata utile?

    0 commenti Nessun commento