Casella di ricerca

di il
6 risposte

Casella di ricerca

Il problema che vi sottopongo è il seguente: devo selezionare da una tabella preimpostata un nome di strada.
La tabella consta di 2 campi su cui lavorare: TIPOLOGIA (ad es. "via", o "piazza", o "largo" ...) e il NOME della strada ("Garibaldi", "Italia", etc.)

Diciamo che ho risolto con una combo, nella quale io digito il nome della strada e posso scegliere l'opzione che mi serve.
Ma in un'ottica di miglioramento, dovendo scegliere (ad esempio) "Largo di Palazzo", la casella "tipologia" ovviamente mi restituisce la parola "Largo", ma se digito "Palazzo" nella casella del nome, lui non mi da niente; dovrei scrivere "di Pal" per vedermi restituire il nome esatto. Tempo fa vidi che in Sql (e forse lì è più fattibile) che mettendo "pala", restituiva una serie di opzioni tra cui "Largo di Palazzo" (esattamente come l'ho scritto), cioè prendeva "Palazzo" come chiave di ricerca e la abbinava non solo alla Tipologia, ma ci metteva anche le parole mancanti. E' possibile farlo anche in Access o è meglio lasciare così com'è?
Ho provato anche a usare Docmd.find e settarlo in modo da ricercare direttamente "parte del campo", ma mentre in locale funziona benissimo, in tabella collegata con ODBC è molto problematica, dal momento che prima di poter aprire la casella di ricerca, deve caricare tutta la tabella, e considerando quasi 4.000 strade, l'attesa è lunga e snervante.
Si accettano opinioni.

6 Risposte

  • Re: Casella di ricerca

    C'è qualcosa di spinoso in questo problema...cercherò di orientare il mio punto di vista. Pare che gli Stradari (anche quelli allegati agli elenchi telefonici) seguano delle "loro" regole di "indicizzazione" strade. Per esempio prima il Cognome, mentre per Largo di Palazzo si dà la precedenza alla parola Palazzo.
    Io imposterei una tabella Strade con i seguenti campi:
    IDStrada
    StradaIndicizzato
    StradaVisualizzato

    In StradaIndicizzato ci vanno valori tipo "Turati Filippo, Via" / "Palazzo, Largo di"
    In StradaVisualizzato ci vanno i corrispondenti valori "Via Filippo Turati" / "Largo di Palazzo"

    L'utente non è tenuto a ricordare se si tratta di Via, Piazza, Largo...generalmente deve puntare alla stringa significativa, quindi digitare Palazzo.
    Può capitare che non sappia la regola e se scrive "di Palazzo" non troverà nulla...qua la questione si complica davvero. Occorre una soluzione totalizzante (qua barcollo un po')...oppure "aggirare" gli ostacoli. Per esempio si potrebbe imporre che la casella combinata abbia 3 colonne e 2 possibili "query" che la governano. La prima di default qStradeIndicizzate con la 2a colonna su StradaIndicizzato. La seconda qStradeVisualizzate con la 2a colonna StradaVisualizzato.
    Si può pensare a un comando che commuta la differente query di Origine riga per dare la possibilità di digitare partendo dalla Tipologia...che direi di includere totalmente/direttamente nella strada stessa.

    Non so se ho risposto coerentemente alla richiesta. Ho solo proposto una "via" che minimizza i danni.
  • Re: Casella di ricerca

    OsvaldoLaviosa ha scritto:


    [...]
    Io imposterei una tabella Strade con i seguenti campi:
    IDStrada
    StradaIndicizzato
    StradaVisualizzato

    In StradaIndicizzato ci vanno valori tipo "Turati Filippo, Via" / "Palazzo, Largo di"
    In StradaVisualizzato ci vanno i corrispondenti valori "Via Filippo Turati" / "Largo di Palazzo"
    L'utente non è tenuto a ricordare se si tratta di Via, Piazza, Largo...generalmente deve puntare alla stringa significativa, quindi digitare Palazzo.
    A questo avevo pensato anche io, solamente che mi toccherebbe "ritoccare" (e di brutto, anche) la tabella per poter passare anche le congiunzioni dal nome della strada alla tipologia; insomma un lavoraccio, considerato che la città dove vivo ha "appena" 3478 strade diverse...

    OsvaldoLaviosa ha scritto:



    Può capitare che non sappia la regola e se scrive "di Palazzo" non troverà nulla...qua la questione si complica davvero. Occorre una soluzione totalizzante (qua barcollo un po')...oppure "aggirare" gli ostacoli. Per esempio si potrebbe imporre che la casella combinata abbia 3 colonne e 2 possibili "query" che la governano. La prima di default qStradeIndicizzate con la 2a colonna su StradaIndicizzato. La seconda qStradeVisualizzate con la 2a colonna StradaVisualizzato.
    Si può pensare a un comando che commuta la differente query di Origine riga per dare la possibilità di digitare partendo dalla Tipologia...che direi di includere totalmente/direttamente nella strada stessa.

    E qui barcollo io, perdonami ...
    Puoi spiegarmi in modo più ... diciamo così ... maccheronico? Mi sono un pò perso ...

    OsvaldoLaviosa ha scritto:


    Non so se ho risposto coerentemente alla richiesta. Ho solo proposto una "via" che minimizza i danni.
    La coerenza c'è tutta, per carità; quello che non mi è chiaro è la soluzione di due query ...
  • Re: Casella di ricerca

    QStradeIndicizzate
    1. Crea una nuova query in visualizzazione struttura
    2. Importa la tabella Strade
    3. Trascini nell'ordine i campi IDStrada, StradaIndicizzato, StradaVisualizzato
    4. Metti Ordinamento: Crescente su StradaIndicizzato
    5. Salva con nome qStradeIndicizzate

    qStradeVisualizzate
    1. Crea una nuova query in visualizzazione struttura
    2. Importa la tabella Strade
    3. Trascini nell'ordine i campi IDStrada, StradaVisualizzato, StradaIndicizzato
    4. Metti Ordinamento: Crescente su StradaVisualizzato
    5. Salva con nome qStradeVisualizzate

    La casella combinata IDStrada avrà le proprietà:
    Numero colonne: 3
    Larghezza colonne: 0 cm; 5 cm; 5 cm
    Larghezza elenco: 10 cm
    Origine riga: qStradeIndicizzate

    Fin qui credo non ci siano problemi. L'utente deve digitare i primi caratteri della strada secondo le "regole" che dicevo prima (es. Cognome...).
    Per "Largo di Palazzo" l'utente potrebbe digitare "di Palazzo" non trovando nulla. Però...come se mi aspetto che lui sappia che si tratta di Largo...e qualche cosa che non ricorda... A questo punto la qStradeIndicizzate non aiuta, forse è meglio servirsi della qStradeVisualizzate. Allora:
    1. In visualizzazione struttura maschera aggiungi un pulsante che fa questo:
    Private Sub NomePulsante_Click()
    If Me!IDStrada.RowSource = "qStradeIndicizzate" Then
        Me!IDStrada.RowSource = "qStradeVisualizzate"
        Else
        Me!IDStrada.RowSource = "qStradeIndicizzate"
    End If
    End Sub
    2. Salva tutto

    L'utente si accorge di essere in difficoltà, clicca sul Pulsante e cambia l'Origine della casella combinata facendo in modo che l'utente possa scrivere "Largo" ...e poi vedere tutto il resto.
    Se l'utente vuole rivedere l'ordinamento strade precedente, gli basterà cliccare nuovamente sul Pulsante.

    So di averti fornito una soluzione "meno dolorosa" dal punto di vista della programmazione. Per prevedere più casistiche di "indecisione utente", ossia proprio la possibilità di prelevare solo una "porzione" di stringa, occorre un ragionamento più complesso...che al momento (confesso) mi sfugge o non ci arrivo.
  • Re: Casella di ricerca

    Non era quello che avevo in mente.

    Quello che avevo in mente era partire almeno da una stringa della strada.

    Mi spiego meglio:
    Esiste qui una via che si chiama "Viale della Villa Romana", però tutti la conosciamo come "Via Villa Romana".

    A me interessa che l'operatore inserisca in una casella di testo, o una combo, ... che so: "Villa" e il sistema, in una casella di riepilogo, mi faccia vedere:
    |----------------------------------------|
    | Via | della Villa Romana..........|
    |----------------------------------------|

    Così che io posso cliccare direttamente sulla strada all'interno della casella di riepilogo e il problema è passato.
    Perché al momento, in una combo devo iniziare a scrivere "della Villa" (per dire....), e quindi il sistema mi propone la casella di riepilogo; però, come il nome effettivo della strada non sempre è quello che conosciamo, le cose sono due:
    - o metto un pulsante con la funzione Docmd.Find (e quindi dobbiamo attendere che il sistema carichi tutta la tabella; cosa che in locale è rapidissima, ma via ODBC è davvero uno strazio)
    - o trovo una soluzione che, in una combo, inserisco una stringa e la casella di riepilogo mi indichi le varie opzioni, indipendentemente da quello che trovo prima della stringa
  • Re: Casella di ricerca

    Secondo me non puoi ottenere una cosa del genere direttamente da una combo. Considera che una stringa "interna" conduce comunque a più risultati, immagina:
    Via della Villa Romana
    Via Claudio Villa
    Via della Villa Campana
    Villa Giuseppe Garibaldi

    Di conseguenza ti servi di una query con inserimento di un parametro del tipo
    LIke "*" & [Inserisci una stringa significativa] & "*"
    Crei una maschera continua che poggia su questa query. La maschera mostrerà più record possibili, quindi l'utente sceglie il record che gli serve e un comando (clic di pulsante) imposta il valore IDStrada.
  • Re: Casella di ricerca

    Riprendo questo post dell'anno scorso per comunicarvi che alla fine ho risolto in maniera saggia (come del resto è stato già suggerito in questo post).

    In pratica mi sono scaricato dal portale della P.A. di riferimento tutto lo stradario completo in formato .xls, me lo sono importato in access e ho modificato la tabella inserendo un ulteriore campo definito KEY

    Premetto che per le congiunzioni apostrofate, ho preferito mettere uno spazio tra l'apostrofo e il nome, effettuando un Replace con una query di aggornamento settata in modo che tutti i "L'A", "L'E", "L'I", "L'O" e "L'U" avessero, tra l'apostrofo e la vocale, uno spazio.

    Quindi, sempre con una query di aggiornamento, ho effettuato una Replace nella nomenclatura delle strade dove ci sono gli spazi, e, per una mia comodità personale, ho preferito rimpiazzare quindi gli spazi tra un nome e un cognome, e tra una congiunzione e un nome, con un cancelletto "#" sempre tramite un REPLACE in una query di aggiornamento.

    A questo punto ho creato un Recordset e, strada per strada, ho analizzato la nomenclatura del record in modo che lo stesso fosse ripetuto per N volte in base a quante parole era formato il nome della strada.
    Ovviamente nella routine ho fatto in modo che il sistema memorizzasse la posizione dei cancelletti (#) e così da effettuare un MID() esatto.
    Inoltre, per le strade con una sola parola nella toponomastica (tipo "Via Bari", "Via Roma"), ho fatto in modo che la routine si basasse sul valore "0" di InStr per riprendere pari pari il nome della strada.

    Quindi adesso, per una Via del Principe Amedeo D'Aosta, in primis ho separato "D'" e "Aosta" (quindi è diventato "Principe Amedeo D' Aosta"), dopodiché ho creato 4 record identici in tutto fuorché della chiave (non indicizzata e non primaria).
    Pertanto ho:

    Principe - Principe Amedeo D' Aosta - Via
    Amedeo - Principe Amedeo D' Aosta - Via
    D' - Principe Amedeo D' Aosta - Via
    Aosta - Principe Amedeo D' Aosta - Via

    A questo punto ho creato una form di tipo pop-up con una casella per la Key e una casella di riepilogo basata sulla parola della KEY.
    Una volta digitata la key, effettuo il requery della casella Elenco dove appaiono le strade, ci clicco sopra e il sistema aggiorna automaticamente la form principale.
    Per una comodità di ricerca, la casella della KEY è una combo con obbligo di selezione dall'elenco (così per evitare allarmismi).

    Adesso i colleghi già li trovo più sorridenti e meno incaxxati (con il sottoscritto).
    Grazie a chi mi aveva dato quel salomonico suggerimento
Devi accedere o registrarti per scrivere nel forum
6 risposte