Fonction récursive et source de données
Stagiaire WDF
Inscrit:
18/08/2003 09:56
De COLMAR (ALSACE)
Post(s): 41
Bonjour à tous.

Voilà, j'ai donc un souci dans l'emploi d'une fonction récursive. Son but est de récupérer une structure hierarchique. Un groupe d'utilisateur administre un sous-groupe qui peut administrer un sous-sous-groupe, etc... Un groupe est forcément administré, mais n'administre pas forcément un sous-groupe. On a donc une structure en arbre. Avec le code ci-dessous, je pensais récupérer cette hierarchie en la mettant dans une liste-table. Je n'aurais plus eu qu'à ensuite trier la liste en fonction du niveau du groupe (le plus haut = 1, le plus bas = n)

Voilà le code :

PROCEDURE Recurs_Group(LeGroupe,Niveau=1)

Req est une Source de Données

SI PAS HExécuteRequêteSQL(Req,"SELECT GroupName,LibGroupName FROM PROFIL WHERE AdminPar = '"+LeGroupe+"'") ALORS
__Info("Erreur lors de l'exécution d'une requête SQL :" + HErreurInfo)
FIN

HLitPremier(Req)

TANTQUE PAS HEnDehors(Req)
__Recurs_Group(Req.GroupName,(Niveau+1))
__ListeAjoute(ComboGroupe,Req.GroupName+TAB+Req.LibGroupName+TAB+Niveau)
FIN


Le problème est que dès que je tombe sur un groupe qui n'a pas de sous-groupe, je sors de la procédure et reviens donc dans l'appel précédent de celle-ci mais la ligne suivante génère une erreur :
ListeAjoute(ComboGroupe,Req.GroupName+TAB+Req.LibGroupName+TAB+Niveau)

En effet, Windev me dis que le fichier "Req" est inconnu dans l'analyse ou que la requête/vue n'est pas initialisée.

J'ai l'impression qu'il n'arrive pas gérer des sources de données local. C'est comme si il considérait ma variable "Req" globale et que dès qu'il sort d'un appel de fonction, pof, il ne reconnait plus la variable. En effet, une source de données est automatiquement détruite quand on sort de la procédure dans laquelle elle a été définie.

Pouvez vous m'aider ?

Contribution le : 15/06/2005 11:38
_________________
Garçon ! Un Homer Bière !!
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
25/05/2005 11:54
Post(s): 24
Piste hypothétique :
Ta fonction étant récursive, Req est redefini a chaque appel. Hors lors d'une extrémité de ton arbre (pas de sous-groupe), la requete "Req" sur lequel se base ton HEnDehors est celui de la requete précédente (enfin me semble-t-il).
Il faudrait, je pense, créer une source de données pour chaque niveau de récursivité afin de conserver l'intégrité de ta variable Req.
Est-il possible de déclarer un :
Req+Niveau est une source de données ??

Contribution le : 15/06/2005 11:49
_________________
Plus on y va moins vite, plus vite on y va moins longtemps
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
18/08/2003 09:56
De COLMAR (ALSACE)
Post(s): 41
J'y ai pensé mais je ne sais pas comment faire, à moins de faire un tableau dynamique de source de données...

Contribution le : 15/06/2005 11:52
_________________
Garçon ! Un Homer Bière !!
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
25/05/2005 11:54
Post(s): 24
Un tableau dynamique correspond grossierement à vos attentes. Par contre, attention aux déclarations et à la réallocation parce que s'il existe beaucoup de branches dans cet arbre, l'allocation dynamique doit se faire pour chaque sous-groupe de chaque sous-groupe de chaque sous-groupe de ..... ce qui peut vite conduire à du petit buffer overflow.

Contribution le : 15/06/2005 11:59
_________________
Plus on y va moins vite, plus vite on y va moins longtemps
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
18/08/2003 09:56
De COLMAR (ALSACE)
Post(s): 41
J'ai écris ça :

GLOBALE A LA FENETRE
__Tab_Req est un tableau de 1 Source de Données

PROCEDURE Recurs_Group(LeGroupe,Niveau=1)

SI Niveau > Dimension(Tab_Req) ALORS
__Tab_Req[Niveau] = allouer un tableau dynamique de Niveau sources de données
FIN

SI PAS HExécuteRequêteSQL(Tab_Req[Niveau],"SELECT GroupName,LibGroupName FROM PROFIL WHERE AdminPar = '"+LeGroupe+"'") ALORS
__Info("Erreur lors de l'exécution d'une Tab_Req[Niveau]uête SQL :" + HErreurInfo)
FIN
HLitPremier(Tab_Req[Niveau])
TANTQUE PAS HEnDehors(Tab_Req[Niveau])
__Recurs_Group((Tab_Req[Niveau].GroupName),(Niveau+1))
__ListeAjoute(ComboGroupe,Tab_Req[Niveau].GroupName+TAB+Tab_Req[Niveau].LibGroupName+TAB+Niveau)
FIN

Mais Windev me dit que le nom de la source de données est indéfini : Tab_Req[Niveau]

Je crois que je ne vais pas m'en sortir si facilement. Là où une petite fonction récursive aurait très bien pu faire l'affaire, je me vois déjà monter une véritable usine à gaz.

Contribution le : 15/06/2005 12:07
_________________
Garçon ! Un Homer Bière !!
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
18/08/2003 09:56
De COLMAR (ALSACE)
Post(s): 41
PROBLèME RéSOLU :

PROCEDURE Recurs_Group(LeGroupe,Niveau=1)

HExécuteRequêteSQL("Req"+Niveau,"SELECT GroupName,LibGroupName FROM PROFIL WHERE AdminPar = '"+LeGroupe+"'")

HLitPremier({"Req"+Niveau})

TANTQUE PAS HEnDehors({"Req"+Niveau})
__Recurs_Group(({"Req"+Niveau+".GroupName"}),(Niveau+1))
__ListeAjoute(ComboGroupe,{"Req"+Niveau+".GroupName"}+TAB+{"Req"+Niveau+".LibGroupName"}+TAB+Niveau)
__HLitSuivant({"Req"+Niveau})
FIN


De cette manière, il est possible de déclarer des variables "source de données" de type "Req"+Indice (Req1,Req2,Req3,etc...)

Trouvé dans l'aide de Windev :
Externe MaRequête ; HExécuteRequêteSQL(MaRequête, "SELECT NOM FROM CLIENT")
// Autre syntaxe possible :
HExécuteRequêteSQL("MaRequête", "SELECT NOM FROM CLIENT")


Merci de m'avoir aidé !

Contribution le : 15/06/2005 12:23
_________________
Garçon ! Un Homer Bière !!
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
25/05/2005 11:54
Post(s): 24
Finalement, vous etes passé à coté de l'usine à gaz.
J'avais pensé à cette solution mais j'étais persuadé que cette orthographe ne s'employait que pour les champs. Je pense que ca devrait etre réutilisable dans bien des cas ...

Contribution le : 15/06/2005 14:09
_________________
Plus on y va moins vite, plus vite on y va moins longtemps
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Anonyme
Maintenant, j'aimerais bien savoir quand est libéré la mémoire utilisé dans les sources de données généré à la volé.
Est ce que le traitement fonctionnes plusieurs fois, sans redémarre l'appli?

Sinon, pour ce même problème, je fesait une liste des ID utiles dans une chaine, puis je la parcourait dans ma boucle qui fait l'appel à la procédure.

Contribution le : 15/06/2005 14:21
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Bonjour

Voila un bel exemple d'indirection pour les frileux !

@Killaw
Citation :
ne s'employait que pour les champs

Heureusement que non et il faudrait vite penser à lire l'aide sur le sujet (et pouquoi pas nos dossiers).

@Homer
Félicitation.
Citation :
j'aimerais bien savoir quand est libéré la mémoire utilisé dans les sources de données

... Lors de leur désactivation, à savoir l'appel des HAnnuleDéclaration. Il est donc vivement conseillé de les libérer aussi rapidement que possible.

Contribution le : 16/06/2005 16:09
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Stagiaire WDF
Inscrit:
25/05/2005 11:54
Post(s): 24
@R&B
Citation :
Heureusement que non et il faudrait vite penser à lire l'aide sur le sujet (et pouquoi pas nos dossiers).


Je suis navré de la limite de mes connaissances néanmoins mes 2 semaines de windev en tant que stagiaire peuvent surement m'en excuser. Toutefois, je fais de mon mieux pour essayer d'aider les personnes sur ce forum ce qui, apparement, n'est pas au gout de tout le monde. [Attaque personelle inutile et modérée]

PS: Ceci n'est pas un reglement de compte mais une mise au point.

Cordialement.
Moi

Contribution le : 16/06/2005 16:25
_________________
Plus on y va moins vite, plus vite on y va moins longtemps
Créer un fichier PDF de la contribution Imprimer


Re: Fonction récursive et source de données
Animateur WDF
Inscrit:
26/06/2002 16:24
De wdforge.org
Post(s): 2822
Killaw, attention, il y a méprise (et non mépris tout cours loin s'en faut).
Il s'agissait juste de mettre en évidence les indirections, qui affublées des nécessaires constantes (IndChamp, IndFichier...) pour accélerer les traitement (WinDev recherche alors à la bonne place dans la pile des éléments en mémoire), sont réellement une trés grande fonctionnalité de WinDev pour produire des programmes adaptatifs et concis.

Pour le reste, je remercie (régulièrement) toutes les personnes actives ici bas quelques soient leur niveau, origines et activité. Dois-je encore le faire ?

Contribution le : 16/06/2005 17:19
_________________
R&B
Contact, CV.
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2