Newsgroup: it.comp.lang.delphi
Titolo: firebird + ricorsione

Io ho un albero definito in una tabella 
 NODID ,NODFIGID1..NODFIGID20,NODPADID,NODTIP
L'albero ha 3 tipologie di nodo:
all'altezza 1 la tipologia è di tipo A
ad altezza 2,3 la tipologia è di tipo B
ed ad altezza 3....X la tipologia è di tipo C
ora dovrei costruire un report che elenchi dei docuementi legati ad nodi 
di tipologia C ma devo raggrupparli per i nodi di tipologia B.
Se avessi la ricorsione sarebbe tutto piu semplice...
ma non so' se esiste in firebird
--- posted by geoForum on 
http://www.delphiedintorni.it

 ma non so' se esiste in firebird
Firebird, come tutti i RDBMS, ti consente di creare chiavi esterne 
sulla stessa tabella.  E' il modo in cui normalmente viene gestita 
  la gerarchia tra record (tipicamente rappresentata come albero).
Tanto per farti un esempio, questo č lo script di creazione di una 
tabella MySQL in cui sia possibile gestire la ricorsione tra record:
CREATE TABLE TABELLA (
   ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   ID_PADRE INTEGER UNSIGNED NOT NULL,
   CAMPO1 INTEGER UNSIGNED NULL,
   CAMPO2 INTEGER UNSIGNED NULL,
   CAMPO3 INTEGER UNSIGNED NULL,
   PRIMARY KEY(ID),
   INDEX TABELLA_FKIndex1(ID_PADRE)
);

Si ok, ma il problema non è costruire la tabella:
La mia tabella è stata creata come dici tu in firebird.
Ora pensando di avere un albero cosi:
 root
  |
  --- Categoria 1
  |    |
  |    - Secca
  |    |   |
  |    |   - Spagnolette
  |    |   - Noci
  |    - Fresca
  |       |
  |       -Mele
  |       -Pere 
  --- Categoria 2
       |
       - Limone
       - Arancio
Come puoi  tirar fuori un report ragruppato  per le Categorie????
Nb: Le categorie non sono statiche!!!


 Ora pensando di avere un albero cosi:
<snip>
CREATE TABLE CATEGORIA (
   CAT_ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   CAT_DESCR VARCHAR NULL,
   PRIMARY KEY(CAT_ID)
);
CREATE TABLE FRUTTA (
   FRU_ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   FRU_ID_PARENT INTEGER UNSIGNED NOT NULL,
   FRUTTA_DESCR VARCHAR NULL,
   FRU_DESCR INTEGER UNSIGNED NULL,
   PRIMARY KEY(FRU_ID),
   INDEX FRUTTA_FKIndex1(FRU_ID_PARENT)
);
CREATE TABLE FRUTTA_has_CATEGORIA (
   FRU_ID INTEGER UNSIGNED NOT NULL,
   CAT_ID INTEGER UNSIGNED NOT NULL,
   PRIMARY KEY(FRU_ID, CAT_ID),
   INDEX FRUTTA_has_CATEGORIA_FKIndex1(FRU_ID),
   INDEX FRUTTA_has_CATEGORIA_FKIndex2(CAT_ID)
);
In questo schema, la tabella "FRUTTA_has_CATEGORIA" rappresenta la 
relazione molti a molti tra FRUTTA e CATEGORIA (una particolare 
frutta appartiene a piů categorie e una categoria č condivisa tra 
piů frutta).  I report li esegui selezionando i dati da questa 
tabella.

ok in parole povere non utilizzi la ricorsione....
Quindi potrei anche semplificare... e fare cosi:
Aggiungere un campo Categoria che nn è altro che un puntatore al nodo
di livello 2 [nel esempio la Categoria]..........
Quello che invece ho bisogno per non rifarmi tutto il programma sono le 
query relazioni derivate(o intensionali)



Intedevo dire relazioni DEDUTTIVE


 ok in parole povere non utilizzi la ricorsione....
Invece sì, la tabella FRUTTA è "ricorsiva".

 nodi di tipologia C ma devo raggrupparli per i nodi di tipologia B.
Cambia struttura al DB, utilizza i Celcko Nasted Sets oppure i
Materialized Path (od altri simili).
-- 
I am what I am, I do what I can
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.