Newsgroup: it.comp.appl.access
Titolo: Query a campi incrociati con parametri

Un saluti a tutti!!
Ho il seguente problema..
Non riesco ad impostare una query a campi incrociati (che vergogna!)
in modo che mi tiri fuori il numero di Ricorsi presentati dai
Ricorrenti in una specifica Materia in un arco di tempo detrminato...
Criterio: Between nz([Forms]![Conta
ricorsi]![AnnoInizio];DMin("Anno";"Ricorsi")) And nz([Forms]![Conta
ricorsi]![AnnoFine];DMax("Anno";"Ricorsi")).
Il problema è che se in questo arco di tempo non ci sono ricorsi per
quella materia, la query mi restituisce l'errore "Il modulo di
gestione di database Microsoft Jet non riconosce " come nome di campo
o espressione valida.".
Ho provato a creare campi calcolati.. funzioni nz.. ma niente!
Su quali campi dovrei impostare tali criteri? Sul Conteggio di
IDMateria? Su quello di IDRicorso?
Avevo impostato..
Campo:        Cognome     Nome        Anno        Materia    IDRicorso
Tabella:      Ricorrenti  Ricorrenti  Ricorrenti  Materie    Ricorsi
Formula:      Raggr.      Raggr.      Raggr.      Raggr.     Conteggio
Campi incr.:  Int. riga   Int. riga   Int. riga   Int. col.  Valore
Dove sbaglio?
Il database è così strutturato..
Tabelle:
Ricorrenti	        Ricorsi			Materie
IDRicorrente		IDRicorso		IDMateria
Cognome		        Anno			Materia
Nome			IDRicorrente
			IDMateria
Relazioni:
Ricorrenti	--->	Ricorsi		(uno a molti)
Materie	        --->	Ricorsi		(uno a molti)
...grazie!

 ha scritto nel messaggio
news:478503f2.03051...@posting.google.com...

Aggiungi un criterio alla colonna [Anno] (in pratica una nuova colonna
impostata a "DOVE"): Not is null.
Pulisci tutto il resto.
Between nz([Forms]![Conta
ricorsi]![AnnoInizio];DMin("Anno";"Ricorsi")) And nz([Forms]![Conta
ricorsi]![AnnoFine];DMax("Anno";"Ricorsi")).
Diventa:
Between [Forms]![Conta
ricorsi]![AnnoInizio] And [Forms]![Conta
ricorsi]![AnnoFine].
Se poi vuoi comunque immettere un valore anche se il controllo sulla
maschera è nullo o vuoto (DMin("Anno";"Ricorsi")) allora
usa due funzioni del tipo:
Public Function DimmiSostituisciAnno1() as Integer '(se di tipo intero o
string se di tipo testo)
If IsNull([Forms]![Conta ricorsi]![AnnoInizio]) or [Forms]![Conta
ricorsi]![AnnoInizio] = 0 then
DimmiSostituisciAnno1 = DMin("ANNO","Ricorsi")
else
DimmiSostituisciAnno1 = [Forms]![Conta ricorsi]![AnnoInizio]
End If
Public Function DimmiSostituisciAnno2() as Integer '(se di tipo intero o
string se di tipo testo)
If IsNull([Forms]![Conta ricorsi]![AnnoFine]) or [Forms]![Conta
ricorsi]![AnnoInizio] = 0 then
DimmiSostituisciAnno2 = DMax("ANNO","Ricorsi")
else
DimmiSostituisciAnno2 = [Forms]![Conta ricorsi]![AnnoFine]
End If
Il Criterio nella query diventa:
Between DimmiSostituisciAnno1() And DimmiSostituisciAnno2()
Sono possibili altre strade.
Ciao, Carlo

...

Ti ringrazio per la risposta.. ma forse la mia domanda non è stata
abbastanza chiara.
Voglio che la query mi includa anche le materie in cui c'è un valore
null, non che le escluda!! Perché Is Not Null? Perché intervenire
sull'anno?


Sì per l'anno puoi omettere il criterio.
La tua richiesta è stata molto precisa: "...che mi tiri fuori il numero di
Ricorsi presentati dai
Ricorrenti in una specifica Materia in un arco di tempo detrminato".
Se è solo questo i suggerimenti che ti ho dato vanno benissimo.
Se invece vuoi comunque vedere il risultato ti consiglio di usare due query
e gestire il tutto da codice.
La seconda query non contiene criteri o filtri.
Da codice: Apri la prima query, gestisci l'errore, se l'errore è quello che
hai detto...apri la seconda query e, solo a questo punto, visualizzi o usi
l'una o l'altra.
Ciao, Carlo

...

Continuo a non capire.. o a non farmi capire.
Ad esempio..
es. 1
ho 8 Materie: mat1; mat2; mat3... mat8
ho un periodo di tempo: 2003
se nel 2003 non è stato presentato alcun ricorso per la mat2 e/o la
mat 5, il report mi restituisce il messaggio "Il modulo di gestione di
database Microsoft Jet non riconosce " come nome di campo o
espressione valida."
es. 2
ho 8 Materie: mat1; mat2; mat3... mat8)
ho un periodo di tempo: dal 2000 al 2003
in questo arco di tempo sono stati presentati ricorsi per tutte le
materie (in 4 anni vorrei vedere..!) e, quindi, il report mi
visualizza ciò che dovrebbe.
Domanda:
Come devo impostare la query in modo che nell'es. 1 mi comprenda nel
report anche le materie con valore null?
Ciao..

 Ciao..
Questa istruzione non restituisce nulla perchè nel 2003 non ci sono ricorsi
per nessuna materia:
TRANSFORM Count(MRicorsi.Ricorso) AS ConteggioDiRicorso
SELECT MRicorsi.Anno
FROM Materie INNER JOIN MRicorsi ON Materie.IDM = MRicorsi.Materia
WHERE (((MRicorsi.Anno) Between 2003 And 2003) AND
((MRicorsi.Ricorso)=True))
GROUP BY MRicorsi.Anno
PIVOT Materie.Materia;
Quest'altra istruzione ritorna tutti i ricorsi (ricorso = Vero) per tutte le
materie e anche per le materie che non hanno avuto ricorsi nel periodo
specificato:
TRANSFORM Count(MRicorsi.Ricorso) AS ConteggioDiRicorso
SELECT MRicorsi.Anno
FROM Materie INNER JOIN MRicorsi ON Materie.IDM = MRicorsi.Materia
WHERE (((MRicorsi.Anno) Between 1998 And 2001))
GROUP BY MRicorsi.Anno
PIVOT Materie.Materia;
Le tabelle che ho usato sono due:
Materie: IDM di tipo contatore; Materia di tipo Testo
MRicorsi: ID contatore, Materia numerico, Ricorso sì/no, Anno numerico.
Join 1 a molti integrità referenziale tra IDM e Materia.
Con questo sistema (provare per credere) non ho alcun errore.
Tutto ciò è vero se hai usato due tabelle come nell'esempio.
Questo per quanto riguarda la query.
E' chiaro che nel report devi usare (e solo ora ho capito che parlavi di un
REPORT che non hai mai menzionato nei post precedenti) solo i campi presenti
nelle intestazioni delle colonne. Se uno dei controlli che hai usato nel
report (MAt1,Mat2,Mat3, ecc.) non è presente nelle intestazioni di colonna o
non è compreso nel risultato della query, avrai l'errore descritto.
Come potrebbe il report usare un'origine controllo che non esiste?
La soluzione è quella di includere tutte le materie sia come controlli nel
report che, e soprattutto, nelle intestazioni di colonna della query.
Per il report sai come si fà; per la query aprila in struttura ti posizioni
sul campo impostato a "Intestazione colonna", tasto destro, "Proprietà" e in
"Intestazioni colonne" metti (scrivi) tutte ma proprio tutte le materie
separate da un punto e virgola (;). Alimenta il report con questa query e
vedrai che nell'elenco dei campi disponibili per il report troverai l'elenco
di tutte le materie. Ti è sufficiente trascinare tutti i campi nel corpo del
report.
Ciao, Carlo

...

Hai ragione... mi sono accorto che non ho fatto alcun cenno al report.
Cmq.. sei grande!! Ho risolto scrivendo nelle proprietà del campo che
funge da intestazione colonna tutte le materie previste.
A questo punto la domanda sorge spontanea.. le materie erano soltanto
8. Se fossero state 100 avrei dovuto metterle tutte come intestazioni
di colonna o c'è un modo più rapido (o, cmq, diverso) di risolvere la
questione?
Grazie infinite!!!