|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Débuté par IOM - Fabien, 26 juil. 2004 21:23 - 7 réponses |
| |
| | | |
|
| |
Posté le 26 juillet 2004 - 21:23 |
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 |
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 10:50 |
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 |
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 11:27 |
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 |
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 13:00 |
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
|
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 14:12 |
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
|
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 14:42 |
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
|
| |
| |
| | | |
|
| | |
| |
Posté le 27 juillet 2004 - 17:18 |
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
|
| |
| |
| | | |
|
| | |
| |
Posté le 28 juillet 2004 - 13:34 |
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
|
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|