Visualizzazione post con etichetta Access VBA. Mostra tutti i post
Visualizzazione post con etichetta Access VBA. Mostra tutti i post

mercoledì 4 gennaio 2012

[Access VBA] Ricerca Multi-Tabella

Descrizione :
Un mio esempio pratico VBA per ricercare una determinata stringa in tutte le Tabelle e Campi di un DB.

+ Articolo :

Inserisco nel Blog questa mia soluzione VBA, data tempo fa ad un utente che chiedeva come
cercare una determinata stringa in tutti i Campi di tutte le Tabelle di un DB Access, utilizzando codice VBA.
Sebbene la richiesta possa sembrare singolare, questo è quel genere di cose che non si trovano certo nei primi 10 risultati di Google, e quindi a maggior ragione nel mio Blog non può mancare.

Il processo illustrato di seguito tiene traccia dell'eventuale nome Tabella e relativo nome Campo in cui la ricerca è andata a buon fine.
Il risultato è una Collection di stringhe con tutte le occorrenze ottenute, che può essere successivamente ciclata, e ad esempio scritta in altro DB, su file, ecc...

--> Codice Esempio :
    Dim ricerca As String
    ricerca = "prova"
    
    Dim nomeTabella As String
    Dim nomeCampo As String
    
    Dim Risultati As New Collection
    
    Dim n As Variant
    Dim risultato As Variant
    Dim T As TableDef
    Dim F As Field
    
    For Each T In CurrentDb.TableDefs
        If Left(T.Name, 4) <> "MSys" Then
            For Each F In T.Fields
                On Error Resume Next
                n = DLookup("[" & F.Name & "]", T.Name, "[" & F.Name & "]='" & ricerca & "'")
                If Err.Number = 0 And n = ricerca Then
                    risultato = ricerca & " trovato su " & T.Name & " / " & F.Name
                    Risultati.Add risultato
                End If
                Err.Clear
            Next F
        End If
    Next T
    
    'For Each risultato In Risultati
    '    MsgBox risultato
    'Next risultato

Il controllo sui possibili errori della DLookup(), unito all'esclusione delle Tabelle di sistema,
rende il codice già abbastanza "robusto" pur mantenendo la sua semplicità e adattabilità a vari casi.

Ho volutamente lasciato le ultime 3 linee commentate per mantenere un'idea di test dei risultati ottenuti. Nel caso reale ovviamente, è meglio evitare di correre il rischio di ricevere un "treno" di MessageBox.

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.




sabato 29 ottobre 2011

[Access VBA] Su Maschere e Query Parametriche

Descrizione :
Una tecnica interessante per collegare Maschere basandosi sull'uso avanzato delle Query Parametriche e minimizzando la scrittura di codice VBA.

+ Articolo :

L'esempio si basa su una Tabella "globale", da cui prelevare i dati.
In breve, la struttura della Tabella è la seguente :

id - contatore - PK [1,2,...]
IP - testo [192.168.1.1 , 192.168.1.2 , ... ]
HOST - Testo
LOGON - Testo
DOMINIO - Testo

Nell'esempio che segue risolvo il passaggio tra la Maschera TROVA ( con 3 controlli di tipo TextBox : TIP, THOST, TLOGON ) e la Maschera VISUALIZZA ( che contiene gli stessi controlli ma in modalità sola lettura e visualizza il risultato della ricerca, un record per volta ).

Per gestire il passaggio servono veramente poche righe di VBA, e inoltre grazie all'uso di un'opportuna Query Parametrica, si risolve alla radice ogni possibile problema di errore nell'inserimento da parte dell'utente.

I due vantaggi principali di questa tecnica sono :
1. La Query Parametrica risolve implicitamente i casi d'errore inserimento utente ( TextBox vuota, formati non previsti, ecc... ), che nella peggiore ipotesi porterebbero ad un crash del processo, risparmiando parecchie righe di controllo VBA.
2. Si evita l'approccio comune di concatenare direttive Sql e valori, con tutte le eccezioni che questo può portare.

Anzitutto, la Query Parametrica. Ovviamente prende i dati dalla tabella globale.
La creo in struttura così ( un'immagine vale più di mille parole ) :


Come si vede, nei criteri di IP, HOST e LOGON, i Parametri fanno riferimento diretto ai controlli sulla Maschera TROVA. Questo accorgimento risparmia in un colpo solo decine e decine di righe VBA.
Salvo la Query e la nomino "Query_TROVA".

A questo punto la Maschera TROVA passa in automatico i propri parametri alla Maschera VISUALIZZA.

--> Maschera TROVA :

Sulla Maschera TROVA c'è il pulsante "cmd_trova", che applica i criteri dell'utente.
L'unico codice necessario è per il pulsante :

Private Sub cmd_trova_Click()

    DoCmd.OpenForm "VISUALIZZA", acNormal, , , acFormReadOnly

End Sub


Con acFormReadOnly la rendo di sola lettura, come desiderato.

--> Maschera VISUALIZZA :

La Maschera VISUALIZZA può essere creata tranquillamente a partire dalla Tabella globale, con creazione guidata. Al momento del Load(), semplicemente si andrà a ridefinire il suo RecordSource.
Perciò l'unico codice necessario è questo :

Private Sub Form_Load()

    Me.RecordSource = "Query_TROVA"

End Sub


Query_TROVA è la nostra brava Query Parametrica di cui sopra, e posso passarne il nome
come stringa direttamente al RecordSource della Maschera. Comodo no ?

+ Fine Articolo.

Un Click su "Mi Piace" è il modo migliore per ringraziare l'autore di questo articolo.



 
Design by Free WordPress Themes Modificato da MarcoGG