IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Requete dans procedure récursive.


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Par défaut Requete dans procedure récursive.
    Bonjour à tous.
    Dans mon application, j'ai un système de familles d'articles. Ces familles peuvent également contenir d'autres familles.
    J'aimerai rechercher toutes les familles contenues dans une famille.
    Je dois donc faire une procédure récursive.

    Le schéma est le suivant :
    ....procédure recherche_sous_famille(id_famille, liste_sous_familles)
    ........on recherche toutes les sous familles de la famille "id_famille"
    ........pour chaque sous famille
    ............on ajoute la sous famille dans la liste "liste_sous_familles"
    ............recherche_sous_famille(id_sous_famille, liste_sous_familles)
    ........fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    PROCEDURE recherche_tout_fils(id_parent, tab_fils)
    liste_fils est un tableau dynamique de 0 entier
    requete est une chaîne
    recherche_fils est une Source de Données
    pos est un entier
     
    requete = "select fils from ......"
     
    SI HExécuteRequêteSQL(recherche_fils,requete) = Faux ALORS
    	Info("Erreur d'éxécution de la requète")
    	RETOUR
    FIN
     
    HLitPremier(recherche_fils)
    TANTQUE HEnDehors(recherche_fils) = Faux
    	TableauAjoute(tab_fils, recherche_fils.fils)
    	pos = HSauvePosition(recherche_fils)
    	recherche_tout_fils(recherche_fils.fils, tab_fils)
    	HRetourPosition(pos)
    	HLitSuivant(recherche_fils)	
    FIN
    Pouvez-vous me dire si c'est possible d'avoir une requête dans une procédure récursive car j'ai l'impression qu'il considère que la requête dans la procédure "appelante" et la même que dans la procédure appelée.
    Merci beaucoup.

  2. #2
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Bonjour,
    Par défaut, lors de l'appel d'une procédure, les paramètres sont passés par variable (par adresse). Si le paramètre est modifié dans la procédure, le traitement appelant la procédure récupérera le paramètre avec sa valeur modifiée.
    Tu peux :
    - Passer un paramètre par valeur à une procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    recherche_tout_fils((recherche_fils.fils), tab_fils)
    - Utiliser un paramètre "local" dans la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCEDURE recherche_tout_fils(LOCAL id_parent, tab_fils)
    Pour plus de précision regarde dans l'aide : procédure, paramètres.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Par défaut
    Merci Tasumy pour ta réponse.

    J'ai essayé chaque solution, les deux solutions en même temps mais aucune ne marche.
    Il me dit que la position donnée est invalide.
    Quand je fais l'execution en mode pas a pas, je vois que la valeur de Hnumenr est a -1 et que Hendehors est a vrai. Il garde le même Hendehors que la requête de la procédure appelée.

  4. #4
    Membre éprouvé
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Par défaut
    Ah pardon, j'ai mal compris ton problème...
    Sinon, je pense que ça vient de ta source de données car une source de données est globale à tous les traitements du projet.

    Si deux variables de type source de données de même nom sont déclarées dans différents traitements du projet, il est nécessaire de libérer la première source de données (fonctions HAnnuleDéclaration ou HDétruitVue) avant d'appeler un autre traitement contenant la seconde source de données.
    Il te faut un nom différent à chaque appel.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Par défaut
    Encore merci d'avoir pris le temps de me répondre.
    Est ce qu'on peut nommer "dynamiquement" une variable ?
    C'est à dire par exemple de définir une source de données du genre recherche_fils_+l'identifiant du pere a rechercher.

  6. #6
    Invité de passage
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1
    Par défaut
    Bonjour,

    Si je ne me trompe pas, quand tu crées une requête, elle est accessible dans toute l'application. Donc si tu crées une nouvelle avec le même nom, tu écrases la requête précédente. Essaye de nommer ta requête différemment à chaque appel de ta fonction, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    PROCEDURE recherche_tout_fils(LOCAL id_parent, tab_fils)
    liste_fils est un tableau dynamique de 0 entier
    requete est une chaîne
    pos est un entier
    
    requete = "select fils from ...."
    
    SI HExécuteRequêteSQL("recherche_fils"+id_parent,requete) = Faux ALORS
    	Info("Erreur d'éxécution de la requète")
    	RETOUR
    FIN
    
    HLitPremier("recherche_fils"+id_parent)
    TANTQUE HEnDehors("recherche_fils"+id_parent) = Faux
    	TableauAjoute(tab_fils, {"recherche_fils"+id_parent+".fils",indRubrique})
    	pos = HSauvePosition("recherche_fils"+id_parent)
    	recherche_tout_fils({"recherche_fils"+id_parent+".fils",indRubrique}, tab_fils)
    	HRetourPosition(pos)
    	HLitSuivant("recherche_fils"+id_parent)	
    FIN

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2007
    Messages : 106
    Par défaut
    C'est bon ca marche avec ta méthode saloci !!!
    Un grand merci à vous deux pour m'avoir aider.
    C'est avec un très grand plaisir que je mets ce post en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/02/2009, 10h05
  2. tests sur requetes dans une procedure stockée
    Par morback dans le forum SQL
    Réponses: 18
    Dernier message: 30/08/2007, 16h36
  3. Appeler Requete avec parametre dans Procedure
    Par shadockgreg dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2006, 12h25
  4. Resultat requete dans une seule colonne
    Par mathieu--g dans le forum Sybase
    Réponses: 2
    Dernier message: 08/07/2003, 13h42
  5. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo