Newsgroup: it.comp.appl.access
Titolo: R: Ricerca "sovrapposizioni"

Ciao Lorenzo,
scusami per il ritardo, ma ho avuto una settimana molto intensa e non ho
potuto dedicare molto tempo al PC.
Ho esaminato il file TMP.MDB che mi hai inviato... ed ho risolto l'arcano;
te lo invio con le modifiche effettuate.
In principio credevo che il problema risiedesse nell'assenza delle
chiavi... ma ho constatato che non era cosi'... in ogni modo ti consiglio
di inserire sempre una chiave in ogni tabella.
Il problema e' di natura concettuale... quando ho scritto la prima mail mi
si era accesa la lampadina dei pb attinenti la riflessivita'
dell'uguaglianza... ma evidentemente la fretta mi ha impedito di
riflettere a fondo.
La query (quella vecchia):
SELECT * 
FROM Tmp AS T1 WHERE EXISTS (SELECT *
              FROM Tmp AS T2
              WHERE (T2.IDOpe = T1.IDOpe) AND
                    (T2.Dinizio = T1.Dinizio) AND
                    (T1.Hinizio < T2.Hfine) AND
                    (T1.Hfine   > T2.Hinizio))
ORDER BY HInizio;
funziona come due cicli FOR innestati... allora se anche nella tabella ho
UNA SOLA RIGA:
gigi  1/1/00   8.00  10.00
(che NON e' un caso di sovrapposizione perche' non ci sono altre tuple
nella tabella!) questa apparirebbe comunque nella query.
Infatti quando nelle iterazioni T1 e T2 puntano alla stessa riga accade
che:
T2.IDOpe=gigi = T1.IDOpe=gigi         ----> TRUE 
T2.Dinizio=1/1/00 = T1.Dinizio=1/1/00 ----> TRUE
T1.HInizio=8.00 < T2.HFine=10.00      ----> TRUE
T1.HFine=10.00  > T2.Hinizio=8.00     ----> TRUE
e la riga viene valutata (in modo errato) come sovrapposta a se stessa.
Il pb. nasce dal fatto che con questa struttura di tabella e di attributi
e' impossibile distinguere quando ad una certa iterazione del FOR, due
righe sono "la stessa identica riga" oppure quando "sono identiche"
perche', pur essendo due righe diverse, esse sono "perfettamente
sovrapposte".
La soluzione piu' semplice e' quella di aggiungere un attributo
PROGRESSIVO (che per comodita' puo' diventare la sola ed unica chiave
primaria della tabella TMP)
Tmp(PROGRESSIVO, idope, dinizio, hinizio, hfine)
in modo che due righe diverse siano SEMPRE distinguibili. Apportando tale
modifica alla tabella e cambiando la query nella seguente:
SELECT IDOpe, DInizio, HInizio, HFine
FROM Tmp AS T1
WHERE EXISTS (SELECT *
              FROM Tmp AS T2
              WHERE (T2.Progressivo <> T1.Progressivo) AND
                    (T2.IDOpe = T1.IDOpe) AND
                    (T2.DInizio = T1.Dinizio) AND
                    (T2.HInizio < T1.HFine) AND
                    (T2.HFine > T1.HInizio))
ORDER BY IDOpe, DInizio, HInizio;
essa viene eseguita correttamente e dei 4224 record ne restituisce 540
come sovrapposti. Se non hai gia' saturato il limite di Access puoi
indicizzare tutti i campi della tabella TMP in modo che la query sia
leggermente piu' veloce.
Mi sembra di aver capito che hai gia' risolto via codice... in ogni modo
se non dovesse ancora funzionare non esitare a segnalarmelo.
Ciao
Giuseppe

 come sovrapposti. 
Mitico Giuseppe!
Ti meriti un birra, fai un fischio quando passi da Belluno
;-)
--
Lorenzo Coronati
--
<<Complimenti per la risposta disinteressata a 
differenza di altri che sul NG ci mangiano sopra.>>
(Voltolini, 20/04/2000)
--