Newsgroup: it.comp.appl.access
Titolo: quale istruzione query?

Ciao a tutti e grazie per i continui suggerimenti.
In una tabella che contiene i seguenti campi:
BarCode = numerico, indicizzato (duplicati ammessi), in relazione molti a
uno con l'Id di un'altra tabella contenente i dati anagrafici della persona
(in questo caso Contatore indicizzato (Duplicati non ammessi)
entrate = data
uscite = data
dove vengono registrati dei passaggi in entrata e in uscita, attraverso una
lettura con barcode (Id)
ho bisogno di fare un controllo di questo tipo:
Controllare se l'Id contiene almeno un entrata ed un'uscita e quindi
selezionare quelli che non corrispondono a tale condizione.
Come posso farlo con una query?
Grazie infinite
Donato

Donato ha scritto:

Non hai specificato se la tabella entrate-uscite registra l'entrata e
l'uscita nello stesso record o se hai due record, uno con solo l'entrata e
uno con solo l'uscita.
Nel primo caso puoi fare
SELECT * FROM tabella WHERE (entrate Is Null) OR (uscite Is Null);
Namor
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:bjmh3e$8o5$1...@news.newsland.it...

Non registra sullo stesso record sia l'entrata che l'uscita, ma su record
differenti. Per cui su un record ci può essere l'uscita e su un altro
l'entrata.
Quel che voglio ottenere è un filtro che mi selezioni chi non è mai entrato
ne uscito e chi è soltanto uscito o soltanto entrato.
Grazie

 ha scritto nel messaggio
news:bjmkdq$ip6$1...@newsread.albacom.net...

Dividiamo il problema in due.
con ua query puoi controllare quali ID hanno almeno una timbratura, basta
fare un raggruppamento per ID:
SELECT id FROM tabella WHERE GIORNO =<qui indichi il giorno> GROUP BY id
con un'altra query puoi controllare quali hanno, all'interno della stessa
data, un numero di timbrature dispari
SELECT id FROM Tabella1 WHERE GIORNO =<qui indichi il giorno> GROUP BY id
HAVING Count(id)\2=1
Modificando opportunamente i filtri, fai tutto quello che vuoi.
(Attenzione al segno di divisione rovescio che restituisce il resto intero
della divisione)
Ciao
Giorgio

 Grazie
Per chi non è mai entrato né uscito, che quindi non avrà records nella
tabella, devi fare una query con un outer join (LEFT o RIGHT JOIN) con le
tabelle anagrafica e movimenti; prendi il barcode o il cognome dalla tbl
anagrafica e imposti come criterio "Is Null" sul campo barcode della
tabella movimenti.
Per l'altro problema, sarebbe stato più facile se i dati fossero salvati
in una tabella con i campi "BarCode", "Data", "Verso" dove verso è un
campo numerico che distingue le entrate dalle uscite.
Per esempio se dai all'entrata valore 1 e all'uscita valore 10, dopo
potrai facilmente fare una query dove raggruppi per barcode e per data e
sommi i valori di verso.
Se la somma è 1 avrai solo l'entrata, se è 10 avrai solo l'uscita, se è 11
avrai entrata e uscita.
In questo modo gestisci anche i casi anomali:
se la somma è 2 vuol dire che nello stesso giorno hai due entrate, se è 20
hai due uscite, se è 12 hai 2 entrate e 1 uscita, ecc...
Sarà poi molto facile fare una query per selezionare tutti i record che
hanno valore diverso da 11 e che quindi per un motivo o per l'altro sono
anomali.
Se non hai la possibilità di modificare la struttura dati puoi creare una
query d'unione che metta i dati nel formato barcode-data-verso e poi usare
questo sistema.


 ha scritto nel messaggio
news:bjmlvk$sh9$1...@news.newsland.it...

outer join ???? Di che si tratta?
grazie

 HAVING Count(id)\2=1
non è possibile selezionarli in base a pari o dispari in quanto hanno una
codice univoco.
Ad ogni passaggio in entrata od uscita, viene registrato un record
corrispondente all'Id.

 ha scritto nel messaggio
news:bjmoe6$mvs$1...@newsread.albacom.net...

Esistono essenzialemnte due tipi di join:
1) quello che restituisce solo i record delle tabelle che stanno a destra e
a sinistra del join e che corrispondono alla regola di join (INNER JOIN);
2) quello che restituisce tutti i record che stanno nella tabella di destra
o di sinistra del join insieme alle informazioni relazionate dell'altra
tabella legata (LEFT o RIGHT OUTER JOIN) se ci sono;
Guarda la guida in linea...

 ha scritto nel messaggio
news:bjmone$n60$1...@newsread.albacom.net...

Allora... non ti serve il filtro per giorno.
Ho sbagliato poi il campo di riferimento, non ID ma Barcode.
Le due query diventano quindi:
SELECT barcode FROM tabella GROUP BY barcode
e questa ti da quali hanno almeno una timbratura.
SELECT id FROM Tabella1 GROUP BY barcode HAVING Count(barcode)\2=1
e questa ti da quali hanno un numero di timbrature dispari (omessa entrata o
omessa uscita o doppia timbratura)
Ciao.

 grazie
Quando fai una query con due o più tabelle in relazione tra loro ti
vengono mostrati solo i record in cui i campi dall'una e dall'altra parte
della relazione contengono lo stesso valore. Questo è un INNER JOIN.
Se nella tua tabella anagrafica hai un nome ma non ci sono movimenti per
quella persona, usando questo tipo di query quella persona non comparirà.
Prova a fare doppio click sulla linea nera della relazione e vedrai che
hai la possibilità di cambiare questo comportamento, puoi dire ad access
di mostrare tutti i record di una delle tabelle anche se nell'altra non ci
sono record corrispondenti. Questo è un outer join (RIGHT JOIN o LEFT JOIN)


 Namor
Grazie Namor. Volevo spiegarti che, pur non conoscendo il termine "Outer
join", ci ero comunque arrivato ad impostare questi tipi di selezione.
Ma il problema mi rimane.
Cioè quale istruzione mi può verificare che una persona identificaca dal
barcode risponda ad entrambe le condizioni di Entrata e Uscita?
Escludendo queste, la selezione che mi interessa è per quelle persone che
hanno timbrato solo l'entrata o solo l'uscita.
A dire il vero, io avrei preferito ottenere un comando che cancellasse dalla
tabella principale dell'anagrafica partecipanti quelli che non hanno
registrato alcun passaggio (e quindi non compare il proprio Id nella tabella
dei passaggi).
Attraverso delle query sono riuscito ad ottenere i record che rispondono ai
requisiti di entrata ed uscita.
Adesso il problema è questo.
Confrontare la query così ottenuta con la tabella principale dei
partecipanti e selezionare in questa, i record non corrispondenti al fine di
eliminarli.
Piano piano ci arrivo. Grazie a tutti
Donato

Donato ha scritto:


Bene, allora fai una nuova query e metti da una parte la tabella
"partecipanti" e dall'altra la query che hai già ottenuto, e nella
relazione gli dici di mostrare tutti i record di "partecipanti".
Poi selezioni partecipanti.* e il campo barcode dalla query, sul quale
imposti come criterio "Is Null".
Ti mostrerà tutti i partecipanti che non hanno entrate e uscite. Una volta
verificato che funzioni bene puoi trasformare la query così ottenuta in
una query di eliminazione, per cancellare i partecipanti che non hanno
movimenti.


 ha scritto nel messaggio
news:bjp5mp$sf4$1...@news.newsland.it...

Grazie infinite.
Ci provo.