Popolare listbox

di il
9 risposte

Popolare listbox

Buongiorno a tutti
Ho un applicativo in access 2007, il mio problema è che devo popolare una list box cercando una stringa di testo su due tabelle differenti legate tra loro da un campo numerico.
Questa è la selezione :

SELECT an_clienti.ID, an_clienti.cognome, an_clienti.nome, an_clienti.indirizzo, an_clienti.codfisc, an_pazienti.nome
FROM an_pazienti RIGHT JOIN an_clienti ON an_pazienti.cliente = an_clienti.id
GROUP BY an_clienti.ID, an_clienti.cognome, an_clienti.nome, an_clienti.indirizzo, an_clienti.codfisc, an_clienti.fidelity, an_pazienti.nome
HAVING (((an_clienti.cognome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.fidelity) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.nome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_pazienti.nome) Like "*"+[forms]![avvio]![testo84]+"*"));

il mio problema è che se cerco in una casella di testo nel campo an_pazienti.nome, la list box si popola correttamente, ma se cerco nel campo an_clienti.nome o an_clienti.cognome, la list box si popola ripetendomi i record per quante volte è presente il campo an_pazienti.nome.

Avete una soluzione

Grazie a tutti

9 Risposte

  • Re: Popolare listbox

    Mannaggia a me che non so interpretare SQL. Almeno per me, se descrivi dettagliatamente:
    - tutte le tabelle con tutti i nomi campo
    - quali sono i campi col join
    - spieghi tutto quello che si vede in VISUALIZZAZIONE STRUTTURA query
    forse posso darti una mano anch'io.
  • Re: Popolare listbox

    Ti allego l'immagine in visualizzazione struttura :

    struttura1.jpg
    struttura1.jpg

    grazie
  • Re: Popolare listbox

    Mi spieghi la differenza fra le due tabelle an_clienti e an_pazienti?
  • Re: Popolare listbox

    andrea.corciano ha scritto:


    SELECT an_clienti.ID, an_clienti.cognome, an_clienti.nome, 
    an_clienti.indirizzo, an_clienti.codfisc, an_pazienti.nome
    
    FROM an_pazienti RIGHT JOIN an_clienti 
    ON an_pazienti.cliente = an_clienti.id
    GROUP BY an_clienti.ID, an_clienti.cognome, an_clienti.nome, 
    an_clienti.indirizzo, an_clienti.codfisc, an_clienti.fidelity, an_pazienti.nome
    
    HAVING (((an_clienti.cognome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.fidelity) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.nome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_pazienti.nome) Like "*"+[forms]![avvio]![testo84]+"*"));
    Questa sarebbe l'origine della listbox?
    Perché hai usato Having? quella si usa quando si devono fare "filtri" su campi oggetto di funzioni tipo Sum(), Min(), Max() eccetera (forse perché lo fa Access in automatico passando da QBE a SQL)

    Costruisci una query di selezione lineare
    SELECT an_clienti.ID, an_clienti.cognome, an_clienti.nome, 
    an_clienti.indirizzo, an_clienti.codfisc, an_pazienti.nome
    
    FROM an_pazienti RIGHT JOIN an_clienti 
    ON an_pazienti.cliente = an_clienti.id
    
    WHERE (((an_clienti.cognome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.fidelity) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_clienti.nome) Like "*"+[forms]![avvio]![testo84]+"*")) OR (((an_pazienti.nome) Like "*"+[forms]![avvio]![testo84]+"*"))
    
    GROUP BY an_clienti.ID, an_clienti.cognome, an_clienti.nome,
    an_clienti.indirizzo, an_clienti.codfisc, an_clienti.fidelity, an_pazienti.nome
    Sul fatto che ci siano più record con lo stesso [an_pazienti].[nome] quando cerchi nei campi di [an_clienti] è dovuto solo al fatto che... non lo so perché ma nella tabella [an_pazienti] il valore del campo cliente si ripete in una sorta di relazione uno a molti tra [an_clienti] ed [an_pazienti]. Bada bene che ho detto "sorta di relazione uno a molti", perché se hai impostato una query con RIGHT JOIN... c'è qualcosa che non va nelle tabelle e nei dati che vi sono inseriti (sembra che si siano ripetizioni dove non servono e che manchino dati dove dovrebbero esserci, da quello che hai pubblicato e da come hai descritto il risultato della query)
  • Re: Popolare listbox

    Grazie della risposta ti allego l'immagine del risultato della query

    Cattura1.JPG
    Cattura1.JPG

    questo cliente ha 3 animali e cercando il suo nome/cognome vengono fuori, giustamente 3 record,
    è possibile far sì che venga un solo record in questo caso??

    Grazie
  • Re: Popolare listbox

    An_pazienti erano gli Animali: adesso ho capito.
    Perchè ti servi di questa query per ricavare solo i dati del Cliente? ...sperando di aver capito il tuo obiettivo...
  • Re: Popolare listbox

    andrea.corciano ha scritto:


    grazie della risposta ti allego l'immagine del risultato della query
    questo cliente ha 3 animali e cercando il suo nome/cognome vengono fuori, giustamente 3 record,
    è possibile far sì che venga un solo record in questo caso??
    Sì, eliminando dal risultato della query ed dal raggruppamento il nome dell'animale, il campo [an_pazienti].[nome]. (e a questo punto anche [an_clienti].[fidelity] visto che non è tra i campi selezionati)
    Quindi la query diventa
    SELECT an_clienti.ID, an_clienti.cognome, an_clienti.nome,
    an_clienti.indirizzo, an_clienti.codfisc 
    FROM .... WHERE ...
    GROUP BY an_clienti.ID, an_clienti.cognome, an_clienti.nome,
    an_clienti.indirizzo, an_clienti.codfisc
  • Re: Popolare listbox

    Grazie mille

    Perfetto!!!!!
  • Re: Popolare listbox

    andrea.corciano ha scritto:


    Grazie mille
    Perfetto!!!!!
    (non era poi così difficile, eh? io non lo dico a nessuno, tu fa' quello che vuoi).
    Serve proprio il RIGHT JOIN? quelle due tabelle non hanno l'integrità referenziale? immaginando che un cliente sia tale solo perché ha un animale (altrimenti non diventa cliente). Pensa alla struttura del db, di queste due tabelle e di conseguenza anche a questa query, che con tutta probabilità può avere un normalissimo JOIN.
Devi accedere o registrarti per scrivere nel forum
9 risposte