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 :

Idées pour la création d'une procédure [WD15]


Sujet :

WinDev

  1. #1
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut Idées pour la création d'une procédure
    Bonjour,

    J'ai dans une BDD des distributeurs, certain d'entre eux dépendent d'autres distributeurs, exemple
    Distributeur 1
    |
    --> Distributeur 1.1
    | |
    | --> Distributeur 1.1.1
    | |
    | --> Distributeur 1.1.2
    |
    --> Distributeur 1.2
    Distributeur 2

    Le soucis est : comment faire une procédure qui va me remonter tous les ID des distributeurs dépendant par exemple du distributeur 1 ( donc distributeur 1.1, distributeur 1.2, distributeur 1.1.1, distributeur 1.1.2)

    Pour info le structure de ma table "distributeur" est faite comme cela :
    ID distributeur,
    Nom distributeur,
    ...
    Depend de --> qui contient l'ID du distributeur auquel il est rattaché, qui est donc son supérieur.

    Merci beaucoup.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Bonjour,

    C'est un problème d'algo, rien de particulier à Windev.

    Un peu de lecture pour vous aider : http://www.google.fr/search?q=parcou...re+recursivite

    N'hésitez pas à poser des questions sur les choses qui vous échappent après ça.

  3. #3
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Merci,

    Je connais la récursivité, j'y ai pensé mais je ne maitrise pas assez pour arriver à faire ma procédure.

    Je vais continuer à chercher...

  4. #4
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Voici ma procédure. Elle ne fonctionne pas, je dois passer à côté de quelque chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PROCEDURE listeDesDistributeurs(nNumDistri est un entier)
     
    HLitRecherchePremier(T_distributeurs,T_distributeurs_ID,nNumDistri)
    SI T_distributeurs.T_distributeurs_ID = nNumDistri ALORS
    	RENVOYER T_distributeurs.T_distributeurs_nom
    SINON
    	RENVOYER listeDesDistributeurs(T_distributeurs.T_distributeurs_ID)
    FIN
    Merci.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Je pense qu'il manque juste l'appel récursif.

    Faisons simple. Stockons le résultat dans une variable globale. (Il doit possible de passer cette variable en paramétre).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dans le code :
    Global
    	gs_Resultat est une chaine
     
    // appel de la procédure
    listeDesDistributeurs(n_IdDistributeur1)
    info(gs_Resultat)
    Et la procédure qui sera appelée

    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 listeDesDistributeurs(nNumDistri est un entier)
     
    LOCAL
    	n_PosDistri	est un entier
     
     
    HLitRecherchePremier(T_distributeurs,T_distributeurs_ID,nNumDistri) ALORS
    TANTQUE HTrouve(T_distributeurs)
    	// On mémorise le distributeur dépendant
    	gs_Resultat += T_distributeurs.T_distributeurs_nom + RC
     
    	n_PosDistri = SauvePosition(T_distributeurs)
     
    	// On recherche les distributeur dépendant du distributeur trouvé
    	listeDesDistributeurs(T_distributeurs.T_distributeurs_ID)
     
    	RetourPosition(n_PosDistri)
     
    	// On recherche le distributeur dépendant suivant
    	HLitSuivant(T_distributeurs,T_distributeurs_ID
    FIN // TANTQUE HTrouve(T_distributeurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // - Original commenté
    PROCEDURE listeDesDistributeurs(nNumDistri est un entier)
     
    HLitRecherchePremier(T_distributeurs,T_distributeurs_ID,nNumDistri)
    SI T_distributeurs.T_distributeurs_ID = nNumDistri ALORS
    	// Lors du premier appel, pour le distri 1, on obtient Distri 1.1 et on quitte, c'est pas top
    	RENVOYER T_distributeurs.T_distributeurs_nom
    SINON
    	// Si on ne trouve pas de distri dépendant, on fait une recherche sur une valeur qu'on ne maitrise pas
    	// T_distributeurs.T_distributeurs_ID a été mis à jour suite à la recherche et contient sans doute la dernière valeur du fichier
    	RENVOYER listeDesDistributeurs(T_distributeurs.T_distributeurs_ID)
    FIN

    Les fonctions SauvePosition / RetourPosition sont spécifiques à Windev et à l'hyperfile. On peut éviter de les utiliser en mémorisant l'ensemble des résultats dans une variable avant l'appel récursif.

  6. #6
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Bonjour,

    j'ai une erreur dans la fonction :
    Erreur à la ligne 43 du traitement Procédure globale listeDesDistributeurs.
    Vous avez appelé la fonction HLitSuivant.
    Aucun parcours n'a été amorcé pour la rubrique <T_distributeurs_ID> sur le fichier <T_distributeurs>.

    ----- Informations techniques -----

    Projet : GPI

    Appel WL :
    Traitement de 'Procédure globale listeDesDistributeurs' (Procedures globales de GPI.listeDesDistributeurs), ligne 43, thread 0
    Fonction 'HLitSuivant', syntaxe 0

    Que s'est-il passé ?
    Aucun parcours n'a été amorcé pour la rubrique <T_distributeurs_ID> sur le fichier <T_distributeurs>.


    D'après ce que j'ai trouvé dans l'aide il faut que je rajoute un HLitRecherche avant le HRetourPosition mais avec quel paramètre ? Car quand je revient sur le HRetourposition l'instruction suivante est HLitSuivant.

    Par contre pour que l'application ne boucle pas j'ai remplacé le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitRecherchePremier(T_distributeurs,T_distributeurs_ID,nNumDistri)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitRecherchePremier(T_distributeurs,T_distributeurs_dependDe,nNumDistri)
    Sinon ma procédure bouclée sans fin du fait que je passe l'ID d'un distributeur et que je recherche son ID, alors que dépendDe me permet de trouver celui qui est rattaché à mon distributeur initial.

    Merci pour tout.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Aucun parcours n'a été amorcé pour la rubrique <T_distributeurs_ID> sur le fichier <T_distributeurs>.
    Si tu as changé la clé dans le HLitRecherche, il faut aussi la changer dans le HLitSuivant

    Si les SauvePosition / RetourPosition pose problème, tu peux, dans la procédure faire la recherche en stockant le résultat dans un tableau dynamique puis parcourir ce tableau dynamique et lors de ce parcours faire l'appel récurrent.

  8. #8
    Membre actif Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 618
    Points : 222
    Points
    222
    Par défaut
    Merci bien,

    cela fonctionne...

    Mon erreur venait du fait que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitRecherchePremier(T_distributeurs,T_distributeurs_dependDe,nNumDistri)
    et que dans mon HLitSuivant j'avais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLitSuivant(T_distributeurs,T_distributeurs_ID)
    Ma rubrique de parcours devait être : T_distributeurs_dependDe

    Et voilà ....

    Encore merci.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 04/05/2010, 12h14
  2. idées pour la création d'une base de données ?
    Par sephiroth669 dans le forum Access
    Réponses: 3
    Dernier message: 22/03/2010, 18h43
  3. Conventions à utiliser pour la création d'une DLL
    Par Writer dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2005, 09h24
  4. [DB2]Eurreur lors de la création d'une procédure
    Par uaspecitmoon dans le forum DB2
    Réponses: 1
    Dernier message: 25/05/2005, 19h23
  5. Réponses: 4
    Dernier message: 22/09/2004, 09h17

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