Newsgroup: it.comp.appl.access
Titolo: Curiosità su JetSQL (lungo)

Un paio di mesi fà combattevo con un problema, mi è rimasta la curiosità e
ve la sottopongo perchè sembra (prendete con le pinze quest'affermazione)
riguardare un'anomalia nel modo in cui il processore di Query di Access
(2000) tratta alcuni comandi.
(proseguite la lettura solo se avete *molta* pazienza e siete anche un pò
masochisti):
Analizzate il seguente comando SQL:
nota: questa query di accodamento si occupa assieme con altre due di
aggiungere alla tabella "richieste" tutta una serie di cartelle cliniche
correlate a una effettivamente richiesta.
INSERT INTO tblRichieste ( IDCartellaClinica, N°, Anno, Reparto, Nome,
Cognome, DataNascita, DataRichiesta, N°Richiesta, [Note], Originale, RX,
FotocopieCC, RichiestaEvasa )
SELECT m.IDCartellaClinica, m.NumeroProgressivo, m.Anno, m.Reparto, r.Nome,
r.Cognome, r.DataNascita, r.DataRichiesta, r.N°Richiesta, r.Note,
r.Originale, r.RX, r.FotocopieCC, r.RichiestaEvasa
FROM tblRichieste AS r
INNER JOIN (tblCartelleClinicheBrotzu AS m
INNER JOIN tblCartelleClinicheBrotzu AS f
ON m.IDCartellaClinica = f.IDCartellaFascicolante)
ON r.IDCartellaClinica = f.IDCartellaClinica
WHERE r.RichiestaEvasa=False
AND m.idcartellaclinica
NOT IN (Select d.idcartellaclinica from tblRichieste as d where
d.richiestaevasa=false and d.idcartellaclinica is not null));
ora, questa query funziona correttamente, se
invece togliamo dalla subquery
"Select d.idcartellaclinica from
tblRichieste as d where d.richiestaevasa=false and d.idcartellaclinica is
not null"
la condizione "d.idcartellaclinica is not null" essa cessa di funzionare
(come
dovrebbe) con questa modifica infatti la query funziona correttamente quando
le
cartelle cliniche in tblRichieste corrispondono a delle cartelle che
esistono effettivamente nel database, se invece *una sola* fra le cartelle
richieste non esiste (può succedere, in questo caso si ha il campo
idcartellaclinica=null
perchè esiste una query precedente che sincronizza gli ID) allora la query
non restituisce nessun record; questo per me è sconcertante in quanto il
comando select si limita semplicemente a richiedere tutte le cartelle
cliniche che hanno al loro interno delle altre cartelle fascicolate e sono
state richieste verificando poi (clausola NOT IN) che l'ID relativo non sia
già stato selezionato per evitare duplicati.
Ora "smontando" la query e facendo eseguire separatamente i vari pezzi ho
verificato che il problema stà proprio nella clausola NOT IN, infatti Access
sbarella completamente quando incontra un valore Null nel campo
d.idcartellaclinica: a quel punto per lui TUTTI gli ID di questo mondo sono
contenuti nel rowset risultante da "Select d.idcartellaclinica from
tblRichieste as d where d.richiestaevasa=false" e di conseguenza la query
principale restituisce 0 records; ragion per cui ho dovuto aggiungere la
clausola and d.idcartellaclinica is not null
La query che aggiuge le cartelle presenti nello stesso fascicolo di quelle
richieste ("le sorelle"), query che aveva lo stesso problema di quella
precedente (che aggiunge le "madri")
"INSERT INTO tblRichieste ( N°, Anno, Reparto, Nome, Cognome, DataNascita,
DataRichiesta, N°Richiesta, [Note], Originale, RX, IDCartellaClinica,
FotocopieCC, RichiestaEvasa ) SELECT t.NumeroProgressivo, t.Anno, t.Reparto,
r.Nome, r.Cognome, r.DataNascita, r.DataRichiesta, r.N°Richiesta, r.Note,
r.Originale, r.RX, t.IDCartellaClinica, r.FotocopieCC, r.RichiestaEvasa FROM
tblRichieste AS r INNER JOIN tblCartelleClinicheBrotzu AS t ON
r.IDCartellaClinica = t.IDCartellaFascicolante WHERE
(((r.RichiestaEvasa)=False) AND t.idcartellaclinica not in (select
d.idcartellaclinica from tblRichieste as d where d.richiestaevasa=false and
d.idcartellaclinica is not null));"
entrambe le query sono contenute
nella procedura "AggiuntaParenti" (vedi sotto):
Public Sub Duplicate(strSQL As String)
    Dim rst As New ADOrst
    Dim Num As Long
        rst.Apri strSQL
            Num = rst.Recordset!Conta
        rst.Chiudi
        Set rst = Nothing
        If Num > 0 Then
            DoCmd.OpenForm "frmEccezzioni"
            Else
                IDLink
                AggiuntaParenti
                DoCmd.OpenReport "rptConsegna"
        End If
End Sub
prima di lanciare le query mi assicuro che non ci siano cartelle duplicate
nel database (può succedere, negli ospedali sono dei casinisti con gli
archivi, e questo era un "porting" di un archivio cartaceo, una piccola
applicazione GED)
nel caso in cui esistano dei duplicati vengono gestiti in una form a parte.
La query che sincronizza gli IDCartellaclinica  (in "IDLink"):
"update tblrichieste as r inner join tblcartelleclinichebrotzu as t on
r.reparto=t.reparto and r.anno=t.anno and r.n°=t.numeroprogressivo set
r.idcartellaclinica=t.idcartellaclinica where r.richiestaevasa=false and
r.idcartellaclinica is null;"

 ha scritto nel messaggio
news:XYKN6.414$5_6....@news2.tin.it...
