Newsgroup: it.comp.appl.access
Titolo: Gestione gerarchica di dati

Nel Sito Comune, alla voce General, l'argomento
6.207 Cenni alla gestione di dati gerarchici in un database relazionale
riporta al seguente documento
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
in cui ad un certo punto trovo la seguente query, al paragrafo
Retrieving a Single Path
SELECT 
t1.name
 AS lev1, 
t2.name
 as lev2, 
t3.name
 as lev3, 
t4.name
 as
lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE 
t1.name
 = 'ELECTRONICS' AND 
t4.name
 = 'FLASH';
che dovrebbe dare questo risultato
+-------------+----------------------+-------------+-------+
| lev1        | lev2                 | lev3        | lev4  |
+-------------+----------------------+-------------+-------+
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
+-------------+----------------------+-------------+-------+
1 row in set (0.01 sec)
Per farla funzionare in Access 2000 devo aggiungere un paio di
parentesi, così
SELECT 
t1.name
 AS lev1, 
t2.name
 as lev2, 
t3.name
 as lev3, 
t4.name
 as
lev4
FROM ((category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id)
LEFT JOIN category AS t3 ON t3.parent = t2.category_id)
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE 
t1.name
 = 'ELECTRONICS' AND 
t4.name
 = 'FLASH';
e in effetti sulle prime mi dà il risultato previsto, anche se non
capisco come: nella tabella di esempio, non esiste nessun record che
abbia "electronics" al primo campo e, prendendo il parent di questo, mi
conduca al nome "flash".
Ma i misteri si infittiscono. Salvo la query e quando la riapro non mi
dà alcun record. Giustamente, sostengo io, ma perché prima me ne dava
uno?
Per chiarire, il codice SQL è salvato in modo leggermente diverso,
così
SELECT 
t1.name
 AS lev1, 
t2.name
 AS lev2, 
t3.name
 AS lev3, 
t4.name
 AS
lev4
FROM ((category AS t4 LEFT JOIN category AS t3 ON t4.parent =
t3.category_id) LEFT JOIN category AS t2 ON t3.parent = t2.category_id)
LEFT JOIN category AS t1 ON t2.parent = t1.category_id
WHERE (((
t1.name
)='ELECTRONICS') AND ((
t4.name
)='FLASH'));
ma ho anche provato a riscriverlo (disperato...) e non cambia nulla: la
query salvata non dà record. Se però ne scrivo una nuova, ecco che il
record fantasma ricompare!
A naso, la query giusta dovrebbe essere
SELECT 
t1.name
 AS lev1, 
t2.name
 AS lev2, 
t3.name
 AS lev3, 
t4.name
 AS
lev4
FROM ((category AS t4
INNER JOIN category AS t3 ON t4.parent = t3.category_id)
INNER JOIN category AS t2 ON t3.parent = t2.category_id)
INNER JOIN category AS t1 ON t2.parent = t1.category_id
WHERE 
t1.name
='ELECTRONICS' AND 
t4.name
='FLASH';
e infatti così mi funziona anche dopo il salvataggio.
Ho provato più volte e mi va sempre allo stesso modo.
Mi è venuto il sospetto che si tratti di qualche problema dovuto ai
diversi dialetti SQL, come proverebbe il fatto delle parentesi.
Qualcuno ha informazioni?
-------------------------------
Già che ci sono, al paragrafo The Adjacency List Model la seguente
query mi dà errore
CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL);
sembra che AUTO_INCREMENT non piaccia ad Access 2000. Con che lo
sostituisco?
-----------------------------------
Nell'occasione, segnalo che il Sito Comune mi è stato utile per moduli
calendario, numerazione di record nelle query, caricamento di file da
maschera, utilità che verificano l'apertura di maschere, creazione di
grafici, ridimensionamento di maschere.
Ringrazio gli autori e saluto tutti.
Riccardo Baldinotti

Sono ancora perplesso su questo argomento...
Ciao a tutti.
Riccardo Baldinotti ha scritto:
