Query di ricerca su boleano con combobox

di il
11 risposte

Query di ricerca su boleano con combobox

Buonasera a tutti, all’interno del mio database sto cercando di creare una query di ricerca, nella quale mi dia come risultato tutti i record nel quale una casella boleana sia flaggata, e fin qua tutto bene. Il problema mi sorge perché vorrei che dalla mia maschera iniziale, tramite un combobox si possa selezionare in quale delle colonne boleane la query debba andare a cercare il flag.
Per capirci

SELECT TPatenti.ID, TPatenti.PatA, TPatenti.PatB, TPatenti.PatC
FROM TPatenti
WHERE TPatenti.(dato preso dal combobox)=Vero

Come faccio a fargli andare a pescare il PatA, per esempio, da dentro il combo? Cosa devo scrivere dove ho messo la parentesi tonda?
Spero di essere stato chiaro, grazie in anticipo.

11 Risposte

  • Re: Query di ricerca su boleano con combobox

    Qualche cosa di confuso mi pare ci sia....!
    La tua Query deve avere come criterio una condizione che Equipari il CAMPO oggetto del Criterio con l'Oggetto che deve fornire il Valore...
    
    SELECT TPatenti.ID, TPatenti.PatA, TPatenti.PatB, TPatenti.PatC
    FROM TPatenti
    WHERE TPatenti.(NomeCampoTabella)=Forms!NomeFomr!NomeCheckBox
    Tieni presente che per aggiornare la Query ad ogni VARIAZIONE della CheckBox della Maschera, devi effettuare l'aggiornamento di tutti gli Oggetti DataBound collegati a questa Query, sfruttando il metodo REQUERY degli stessi su EVENTO AFTERUPDATE della CheckBox.
    
    Private Sub NomeCheckBox_AfterUpdate)
       ' In caso di una SubForm
       Me!NomeSuForm.Form.Requery
       ' In caso di una Combo
       Me!NomeCombo.Requery
       ' ecc...
    End Sub
  • Re: Query di ricerca su boleano con combobox

    Eh, mi scuso, sono ancora ‘novizio’ in materia, quindi probabilmente mi sono spiegato male. Non sono riuscito ad applicare quanto suggerito..Nel dubbio provo a rispiegarmi.
    Per farla più semplice, ho una tabella Patenti con Cognomi, PatenteA, PatenteB, PatenteC. Cognomi è testo, mentre le altre tre sono Si/No.
    La query che sto cercando di fare dovrà restituirmi tutti i Record con (esempio) la Patente A flaggata. Il problema mi sorge perché vorrei fare in modo che la scelta di quale campo debba pescare la query, mi venga da un menu a tendina su una maschera esterna, dal quale potrò selezionare Patente A, Patente B, Patente C. Come inserisco nel WHERE questo richiamo, è il successivo ‘vero’?
    Scusate ancora e grazie
  • Re: Query di ricerca su boleano con combobox

    Visto che i campi PatenteA, PatenteB, PatenteC sono di tipo logico e qualora la casella combinata permetta di selezionare una delle tre possibili patenti (come selezione di tipo testo: "PatenteA", "PatenteB", "PatenteC" corrispondenti ai nomi dei campi delle tre colonne) potrai implementare la query con cui effettui la ricerca, sfruttando la funzione EVAL che (in base al valore selezionato, nella combo-box) imposti il criterio a Vero (della colonna, corrispondente al campo) da applicare:
    https://support.office.com/it-it/article/funzione-eval-8c4a1b10-85ba-40db-b0c8-5290da4d4166
  • Re: Query di ricerca su boleano con combobox

    Perdonate l’ignoranza, ma posso usare Eval direttamente sulla query, o devo passare in VBA?
  • Re: Query di ricerca su boleano con combobox

    Se la Combo espone come BoundColumn il campo di Ricerca non serve usare EVAL, che si usa per recuperare il valore di Colonne non corrispondenti alla BoundColumn.

    In questo caso dovendo definire il Tipo di Patente, che non è assoggettato ad una Tabella Opzioni, ma deve essere un Riferimento di NomeCampo, credo convenga usare una Combo in Modalità RowSourceType=Elenco Valori e di conseguenza la BoundColumn potrebbe essere il Nome del Campo direttamente, ovviando all'uso di EVAL, sempre io abbia ben compreso l'idea di Willy.

    Penso tuttavia che l'idea di avere 3 Campi per definire le 3 Patenti potrebbe essere superato usando un solo Campo Numerico da valorizzare in modalità Booleana con Mascheratura...!

    Bit0=PatenteA
    Bit1=PatenteB
    Bit2=PatenteC

    Con un valore tra 0÷7 ottieni tutte le combinazioni.
    Per sapere se un utente ha la patente A, metti in AND il Valore con 1 (001 Boleano)
    Per sapere se un utente ha la patente B, metti in AND il Valore con 3 (010 Boleano)
    Per sapere se un utente ha la patente C, metti in AND il Valore con 5 (100 Boleano)
    Per sapere se un utente ha la patente A e C, metti in AND il Valore con 6 (101 Boleano)
    ecc...

    Ricordo che in SQL l'operatore Boleano AND si realizza con BAND, sicchè il primo esempio per cercare la Patente A:
    
    SELECT * From TableData WHERE (CampoValorePatente BAND 1)=0
    Saluti
  • Re: Query di ricerca su boleano con combobox

    Buonasera, e grazie per la pazienza fino a qua.
    Purtroppo, sicuramente per mia incompetenza, non sono riuscito a comprendere bene le situazioni proposte, e di conseguenza non ho risolto il problema.

    Per la soluzione dell'impiego dell'EVAL, non ho ben capito come implementarla.

    Per la soluzione di @Alex, le patenti nel mio caso vanno da A a H, di conseguenza le combinazioni diventerebbero moooolte di più. Avevo messo un esempio a 3 per semplificare la cosa.

    In definitiva, io ho una tabella composta da un campo riferimento (con anagrafica principale) e tanti campi Si/No quante sono le patenti.
    La Inner Join funziona tranquillamente.
    Quello che mi manca è completare la Query di Inner Join con un WHERE che mi restringa i risultati ai soli possessori di una determinata patente (anche solo una, non ho casi in cui devo cercare persone con più di una patente). La Patente da ricercare vorrei poterla selezionare da un menu a tendina (combobox), e da lì avviare la query. Ho impostato un combobox con i valori, ma non riesco a collegarlo con la query.

    Grazie di nuovo per la pazienza,

    Simone
  • Re: Query di ricerca su boleano con combobox

    Se posso dare una mano anch'io, gradirei però la completa elencazione di:
    - nomi propri delle tabelle
    - nomi propri di tutti i campi delle tabelle con indicazione della chiave primaria
    - le relazioni
    - nomi propri di maschere
    - rispiega tutto usando i nomi propri
  • Re: Query di ricerca su boleano con combobox

    Grazie..! Semplifico per quanto sgtrettamente necessario:

    La tabelle sono due:
    - TAnagrafica
    - TPatenti

    TAnagrafica ha 3 campi:
    - Cognome (Testo)
    - Nome (Testo)
    - CodiceFiscale (Testo, Chiave primaria)

    TPatenti ha 10 campi:
    - ID (Num auto, chiave primaria)
    - PersonalID (Testo)
    - PatA (Si/No)
    - PatB (Si/No)
    ........continua con C D E F G
    - PatH (Si/No)

    TAnagrafica è correlata con TPatenti con una relazione uno-a-molti tra TAnagrafica.CodiceFiscale e TPatenti.PersonalID.

    La maschera in cui si trova il combobox (Nome: Combo14) nel quale sono già inserite le voci (PatA, PatB, PatC......PatH) si chiama:
    - MainForm

    Io per ora ho creato una query con Inner Join per avere un complessivo di personale e patenti. Quello che cerco è poter mettere un WHERE alla query che mio restringa la restituzione di record a personale avente una determinata patente. Questa patente vorrei poterla selezionare dall'elenco della combobox.
    SELECT *
    FROM TAnagrafica INNER JOIN TPatenti ON TAnagrafica.[CodiceFiscale] = TPatenti.[PersonalID]
    WHERE '(qua è il problema, non trovo un modo per richiamare il campo tramite selezione da combobox)'=True 
    Spero sia tutto il necessario. Sicuramente ci saranno errori concettuali, sono alle prime armi con questo mondo. Qualsiasi eventuale correzione è estremamente bene accetta.
    Grazie mille e buona giornata..!
  • Re: Query di ricerca su boleano con combobox

    Schizzo ha scritto:


    La tabelle sono due:
    - TAnagrafica
    - TPatenti

    TAnagrafica ha 3 campi:
    - Cognome (Testo)
    - Nome (Testo)
    - CodiceFiscale (Testo, Chiave primaria)

    TPatenti ha 10 campi:
    - ID (Num auto, chiave primaria)
    - PersonalID (Testo)
    - PatA (Si/No)
    - PatB (Si/No)
    ........continua con C D E F G
    - PatH (Si/No)

    TAnagrafica è correlata con TPatenti con una relazione uno-a-molti tra TAnagrafica.CodiceFiscale e TPatenti.PersonalID.
    Io obietto questa struttura tabelle. Io penserei la struttura così:
    TAnagrafica: OK

    TPatenti
    LPatente (PK)(i valori saranno 7: A,B,C,D,E,F,G,H)

    TPersonePatentate
    IDPP (PK)
    DataPatente
    CodiceFiscale (FK)
    LPatente (FK)

    Relazioni:
    TAnagrafica.CodiceFiscale uno-a-molti TPersonePatentate.CodiceFiscale
    TPatenti.LPatente uno-a-molti TPersonePatentate.LPatente
  • Re: Query di ricerca su boleano con combobox

    Io obietto questa struttura tabelle. Io penserei la struttura così:
    TAnagrafica: OK

    TPatenti
    LPatente (PK)(i valori saranno 7: A,B,C,D,E,F,G,H)

    TPersonePatentate
    IDPP (PK)
    DataPatente
    CodiceFiscale (FK)
    LPatente (FK)

    Relazioni:
    TAnagrafica.CodiceFiscale uno-a-molti TPersonePatentate.CodiceFiscale
    TPatenti.LPatente uno-a-molti TPersonePatentate.LPatente
    Due dubbi: in questo caso, se una persona ha più di una patente, diventa scomodo da inserire o sbaglio?
    Se oltre alla patente dovessi associargli un campo (ad esempio, note, o scadenza per ogni patente) come potrei dover fare?
  • Re: Query di ricerca su boleano con combobox

    Schizzo ha scritto:


    in questo caso, se una persona ha più di una patente, diventa scomodo da inserire o sbaglio?
    Devi prevedere una maschera/sottomaschera MAnagrafica/SMPersonePatentate. Poi inserisci i "molti" dati nella sottomaschera come normalmente si fa.

    Schizzo ha scritto:


    Se oltre alla patente dovessi associargli un campo (ad esempio, note, o scadenza per ogni patente) come potrei dover fare?
    Io ho previsto un DataPatente, puoi aggiungere altri campi a TPersonePatentate, quindi anche Note, DataScadenzaPatente.
Devi accedere o registrarti per scrivere nel forum
11 risposte