OVH Cloud OVH Cloud

[SQL] Relation à n niveaux

5 réponses
Avatar
Gilles Balp
Bonjour,

Je patauge dans la mise au point de la construction d'un treeview à partir
de deux tables du type :
T1 avec identifiant unique IDT1 représentant une entité
T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
IDT1 (0,n 0,1)
style "arbre généalogique"

j'y arrive avec multiples requêtes et incrémentation et décrémentation de
compteurs suivant les niveaux des fils qui ont des fils et encore et
toujours.... (faudrait qu'ils se calment...)

en un mot quelle est l'astuce, si il y en a une, pour torcher le résultat
avec un bonne requête qu'il suffit de balayer pas à pas avec un simple test
sur l'enregistrement précédent par exemple
(je me sens très optimiste)

Merci d'avance


--
Gilles Balp
gil.balp@libertysurf.fr

5 réponses

Avatar
Ph. B.
> Bonjour,



Bonjour,

Je patauge dans la mise au point de la construction d'un treeview à partir
de deux tables du type :
T1 avec identifiant unique IDT1 représentant une entité
T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
IDT1 (0,n 0,1)
style "arbre généalogique"



Donc en gros, obtenir une réprésentation "plate" d'une structure
originellement arborescente...

j'y arrive avec multiples requêtes et incrémentation et décrémentation de
compteurs suivant les niveaux des fils qui ont des fils et encore et
toujours.... (faudrait qu'ils se calment...)



Compte tenu de la modélisation choisie (2 tables dont l'une représente
des liens de type père/fils), il n'y a pas de solution immédiate, si ce
n'est d'utiliser une procédure stockée qui encapsule toutes les
manipulations permettant d'obtenir le résultat.
Mais ces manipulations risquent de devenir très pénalisantes en termes
de temps consommé pour des arbres de profondeur importante, voire même
de faire écrouler le système.

en un mot quelle est l'astuce, si il y en a une, pour torcher le résultat
avec un bonne requête qu'il suffit de balayer pas à pas avec un simple test
sur l'enregistrement précédent par exemple
(je me sens très optimiste)



Il faut être optimiste ! ;-)

La solution est de repenser la modélisation de ton arbre de hiérarchique
à intervallaire (un peu comme on transforme une fonction récursive en
fonction itérative). Cela imposera de revoir ton modèle de données !

Pour tous les détails, Frédéric Brouard a expliqué tout cela en détail
et je te renvoie donc à son site et plus particulièrement :
http://sqlpro.developpez.com/Tree/SQL_tree.html
Y est exposé le principe et un exemple de résolution s'appuyant sur le
SGBD Ms-SQLServer 2000....

Merci d'avance



De rien,
--
Philippe Boucault.
Avatar
Roumegou
Salut Gilles,

Gilles Balp a exposé le 22/05/2004 :
Bonjour,

Je patauge dans la mise au point de la construction d'un treeview à partir
de deux tables du type :
T1 avec identifiant unique IDT1 représentant une entité
T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
IDT1 (0,n 0,1)
style "arbre généalogique"



si tu veux, j'ai développé un systeme de gestion de treeview (type
gestion de menu) pour référencer des fichiers excel, word, page html,
pdf,page webdev, upload, download ...
à partir de deux tables mySQL(en tête, et détail avec notion de pere);
tu peux gérer une profondeur illimitée.

J'ai développé les fenêtres en WD75 pour gérer et créer ces arbres et
en webdev la page pour les exploiter.(en modifiant un peu le composant)

Si cela t'interresse, mais il faudrait que je réorganise cela un peu.

j'y arrive avec multiples requêtes et incrémentation et décrémentation de
compteurs suivant les niveaux des fils qui ont des fils et encore et
toujours.... (faudrait qu'ils se calment...)

en un mot quelle est l'astuce, si il y en a une, pour torcher le résultat
avec un bonne requête qu'il suffit de balayer pas à pas avec un simple test
sur l'enregistrement précédent par exemple
(je me sens très optimiste)

Merci d'avance



--
Eric Roumégou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Gilles Balp
Merci beaucoup pour ces précieuses informations, je vais m'en inspirer


"Ph. B." a écrit dans le message
de news:40b068ef$0$21892$
> Bonjour,

Bonjour,

> Je patauge dans la mise au point de la construction d'un treeview à


partir
> de deux tables du type :
> T1 avec identifiant unique IDT1 représentant une entité
> T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
> IDT1 (0,n 0,1)
> style "arbre généalogique"

Donc en gros, obtenir une réprésentation "plate" d'une structure
originellement arborescente...

> j'y arrive avec multiples requêtes et incrémentation et décrémentation


de
> compteurs suivant les niveaux des fils qui ont des fils et encore et
> toujours.... (faudrait qu'ils se calment...)

Compte tenu de la modélisation choisie (2 tables dont l'une représente
des liens de type père/fils), il n'y a pas de solution immédiate, si ce
n'est d'utiliser une procédure stockée qui encapsule toutes les
manipulations permettant d'obtenir le résultat.
Mais ces manipulations risquent de devenir très pénalisantes en termes
de temps consommé pour des arbres de profondeur importante, voire même
de faire écrouler le système.

> en un mot quelle est l'astuce, si il y en a une, pour torcher le


résultat
> avec un bonne requête qu'il suffit de balayer pas à pas avec un simple


test
> sur l'enregistrement précédent par exemple
> (je me sens très optimiste)

Il faut être optimiste ! ;-)

La solution est de repenser la modélisation de ton arbre de hiérarchique
à intervallaire (un peu comme on transforme une fonction récursive en
fonction itérative). Cela imposera de revoir ton modèle de données !

Pour tous les détails, Frédéric Brouard a expliqué tout cela en détail
et je te renvoie donc à son site et plus particulièrement :
http://sqlpro.developpez.com/Tree/SQL_tree.html
Y est exposé le principe et un exemple de résolution s'appuyant sur le
SGBD Ms-SQLServer 2000....

> Merci d'avance

De rien,
--
Philippe Boucault.


Avatar
ericdescatoire
"Gilles Balp" wrote in message news:<c8ohm2$ssk$...
Bonjour,

Je patauge dans la mise au point de la construction d'un treeview à partir
de deux tables du type :
T1 avec identifiant unique IDT1 représentant une entité
T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
IDT1 (0,n 0,1)
style "arbre généalogique"

j'y arrive avec multiples requêtes et incrémentation et décrémentation de
compteurs suivant les niveaux des fils qui ont des fils et encore et
toujours.... (faudrait qu'ils se calment...)

en un mot quelle est l'astuce, si il y en a une, pour torcher le résultat
avec un bonne requête qu'il suffit de balayer pas à pas avec un simple test
sur l'enregistrement précédent par exemple
(je me sens très optimiste)

Merci d'avance



Bonjour Gilles,

Il y a la possibilité d'utiliser la représentation intervallaire des
arbres que j'ai découvert récemment sur le site SQLpro et dont il est
fait référence dans ce fil de discussion.
Mais avant de découvrir cela, j'avais développé une appli dans
laquelle j'utilise un treeview pour afficher un organigramme
hiérarchique dont voici un rapide descriptif et le code de
remplissage:

je n'ai qu'un seul fichier de fonction nommé "Profession":
- CodeProfession
- Libellé
- Niveau
...
- CodeSup

// Code d'initialisation du arbOrganigramme (c'est le nom du TV)
ElémentCourant,IdSupérieur,Image sont des chaînes
NPos est un entier
ArbreSupprimeTout(arbOrganigramme)
Image = "C:Mes ProjetsMéthode UVA 1USINE-.BMP"
ArbreAjoute(MoiMême,saiRaisonSociale,Image,Image,"*S",aDernier) ;
ArbreDéroule(MoiMême,saiRaisonSociale)
// Pour chaque profession du fichier "Profession", récupération de la
chaine hiérarchique ...
POUR TOUTE Profession sur Niveau
ElémentCourant = Profession.Libellé
IdSupérieur = Profession.CodeSup
NPos = HSauvePosition(Profession,Niveau)
// Cette boucle est la clé du remplissage du treeview
TANTQUE HLitRecherchePremier(Profession,CodeProf,IdSupérieur) = Vrai
ElémentCourant = Profession.Libellé+TAB+ElémentCourant
IdSupérieur = Profession.CodeSup
FIN
ElémentCourant = saiRaisonSociale+TAB+ElémentCourant
HRetourPosition(NPos)
// que l'on ajoute à l'arbre, noeud déroulé.
SI Profession.Niveau = 1 ALORS Image = "C:Mes ProjetsMéthode UVA
1INFO4-.BMP" SINON Image = "C:Mes ProjetsMéthode UVA
1PERSONN2-.BMP"
ArbreAjoute(arbOrganigramme,ElémentCourant,Image,Image,Profession.CodeProf,aDernier,Profession.CodeProf)
// avec la liste des salariés de la profession (test d'affichage des
salariés par fonction)
HExécuteRequête(reqSalariéParFonction,hRequêteDéfaut,Profession.CodeProf)
POUR TOUT reqSalariéParFonction sur CodeSal
ArbreAjoute(MoiMême,ElémentCourant+TAB+reqSalariéParFonction.Prénom+"
"+reqSalariéParFonction.Nom,...
aDéfaut,aDéfaut,reqSalariéParFonction.CodeSal,aDernier,reqSalariéParFonction.CodeSal)
FIN
ArbreDéroule(arbOrganigramme,ElémentCourant)
FIN
// Sélection de la racine de l'arbre.
ArbreSelectPlus(MoiMême,saiRaisonSociale)

L'arbre est affiché déroulé et pour chaque fonction, la liste des
salariés correspondantes est aussi affiché. Le point clé de ce code
est la boucle TANTQUE. Attention, dans mon cas chaque fonction n'a
qu'un seul supérieur hiérarchique!

En espérant que ceci te soit utile.
Bon dev,
Eric
Avatar
Gilles Balp
Merci à vous tous pour ces différentes pistes, je vais étudier tout çà pour
l'adapter à mon problème .


"Gilles Balp" a écrit dans le message de
news:c8ohm2$ssk$
Bonjour,

Je patauge dans la mise au point de la construction d'un treeview à partir
de deux tables du type :
T1 avec identifiant unique IDT1 représentant une entité
T2 , table de relation avec T1 par deux liaisons IDPère et IDFils avec
IDT1 (0,n 0,1)
style "arbre généalogique"

j'y arrive avec multiples requêtes et incrémentation et décrémentation de
compteurs suivant les niveaux des fils qui ont des fils et encore et
toujours.... (faudrait qu'ils se calment...)

en un mot quelle est l'astuce, si il y en a une, pour torcher le résultat
avec un bonne requête qu'il suffit de balayer pas à pas avec un simple


test
sur l'enregistrement précédent par exemple
(je me sens très optimiste)

Merci d'avance


--
Gilles Balp