OVH Cloud OVH Cloud

Fonctions récursives

6 réponses
Avatar
Fabien Mas
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

6 réponses

Avatar
...
Je suppose que le plantage lors du retour concerne Hyperfile ?
Ton algo est correct, mais tu ne prends pas en compte une contrainte liée à
Hyperfile. Même si tu déclares une nouvelle source de données, Windev ne
gère pas un contexte pour chaque source de données, mais plutôt pour chaque
fichier. Belle aberration...

Regarde les fonctions hSauvePosition et hRetourPosition


"Fabien Mas" a écrit dans le message de
news:41053e1d$0$8538$
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




Avatar
Fabien Mas
ben ca marche pas mieux :(
merci de ton aide
"..." a écrit dans le message de news:
YwgNc.60063$
Je suppose que le plantage lors du retour concerne Hyperfile ?
Ton algo est correct, mais tu ne prends pas en compte une contrainte liée


à
Hyperfile. Même si tu déclares une nouvelle source de données, Windev ne
gère pas un contexte pour chaque source de données, mais plutôt pour


chaque
fichier. Belle aberration...

Regarde les fonctions hSauvePosition et hRetourPosition


"Fabien Mas" a écrit dans le message de
news:41053e1d$0$8538$
> 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
>
>




Avatar
Michel Moreno
Fabien Mas wrote:

ben ca marche pas mieux :(
merci de ton aide
"..." a écrit dans le message de news:
YwgNc.60063$

Je suppose que le plantage lors du retour concerne Hyperfile ?
Ton algo est correct, mais tu ne prends pas en compte une contrainte liée



à

Hyperfile. Même si tu déclares une nouvelle source de données, Windev ne
gère pas un contexte pour chaque source de données, mais plutôt pour



chaque

fichier. Belle aberration...

Regarde les fonctions hSauvePosition et hRetourPosition


"Fabien Mas" a écrit dans le message de
news:41053e1d$0$8538$

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













Bonjour,
le probleme c'est qu'on ne peut pas faire des hsauveposition imbriques
pour un meme fichier(dixit aide).

Pour ton algo:

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

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
analyserNiveau(sdd.IDNiveau)
HLitSuivant(sdd)
FIN

suffit pas ?, tu executais , apparement 2 fois la meme requete

Sinon, tu peux toujours essayer avec des alias

--
Michel Moreno
Clior Informatica
Carrer de Balmes 360 2º 2ª
08006 Barcelona

Tel : (+34) 93 292 48 00
Fax : (+34) 93 292 48 04

http://www.clior.es
Avatar
Manu
Fabien Mas 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



c'est ce qui s'appelle faire des jointures ouvertes...

On peut le faire en une seule requete avec fixant le nombre de fils
possibles.
Avatar
Romuald.besset
Michel Moreno wrote:
Fabien Mas wrote:

ben ca marche pas mieux :(
merci de ton aide
"..." a écrit dans le message de news:
YwgNc.60063$

Je suppose que le plantage lors du retour concerne Hyperfile ?
Ton algo est correct, mais tu ne prends pas en compte une contrainte
liée




à

Hyperfile. Même si tu déclares une nouvelle source de données, Windev ne
gère pas un contexte pour chaque source de données, mais plutôt pour




chaque

fichier. Belle aberration...

Regarde les fonctions hSauvePosition et hRetourPosition


"Fabien Mas" a écrit dans le message de
news:41053e1d$0$8538$

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













Bonjour,
le probleme c'est qu'on ne peut pas faire des hsauveposition imbriques
pour un meme fichier(dixit aide).

Pour ton algo:

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

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
analyserNiveau(sdd.IDNiveau)
HLitSuivant(sdd)
FIN

suffit pas ?, tu executais , apparement 2 fois la meme requete

Sinon, tu peux toujours essayer avec des alias




C'est la source de données de la requête qu'il faut indicer (son nom)...
en effet, contrairement à l'énoncé de la documentation, si la portée de
la variable source de donnée est bien locale, la définition Hyperfile de
la connexion elle est bien de portée globale (voir notre dossier sur les
sources de données "spectre d'analyse").
Ainsi, dans la récursivité, vous réexploitez une définition déja
existante... ce qui provoque l'erreur.
le mieux est alors d'utiliser un tableau dynamique de sources de données
et d'y ajouter des éléments... ou de trouver le moyen d'indicer vos
connexions (une par orrurrence de récursivité)...

++ R&B
Avatar
Fabien Mas
tu peux me donner un exemple ?

"Manu" a écrit dans le message de news:
ce50oe$t4h$
Fabien Mas 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

c'est ce qui s'appelle faire des jointures ouvertes...

On peut le faire en une seule requete avec fixant le nombre de fils
possibles.