Funzione Dir in query

di il
22 risposte

Funzione Dir in query

Ho una tabella DettagliSupporti avente anche un campo di nome Indice. In Indice, se la stringa inizia per \Arti\…ecc vuol dire che corrisponde a un path. Siccome ho rivoluzionato la logica delle cartelle interne a Arti, ossia cambiato di posizione molti file, per quanto abbia sostituito coerentemente i nuovi path, credo che alcuni non funzionano e/o non siano coerenti. Ho pensato di fare un test creando una query così:

1. Al campo Indice ho messo il criterio “\Arti\*”
2. Aggiunto un campo
StringaPath: [CurrentProject].[Path] & [Indice]
che funziona
3. Aggiunto un campo
EsistePath: IIf(Dir([StringaPath])<>"";"S";"N")

Quando eseguo la query, appare un messaggio di errore Funzione Dir non definita nell'espressione.

Cosa sbaglio? In passato avevo usato Dir in VBA. Si può usare anche nelle query?

22 Risposte

  • Re: Funzione Dir in query

    La risposta giusta è che stai facendo una cosa tecnicamente sbagliata, una cavolata.

    E' un errore di sostanza pensare sia giusto ed utile creare una struttura di Cartelle annidate quando si ha un Database Relazionale…!

    Detto questo che chiaramente si scontra con la tua poca esperienza, il problema è dato da una Gestione della sicurezza di Access(o meglio JET Engine) che blocca le funzioni potenzialmente critiche e DIR lo sarebbe per lui.

    Serve cambiare il valore di una Chiave di registro se non ricordo male, dal valore NATIVO=[3] al valore [2]

    HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines

    https://renenyffenegger.ch/notes/Windows/registry/tree/HKEY_LOCAL_MACHINE/Software/Microsoft/Office/application_version/Access-Connectivity-Engine/Engines/index

  • Re: Funzione Dir in query

    20/07/2023 - @Alex ha scritto:


    La risposta giusta è che stai facendo una cosa tecnicamente sbagliata, una cavolata.

    E' un errore di sostanza pensare sia giusto ed utile creare una struttura di Cartelle annidate quando si ha un Database Relazionale…!

    Ciao a tutti,

    ma non farebbe prima con due righe di codice ?  e magari anche senza la Dir… magari con FileSystemObject  FolderExists ?

    Io farei così ;-) 

  • Re: Funzione Dir in query

    Franco, no quella gestione di cartelle non è da fare a prescindere…! E' frutto di una mal gestione del sistema, se ti serve un File lo prendi dall'applicativo non vai nella cartella a scorazzare, poi cambi il Nome del File perchè non ti piace e come riallinei il DB…?
    L'esempio più chiaro è proprio quella bella idea che ha avuto Osvaldo di RIVOLUZIONARE la logica delle cartelle… ma chi fa una roba del genere…? A che pro…?

    Detto questo usare una UDF con accesso a LIB esterne in una Query non è una grandissima idea… ;-)

  • Re: Funzione Dir in query

    Non me la sento di mettere mano a file di registro e combinare pasticci per un semplice check che devo fare. 

    Mi vengono in mente un paio di soluzioni alternative:
    A) Usare una Public Function e usare lì Dir con normale sintassi anche completa: chissà se funziona!
    B) Ciclare il recordset controllandolo con Dir, quindi prendere i path errati e trasferirli su una tabella di comodo.

  • Re: Funzione Dir in query

    20/07/2023 - By65Franco ha scritto:


    ma non farebbe prima con due righe di codice ?  e magari anche senza la Dir… magari con FileSystemObject  FolderExists ?

    …cioè una soluzione simile alla mia B)? Altrimenti puoi spiegarti meglio?

  • Re: Funzione Dir in query

    20/07/2023 - @Alex ha scritto:


    Franco, no quella gestione di cartelle non è da fare a prescindere…!

    Certo, sotto questo aspetto sono d'accordo con te.

  • Re: Funzione Dir in query

    20/07/2023 - OsvaldoLaviosa ha scritto:


    Mi vengono in mente un paio di soluzioni alternative:

    Se vuoi continuare con la Query si, una delle due….
    Vai in un modulo crei una public function … esempio:

    Public Function MyDirCheck(tuoParametro As String) As Boolean
    It Dir(TuoControllo) Then MyDirCheck = True Else MyDircCheck = False
    End If

    E dalla Query richiami la Function, gli passi la Folder da testare e ti ritorna True or False

  • Re: Funzione Dir in query

    20/07/2023 - OsvaldoLaviosa ha scritto:


    …cioè una soluzione simile alla mia B)? Altrimenti puoi spiegarti meglio?

    Visto che la query l'hai già fatta …. fai la function di test

    Ma però cambiare logica come dice @Alex ? non ti conviene visto che ci metti mano ?

  • Re: Funzione Dir in query

    20/07/2023 - @Alex ha scritto:


    L'esempio più chiaro è proprio quella bella idea che ha avuto Osvaldo di RIVOLUZIONARE la logica delle cartelle… ma chi fa una roba del genere…? A che pro…?

    ;-))  ma perchè a me non capitano mai stè cose ? ;-) … e vabbè, quando la fantasia eccede poi qualcosa del genere scappa sempre fuori. E giustamente bisogna porre rimedio e non mettere delle toppe. A meno che non si abbia scelta ….

  • Re: Funzione Dir in query

    Nel 3° campo della query ho scritto:
    EsistePath: fCheck([StringaPath])

    Ho creato una Public Function in un Modulo scritta così:

    Public Function fCheck(StringaPath As String) As String
    Dim strCheck As String
    If Dir(StringaPath, vbDirectory) <> "" Then
       strCheck = "Sì"
       Else
       strCheck = "No"
    End If
    fCheck = strCheck
    End Function

    …non importa che ho scelto String (anzichè Boolean)…il tutto funziona secondo le previsioni.

    Grazie By65Franco.

  • Re: Funzione Dir in query

    20/07/2023 - OsvaldoLaviosa ha scritto:


    Nel 3° campo della query ho scritto:
    EsistePath: fCheck([StringaPath])

    Ho creato una Public Function in un Modulo scritta così:

    Public Function fCheck(StringaPath As String) As String
    Dim strCheck As String
    If Dir(StringaPath, vbDirectory) <> "" Then
       strCheck = "Sì"
       Else
       strCheck = "No"
    End If
    fCheck = strCheck
    End Function

    …non importa che ho scelto String (anzichè Boolean)…il tutto funziona secondo le previsioni.

    Grazie By65Franco.

    Non avresti potuto usare Boolean scritta così…

  • Re: Funzione Dir in query

    20/07/2023 - OsvaldoLaviosa ha scritto:


    Nel 3° campo della query ho scritto:
    EsistePath: fCheck([StringaPath])

    Ho creato una Public Function in un Modulo scritta così:

    Public Function fCheck(StringaPath As String) As String
    Dim strCheck As String
    If Dir(StringaPath, vbDirectory) <> "" Then
       strCheck = "Sì"
       Else
       strCheck = "No"
    End If
    fCheck = strCheck
    End Function

    Impostala meglio…. snellisci ;-)

    Public Function fCheck(StringaPath As String) As String
    If Dir(StringaPath, vbDirectory) <> "" Then fCheck = "Sì" Else fCheck = "No"
    End Function

    Perchè dichiarare una variabile stringa quando già ce l'hai ?

    ;-)

  • Re: Funzione Dir in query

    Public Function fCheck(StringaPath As String) As String
        fCheck = "No"
        If Dir(StringaPath, vbDirectory) <> vbNullString Then fCheck = "Sì"
    End Function
  • Re: Funzione Dir in query

    21/07/2023 - @Alex ha scritto:


    Public Function fCheck(StringaPath As String) As String
        fCheck = "No"
        If Dir(StringaPath, vbDirectory) <> vbNullString Then fCheck = "Sì"
    End Function

    ;-))   perchè @Alex l'Else no ?

Devi accedere o registrarti per scrivere nel forum
22 risposte