Newsgroup: it.comp.appl.access
Titolo: Aiuto su Query

Ciao,
avrei bisogno di una mano su una query.
Dunque devo realizzare un report "Scadenziario" che visualizzi tutti i
possessori di patenti scadute.
Il layout č grossomodo cosě:
************************************
Nome Cognome Pat.A Pat.B Pat.C
Federico Bianchi 01/08/2003
Luca Rossi 02/03/2003
************************************
Se un elemento ha una delle 3 patenti scadute allora devo visualizzarlo,
altrimenti no.
Il mio problema č quando un elemento ha una patente scaduta e le altre no. A
quel punto dovrei visualizzare sě quell'elemento ma SOLO LA DATA della
patente scaduta, omettendo le altre.
E metterlo in pratica su una query...bč,ho qualche problemino.
Io ho realizzato questa query:
SELECT [Cliente].[Cognome], [Cliente].[Nome], [Cliente].[pat_A],
[Cliente].[pat_B], [Cliente].[pat_C]
FROM Cliente
WHERE ((([Cliente].[pat_A])<=[data]) Or (([Cliente].[pat_B])<=[data]) Or
(([Cliente].[pat_C])<=[data3]));
ma il risultato č che se un cliente ha una patente scaduta e una
no,essendoci Or, me lo visualizza con entrambe le date, mentre devo riuscire
a visualizzarlo solo con quella scaduta.
Qualcuno saprebbe darmi una mano?
Grazie mille e buona serata,
Fa77
--------------------------------
Inviato via 
http://usenet.libero.it

Fa77 ha scritto:


Io creerei 3 campi calcolati in cui inserisco la data solo se č scaduta,
altrimenti lascio vuoto il campo (null).
Poi per filtrare, semplicemente verifico con un >0 i record in cui c'č
almeno una data scaduta.
SELECT cognome, nome, 
IIf([pat_A]<[data],[pat_A],Null) AS scad_pat_A, 
IIf([pat_B]<[data],[pat_B],Null) AS scad_pat_B, 
IIf([pat_C]<[data],[pat_C],Null) AS scad_pat_C
FROM Cliente
WHERE IIf([pat_A]<[data],[pat_A],Null)>0 
OR IIf([pat_B]<[data],[pat_B],Null)>0 
OR IIf([pat_C]<[data],[pat_C],Null)>0;
Namor
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ok, grazie mille!
La stessa query la devo utilizzare anche per un altro programma, e qui sorge
un altro problema.
La query l'ho fatta via codice in vba con una stringa SQL.
Una volta che la eseguo mi dą questo errore:
"Errore di run-time:3464
Tipi di dati non corrispondenti nell'espressione criterio".
Ecco il pezzo di codice:
*******************************************
Dim wdata3 as variant
Set wdb = CurrentDb()
Set wt = wdb.OpenRecordset("Dipendenti")
Set wt = wdb.OpenRecordset("SELECT [Dipendenti].[Cognome],
[Dipendenti].[Nome], IIf([Dipendenti].[cert_san]<""" & wdata3 &
""",[Dipendenti].[cert_san],Null) AS scad_cert_san, " & _
"IIf([Dipendenti].[wma]<""" & wdata3 & """,[Dipendenti].[wma],Null) AS
scad_wma, IIf([Dipendenti].[wmb]<""" & wdata3 & """,[Dipendenti].[wmb],Null)
AS scad_wmb " & _
"FROM Dipendenti " & _
"WHERE (((IIf([Dipendenti].[cert_san]<""" & wdata3 &
""",[Dipendenti].[cert_san],Null))>0)) OR (((IIf([Dipendenti].[wma]<""" &
wdata3 & """,[Dipendenti].[wma],Null))>0)) OR " & _
"(((IIf([Dipendenti].[wmb]<""" & wdata3 &
""",[Dipendenti].[wmb],Null))>0));", dbOpenDynaset)
******************************************
Qualche suggerimento?


 Qualche suggerimento?
Il problema dovrebbe essere su questi criteri:
WHERE (((IIf([Dipendenti].[cert_san]<""" & wdata3 &
""",[Dipendenti].[cert_san],Null))>0))
se [cert_san] e wdata3 sono di tipo data non devi mettere i doppi apici,
che servono quando usi stringhe:
WHERE (((IIf([Dipendenti].[cert_san]<" & wdata3 &
",[Dipendenti].[cert_san],Null))>0))
Namor


Cosě funziona perň non ho risolto il mio problema di fondo.
Infatti subito dopo io apro un Report e non capisco perchč continua a
chiedermi di inserire wdata3.
Non riesco a trovare un metodo per passargli wdata3.
Subito dopo la query io eseguo il report con questa riga:
DoCmd.OpenReport "Report_Scadenziario", acViewPreview
Scusa se approffitto della tua pazienza ma fino ad ora mi sei stato di
grande aiuto!


 Infatti subito dopo io apro un Report e non capisco perchè continua a


A posto, avevo inserito una ); di troppo nella stringa where.
Però continua a non funzionare!!!!sigh!!!!
Adesso, non appena cerca di eseguire il report, mi compare il seguente msg
di errore:
"Funzione WHERE non definita nell'espressione"
cosa vuol dire??????


 cosa vuol dire??????
Quando rispondi ad un msg devi scrivere sempre DOPO al messaggio
originale, sennò si perde il filo logico del discorso e non si capisce più
niente, e lasciare tutte le parti indispensabili alla comprensione
dell'intero discorso, e segnalare con [cut] dove hai tagliato quialcosa.
Sempre per la leggibilità sarebbe consigliabile anche togliere gli
elementi inutili, per esempio le firme automatiche tipo "Inviato via
http://usenet.libero.it
".
Se avessi letto sulla guida la pagina relativa ad openreport avresti visto
subito cosa c'è che non va. Nella "condizione WHERE" devi inserire solo i
criteri, togliendo il "WHERE".
A cosa ti serve il recordset wt se poi non lo usi? Per aprire il report
non serve.
Il fatto che ti chieda di inserire wdata3 è dovuto al fatto che non trova
un modo per assegnargli un valore. Assegni un valore corretto a wdata3
prima di eseguire la query?
Dichiara una variabile stringa, per esempio dim SQL as string
e assegna l'sql della query alla variabile
SQL="SELECT............."
Interrompi il codice in quel punto, vai nella finestra debug, fai un ?SQL
e controlla che il codice sia tutto a posto. Così è più facile vedere se
il comando SQL viene generato correttamente.



Ti ringrazio per la risposta.



Niente, non riesco in nessun modo a far funzionare il report.
Allora, ho fatto un pò di ordine nella mia funzione, stavo iniziando anche
io a non capirci più niente!
Dunque ho spezzettato la query di partenza, che ho chiamato prova e questo è
il codice:
*************************************
SELECT [Dipendenti].[Cognome], [Dipendenti].[Nome],
IIf([Dipendenti].[cert_san]<[wdata3],[Dipendenti].[cert_san],Null) AS
scad_cert_san, IIf([Dipendenti].[wma]<[wdata3],[Dipendenti].[wma],Null) AS
scad_wma, IIf([Dipendenti].[wmb]<[wdata3],[Dipendenti].[wmb],Null) AS
scad_wmb
FROM Dipendenti;
*************************************
A questo punto ho creato la procedura in vba:
*************************************
Private Sub Anteprima_Click()
dim strSQL as string
Dim wdb As Database
dim wq as QueryDef
set wq = wdb.QueryDefs("prova")
strSQL = "(((IIf([prova].[scad_cert_san]<" & Chr(35) & wdata3 & Chr(35) &
",[prova].[scad_cert_san],Null))>0)) OR (((IIf([prova].[scad_wma]<" &
Chr(35) & wdata3 & Chr(35) & ",[prova].[scad_wma],Null))>0)) OR
(((IIf([prova].[scad_wmb]<" & Chr(35) & wdata3 & Chr(35) &
",[prova].[scad_wmb],Null))>0))"
DoCmd.OpenReport "Report_Scadenziario", acViewPreview, , strSQL
************************************
E questo è tutto.
Se inserisco a mano il parametro wdata3, poi il report viene visualizzato
bene con i giustri filtraggi (quelli di inizio thread per intenderci).
Il problema è che non riesco in nessuna maniera a passarci wdata3. Non credo
sia neanche un problema di forma, se non sbaglio per le date dovrebbe essere
quella lì e cioè ad esempio: #01-05-2002#.
Per l'ennesima volta, hai qualche suggerimento?


Fa77 ha scritto:
[cut]






Intanto elimina queste righe, per aprire il report non ti servono:
Dim wdb As Database
dim wq as QueryDef
set wq = wdb.QueryDefs("prova")
Se funziona passando il parametro a mano è già qualcosa.
Non ho ancora capito cos'è wdata3 e da dove prende il valore. E' una
variabile, un controllo, cos'è?
Si possono anche togliere un po' di parentesi superflue.
Falla così la funzione:
Private Sub Anteprima_Click()
dim strSQL as string
  strSQL = "IIf([prova].[scad_cert_san]<" & Chr(35) & wdata3 & Chr(35) &
  ",[prova].[scad_cert_san],Null)>0 OR IIf([prova].[scad_wma]<" &
  Chr(35) & wdata3 & Chr(35) & ",[prova].[scad_wma],Null)>0 OR
  IIf([prova].[scad_wmb]<" & Chr(35) & wdata3 & Chr(35) &
  ",[prova].[scad_wmb],Null)>0"
  debug.print strSQL
  stop
 
  DoCmd.OpenReport "Report_Scadenziario", acViewPreview, , strSQL
end sub
Poi esegui la maschera e premi il tasto "anteprima".
Si fermerà sulla riga "stop".
Vai su "Visualizza" - "Finestra debug"
Vedrai il codice SQL che dovrebbe filtrare i risultati del report.
C'è dentro qualche riferimento a wdata3 o sono stati tutti sostituiti con
una data?



Allora ho fatto come mi hai detto (a parte togliere le parentesi per
questioni di tempo,lo farò sicuramente una volta risolto il problema) nella
"finestra immediata" (finestra debug non l'ho trovata) durante il debug, mi
compare questa stringa, con le date al posto di wdata3.
**************
(((IIf([prova].[scad_cert_san]<#6-01-2002#,[prova].[scad_cert_san],Null))>0))
OR (((IIf([prova].[scad_wma]<#6-01-2002#,[prova].[scad_wma],Null))>0)) OR
(((IIf([prova].[scad_wmb]<#6-01-2002#,[prova].[scad_wmb],Null))>0))
**************
wdata3 è:
dim wdata3 as variant


Fa77 ha scritto:

[cut]



Allora la stringa SQL viene generata correttamente. Forse il wdata3 te lo
chiedeva nella riga che hai eliminato e che non ti serve:
set wq = wdb.QueryDefs("prova")
Adesso che non c'è più non dovrebbe più chiederla.
Cambia "dim wdata3 as variant" con "dim wdata3 as date" visto che sappiamo
esattamente che tipo di dati dovrà contenere.
Togli o commenta le righe "debug.print strSQL" e "stop" e prova se va.



Ciao, ho appena provato a cambiare wdata3 in una variabile date ma continua
impeterrita a comparire la finestra "Immissione valore parametro", non so
veramente che pesci pigliare!
