[Risolto] Problema linkaggio BE-FE tramite funzione

di il
25 risposte

[Risolto] Problema linkaggio BE-FE tramite funzione

Salve a tutti, da un po' di tempo a questa parte, come da titolo il db mi da quest'anomalia...cioè..
tramite una funzione, laddove il be e fe sono nella stessa directory, parte l'allineamento delle tabelle tramite una macro (Autoexec) che richiama la funzione... la funzione è la seguente (presi spunto prp qui sul forum se non erro)
Function ControlloFiles() As Boolean
On Error GoTo LblErr
Dim TLink As String
Dim LinkBE As String
dim strPercorso  as String
Dim db As Database
Dim rs As DAO.Recordset

    strPercorso = CurrentProject.Path & "\"
    

    LinkBE = strPercorso & "FE.accdb"
    Set rs = CurrentDb.OpenRecordset("TTabelleCollegate")
    Set db = OpenDatabase(LinkBE, False, False, "MS Access;PWD=password")
    rs.MoveFirst
Do Until rs.EOF
    TLink = rs.Fields(0).Value
    CurrentDb.TableDefs.Delete TLink
    DoCmd.TransferDatabase acLink, "Microsoft Access", LinkBE, acTable, TLink, TLink
    rs.MoveNext
Loop
db.Close
Set db = Nothing
        ControlloFiles = True


LblErr:
MsgBox (Err.Description)

End Function
ora cosa succede... che se trasferisco la directory sul portatile (desktop) mi segnala che il vecchio percorso (quelo della pennetta) non è attendibile quindi, come se non eseguisse l'allineamento...facendo il debug, nella variabile LinkBE mi porta esattamente il link dove si trova il FE!
Cosa anomala è che, la stessa funzione, riportata su un altro db sempre diviso tra BE-FE funziona perfettamente, posso trasferire la cartella dove mi pare, la function funge sempre... cosa potrei verificare???

25 Risposte

  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Hai modificato questa riga...?
    strPercorso = CurrentProject.Path & "\"
    
    Come vedi usando la proprietà PATH di CurrentProject costruisce la stringa di connessione con le coordinate del FE.
    Tu dovrai mettere il percorso di rete.

    Chi cancella le linked table...? Spero alla chiusura dell'applicativo...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Ciao Alex, grazie mille per la risposta.
    relativamente alla valorizzazione delle variabili la cosa funziona nel senso che, la
        strPercorso = CurrentProject.Path & "\"
    riporta dove risiede il FE mentre
    LinkBE = strPercorso & "FE.accdb"
    costruisce la stringa di dove risiede il FE più il nome del db...durante il debug mi ritrovo che la variabile LinkBE contiene esattamente il percorso+nome fe tanto che, se faccio doppio click sulla stringa e la lancio in un percordo directory, mi apre il FE...ma nn capisco perchè a questo punto, non mi linka le tabelle...

    EDIT: no, non ho modificato quella stinga, ho riportato il codice così come riportato nel modulo
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Scusa ma credo tu non abbia capito... oppure ti spieghi male.

    Le tabelle sono nel BE e non nel FE.... nel FE ci sono le tabelle fittizie o linkate... motivo per cui il path deve essere quello del BE.
    Quindi il DB da cui andare a prendere le tabelle è sempre il BE e non il DELL'APPLICATIVO, ed ovviamente se cambia il suo percorso serve modificare la connectionstring con il percorso del BE aggiornato.

    Se questo non ti è chiaro non so come migliorare la spiegazione... di fatto il tuo codice è assolutamente errato perché usa il FE.

    Credo tu abbia copiato il codice senza comprenderlo ed introducendo molti errori insensati... la tabella del FE usata ha l'elenco delle tabelle da andare a cercare nel BE.
    Credo, ma non ne sono certo, sia un mio codice...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    OMG direbbero da qualche parte...non solo ho scritto male ma ro ripetuto anche l'errore....
    si, ti chiedo immensamente venia ma intendevo il BE, li ho creato il modulo ed inserito il codice che viene richiamato con la macro...
    I BE e FE li inserisco sempre nella stessa cartella e giustamente all'avvio del FE dovrebbe partire il codice per l'allineamento delle tabelle (come avevo descritto nel primo post prima della digestione)
    Per il codice, penso che può essere tuo perchè presi spunto (riportato) da questo forum forse proprio su un mio vecchio post tant'è che non ho mai avuto di questi problemi ma ora, appena cerco di aprire il db sul portatile il codice non va a buon fine

    La cosa anomala è che, ora ho provato ad allineare il db tramite la gestione delle tabelle collegate ed il codice va a buon fine nel senso che, se porto la cartella dal desk nella cartella documenti o chi che sia, parte il codice ed esegue l'allineamento...come mai prima si bloccava? al dila del fatto che avevo scritto nel codice
    LinkBE = strPercorso & "FE.accdb"
    in realtà al posto di FE.accdb vi è il nome esatto del dv usato come BE...credevo di facilitare le cose ed invece ho creato l'equivoco
    EDIT. se ho risolto la cosa utilizzando la gestione delle tabelle collegate, può essere qualcosa legata al SO? Sul portatile ho Win 10 mentre in ufficio il buon vecchio 7...il problema è ke io non voglio dover allineare manualmente le tabelle...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Posta il codice che dici funzionare... ma solo dopo aver cancellato dal FE le Linked Table e riprovato...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    
    Function ControlloFiles() As Boolean
    On Error GoTo LblErr
    Dim TLink As String
    Dim LinkBE As String
    Dim db As Database
    Dim rs As DAO.Recordset
    
        strPercorso = CurrentProject.Path & "\"
    
        LinkBE = strPercorso & "GestioneDati.accdb"
        Set rs = CurrentDb.OpenRecordset("TTabelleCollegate")
        Set db = OpenDatabase(LinkBE, False, False, "MS Access;PWD=jrbz1")
        rs.MoveFirst
    Do Until rs.EOF
        TLink = rs.Fields(0).Value
        CurrentDb.TableDefs.Delete TLink
        DoCmd.TransferDatabase acLink, "Microsoft Access", LinkBE, acTable, TLink, TLink
        rs.MoveNext
    Loop
    db.Close
    Set db = Nothing
            ControlloFiles = True
    
    LblErr:
    MsgBox (Err.Description)
    
    End Function
    
    ecco il codice...eliminando le linked table mi segnala elemento non trovato in questo insieme riportando il nome della prima tabella all'interno della tabella TTabelleCollegate contenente tutti i nomi tabella cui deve aggiornare
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Questo ti dice qualche cosa...?
    Come ti avevo cercato di far capire... il tuo codice conteneva un grave errore concettuale e funzionava fintanto che le tabelle erano presenti... ti dissi anche "chi le cancella...?"... ma questo è rimasto inascoltato...

    Ti ripeto, ultima volta, che la cosa funziona cosi....
    La tabella che chiami TTabelleCollegate è nel FE e contiene l'elenco delle tabelle da linkare nel BE.
    Quindi su apre un rs nel FE basato sulla tabella sopracitata e si genera un ciclo... per ogni tabella dell'elenco si esegue un TransferDatabase dal BE con la tabella puntata dal recordset.
    Il path del BE deve essere NOTO altrimenti non può funzionare.
    Quindi di solito si usa filedialog alla prima volta che si sposta, poi si salva in una tabella di servizio oppure con SaveSetting nel registro di ACCESS e lo si recupera con GetSettings...
    Su chiusura del FE si devono cancellare le LinkedTables sempre.
    Un esempio molto grezzo di codice è Questo, ma non so se sia un bene fartelo vedere... Non vorrei ti creasse più confusione.

    **
    Ora vedi tu... ma prima di proseguire con il 3d rifletti molto bene.
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Ciao Alex, scusami ma ho avuto una settimana pienissima...
    cmq sostituito in todo la funzione con quella segnalatomi da te però la procedura di verifica se una tabella esiste per poi cancellarla e relinkarla, va molto a sfavore della lentezza di avviamento, considerando che le tabelle contengono giusto una decina di record per i test effettuati...quasi 14 secondi... (il pc su cui opero al momento non è una belva ma è un i3 con una CPU 3.40 GHz e 4 gb di RAM).

    Ora, considerando che questa tipologia di pc per il lavoro è praticamente la più diffusa, come potrei bonificare i tempi?
    Stavo pensando quindi di sostituire la funzione "Esiste_Oggetto" con un loop che elimina tutte le tabelle per poi relinkarle (quelle presenti nella linked table per intenderci)...dici che sia fattibile? Operativamente corretta come operazione?

    Inoltre perdona l'ignoranza, come mai è necessario eliminare le tabelle collegate?
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Puoi valutare di rimuovere le linked table alla chiusura... e questo già si nasconde e difficilmente può essere possibile di anomalie in quanto il.codice lavora ClientSide quindi se si chiude funziona.
    A questo punto alla riapertura devi solo Linkarle senza controllo.
    Puoi vedere se questa soluzione migliora in modo sensibile... poi possiamo pensare ad altre cose... un'altra sicuramente c'è ma più complicata da spiegare... e sicuramente da verificare bene.
    In realtà ho fatto un demo per questa cosa ma non ricordo dove sia... domani ci guardo.
    Facciamo un passo alla volta.
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    @Alex ha scritto:


    Puoi valutare di rimuovere le linked table alla chiusura... e questo già si nasconde e difficilmente può essere possibile di anomalie in quanto il.codice lavora ClientSide quindi se si chiude funziona.
    A questo punto alla riapertura devi solo Linkarle senza controllo.
    Puoi vedere se questa soluzione migliora in modo sensibile... poi possiamo pensare ad altre cose... un'altra sicuramente c'è ma più complicata da spiegare... e sicuramente da verificare bene.
    In realtà ho fatto un demo per questa cosa ma non ricordo dove sia... domani ci guardo.
    Facciamo un passo alla volta.
    Perfetto.

    Ho sostituito la funzione come accennato nei post precedenti in maniera tale da eliminare le tabelle linkate su chiusura del db e ricrea il collegamento all'apertura del database (poi imposterà di eseguire i collegamenti dopo la login)
    Per ora, i tempi di apertura sono calati intorno agli 8.66 secondi (cronometrato). Vi sono altre operazioni che potrei eseguire per snellire tale operazione? La mia preoccupazione è per quando vi saranno decine e decine di record nelle tabelle...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    zio Ken ha scritto:


    Ho sostituito la funzione come accennato nei post precedenti in maniera tale da eliminare le tabelle linkate su chiusura del db e ricrea il collegamento all'apertura del database (poi imposterà di eseguire i collegamenti dopo la login)
    Per ora, i tempi di apertura sono calati intorno agli 8.66 secondi (cronometrato). Vi sono altre operazioni che potrei eseguire per snellire tale operazione? La mia preoccupazione è per quando vi saranno decine e decine di record nelle tabelle...
    Ho 2 cose da proporti... delle quali però ho qualche dubbio che espongo insieme alle opzioni:
    1° PRIMA
    Prima del Ciclo di LINK, dovresti aprire un RS su un'Oggetto Database che punta ad una Tabella del BE...
    Quindi:
    
    Dim dbExt       As DAO.Database
    Dim rsDummy     As DAO.Recordset
    Set dbExt = OpenDatabase(Path)
    Set rsDummy = dbExt.OpenRecordset("NomeTabella", dbOpenSnapshot, dbReadOnly)
    ' Da quì esegui il RELINK
    ' Terminato il Relink
    rsDummy.Close
    dbExt.Close
    Set dbExt=nothing
    Set rs=nothing
    
    Ovviamente devi verificare se è vero che i tempi si accorciano, e se fosse vero sicuramente è visibile la differenza.
    P.S. Dimenticavo, la speranza è che la funzione TransferDatabase si appoggi alla Connessione presente nel POOL...

    2° SECONDA
    Invece di Cancellare le LINKED e RELINKARLE, potresti provare semplicemente a cancellare e ripristinare la Proprietà Connect...
    Quindi su chiusura la rimuovi, e su Apertura puntando alle Linked presenti vai a scrivere la Connection String... (prima di farlo LEGGI come viene composta, con un semplice
    DEBUG.PRINT CurrentDb.TableDefs("NomeLinkedTable").Connect
    Questo secondo metodo tuttavia, richiede la consapevolezza che se fai modifiche al BE, serve verificarne la reale funzionalità...

    Tutto da Testare ovviamente...
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Ciao Alex perdonami, mi sono perso....

    relativamente la prima opzione, devo semplicemente inserire un nome tabella? Poichè ho provato ad integrare quanto segnalatomi nella funzione ma i tempi di apertura sono risaliti a 13 secondi penso di aver pastrocchiato e non intuito ciò che mi suggerisci
    Set dbCurr = CurrentDb
    strSQL = cLnkTbl
    dbCurr.TableDefs.Refresh
    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.MoveFirst
    
        strPercorso = CurrentProject.Path & "\"
        
        SysCmd acSysCmdSetStatus, "Connessione al server in corso..."
        
        LinkBE = strPercorso & "DemoDati.accdb"
    
    Do Until rs.EOF
    S = rs.Fields(0).Value
    
    Dim dbExt       As DAO.Database
    Dim rsDummy     As DAO.Recordset
    Set dbExt = OpenDatabase(LinkBE)
    Set rsDummy = dbExt.OpenRecordset(S, dbOpenSnapshot, dbReadOnly)
    ' Da quì esegui il RELINK
    ' Terminato il Relink
    rsDummy.Close
    dbExt.Close
    Set dbExt = Nothing
    'Set rs = Nothing
    
    
    DoCmd.TransferDatabase acLink, "Microsoft Access", _
    LinkBE, acTable, S, S
    La funzione segnalata da te, la imposto come codice all'apertura?
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Quel codice non è completo... manca la chiusura del Loop... ma si vede che apri un rs ogni iterazione... io dissi di aprirlo prima su una tabella qualsiasi, fare il loop e chiuderlo alla fine...

    Prova a rivederlo...

    La tabella qualsiasi in realtà potrebbe essere una Dummy Table... in quanto la tecnica di mantenere aperto un rs fittizio sempre velocizza molto le interrogazioni... ma questa è una cosa successiva... servirebbe prima individuare la strada poi avere una discreta visione d'insieme..
  • Re: [Risolto] Problema linkaggio BE-FE tramite funzione

    Ciao Alex, ho modificato la funzione e riposto il codice completo
    Public Function LinkTbl() As Boolean
    On Error GoTo Err_LinkTbl
    
    Dim TLink As String
    Dim LinkBE As String
    Dim strPercorso As String
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim dbCurr As DAO.Database
    Dim S As String
    LinkTbl = False
    
    Set dbCurr = CurrentDb
    strSQL = cLnkTbl
    dbCurr.TableDefs.Refresh
    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.MoveFirst
    
        strPercorso = CurrentProject.Path & "\"
        
        SysCmd acSysCmdSetStatus, "Connessione al server in corso..."
        
        LinkBE = strPercorso & "DemoDati.accdb"
    
    ' *****Prova linkaggio tabella
    Dim dbExt       As DAO.Database
    Dim rsDummy     As DAO.Recordset
    Set dbExt = OpenDatabase(LinkBE)
    Set rsDummy = dbExt.OpenRecordset("tblAzienda", dbOpenSnapshot, dbReadOnly)
    ' Da quì esegui il RELINK
    ' Terminato il Relink
    Do Until rs.EOF
    S = rs.Fields(0).Value
    ' *****Fine prova linkaggio tabella
    
    DoCmd.TransferDatabase acLink, "Microsoft Access", _
    LinkBE, acTable, S, S
    rs.MoveNext
    Loop
    LinkTbl = True
    Exit_Here:
    rs.Close
    Set rs = Nothing
    rsDummy.Close
    dbExt.Close
    Set dbExt = Nothing
    Exit Function
    Err_LinkTbl:
        If Err.Number = "0" Then Resume Next
        If Err.Number = "20" Then Resume Next
        If Err.Number <> "0" Then
        End If
        LinkTbl = False
        MsgBox "Impossibile connettersi al Server"
    Resume Exit_Here
    
    
        SysCmd acSysCmdSetStatus, "Connessione al server eseguita con successo!"
    
    End Function
    Cosi, stiamo intorno ai 4 secondi (cronometro alla mano)...i tempi di sono dimezzati...cos'è una dummy table? Ho fatto una prova in rete ma non ho trovato guide Microsoft
Devi accedere o registrarti per scrivere nel forum
25 risposte