Newsgroup: it.comp.appl.access
Titolo: Query con funzione IIF nei criteri

Ho una query che ha sempre funzionato benissimo. Adesso devo inserire
un altro criterio. Praticamente in base a quello che inserisco in una
maschera devo selezionare un intervallo di fatture. Se in una casella
di testo della maschera non c'è scritto niente, la query deve
restituire tutti i record. La query (un pò lunga, ma mi interessa solo
la parte finale) è la seguente:
SELECT Fatture.IDFattura, Fatture.NFattura, Fatture.Data,
DettaglioFatture.IDLotto, DettaglioFatture.IDScelta,
DettaglioFatture.NPelli, DettaglioFatture.IDLavorazione,
DettaglioFatture.IDGruppo, DettaglioFatture.IDColore,
DettaglioFatture.MQ, Arrotonda([MQ]/[NPelli],2) AS Media,
DettaglioFatture.Lavorazione, DettaglioFatture.ORDINE, Archivio.REF,
Archivio.Identificativo, NZ((Archivio!Concia),0)*[NPelli] AS
CostoMedio, nz((Archivio!Media),0)*([NPelli]) AS CostoMedia, Arrotonda
(IIf([C/LAVOR]=True,0,IIf([NS]=True,0,((Archivio!Totale/Archivio!Pezzi)
*[NPelli]))),2) AS CostoaPelle, Arrotonda([Lavorazione]*[MQ],2) AS
Costo, Arrotonda(IIf([C/LAVOR]=True,((Arrotonda([Lavorazione]*[MQ],2)+
(NZ(([Archivio]![Concia]),0)*[NPelli])-nz(([Archivio]![Media]),0)*
([NPelli]))/[MQ]),(([DettaglioFatture]![Lavorazione]*[MQ])+(NZ
(([Archivio]![Concia]),0)*[NPelli])-nz(([Archivio]![Media]),0)*
([NPelli]))/[Mq]),2) AS Lavor, IIf([NS]=True,0,(([NPelli]*nz(Archivio!
CONCIA,0))+([MQ]*[Lavorazione]))-([NPelli]*nz(Archivio!MEDIA,0))) AS
LavorTot, IIf([C/LAVOR]=True,Arrotonda(IIf([C/LAVOR]=True,((Arrotonda
([Lavorazione]*[MQ],2)+(NZ(([Archivio]![Concia]),0)*[NPelli])-nz
(([Archivio]![Media]),0)*([NPelli]))/[MQ]),(([DettaglioFatture]!
[Lavorazione]*[MQ])+([Archivio]![Concia]*[NPelli])-nz(([Archivio]!
[Media]),0)*([NPelli]))/[Mq]),2),Arrotonda(((([Archivio]![Totale]/
[Archivio]![Pezzi])*[NPelli])+Nz(([Archivio]![Concia]),0)*([NPelli])-nz
(([Archivio]![Media]),0)*([NPelli])+([DettaglioFatture]![Lavorazione]*
[Mq]))/[Mq],2)) AS Prezzo, Archivio.VisualizzaCome, Arrotonda
((((Archivio!Totale/Archivio!Pezzi)*[NPelli])+Nz((Archivio!Concia),0)*
([NPelli])-nz((Archivio!Media),0)*([NPelli])+(DettaglioFatture!
Lavorazione*[Mq]))/[Mq],2)*[MQ] AS Totale, Archivio.NS, Archivio.[C/
LAVOR], DettaglioFatture.IDDettaglioFattura, Fatture.IDCliente
FROM Fatture INNER JOIN (Archivio INNER JOIN DettaglioFatture ON
Archivio.IDLotto = DettaglioFatture.IDLotto) ON Fatture.IDFattura =
DettaglioFatture.IDFattura
GROUP BY Fatture.IDFattura, Fatture.NFattura, Fatture.Data,
DettaglioFatture.IDLotto, DettaglioFatture.IDScelta,
DettaglioFatture.NPelli, DettaglioFatture.IDLavorazione,
DettaglioFatture.IDGruppo, DettaglioFatture.IDColore,
DettaglioFatture.MQ, DettaglioFatture.Lavorazione,
DettaglioFatture.ORDINE, Archivio.REF, Archivio.Identificativo, NZ
((Archivio!Concia),0)*[NPelli], nz((Archivio!Media),0)*([NPelli]),
Arrotonda(IIf([C/LAVOR]=True,0,IIf([NS]=True,0,((Archivio!Totale/
Archivio!Pezzi)*[NPelli]))),2), Arrotonda([Lavorazione]*[MQ],2),
Arrotonda(IIf([C/LAVOR]=True,((Arrotonda([Lavorazione]*[MQ],2)+(NZ
(([Archivio]![Concia]),0)*[NPelli])-nz(([Archivio]![Media]),0)*
([NPelli]))/[MQ]),(([DettaglioFatture]![Lavorazione]*[MQ])+(NZ
(([Archivio]![Concia]),0)*[NPelli])-nz(([Archivio]![Media]),0)*
([NPelli]))/[Mq]),2), IIf([NS]=True,0,(([NPelli]*nz(Archivio!CONCIA,0))
+([MQ]*[Lavorazione]))-([NPelli]*nz(Archivio!MEDIA,0))), IIf([C/LAVOR]
=True,Arrotonda(IIf([C/LAVOR]=True,((Arrotonda([Lavorazione]*[MQ],2)+
(NZ(([Archivio]![Concia]),0)*[NPelli])-nz(([Archivio]![Media]),0)*
([NPelli]))/[MQ]),(([DettaglioFatture]![Lavorazione]*[MQ])+([Archivio]!
[Concia]*[NPelli])-nz(([Archivio]![Media]),0)*([NPelli]))/[Mq]),
2),Arrotonda(((([Archivio]![Totale]/[Archivio]![Pezzi])*[NPelli])+Nz
(([Archivio]![Concia]),0)*([NPelli])-nz(([Archivio]![Media]),0)*
([NPelli])+([DettaglioFatture]![Lavorazione]*[Mq]))/[Mq],2)),
Archivio.VisualizzaCome, Arrotonda((((Archivio!Totale/Archivio!Pezzi)*
[NPelli])+Nz((Archivio!Concia),0)*([NPelli])-nz((Archivio!Media),0)*
([NPelli])+(DettaglioFatture!Lavorazione*[Mq]))/[Mq],2)*[MQ],
Archivio.NS, Archivio.[C/LAVOR], DettaglioFatture.IDDettaglioFattura,
Fatture.IDCliente
HAVING (((Fatture.IDFattura)=IIf([Forms]![frmCriteriStampa]![Testo6]
="","*",([Fatture].[IDFattura])>=[Forms]![frmCriteriStampa]![Testo6]
And ([Fatture].[IDFattura])<=[Forms]![frmCriteriStampa]![Testo8])) AND
((Fatture.Data) Between [Forms]![frmCriteriStampa]![Testo2] And
[Forms]![frmCriteriStampa]![Testo4]) AND ((Fatture.IDCliente)=[Forms]!
[frmCriteriStampa]![CasellaCombinata0]));
La parte incriminata è (((Fatture.IDFattura)=IIf([Forms]!
[frmCriteriStampa]![Testo6]="","*",([Fatture].[IDFattura])>=[Forms]!
[frmCriteriStampa]![Testo6] And ([Fatture].[IDFattura])<=[Forms]!
[frmCriteriStampa]![Testo8]))
in quanto è quella che non funziona. Il >= e <= è solo l'ultimo
esperimento al posto del between. Ho provato a togliere la prima parte
(((Fatture.IDFattura)=IIf([Forms]![frmCriteriStampa]![Testo6]="","*" e
funziona. Ma è importante il discorso che se non metto niente deve
restituire tutti i record. Come posso fare?
Grazie
Ciao
Stefano


Ciao Stefano
forse
[Forms]![frmCriteriStampa]![Testo6]=""
dovrebbe diventare
isnull(IIf([Forms]![frmCriteriStampa]![Testo6])
C'è differenza tra Null e ""
Fammi sapere.
Ciao
Alberto


Mi spiace ma non funziona neanche così.

 ha scritto nel messaggio 
news:c4177752-b16a-4ddf...@r1g2000vbp.googlegroups.com...
Ho una query che ha sempre funzionato benissimo. Adesso devo inserire
un altro criterio. Praticamente in base a quello che inserisco in una
maschera devo selezionare un intervallo di fatture. Se in una casella
di testo della maschera non c'� scritto niente, la query deve
restituire tutti i record. La query (un p� lunga, ma mi interessa solo
la parte finale) � la seguente:

La parte incriminata � (((Fatture.IDFattura)=IIf([Forms]!
[frmCriteriStampa]![Testo6]="","*",([Fatture].[IDFattura])>=[Forms]!
[frmCriteriStampa]![Testo6] And ([Fatture].[IDFattura])<=[Forms]!
[frmCriteriStampa]![Testo8]))
in quanto � quella che non funziona. Il >= e <= � solo l'ultimo
esperimento al posto del between. Ho provato a togliere la prima parte
(((Fatture.IDFattura)=IIf([Forms]![frmCriteriStampa]![Testo6]="","*" e
funziona. Ma � importante il discorso che se non metto niente deve
restituire tutti i record. Come posso fare?
Grazie
Ciao
Stefano
Risposta:
Scusami ma non si pu� presentare una cosa del genere.
Fa male agli occhi anche  avederla
Cerca di usare gli alis, una parvenza di identazione, sfoltisci qalche campo 
che qui non serve, insomma rendi leggibile l'istruzione

 C'� differenza tra Null e ""
La questione e' che  quando vuole tutto e gli diventa
Fatture.IDFattura)="*"
e
quando vuole i limiti diventa pressapoco
Fatture.IDFattura)= x >=[Testo6] And (x)<=[Testo8]))
che non credo sia il massimo
personalmente in assenza di conoscenza di lettura e scrittura farei cosi'
Fatture.IDFattura)>=IIf([Forms]![frmCriteriStampa]![Testo6]="",0,[frmCriteriStampa]![Testo6]) 
and 
Fatture.IDFattura)<=IIf([Forms]![frmCriteriStampa]![Testo8]="",99999999,[frmCriteriStampa]![Testo8])
--
ac

 che qui non serve, insomma rendi leggibile l'istruzione
...hai ragione...ho fatto semplicemente copia/incolla. Ma quello che
mi interessava era solo l'ultima parte.
Grazie
Stefano


wrote:

Ho fatto in modo che se non si mette niente nel campo Testo 6, esso
venga automaticamente compilato con uno "0". A questo punto ho
inserito nei criteri della query la seguente funzione:
Like IIf([Forms]![frmCriteriStampa]![Testo6]=0;"*";([Fatture].
[IDFattura]) Between [Forms]![frmCriteriStampa]![Testo6] And [Forms]!
[frmCriteriStampa]![Testo8])
Questo funziona se io metto 0 nel Testo6 ma non funziona se ci metto
l'intervallo di IDFattura. La cosa strane è che secondo me c'è
qualcosa di sbagliato proprio nella struttura della funzione perchè se
io lascio la seconda parte Between [Forms]![frmCriteriStampa]![Testo6]
And [Forms]![frmCriteriStampa]![Testo8]), questa funziona. Ovviamente
così non mi valuta più il caso nel quale io voglio tutti i record.
Dov'è l'inghippo?


Ma IDFattura e' una stringa?
Quindi il risultato dell'iif deve sempre essere una stringa.
Infatti questa espressione ([Fatture].[IDFattura])>=[Forms]!
[frmCriteriStampa]![Testo6] And ([Fatture].[IDFattura])<=[Forms]!
[frmCriteriStampa]![Testo8]) torna vero o falso, essendo un operazione
binaria su risultati che possono essere o vero o falso.
o sbaglio?
ciao
mau


IDFattura è il contatore della tabella fatture. In testo6 e Testo8
metto l'intervallo che mi interessa. Comunque ho trovatto una
soluzione. Un pò alla MacGyver a dir la verità. Visto che la query
funziona se le chiedo solo Between [Forms]![frmCriteriStampa]![Testo6]
And [Forms]![frmCriteriStampa]![Testo8]) oppure lasciando vuoto il
criterio se voglio tutti i record, ho pensato bene di fare 2 query:
una con il criterio vuoto e una con la richiesta dell'intervallo.
Associando le 2 query a 2 diversi report, quando faccio partire la
stampa faccio in modo di controllare se nelle caselle c'è o meno un
intervallo di record. In base a quello che trovo nelle caselle stampo
uno o l'altro report. Che ne dite?
Comunque se qualcuno ha una soluzione un pò più ortodossa ben venga.
Ciao
Stefano


Prova a metter nella query un campo con
IIf([forms]![frmCriteriStampa]![testo6]=0;0;[idfattura])
e nei criteri
Between IIf([forms]![frmCriteriStampa]![testo6]=0;0;[forms]!
[frmCriteriStampa]![testo6]) And IIf([forms]![frmCriteriStampa]!
[testo6]=0;0;[forms]![frmCriteriStampa]![testo8])
E' molto poco ortodossa, ma dovrebbe funzionare :)
ciao
mau