Access 2007-problema con query parametrica

di il
3 risposte

Access 2007-problema con query parametrica

Ciao a tutti,
vi espongo quello che vorrei ottenere da una query parametrica usando Access 2007.Ho una tabella "anagrafe" con dieci campi.
Ho fatto una query parametrica che ha tre parametri ed usa come parametri le caselle di testo :"cognome" , "paese" ,"indirizzo".
Se rispondo a tutti e tre i parametri ho un comportamento corretto ,se invece ne salto uno non ottengo alcun risultato.
I comportamenti che vorrei sono due e cioè:
1-Se per esempio alla richiesta del cognome metto "TIZIO" e salto le risposte alle altre due domande (paese e indirizzo) vorrei ottenere tutti i record col campo cognome= TIZIO ma con gli altri due campi (paese e indirizzo) aventi qualsiasi valore.
2-Oltre a cio' la query mi deve restituire i record che hanno la corrispondenza coi valori dei parametri inseriti ma non i campi che non hanno valore (se ce ne sono) .Quindi per spiegarmi meglio vorrei ottenere record composti da solo sei campi se i rimanenti quattro campi non hanno alcun valore inserito.
Confido in un vostro prezioso suggerimento !
Grazie ancora.
Carlo

3 Risposte

  • Re: Access 2007-problema con query parametrica

    Evidentemente il predicato SQL che hai usato non prevede che in caso di assenza di un Parametro il Filtro non consideri il parametro stesso... purtroppo non vedendo il predicato non posso darti altre indicazioni.

    Allego questo tutorial
    
    Capita di dover scrivere Queries che comprendano PARAMETRI riferiti a Controlli presenti in Maschere, la situazione più evidente è l'uso di COMBOBOX per la selezione di Criteri.
    codice:
    
    SELECT * FROM T1
    WHERE [CampoX]=Forms!NomeForm!NomeCombo
    
    Nel caso in cui la Combo abbia valori NULLI la query restituirebbe tutti i record corrispondenti, probabilmente ZERO, ma spesso si vorrebbe venissero mostrati tutti come se il Criterio non fosse inserito.
    
    Per ovviare a questo comportamento, che non è un'errore, si può scrivere diversamente il predicato SQL
    codice:
    
    SELECT *
    FROM T1
    WHERE [CampoX]=Forms!NomeForm!NomeCombo OR Forms!NomeForm!NomeCombo IS NUll;
    
    Questo predicato è valido per tutti i Tipi di Campo(Date,Numeri,Testo...) ed evita il Casting dei dati che avverrebbe con l'uso del LIKE ...."*"
    
    Chiaramente applicabile anche con HAVING.
    
    La spiegazione tecnica del predicato si ottiene sostituendo ai 2 Criteri messi in OR LOGICO il valore logico risultante:
    codice:
    
    SELECT *
    FROM T1
    WHERE FALSE OR TRUE;
    
    La logica Booleana dice che [FALSE OR TRUE] = TRUE quindi è come definire la selezione di TUTTI i records senza un criterio.
    
    
    
    Tuttavia vorrei far notare che l'ottimizzazione delle Queries è una cosa seria che purtroppo nessuno degli utenti di Access fa, e che richiede la valutazione dei piani di esecuzione delle Queries per capire quale predicato venga eseguito con minor impatto ad ogni passata.
    Ci sono predicati SQL che obbligano JET ad effettuare N Volte esecuzioni parziali del predicato ed a valutarne il risultato in un ulteriore passaggio, e questo accade per ogni RECORD.
    Il risultato è avere Queries LENTE e non si capisce il perchè, e spesso si incolpa, per incompetenza, Access(JET) come motore di DB non performante...! 
    @Alex
  • Re: Access 2007-problema con query parametrica

    Ciao,nello scrivere i parametri della query in visual.struttura,inserisci il primo parametro nel campo "criteri",il secondo parametro nel campo "oppure",il terzo parametro,un record più in basso.visualizzando la query in SQL,vedrai che alla condizione HAVING invece di avere AND(come avrai attualmente)vedrai OR.
  • Re: Access 2007-problema con query parametrica

    sal ha scritto:


    ciao,nello scrivere i parametri della query in visual.struttura,inserisci il primo parametro nel campo "criteri",il secondo parametro nel campo "oppure",il terzo parametro,un record più in basso.visualizzando la query in SQL,vedrai che alla condizione HAVING invece di avere AND(come avrai attualmente)vedrai OR.
    HAVING non è una condizione, ma una CLAUSOLA del predicato SQL che viene usata in sostituzione della CLAUSOLA WHERE solo in caso di utilizzo di funzioni AGGREGATE che introducono la sintassi di GROUP BY.

    Nel suo caso pertanto in assenza di GROUP BY troverà la definizione dei CRITERI in AGGREGAZIONE LOGICA(AND o OR) dopo la CLAUSOLA WHERE.

    Magari ho frainteso il senso ma ho tenuto a precisare.
Devi accedere o registrarti per scrivere nel forum
3 risposte