Condividi tramite

Elencare Cartelle in una tabella.

Anonimo
2021-01-26T13:01:35+00:00

Salve a tutti.

Ho necessità di elencare in una tabella tutte le sottocartelle contenute in una specifica cartella.

Scenario:

Uso office 365, sto creando un piccolo DB per gestire il mio negozio di vino.

Le cartelle in questione vengono create in automatico (con sintassi standard) da un'altra sub per immagazzinare vari file relativi al prodotto.

A volte succede che a seguito di correzioni/modifiche di alcuni dati (per esempio il nome del produttore - che è utilizzato nella sintassi del nome cartella vino) andrebbe modificato anche il nome della cartella del vino (potrebbero essere coinvolti più vini e quindi più cartelle).

L'idea quindi è di creare un elenco delle cartelle esistenti, poi usare il comando Replace per aggiornare il nome cartella e poi il comando Name per rinominare effettivamente la Cartella.

Ho recuperato su questo forum, e leggermente modificato per adattarlo al mio caso, il seguente codice:

================================================================

Option Compare Database

Option Explicit

Sub Cartelle()

On Error GoTo errorHandler

DBEngine(0)(0).Execute "delete * from tb_Cartelle", dbFailOnError

 Dim strPath     As String

 Dim strFile     As String

 strPath = Form_m_Home!PercCart_Prodotti_m.Value

 strFile = Dir(strPath, vbDirectory)

Do While strFile <> ""

    If (GetAttr(strPath & strFile) And vbDirectory) = vbDirectory Then

        If strFile <> "." And strFile <> ".." Then

            DBEngine.BeginTrans

            DBEngine(0)(0).Execute "insert into tb_Cartelle (Cartelle) values ('" & strFile & "')", dbFailOnError

            DBEngine.CommitTrans

        End If

    End If

strFile = Dir

Loop

ext_errorLoadAccountHandler:

    Exit Sub

errorHandler:

    With Err

        DBEngine.Rollback

        MsgBox "ERR#" & .Number _

            & vbNewLine & .Description _

            , vbOKOnly Or vbCritical

     End With

     Resume ext_errorLoadAccountHandler

End Sub

================================================================

La sub in questione si avvia su evento "Su Caricamento" della maschera Home (che si avvia in automatico all'avvio del DB).

Però funziona solo in parte, mi estrae solo 2 delle 4 cartelle presenti e mi restituisce il seguente errore:

Cartelle presenti (a sx) e cartelle estratte (a dx) :

Non riesco a capire perchè il codice funziona solo in parte e si interrompe dando errore.

Qualcuno può darmi suggerimenti?

Spero di essermi spiegato e scusate per eventuali errori o mancanze (sono autodidatta alle prime armi....).

Grazie e cordiali saluti.

Enrico.

Microsoft 365 e Office | Accesso | 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
  1. domenico laurenza 9,900 Punti di reputazione Moderatore volontario
    2021-01-26T17:07:03+00:00

    Ciao,

    il problema era proprio nella terza cartella che ha come nome Nero D'Avola, l'apostrofo creava problemi nell'istruzione.

    Come dice Sandro l'utilizzo della transazione è consigliabile se hai più operazioni di aggiornamento delle tabelle in modo da ripristinare la situazione iniziale in caso di errori che non completano gli aggiornamenti. Nel tuo caso tu finalizzi con la Commit ogni registrazione e questo ti ha aiutato a capire che la terza cartella creava problemi.

    Ciao Mimmo

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2021-01-26T14:12:01+00:00

    ciao Enrico,

    approvo l'utilizzo delle transazioni, soprattutto se poste non nel loop ma all'esterno in modo da sfruttarne le potenzialita' altrimenti in tal modo non serve a nulla.

    Da migliorare il roolBack nel caso in cui si verifichi un errore nel loop e da sostituire la costante dbFailOnErron con &H80 o 128 e DBEngine.CommitTrans,1 al posto del solo DBEngine.CommitTrans.

    Se all'interno del nome di una cartella vi e' un apice che cosa succede?

     strPath = Form_m_Home!PercCart_Prodotti_m.Value secondo me, meglio passare la stringa come parametro alla sub.

    Pensaci su... :-)

    Ciao, Sandro.

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. domenico laurenza 9,900 Punti di reputazione Moderatore volontario
    2021-01-26T13:11:36+00:00

    Ciao,

    senza aver fatto delle prove posso dirti che l'apostrofo ti dà l'errore.

    Prova a cambiare l'istruzione

       DBEngine(0)(0).Execute "insert into tb_Cartelle (Cartelle) values ('" & strFile & "')", dbFailOnError

    con

       DBEngine(0)(0).Execute "insert into tb_Cartelle (Cartelle) values (""" & strFile & """)", dbFailOnError

    Ciao Mimmo

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  3. Anonimo
    2021-01-27T02:02:25+00:00

    Ciao Sandro

    Grazie per le indicazioni e suggerimenti, tra l'altro mi sembra che il codice sopra l'ho preso proprio da un tuo vecchio post su questo forum.

    Purtroppo molti concetti di Access ancora mi sfuggono, non sono riuscito a trovare un buon corso/libro da studiare e allora, man mano che arrivano i problemi, cerco di capire usando internet...

    Il problema dell'apostrofo mi era sfuggito anche perchè i nomi della cartella vegono prima verificati da una sub che, tramite vari replace, sostituisce con degli spazi i caratteri speciali non permessi nei nomi cartelle (ma ovviamente tra questi caratteri non c'è l'apice...).

    Ciao e grazie ancora per l'aiuto.

    Enrico.

    0 commenti Nessun commento
  4. Anonimo
    2021-01-26T13:55:28+00:00

    Ciao Mimmo

    Ho fatto quanto hai suggerito e sembra funzionare perfettamente.

    Grazie davvero per la disponibilità e tempestività.

    Magari puoi anche spiegarmi perchè non andava subito in errore ma estraeva il nome delle prime due cartelle?

    Grazie ancora.

    Ciao.

    Enrico.

    0 commenti Nessun commento