Percorso Database diviso

di il
18 risposte

Percorso Database diviso

Allo scopo di agevolarmi l'upgrade del codice da me prodotto, (utilizzato da più soci della mia associazione), ho preferito dividere il database dal software con l'operazione "DIVIDI DATABASE".
Il problema ora consiste nel fatto che le tabelle sono legate al codice da un percorso assoluto e se l'utente sposta l'intera directory da un'altra parte nel PC, nulla funziona più.
Ciò anche se (per impostazione), sia la parte codice che i dati continuano a convivere nella stessa cartella dopo lo spostamento.

Chiedo a chi è più esperto di me se a questo c'è un rimedio e ringrazio.

Antonio Cuomo

18 Risposte

  • Re: Percorso Database diviso

    Non so se ti riferisci a istruzioni come ad esempio FollowHyperlink. Se si vuole spostare qualcosa è consigliabile farlo con l'intero database unitamente a tutto il malloppo di cartelle e files corrispondenti. A questo punto occorre modificare i tuoi codici sfruttando un PATH RELATIVO proprio per venire incontro a una esigenza di questo genere.
    Ricordo ad esempio (sempre per FollowHyperlink) che si sfrutta l'istruzione CurrentProject.Path.
  • Re: Percorso Database diviso

    Molto interessante la tua puntualizzazione.
    Ho imparato una cosa nuova.
    Sicuramente con
    Dim NUOVO_INDIRIZZO As String
    NUOVO_INDIRIZZO = CurrentProject.Path
    MsgBox NUOVO_INDIRIZZO
    posso sapere facilmente in quale directory ora mi trovo, ma ciò non basta.

    Debbo informare Access (che deve sincronizzarsi con le sue tabelle a questo NUOVO_INDIRIZZO in quanto esso mantiene ancora quello registrato al momento della divisione, e ciò deve avvenire prima che si arrabbia e cioè prima che va a cercarsi le tabelle.
    Domanda: in che modo si passa questa informazione?

    ciao antonio
  • Re: Percorso Database diviso

    Se il Be è sempre nella cartella del Fe ti basta ciclare la collection tabledefs e, dove l'oggetto tabledef espone proprietà Connect valorizzata significa si tratta di una Linked table... ti basta riassegnare il Path del Be ricostruendolo.
    La cosa direi che è molto semplice... verifica come è strutturata la Msysobject relativamente alle tabelle linkate. .. e vedi come devi ricostruire la proprietà Connect.
  • Re: Percorso Database diviso

    Ti ho letto Alex.
    Dal tono usato ho capito che la cosa si può fare (del resto hai sempre una risposta per tutto).
    Non ho capito da dove partire ma avvierò le mie indagini.
    Attendi mie notizie.

    antonio
  • Re: Percorso Database diviso

    Una cosa simile su cui puoi lavorare
    
    Function Relink()
    Dim tdf As DAO.Tabledef
    Dim strPATH As String
    
    strPATH=CurrentProject.PAth & "\NomeBE.mdb"
    For each tdf in DbEngine(0)(0).Tabledefs
        If Len(tdf.Connect)>0 Then
           tdf.Connect=";DATABASE=" & strPATH
           tdf.RefreshLink
        End If
    Next
    End Function
    Questa funzione le puoi far richiamare dalla Macro AUTOEXEC.
    Ci sono metodi più raffinati, ma questo funziona..., metti la gestione errori, la verifica che il BE esiste e quanto serve per non avere sorprese.....

    Guarda però che l'ho scritto a memoria... non provato quindi magari contiene un qualche errore banale...
  • Re: Percorso Database diviso

    Alex, non ho parole.
    Mi ero avviato per percorsi accidentati ma mi hai surclassato.
    ti ringrazio infinitamente.
    antonio cuomo
  • Re: Percorso Database diviso

    Tranquillo, si bloccava un attimo quando tentava di scrivere il nuovo path anche sulle "Tabelle" Msys... , ma ho raggirato l'ostacolo. Il nuovo path ora è stato aggiornato su tutte le tabelle.
    Il problema comunque risulta parzialmente risolto in quanto, nonostante la riga tdf.RefreshLink la connessione fra l' FE e il BE non c'è lo stesso.
    Mi è venuta l'idea di fare una compattazione e ripristino (manualmente). Tutto è filato dritto.
    Ma ora nasce il problema di lanciare in automatico questa operazione. E quì casca l'asino.
    Ho trascorso il 1^ maggio per capire fra le diverse soluzioni offerte su web (quasi sempre errate, inconcludenti e precarie), soprattutto per farle mie, cosa facesse al mio caso.
    Come al solito tu eri presente in molte recensioni autorevole e garantista.
    Una parte dei miei problemi sono io stesso con la mia sempre più profonda inesperienza.
    Ho appurato che il codice:
    CommandBars("Menu Bar").Controls("Strumenti").Controls("Utilità database"). _
    Controls("Compatta e ripristina database...").accDoDefaultAction

    fra dichiarazioni, assegnazioni e sintassi inadeguate, non sono riuscito a renderlo funzionale.

    Allo stesso modo non mi funziona:
    bla = Application.CompactRepair("C:\Agenda\Agenda_be.mdb", "C::\Agenda\Agenda_be2.mdb")
    Kill "C:\Agenda\Agenda_be.mdb"
    Name "C:\Agenda\Agenda_be2.mdb" As "C:\Agenda\Agenda_be.mdb"

    Ugualmente non mi ha funzionato "Sendkeys" e ciò sebbene non lo reputi molto professionale.

    Insomma Alex, io mi sento molto disorientato e demoralizzato. Troppe difficoltà, tante puntualizzazioni e purtroppo anche tanta ignoranza da parte mia, che fanno da muro con quello che vorrei e saprei fare.

    ... e allora sono costretto a ricorrere a te e alla tua comprensione.
    Bruscamente: Come si fa a chiedere ad Access di Compattare da programma il mio database?
    fra le tre soluzioni, non so se convieni, sarebbe preferibile la "CompactRepair".
    Ti prego scrivimelo senza che io debba cambiare una sola virgola se puoi perché credimi, io questo Help tanto evocato, non lo capisco proprio e me ne rammarico. Per il mio livello di conoscenza, lo trovo troppo cattedratico; se facesse sempre e dico sempre un esempio sarebbe un'altra cosa.
    Tante volte, e lo diciamo sempre per i nostri figli, si impara più da un buon esempio che da mesi di studio.

    ciao antonio
  • Re: Percorso Database diviso

    antocuomo ha scritto:


    ...
    Bruscamente: Come si fa a chiedere ad Access di Compattare da programma il mio database?
    fra le tre soluzioni, non so se convieni, sarebbe preferibile la "CompactRepair".
    Ti prego scrivimelo senza che io debba cambiare una sola virgola se puoi perché credimi, io questo Help tanto evocato, non lo capisco proprio e me ne rammarico. Per il mio livello di conoscenza, lo trovo troppo cattedratico; se facesse sempre e dico sempre un esempio sarebbe un'altra cosa.
    Tante volte, e lo diciamo sempre per i nostri figli, si impara più da un buon esempio che da mesi di studio.

    ciao antonio
    Ciao Antonio, se vuoi vedere qualche esempio di come compattare il tuo BE, prova a guardare nella sezione "General" di "Sito Comune". Ci sono 6 esempi di come compattare i database. Prova a dargli un'occhiata, magari uno potrebbe fare al caso tuo. Di seguito ti riporto il link:
  • Re: Percorso Database diviso

    Non capisco di cosa stai parlando... eravamo rimasti che bastava quel codice... e basta quello... non servono altre cose...!

    Dovrei fare qualche verifica su cosa hai fatto, ma mi pare tu stia mescolando troppi concetti in modo molto confuso.

    Ti mostro un esempio leggermente differente, forse più complesso, ma segui le istruzioni... poi guarda il codice.
    http://forum.masterdrive.it/access-79/login-sicurezza-form-44771/

    IN sostanza chiudi la Maschera Iniziale, quindi effettua il LOGIN con
    USER=admin
    PWD=admin
    Seleziona il Flag(Collega le tabelle al Server, che poi è quello che serve a te...)

    Questo esempio, gestisce anche i LIVELLI di Accesso, ma tu guarda solo la parte di LINK.
    Si basa su una Tabella [_TL] residente nel CLIENT, che riporta i NOMI delle Tabelle da andare a RICOLLEGARE nel BE(Server).

    Il Sistema cicla questa tabella, recupera in nomi delle Tabelle da Linkare, e dando per scontato(un assunto) che il Server sia sempre nella CurrentProject.Path, effettua il Relink in modo un po differente da quanto suggerito sopra...

    La funzione di cui parlo è la [getLinkedTable] nel Modulo [basGLOBAL]...

    Per il resto non serve a nulla il CompactRepair che ti sconsiglio vivamente di fare in queste condizioni.
  • Re: Percorso Database diviso

    Ringrazio molto mikelemm che mi ha fatto conoscere un bellissimo sito con cui mi piacerà avere in futuro possibili interscambi qualificati, ma non ho saputo trovare per il momento quello che stavo cercando.

    Ad Alex che è pazientissimo con me, dico:
    E' vero; la funzione che mi hai proposto funziona ma solo in caso di uno spostamento della coppia FE+BE su di un'altra directory.
    Se invece per caso, l'operatore rinomina quella stessa directory in cui il SW ha sempre lavorato, la funzione, pur venendo interrogata all'avviamento del programma, corregge il path ma non linka più i dati, a meno che non gli faccio manualmente un "Compatta e Ripristina".
    E' da quì che è nata tutta la mia tribolazione alla ricerca del Compatta.
    Pensi che si possa fare qualcosa oppure devo mettere nelle note che il nome della directory non va modificato?

    Ciao Antonio
  • Re: Percorso Database diviso

    Si con il codice che ti ho proprosto nel 2° intervento, che rigenera completamente il Link funziona.

    P.S. in AccessGroup c'è qualche cosa di mio...
  • Re: Percorso Database diviso

    Scusami alex, come si arriva in AccessGroup ?
  • Re: Percorso Database diviso

    Digital o su Google. .. è il primo, poi vai alla sezione articoli tecnici.

    http://www.accessgroup.it
  • Re: Percorso Database diviso

    Purtroppo quelle istruzioni dell'tuo articolo tecnico, non sono per il mio livello ed ho desistito.
    Tornando al mio caso, ho fatto una pensata:
    Utilizzando la variabile booleana restituita dalla tua funzione di Relink così personalizzata,
    Function Relink(fdati As String) As Boolean
    Dim tdf As DAO.TableDef
    For Each tdf In DBEngine(0)(0).TableDefs
    If Len(tdf.Connect) > 0 Then
    tdf.Connect = fdati ' ";DATABASE ....."
    tdf.RefreshLink
    End If
    Next
    End Function
    mi riproponevo, (eventualmente mi fosse ritornato un valore falso), di lanciare alla bisogna, la funzione
    ' Compatta e ripara il database.
    Function RepairDatabase(Source As String, Destination As String) As Boolean
    RepairDatabase = Application.CompactRepair(Source, Destination)
    Kill Source
    Name Destination As Source
    End Function

    Stranamente la funzione RELINK mi restituisce sempre FALSO, mentre la REPAIRDATABASE mi ritorna sempre VERO. Eppure io so bene che il più delle volte è assolutamente sufficiente fermarsi ad un Relink.

    Pensi Alex che io stia commettendo un errore ?

    antonio.
Devi accedere o registrarti per scrivere nel forum
18 risposte