|
[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+ |
| |
| |
| | | |
|
| | | | |
| | |
|