Tabelle collegate su usb o su disco fisso

di il
8 risposte

Tabelle collegate su usb o su disco fisso

Buongiorno, mi sono appena iscritta e sono neofita di VBA perché di solito creavo con l'autocomposizione, andavo a vedere il codice e lo modificavo come mi serviva, diciamo che imparo un po' alla volta dagli esempi e dai tutorial...

Ho un database FE le cui tabelle sono collegate al BE che ha lo stesso nome + il suffisso "Dati". Ho messo il BE su chiavetta USB che nel mio caso è "E:" ed ho modificato il codice in modo che cerchi su E anziché nella stessa cartella del FE. Fin qui tutto ok e quando apro il database le tabelle si collegano senza problemi.

Vorrei fare questo:
cerca il database Dati su E:
se non è collegata la usb, quindi E: non è disponibile,
cerca il database su C:

Avevo pensato di fare in modo con "dir" che controlli se c'è il file o no, ma poi non so come proseguire...
Probabilmente sbaglio qualcosa...
Grazie a chi mi risponderà!

8 Risposte

  • Re: Tabelle collegate su usb o su disco fisso

    lauradms ha scritto:


    ...Avevo pensato di fare in modo con "dir" che controlli se c'è il file o no, ma poi non so come proseguire...
    Probabilmente sbaglio qualcosa...
    Sotto questo aspetto non sbagli, è che non sai come proseguire quando non trovi il file, cioè come fare il relink

    lauradms ha scritto:


    ...
    Vorrei fare questo:
    cerca il database Dati su E:
    se non è collegata la usb, quindi E: non è disponibile,
    cerca il database su C:
    Il vero problema sta qui. Sai che impostato in questo modo sei vincolata a quel computer con quella particolare configurazione, facendo i debiti sconguiri (azione tipicamente informatica) che nessuno abbia cambiato la lettera attribuita al dispositivo usb ecc ecc ecc?
    Devi tenerti una scappatoia per poter scegliere il percorso nel caso in cui non sia né C: né E:
    Se non ricordo male c'era un thread che parlava di una cosa simile da qualche parte... ma non ci giuro.
    Intanto guarda questi:
    (per identificare le tabelle collegate e dove bisogna agire)
    (per chiudere il cerchio)
    ==
    Edit del 22/05/2017
    Ecco il link: Trovare la unita a cui collego una memoria di massa (grazie nman, visto che ho chiesto direttamente a lui)
  • Re: Tabelle collegate su usb o su disco fisso

    Scusa, non ho spiegato bene, ho tutto il codice (ovviamente non scritto da me) che collega le tabelle, con i vari codici errore in caso di database mancante ecc. che ripete il ciclo fino a ricollegare tutte le tabelle, in primo momento avevo pensato: dove c'è If....database non trovato, prima di msgBox, volevo inserire di fare di nuovo la ricerca cambiando il path da E: a C: cioè se non l'hai trovato su E: prova a cercarlo in C: se neanche qui lo trovi torna ai messaggi di errore ecc.., se invece lo trovi continua a collegare le tabelle.
    Evidentemente però non è possibile perché prima mi dava errore perché non avevo chiuso il FOR...EACH, poi errore di inizializzazione ecc.
    Quindi avevo pensato a DIR ma non riesco a capire la sintassi e in che punto metterla...
  • Re: Tabelle collegate su usb o su disco fisso

    lauradms ha scritto:


    ... volevo inserire di fare di nuovo la ricerca cambiando il path da E: a C: cioè se non l'hai trovato su E: prova a cercarlo in C: se neanche qui lo trovi torna ai messaggi di errore ecc.., se invece lo trovi continua a collegare le tabelle.
    Evidentemente però non è possibile perché prima mi dava errore perché non avevo chiuso il FOR...EACH, poi errore di inizializzazione ecc.
    Quindi avevo pensato a DIR ma ...
    Pubblica il codice, con i tuoi tentativi, anche se sbagliati. Così vediamo come e dove agire.
    Se ci sono varie versioni con errori diversi, indica il tipo e la descrizione dell'errore per ogni situazione e su quale riga si verifica.
  • Re: Tabelle collegate su usb o su disco fisso

    Buongiorno, mi scuso per il tempo che è passato, purtroppo ho avuto problemi di salute in famiglia e ho mollato tutto per un po'.

    Ecco il codice originale che allega le tabelle:

    Function AllegaTabelle() As Boolean
    Const NOT_EXISTENT_TABLE As Integer = 3011, DATABASE_NOT_FOUND As Integer = 3024, DATABASE_READ_ONLY As Integer = 3027, TABLE_USE_EXCLUSIVE As Integer = 3045, ACCESS_DENIED As Integer = 3051, TABLE_ON_OTHER_DATABASE As Integer = 3078
    Dim DB As Database, NumTabella As Integer, DatabaseFile As String, ValRestituito As Variant, Tabella As TableDef
    On Error Resume Next
    AllegaTabelle = False
    Set DB = CurrentDb()
    NumTabella = 1
    DatabaseFile = CurrentProject.Path & "\" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "_Dati" & Right(CurrentProject.Name, 4)
    CreaRelazione (DatabaseFile)
    ValRestituito = SysCmd(SYSCMD_INITMETER, "Si stanno allegando tutte le Tabelle", DB.TableDefs.Count)
    For Each Tabella In DB.TableDefs
    If Tabella.Connect <> "" Then
    Tabella.Connect = ";DATABASE=" & DatabaseFile & ";TABLE=" & Tabella.SourceTableName
    Err.Clear
    Tabella.RefreshLink
    If Err <> 0 Then
    If Err = NOT_EXISTENT_TABLE Then
    MsgBox "La Tabella """ & Tabella.SourceTableName & """ non è stata trovata nel Database.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = DATABASE_NOT_FOUND Then
    MsgBox "Il Database non è stato trovato.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = DATABASE_READ_ONLY Then
    MsgBox "Impossibile riallegare le Tabelle. Il Database è di sola lettura o si trova in una directory condivisa di sola lettura.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = TABLE_USE_EXCLUSIVE Then
    MsgBox "Impossibile riallegare le Tabelle. Il Database è già in uso per un'operazione di aggiornamento, riprovare più tardi.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    GoTo Uscita
    ElseIf Err = ACCESS_DENIED Then
    MsgBox "Impossibile aprire: Accesso negato al Database.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = TABLE_ON_OTHER_DATABASE Then
    MsgBox "La Tabella """ & Tabella.Name & """ è da collegare con un altro Database.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err <> 0 Then
    MsgBox "Impossibile collegarsi al Database, in quanto bloccato, danneggiato o inesistente.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    End If
    GoTo Uscita
    End If
    End If
    Salta:
    NumTabella = NumTabella + 1
    ValRestituito = SysCmd(SYSCMD_UPDATEMETER, NumTabella)
    Next Tabella
    AllegaTabelle = True
    Uscita:
    ValRestituito = SysCmd(SYSCMD_REMOVEMETER)
    Set Tabella = Nothing
    Set DB = Nothing
    If Not AllegaTabelle Then Chiudi ("Database")
    DoCmd.Maximize
    End Function

    Inizialmente avevo sostituito CurrentProjectPath con E: in modo che leggesse i dati dall'usb, fin qui OK
    Ma ora vorrei che controllasse E: se non lo trova che controllasse su C:
  • Re: Tabelle collegate su usb o su disco fisso

    In questa porzione di codice avevo provato a ripetere parte del codice perché cercasse in C

    DatabaseFile = "E:\" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "_Dati" & Right(CurrentProject.Name, 4)
    CreaRelazione (DatabaseFile)
    ValRestituito = SysCmd(SYSCMD_INITMETER, "Si stanno allegando tutte le Tabelle", DB.TableDefs.Count)
    For Each Tabella In DB.TableDefs
    If Tabella.Connect <> "" Then
    Tabella.Connect = ";DATABASE=" & DatabaseFile & ";TABLE=" & Tabella.SourceTableName
    Err.Clear
    Tabella.RefreshLink
    If Err <> 0 Then
    If Err = NOT_EXISTENT_TABLE Then
    MsgBox "La Tabella """ & Tabella.SourceTableName & """ non è stata trovata nel Database.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = DATABASE_NOT_FOUND Then
    DatabaseFile = "C:\" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "_Dati" & Right(CurrentProject.Name, 4)
    CreaRelazione (DatabaseFile)
    ValRestituito = SysCmd(SYSCMD_INITMETER, "Si stanno allegando tutte le Tabelle", DB.TableDefs.Count)
    For Each Tabella In DB.TableDefs
    If Tabella.Connect <> "" Then
    Tabella.Connect = ";DATABASE=" & DatabaseFile & ";TABLE=" & Tabella.SourceTableName
    Err.Clear
    Tabella.RefreshLink
    If Err <> 0 Then
    If Err = NOT_EXISTENT_TABLE Then
    MsgBox "La Tabella """ & Tabella.SourceTableName & """ non è stata trovata nel Database.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"
    ElseIf Err = DATABASE_NOT_FOUND Then
    MsgBox "Il Database non è stato trovato.", vbCritical + vbOKOnly + vbMsgBoxSetForeground + vbApplicationModal, "Operazione interrotta"

    e poi continuava come l'originale

    Mi dava un problema con FOR EACH quindi avevo provato ad aggiungere EXIT FOR ma comunque non funzionava.
    Probabilmente è assurdo ripetere il codice... mi sa che devo studiare ancora un po'...
    .. qualcuno ha qualche dritta da darmi per sapere in che direzione posso approfondire?
    Grazie
  • Re: Tabelle collegate su usb o su disco fisso

    Commetti grossi errori di LOGICA... oltre a non usare i TAG CODE che rendono illeggibile il codice.

    In sostanza, PRIMA di partire con il RELINK si controlla se, il FILE di destinazione esiste, quindi se il Path è valido... e se non lo è si consente di effettuare la selezione alternativa.
    Il ciclo di Relink di conseguenza è il medesimo, sarebbe assurdo dover riscrivere tutto quel codice N volte... è già scritto... basta usarlo bene...!
  • Re: Tabelle collegate su usb o su disco fisso

    Ok scusa per i tag ... non sono pratica ancora... Quindi dovrei provare con FileExist e poi aggiornare il path di conseguenza, se ho capito bene
  • Re: Tabelle collegate su usb o su disco fisso

    lauradms ha scritto:


    ... dovrei provare con FileExist...
    o con Dir:
    Dir Function
    Di funzioni "preconfezionate" per la verifica dell'esistenza di un file è pieno il web.
    Per la "gestione" dell'intera fase di relink credo che @Alex abbia abbondanza di codice per ogni occasione.
Devi accedere o registrarti per scrivere nel forum
8 risposte