PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV (versões anteriores) → [WD7.5] Procedure recursive et Hfiltre
[WD7.5] Procedure recursive et Hfiltre
Iniciado por Alex, jun., 01 2004 4:21 PM - 7 respostas
Publicado em junho, 01 2004 - 4:21 PM
Bonjour à tous !
Voilà, dans un de mes traitements, je suis obligé d'utiliser une
procedure recursive pour afficher un arbre à partir de base de données.
Dans ma procédure, j'utilise la fonction HFiltre pour me déplacer sur
les enregistrement, mais à chaque enregistrement trouvé je rappelle ma
procédure.
Le résultat est que le filtre sur le fichier est éffacé et remplacé par
un autre filtre...

Comment je peux faire pour que l'etat du filtre et la position soit
sauvé avant de rappeller la procédure, et comment le restaurer après le
traitement de celle-ci ?

Merci de votre aide
A+
Publicado em junho, 01 2004 - 5:33 PM
Alex wrote:

Bonjour à tous !
Voilà, dans un de mes traitements, je suis obligé d'utiliser une
procedure recursive pour afficher un arbre à partir de base de données.
Dans ma procédure, j'utilise la fonction HFiltre pour me déplacer sur
les enregistrement, mais à chaque enregistrement trouvé je rappelle ma
procédure.
Le résultat est que le filtre sur le fichier est éffacé et remplacé

par
un autre filtre...

Comment je peux faire pour que l'etat du filtre et la position soit
sauvé avant de rappeller la procédure, et comment le restaurer après le
traitement de celle-ci ?

Merci de votre aide
A+


Après lecture de votre problème, je vous suggère la solution suivante :
1) avant le changement de filtre par appel à la procédure, prendre soins
de retenir dans une variable le numéro de l’enregistrement en cours grâce
à la commande HnumEnr,
2) Après le traitement pour vous repositionner sur cet enregistrement, refaites
le filtre puis utiliser la commande Hlit
3) Vous pouvez en cas de besoin faire après Hlit, HchangeClé pour redefinir
la clé de parcours
Publicado em junho, 01 2004 - 9:15 PM
On 1-Jun-2004, Alex wrote:

Bonjour à tous !
Voilà, dans un de mes traitements, je suis obligé d'utiliser une
procedure recursive pour afficher un arbre à partir de base de données.
Dans ma procédure, j'utilise la fonction HFiltre pour me déplacer sur
les enregistrement, mais à chaque enregistrement trouvé je rappelle ma
procédure.
Le résultat est que le filtre sur le fichier est éffacé et remplacé
par
un autre filtre...

Comment je peux faire pour que l'etat du filtre et la position soit
sauvé avant de rappeller la procédure, et comment le restaurer après le
traitement de celle-ci ?

Merci de votre aide
A+


Salut !
Ce que je ferais, c'est de créer une "pile" ( un "stack" en anglais ) de
filtres ( en pratique, un tableau dynamique de chaines ) en global.
J'apellerais la procédure avec en paramètre, le NOUVEAU filtre et je ferais
ceci :

MaProcRecursive(cFiltre)
local
nPos est un entier
cNeauFiltre est une chaine
cParcours est une chaine
xValeurRetour est un Variant


dimension(Stact,dimension(stack)+1)
stack[dimension(stack)] = cfiltre
nPos = hnumenr(<Fichier>)
cParcours = hfiltre(<Fichier>,cFiltre)
// contrôle de cParcours ...
.....
hlitpremier(<Fichier>,cParcours)
tant que pas hEndehors(<Fichier>)
// Traitement
// s'il y a un nouvel appel ...
cNeauFiltre = ....
MaProcRecursive(cNeauFiltre)
hlitsuivant(<Filtre>,cParcours)
fin
// réactivation de l'ancien filtre
dimension(stack,dimension(stack)-1)
cParcours = hfiltre(<Fichier>,stack[dimension(stack)])
hlit(<Fichier>,nPos)
// S'il faut une valeur de retour
xValeurRetour = ...
renvoyer xValeurRetour

Bien à toi !

--
Marcel Berman
c/o Managing Business SPRL
Allée du Petit Paris, 11
B - 1410 - Waterloo
Tel : +32 2 351.60.64
Fax : +32 2 351.45.78
Gsm : +32 475.799.477
Publicado em junho, 02 2004 - 10:06 AM
Après lecture de votre problème, je vous suggère la solution suivante :
1) avant le changement de filtre par appel à la procédure, prendre soins
de retenir dans une variable le numéro de l'enregistrement en cours grâce
à la commande HnumEnr,
2) Après le traitement pour vous repositionner sur cet enregistrement,

refaites
le filtre puis utiliser la commande Hlit
3) Vous pouvez en cas de besoin faire après Hlit, HchangeClé pour

redefinir
> la clé de parcours
Merci de votre réponse !
Testé et approuvé ! Ca marche au poil sur l'exemple que j'ai fait !
A+
Publicado em junho, 02 2004 - 1:55 PM
Salut !
Ce que je ferais, c'est de créer une "pile" ( un "stack" en anglais ) de
filtres ( en pratique, un tableau dynamique de chaines ) en global.
J'apellerais la procédure avec en paramètre, le NOUVEAU filtre et je

ferais
ceci :

MaProcRecursive(cFiltre)
local
nPos est un entier
cNeauFiltre est une chaine
cParcours est une chaine
xValeurRetour est un Variant


dimension(Stact,dimension(stack)+1)
stack[dimension(stack)] = cfiltre
nPos = hnumenr(<Fichier>)
cParcours = hfiltre(<Fichier>,cFiltre)
// contrôle de cParcours ...
....
hlitpremier(<Fichier>,cParcours)
tant que pas hEndehors(<Fichier>)
// Traitement
// s'il y a un nouvel appel ...
cNeauFiltre = ....
MaProcRecursive(cNeauFiltre)
hlitsuivant(<Filtre>,cParcours)
fin
// réactivation de l'ancien filtre
dimension(stack,dimension(stack)-1)
cParcours = hfiltre(<Fichier>,stack[dimension(stack)])
hlit(<Fichier>,nPos)
// S'il faut une valeur de retour
xValeurRetour = ...
renvoyer xValeurRetour

Bien à toi !





Merci de ton aide,
J'ai testé et ça à l'air beaucoup plus stable que l'autre solution !
Par contre à la fin il faut faire gaffe et remplacer
hlit(<Fichier>,nPos)
par
si nPos<>-1 alors
hlit(<Fichier>,nPos)
fin

En tout cas un grand MERCI encore pour ton aide !
A+
Publicado em junho, 02 2004 - 2:17 PM
On 2-Jun-2004, Alex wrote:

Merci de ton aide,
J'ai testé et ça à l'air beaucoup plus stable que l'autre solution !
Par contre à la fin il faut faire gaffe et remplacer
hlit(<Fichier>,nPos)
par
si nPos<>-1 alors
hlit(<Fichier>,nPos)
fin


Merci ... mais je dois dire que je proposais cette fonction de tête, sans
rien avoir testé ...
En la relisant, j'ajouterais aussi un test pour vérifier s'il y a un filtre
dans la pile et je mettrais une valeur par défaut
pour le paramètre cFiltre
MaProcRécusrcive(cFiltre = "")


> > // réactivation de l'ancien filtre
///// ici ! Vérification de la taille du stack
si dimension(stacl) >= 1 alors
dimension(stack,dimension(stack)-1)
/// Et vérifier que le filtre n'est pas vide ...
si sansespace(stack[dimension(stack)] alors
cParcours = hfiltre(<Fichier>,stack[dimension(stack)])
sinon
cParcours = ""
hdesactivefiltre(<Fichier>)
fin
fin
/// etc ...
Bien content que cela a pu te servir ...


--
Marcel Berman
c/o Managing Business SPRL
Allée du Petit Paris, 11
B - 1410 - Waterloo
Tel : +32 2 351.60.64
Fax : +32 2 351.45.78
Gsm : +32 475.799.477
Publicado em junho, 03 2004 - 10:02 AM
On 3-Jun-2004, Alex wrote:

J'ai trouvé encore plus simple... En fait c'est inclus dans Windev :

au début de la proc :
sauve_position_base est entier = HSauvePosition(<Fichier>,CléParcours)

A la fin
HRetourPosition(<Fichier>,hRPFiltre)


Au cas où ça peut aider d'autre monde....
A+


Tu as raison !
En fait, en WD 5.5, il n'était pas possible d'imbriquer les HSauvePosition /
HretourPosition, ce qui interdisait leur usage dans des procédures
récursives ...
De là ma manière de faire ...
Décidément ... WD a vraiment bien évolué sur certains trucs ...
Faudra que je relise toute la doc ... au cas d'autres petites choses comme
celle là m'auraient encore échappée ...


--
Marcel Berman
c/o Managing Business SPRL
Allée du Petit Paris, 11
B - 1410 - Waterloo
Tel : +32 2 351.60.64
Fax : +32 2 351.45.78
Gsm : +32 475.799.477
Publicado em junho, 03 2004 - 10:44 AM
Salut'
J'ai trouvé encore plus simple... En fait c'est inclus dans Windev :

au début de la proc :
sauve_position_base est entier = HSauvePosition(<Fichier>,CléParcours)

A la fin
HRetourPosition(<Fichier>,hRPFiltre)


Au cas où ça peut aider d'autre monde....
A+