PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Fonctions récursives
Fonctions récursives
Started by IOM - Fabien, Jul., 26 2004 9:23 PM - 7 replies
Posted on July, 26 2004 - 9:23 PM
C'est possible de faire des fonctions récursives (cad , qui s'appellent
elles-memes ds leur propore code) en windev ?
J'en ai fait une qui me parait correcte algorithymiquement parlant mais elle
plante sitot qu'elle doit remonter un niveau d'appel :

*********** ANNALYSE ****************
1 fichier avec 3 rubriques :

Niveau
IDNiveau
nom
idParent

**************** Fonction **********************
PROCEDURE analyserNiveau(numNiveau)

sdd,sdd2 est une Source de Données
req est une chaîne = "SELECT * FROM Niveau WHERE idParent=" + numNiveau //+
" ORDER BY idParent ASC"

req2 est une chaîne
HExécuteRequêteSQL(sdd,req)ALORS
HLitPremier(sdd)
TANTQUE PAS HEnDehors()
// On affiche ts les niveaux actuels
Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

req2 = "SELECT * FROM Niveau WHERE idParent=" + sdd.IDNiveau
HLitPremier(sdd2)
TANTQUE PAS HEnDehors()
// on va chercher les enfants de ceux la
analyserNiveau(sdd2.IDNiveau)
HLitSuivant(sdd2)
FIN
HLitSuivant(sdd)
FIN
Posted on July, 27 2004 - 10:50 AM
Bonjour,
Essai de faire un HSauvePosition juste avant l'appel de la fonction
et Hrestoreposition juste après.

--
Ami Calmant
Stéphane



---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.726 / Virus Database: 481 - Release Date: 22/07/2004
Posted on July, 27 2004 - 11:27 AM
cela ne marche pas :(

faudrait peut etre voir ca messieurs les developpeurs de PCSOFT ...
"Stéphane" <stephane.miqueu@free.fr> a écrit dans le message de news:
4105fbee$1@news.pcsoft.fr...

Bonjour,
Essai de faire un HSauvePosition juste avant l'appel de la fonction
et Hrestoreposition juste après.

--
Ami Calmant
Stéphane



---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.726 / Virus Database: 481 - Release Date: 22/07/2004

Posted on July, 27 2004 - 1:00 PM
Bonjour,

HExécuteRequêteSQL(sdd,req)ALORS

// il manque qq chose

et...

Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

s'écrit plus simplement :

Fenêtre1.Saisie1 += RC + sdd.nom

Bien cordialement,

Jacques De Schryver

"IOM - Fabien" <fabien@iom.fr> wrote:

C'est possible de faire des fonctions récursives (cad , qui s'appellent
elles-memes ds leur propore code) en windev ?
J'en ai fait une qui me parait correcte algorithymiquement parlant mais

elle
plante sitot qu'elle doit remonter un niveau d'appel :

*********** ANNALYSE ****************
1 fichier avec 3 rubriques :

Niveau
IDNiveau
nom
idParent

**************** Fonction **********************
PROCEDURE analyserNiveau(numNiveau)

sdd,sdd2 est une Source de Données
req est une chaîne = "SELECT * FROM Niveau WHERE idParent=" + numNiveau

//+
" ORDER BY idParent ASC"

req2 est une chaîne
HExécuteRequêteSQL(sdd,req)ALORS
HLitPremier(sdd)
TANTQUE PAS HEnDehors()
// On affiche ts les niveaux actuels
Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

req2 = "SELECT * FROM Niveau WHERE idParent=" + sdd.IDNiveau
HLitPremier(sdd2)
TANTQUE PAS HEnDehors()
// on va chercher les enfants de ceux la
analyserNiveau(sdd2.IDNiveau)
HLitSuivant(sdd2)
FIN
HLitSuivant(sdd)
FIN

Posted on July, 27 2004 - 2:12 PM
oui mais le pb ne vient pas de la ....

"Jacques De Schryver" <jdsetls@netscape.net> a écrit dans le message de
news: 410619c2$1@news.pcsoft.fr...


Bonjour,

HExécuteRequêteSQL(sdd,req)ALORS

// il manque qq chose

et...

Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

s'écrit plus simplement :

Fenêtre1.Saisie1 += RC + sdd.nom

Bien cordialement,

Jacques De Schryver

"IOM - Fabien" <fabien@iom.fr> wrote:

C'est possible de faire des fonctions récursives (cad , qui s'appellent
elles-memes ds leur propore code) en windev ?
J'en ai fait une qui me parait correcte algorithymiquement parlant mais
elle

plante sitot qu'elle doit remonter un niveau d'appel :

*********** ANNALYSE ****************
1 fichier avec 3 rubriques :

Niveau
IDNiveau
nom
idParent

**************** Fonction **********************
PROCEDURE analyserNiveau(numNiveau)

sdd,sdd2 est une Source de Données
req est une chaîne = "SELECT * FROM Niveau WHERE idParent=" + numNiveau
//+

" ORDER BY idParent ASC"

req2 est une chaîne
HExécuteRequêteSQL(sdd,req)ALORS
HLitPremier(sdd)
TANTQUE PAS HEnDehors()
// On affiche ts les niveaux actuels
Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

req2 = "SELECT * FROM Niveau WHERE idParent=" + sdd.IDNiveau
HLitPremier(sdd2)
TANTQUE PAS HEnDehors()
// on va chercher les enfants de ceux la
analyserNiveau(sdd2.IDNiveau)
HLitSuivant(sdd2)
FIN
HLitSuivant(sdd)
FIN


Posted on July, 27 2004 - 2:42 PM
Bonjour,

Si l'analyse de niveaux effectue une lecture du fichier ou de la requête
qui se montre indocile, alors, comme précisé dans un courrier précédent,
ta réponse se trouve dans les instructions HSauvePosition (qui renvoie un
numérique), de préférence sans second paramètre et ensuite HRetourPosition,
qui réactualise là où il faut.

Sinon tu te heurtes de façon prématurée à un message de fin ou début de fichier.

J'espèe que c'est là bonne direction.

Jacques De Schryver








"IOM - Fabien" <fabien@iom.fr> wrote:

oui mais le pb ne vient pas de la ....

"Jacques De Schryver" <jdsetls@netscape.net> a écrit dans le message de
news: 410619c2$1@news.pcsoft.fr...


Bonjour,

HExécuteRequêteSQL(sdd,req)ALORS

// il manque qq chose

et...

Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

s'écrit plus simplement :

Fenêtre1.Saisie1 += RC + sdd.nom

Bien cordialement,

Jacques De Schryver

"IOM - Fabien" <fabien@iom.fr> wrote:

C'est possible de faire des fonctions récursives (cad , qui s'appellent
elles-memes ds leur propore code) en windev ?
J'en ai fait une qui me parait correcte algorithymiquement parlant mais
elle

plante sitot qu'elle doit remonter un niveau d'appel :

*********** ANNALYSE ****************
1 fichier avec 3 rubriques :

Niveau
IDNiveau
nom
idParent

**************** Fonction **********************
PROCEDURE analyserNiveau(numNiveau)

sdd,sdd2 est une Source de Données
req est une chaîne = "SELECT * FROM Niveau WHERE idParent=" + numNiveau
//+

" ORDER BY idParent ASC"

req2 est une chaîne
HExécuteRequêteSQL(sdd,req)ALORS
HLitPremier(sdd)
TANTQUE PAS HEnDehors()
// On affiche ts les niveaux actuels
Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

req2 = "SELECT * FROM Niveau WHERE idParent=" + sdd.IDNiveau
HLitPremier(sdd2)
TANTQUE PAS HEnDehors()
// on va chercher les enfants de ceux la
analyserNiveau(sdd2.IDNiveau)
HLitSuivant(sdd2)
FIN
HLitSuivant(sdd)
FIN




Posted on July, 27 2004 - 5:18 PM
Bonjour,

Envoie ton code complet, avec la procédure liée, svp.

Jacques De Schryver







"IOM - Fabien" <fabien@iom.fr> wrote:

cela ne marche pas :(

faudrait peut etre voir ca messieurs les developpeurs de PCSOFT ...
"Stéphane" <stephane.miqueu@free.fr> a écrit dans le message de news:
4105fbee$1@news.pcsoft.fr...

Bonjour,
Essai de faire un HSauvePosition juste avant l'appel de la fonction
et Hrestoreposition juste après.

--
Ami Calmant
Stéphane



---
Courrier sortant certifié sans virus
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.726 / Virus Database: 481 - Release Date



: 22/07/2004



Posted on July, 28 2004 - 1:34 PM
bonjour,

1/ je confirme qu'il est possible d'utiliser la récursivité de fonction avec
Windev 8
2/ il est néanmoins important de considérer qu'une fonction qui s'appelle
elle-même doit
renvoyer une valeur et intégrer dès le debut de la fonction un test pour la
condition de sortie sur cette valeur
En effet la fonction "s'empile" donc il faut lui donner les moyens de se
"dépiler"
3/ attention, une fonction récursive peut ête intéressante à écrire mais ne
pas constittuer la solution la
plus performante :

exemple :

Fonction RecursiveFactorielle(_nEntier) // très scolaire |:-))

Si _nEntier=0 alors Renvoyer 1
Renvoyer _nEntier*RecursiveFactorielle(_nEntier-1)

Si vous faite un test chrono avec le profiler de WD8 vous constaterez qu'une
programmation classique
du type ...

Fonction ClassiqueFactorielle(_nEntier)

nResultat est un entier=1

I est un entier
Pour I=1 A _nEntier
nResultat=nResultat*I
Fin

Renvoyer nResultat

.... est plus rapide

pour votre probleme, je n'est pas testé ce cas particulier mais je crains
que la situation ne soit
délicate en l'etat même avec les sauvegardes et restauration de contexte car
vous utilisez des sources
de données et Requetes SQL mais ces sources de données sont réinitialisées
dès que vous entrez dans
la fonction recursive !!!!

de plus, votre condition de sortie est HEndehors()
1/ vous risquez la sortie dès le premier test si la requete renvoyer 0
resulstat et votre fonction se retrouve dans le vide
2/ si par exemple HEndehors() est à vrai pour sdd lors d'un empilage via
sdd2 alors vous vous retrouvez sur un HlitSuivant(sdd2)
qui n'a pas été initialisé par HLitPremier()

Je pense qu'il serait souhaitable d'exposer au groupe la finalité de votre
besoin concret car le débat sur les fonctions récursives
devrait être des plus riche pour la communauté.

Bon courage
J.MEDA



"IOM - Fabien" <fabien@iom.fr> a écrit dans le message de
news:41053e2a$1@news.pcsoft.fr...

C'est possible de faire des fonctions récursives (cad , qui s'appellent
elles-memes ds leur propore code) en windev ?
J'en ai fait une qui me parait correcte algorithymiquement parlant mais

elle
plante sitot qu'elle doit remonter un niveau d'appel :

*********** ANNALYSE ****************
1 fichier avec 3 rubriques :

Niveau
IDNiveau
nom
idParent

**************** Fonction **********************
PROCEDURE analyserNiveau(numNiveau)

sdd,sdd2 est une Source de Données
req est une chaîne = "SELECT * FROM Niveau WHERE idParent=" + numNiveau

//+
" ORDER BY idParent ASC"

req2 est une chaîne
HExécuteRequêteSQL(sdd,req)ALORS
HLitPremier(sdd)
TANTQUE PAS HEnDehors()
// On affiche ts les niveaux actuels
Fenêtre1.Saisie1 = Fenêtre1.Saisie1 +RC + sdd.nom

req2 = "SELECT * FROM Niveau WHERE idParent=" + sdd.IDNiveau
HLitPremier(sdd2)
TANTQUE PAS HEnDehors()
// on va chercher les enfants de ceux la
analyserNiveau(sdd2.IDNiveau)
HLitSuivant(sdd2)
FIN
HLitSuivant(sdd)
FIN