Newsgroup: it.comp.lang.vo-clipper
Titolo: Database per un albero genealogico

Buona sera a tutti, spero abbiate trascorso delle belle vacanza al
contrario di me.... Sigh!
Vorrei un piccolo aiuto, un'idea su come impostare i campi di un
database che dovrà contenere tutti i nomi dei  componenti di un albero
genealogico di una famiglia.
Forse qualcuno lo ha già fatto e mi sa dire quanti e quali campi
impostare e come ha risolto le relazioni figli-genitori-genitori-figli
ecc....
Vi ringrazio.
Paolo

 ecc....
Non mi è mai capitato di fare qualcosa del genere ma immagino che la
struttura dati ideale per rappresentare un albero genealogico sia una
sorta di albero ennario che come dati ha, fondamentalmente, il nome
della persona e il suo sesso e come puntatori ad altri nodi uno per il
coniuge, uno per il genitore padre, uno per il genitore madre ed un
certo numero massimo, da stabilirsi a priori, per i figli. Puntatore
nullo indicherebbe che non punta a nessun padre, madre o figlio.
Tutto ciò lo puoi implementare utilizzando un array o un database. Nel
primo caso puoi utilizzare, ad esempio, un array di elementi ognuno dei
quali sarebbe a sua volta un array di tot elementi atto a rappresentare
una persona. I puntatori non sarebbero altro che elementi numerici
puntanti alla posizione numerica dell'indice dell'array primario (o 0 se
non punta a niente). Nel secondo caso, invece, utilizzeresti un record
per ogni persona e il numero record come indice per i puntatori.
Ovviamente, in entrambi i casi, non puoi eliminare fisicamente dei
record (niente ADEL() o PACK) altrimenti perdi la significatività dei
puntatori. Potresti implementare una tecnica di riutilizzo degli
elementi cancellati. Oppure potresti utilizzare un campo apposta
progressivo come indice invece di lasciare all'ordine fisico il compito
di rappresentarlo.
Spero di averti dato una traccia utile.
EMG

 EMG
Da tempo ho provato come dici tu ma è più facile a dire che a farsi.
Infatti:
1)     i nomi delle persone che costituiscono l'albero genealogico sono
inseribili spesso solo a casaccio in quanto sono disponibili spesso solo
quando vi è disponibilità di ricordi da parte dei più vecchi.
2)    Non riesco a implementare una relazione uno a molti e molti a uno fra
record dello stesso database.
3)    pensate che si debbano usare più database? Per esempio uno per i
figli, uno per i genitori eccc......
Siccome un figlio è a sua volta un genitore, un nonno o un bisnonno ecc...
si fa solo una grande confusione.
4)    Voglio che la generazione di arrivo e partenza sia gestibile non a
priori ma da menù con default a tutti i possibili membri.
Comunque la cosa più difficile mi sembra quella della relazione uno a molti
e molti a uno all'interno dello stesso database.
Come si può risolvere?
Paolo

 e molti a uno all'interno dello stesso database.
La relazione tra genitori e figli e viceversa è data proprio dai campi
"puntatore" di cui sopra.
EMG

Paolo
Certo non ti posso dare un esempio in due righe, ma quello che devi
fare e' uguale a quello che nelle aziende di produzione viene chiamata
Distinta Base.
Solitamente si usa un solo database in cui un campo rappresenta il
Padre e il secondo il figlio. Se un padre ha piu' figli, ci saranno
tanti record che hanno come primo campo il padre e secondo campo i
singoli figli.
Usando poi la tecnica della ricorsione, puoi navigare tra padre e
figli per ricostruire l'albero (esplosione) o, partendo da un figlio,
ricostruire la discenzenza (implosione).
Ciao
-----------------------------
Fabio Cresta
EDP Consultant & VO/Jasmine developer ITALY
President of Clipper/Visual Objects/Jasmine User Group Italy
e-mail: 
fcr...@tin.it
 
fcr...@windevs.com
web: 
http://www.windevs.com
------------------------------

 wrote in message
3875b60e...@news.tin.it...


 wrote:
Questo e' un esempio di ricorsione in Clipper
(se vuoi ne ho altri inPascal o C ma non in Vo)
si tratta di una stampa con esplosione di una distinta
basata su di una key di due fields (padre+figlio)
1 ) caa_pro =padre distinta
2) esa_pro=figlio distinta
**********
  declare point[30]
  declare padri[30]
**********
function livello()
liv=liv+1
padri[liv]=caa_pro
do while caa_pro=padri[liv] .and. inkey()<>27
   *
   set relation to esa_pro into analisi
   @  prow()+1, 1       say esa_pro+"ł"
   @  prow()  , pcol()  say analisi->des_ana+"ł"
   @  prow()  , pcol()  say analisi->una_ana
   *
   point[liv]=caa_pro+esa_pro
   *
   SEEK esa_pro
   if found()
      ********* ricorre !
      livello()
   end
   SEEK point[liv]
   SKIP
   *
   if caa_pro<>padri[liv]
      liv=liv-1
      if liv<1
         exit
      end
   end
enddo
return .t.
**********
Ciao,
Eugenio Belli.


 In cosa consiste la tecnica della ricorsione?
Consiste fondamentalmente in una funzione che, ad un certo punto, chiama
se stessa. Questo approccio viene naturale quando si ha a che fare con
strutture dati, appunto, ricorsive come gli alberi. In questo caso,
ricorsivo significa che da un qualunque nodo dell'albero io vedo un
sotto-albero con caratteristiche simili all'albero completo ed al quale
posso applicare la stessa funzione di ricerca che sto applicando
all'albero nella sua generalità. Da qui la ricorsione.
EMG

    end
Questo è un peccato veniale, ma sarebbe meglio utilizzare i più chiari
ENDIF (anche se bisogna dire, ad onor del vero, che all'interno delle
direttive di preprocessore #command non funzionano gli endif/enddo ma ci
vogliono per forza gli end).
EMG

 wrote:
Si tratta di un cut&paste da un programma
scritto _molti_ anni fa, e che nonostante
tutto continua a funzionare.
Se ricordo bene lo scrissi la prima volta
con un compiler che si chiamava Quick Silver.
Non c'e' dubbio che sia obsoleto e che
non sia scritto nel miglior modo ma era
mia intenzione di dare _solo_ un' idea
di cosa fosse la ricorsione a Pier Paolo.
D'accordo sulle critiche, sono suggerimenti 
che ho adottato in altri linguaggi e programmi
piu' recenti.
Saluti,
Eugenio Belli.
 


buongiorno scusate il disturbo ma io devo fare proprio un database come questo però in access.
Usando la monotabella della distinta base come risolvo il problema della moglie o madre?
vi ringrazio per l'aiuto salvatemi

 l'aiuto salvatemi
 
purtroppo il messaggio al quale hai risposto č stato scritto piů di 14
anni fa, e non penso che la persona che lo ha scritto legge ancora
questo NG.
 
Inoltre in questo gruppo saranno pochi a poter aiutare con Access -
forse meglio cercare un gruppo che si occupa di Access.
 
Wolfgang
 
 
 
-- 
 


Quoto: io conosco 100000 volte meglio access che non VO ma qui siamo OT :)
 
Al3x

 OT :)
 
non avevo scritto "nessuno", avevo scritto "pochi". 
 
E nessuno proibisce che dai una mano al collega.
 
Wolfgang
 
 
-- 
 

Certo, ma se viene su it.comp.appl.access trova me, altri e si rimane IT :-) 
 
Al3x