OVH Cloud OVH Cloud

[WD7.5-SQL] SQL ManagerX et récursivité ?

5 réponses
Avatar
Stéphane Miqueu
Bonjour,

Je rencontre un petit souci.
Soit une table de produits composés de Matières et/ou de Bases
Une base peut être composée de Matières et/ou de Bases
En gros :
P1
--B1
----M2
----M3
----M4
--M2
--M26
--M75

Je voudrais faire afficher tout ça dans un treeview. Rien que du
classique que je sais faire. MAIS les données sont dans une base SQL et
ma fonction récursive se plante. A l'affichage je n'ai que :
P1
--B1
----M2
----M3
----M4

Au début j'utilisais toujours le même n° de requête donc normal que ça
plante. Maintenant j'incrémente le n° à chaque appel récursif et ça
plante toujours.

Des idées ?

--
Ami Calmant
Stéphane

5 réponses

Avatar
Emmanuel Lecoester
"Stéphane Miqueu" a écrit dans le message de
news:
Bonjour,

Je rencontre un petit souci.
Soit une table de produits composés de Matières et/ou de Bases
Une base peut être composée de Matières et/ou de Bases
En gros :
P1
--B1
----M2
----M3
----M4
--M2
--M26
--M75

Je voudrais faire afficher tout ça dans un treeview. Rien que du
classique que je sais faire. MAIS les données sont dans une base SQL et
ma fonction récursive se plante. A l'affichage je n'ai que :
P1
--B1
----M2
----M3
----M4

Au début j'utilisais toujours le même n° de requête donc normal que ça
plante. Maintenant j'incrémente le n° à chaque appel récursif et ça
plante toujours.

Des idées ?



Comme répondu sur le forum du site (parce que si je dit la réponse est sur
le forum du site c'est de la pub ;-))

"Bonjour Stéphane,

La récursivité peut être résolue avec 2 options :
- requete avec auto-jointure(s)
- utilisation de SQLManagerX qui possède les méthodes SauvePosition et
RetourPosition du moment que la table possède une clé primaire

Maintenant j'ai toujours réussi à me passer de l'option 2 dans mes
migrations de projet.
Le fait de tout mettre dans une requete assure : un temps de réponse
constant quelque soit le nombre d'utilisateurs, un accès optimisé à la base
de données (du moment que les indexes existent). Seule contrainte : si ta
recursivité n'a pas de fond maximum c'est plus compliqué à mettre en oeuvre
(construction de ta requete), si elle possède une profondeur maxi, suffit de
faire n+1 jointure :)

Voilà : à toi de faire ton choix :)

Bienvenue parmi nous
"

++
Avatar
Firetox
Bonjour,

manu a raison et tord.
raison car il est plus facile pour lui de le faire directement en acces
natif avec 1 requete.

maintenant je ne vois pas ce qui genrait de le faire en
SQLManagerX.j'utilise dans le data center une base pour gerer le treeview et
dans le chargment pas de probleme. dans ta desription sur le site
SQLManagerX tu parle de n° de requete donc tu passe par l'acces natif. sinon
SQLManagerX ouvre et ferme les requete a chaque fois donc pas de gene de ce
cote la. si on utilise SQLPremier et SQLSuivant, le N° de requete est
referme a chaque fois donc il serait possibile de le faire et le data center
le fais bien.

maintenant je pense qu'il faut plutot que tu t'oriente vers 1 requete et
parcours de cette requete sinon passe en SQLManagerX et faire des filtres
sur les tables et utiliser sauvePosition et retourPosition puisque tu
utilise la meme table ou sinon utiliser un autre objet sur la table

rien n'empeche d'instancier un objet SQLManagerX au moment ou tu en a
besoin.

bref tout depend aussi de comment est fait la table, et comme est stocké la
hierarchisation

deuxieme point a eviter : la recursivite
sous windev elle est limite. faites un test sur la multiplication chinoise
pour voir combien d'appel on peu avoir avant d'exploser la pile

voici a procedure :
FUNCTION multiplication(vA , vB)
SI vB > 0 ALORS RENVOYER(vA+multiplication(vA,vB-1)) SINON RENVOYER vB

et l'appel :
v_res est un entier
v_res = multiplication(1,842)
Trace(v_res)

en Windev 7.5 842 appels est le maximum si jamais vous mettez 843 ca plante
donc mef avec le recursif

bref il y a surement une solution maintenant voir quelle option tu veux
prendre

@+


donc
"Stéphane Miqueu" a écrit dans le message de news:

Bonjour,

Je rencontre un petit souci.
Soit une table de produits composés de Matières et/ou de Bases
Une base peut être composée de Matières et/ou de Bases
En gros :
P1
--B1
----M2
----M3
----M4
--M2
--M26
--M75

Je voudrais faire afficher tout ça dans un treeview. Rien que du classique
que je sais faire. MAIS les données sont dans une base SQL et ma fonction
récursive se plante. A l'affichage je n'ai que :
P1
--B1
----M2
----M3
----M4

Au début j'utilisais toujours le même n° de requête donc normal que ça
plante. Maintenant j'incrémente le n° à chaque appel récursif et ça plante
toujours.

Des idées ?

--
Ami Calmant
Stéphane




Avatar
Stéphane Miqueu
Après mûre réflexion, Emmanuel Lecoester a écrit :
Comme répondu sur le forum du site (parce que si je dit la réponse est sur
le forum du site c'est de la pub ;-))

"Bonjour Stéphane,

La récursivité peut être résolue avec 2 options :
- requete avec auto-jointure(s)
- utilisation de SQLManagerX qui possède les méthodes SauvePosition et
RetourPosition du moment que la table possède une clé primaire

Maintenant j'ai toujours réussi à me passer de l'option 2 dans mes
migrations de projet.
Le fait de tout mettre dans une requete assure : un temps de réponse
constant quelque soit le nombre d'utilisateurs, un accès optimisé à la base
de données (du moment que les indexes existent). Seule contrainte : si ta
recursivité n'a pas de fond maximum c'est plus compliqué à mettre en oeuvre
(construction de ta requete), si elle possède une profondeur maxi, suffit de
faire n+1 jointure :)

Voilà : à toi de faire ton choix :)

Bienvenue parmi nous
"

++



Bonjour,

Ok j'arrive à suivre. Effectivement pour l'instant je ne passe que par
l'accès natif (pas de SQLManagerX) en incrémentant le n° de requête
mais ça ne fonctionne pas.

Donc soit je gère un tableau dynamique pour stocker le résultat de ma
requête et je traite ce tableau soit j'essais la solution de Manu
(requete avec auto-jointure(s)) mais ça je ne vois pas bien comment le
faire.

Je m'en vais de ce pas chercher sur le net.

Merci de votre aide

--
Ami Calmant
Stéphane
Avatar
nwjb
Le Tue, 04 Apr 2006 16:27:03 +0200, Stéphane Miqueu
a écrit:

Bonjour,

Je rencontre un petit souci.
Soit une table de produits composés de Matières et/ou de Bases
Une base peut être composée de Matières et/ou de Bases
En gros :
P1
--B1
----M2
----M3
----M4
--M2
--M26
--M75

Je voudrais faire afficher tout ça dans un treeview. Rien que du
classique que je sais faire. MAIS les données sont dans une base SQL et
ma fonction récursive se plante. A l'affichage je n'ai que :
P1
--B1
----M2
----M3
----M4

Au début j'utilisais toujours le même n° de requête donc normal que ça
plante. Maintenant j'incrémente le n° à chaque appel récursif et ça
plante toujours.

Des idées ?

--
Ami Calmant
Stéphane




J'utilise la même méthode en concaténant le niveau au nom de la requête et
n'ai
pas de problèmes spécial. J'utilise une base Oracle en accès OleDB depuis
WD direct, mais
fonctionne aussi sur fichiers HF. Il ne faut pas oublier de détecter le
niveau le plus bas
et de 'refermer' les niveaux ouverts. J'utilise cela pour gérer des
'Favoris'. La profondeur
est habituellement assez limitée ( moins de 10 niveaux). Si le code est
utile je peux le mettre.


--
J.Bratières
Avatar
Stéphane Miqueu
nwjb a écrit :
J'utilise la même méthode en concaténant le niveau au nom de la requête
et n'ai
pas de problèmes spécial. J'utilise une base Oracle en accès OleDB
depuis WD direct, mais
fonctionne aussi sur fichiers HF. Il ne faut pas oublier de détecter le
niveau le plus bas
et de 'refermer' les niveaux ouverts. J'utilise cela pour gérer des
'Favoris'. La profondeur
est habituellement assez limitée ( moins de 10 niveaux). Si le code est
utile je peux le mettre.


--J.Bratières



Un exemple de code est toujours utile pour s'enrichir.

Pour une gestion de Favoris, j'aurais plutôt adopté une structure
'nested tree' bien plus simple à gérer (1 seule table) et ainsi on
s'évite la récursivité.

Dans mon cas c'est impossible car un élément de produits peut être
composé d'un autre élément de produit qui lui même ...

--
Ami Calmant
Stéphane