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 :

Créer une procédure qui renvoie plusieurs valeurs [WD17]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut Créer une procédure qui renvoie plusieurs valeurs
    Bonjour,

    J'ai un code que j'utilise plusieurs fois dans une fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dDateDébutMois est une Date = COMBO_AnnéePlanning..ValeurAffichée + ExtraitChaîne(COMBO_MoisPlanning..ValeurAffichée,1,"-") + "01"
    dDateFinMois est une Date = DernierJourDuMois(dDateDébutMois)
    dDateDébutPlanning est une Date = EntierVersDate(DateVersEntier(dDateDébutMois)-(DateVersJour(dDateDébutMois)-1)) //Cela donne la date du 1er lundi pour le planning
    dDateFinPlanning est une Date = EntierVersDate(DateVersEntier(dDateFinMois)+(7-DateVersJour(dDateFinMois))) //Cela donne la date du dernier dimanche pour le planning
    J'aimerai créer une procédure qui me renverrai les valeurs de dDateDébutPlanning et de dDateFinPlanning. Est-ce possible ?

  2. #2
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    La procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PROCEDURE Calcul_date_planning(pAnnéePlanning,pMoisPlanning,pDateDébutPlanning,pDateFinPlanning)
     
    dDateDébutMois est une Date = pAnnéePlanning + ExtraitChaîne(pMoisPlanning,1,"-") + "01"
    dDateFinMois est une Date = DernierJourDuMois(dDateDébutMois)
    pDateDébutPlanning = EntierVersDate(DateVersEntier(dDateDébutMois)-(DateVersJour(dDateDébutMois)-1)) //Cela donne la date du 1er lundi pour le planning
    pDateFinPlanning = EntierVersDate(DateVersEntier(dDateFinMois)+(7-DateVersJour(dDateFinMois))) //Cela donne la date du dernier dimanche pour le planning
    et pour la lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dDateDébutPlanning est une Date
    dDateFinPlanning est une Date
    Calcul_date_planning(COMBO_AnnéePlanning..ValeurAffichée,COMBO_MoisPlanning..ValeurAffichée,dDateDébutPlanning,dDateFinPlanning)
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  3. #3
    Membre actif
    Avatar de alexeyk
    Homme Profil pro
    test
    Inscrit en
    Mai 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : test

    Informations forums :
    Inscription : Mai 2008
    Messages : 62
    Points : 200
    Points
    200
    Par défaut
    Citation Envoyé par meganulos Voir le message
    Bonjour,

    J'ai un code que j'utilise plusieurs fois dans une fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dDateDébutMois est une Date = COMBO_AnnéePlanning..ValeurAffichée + ExtraitChaîne(COMBO_MoisPlanning..ValeurAffichée,1,"-") + "01"
    dDateFinMois est une Date = DernierJourDuMois(dDateDébutMois)
    dDateDébutPlanning est une Date = EntierVersDate(DateVersEntier(dDateDébutMois)-(DateVersJour(dDateDébutMois)-1)) //Cela donne la date du 1er lundi pour le planning
    dDateFinPlanning est une Date = EntierVersDate(DateVersEntier(dDateFinMois)+(7-DateVersJour(dDateFinMois))) //Cela donne la date du dernier dimanche pour le planning
    J'aimerai créer une procédure qui me renverrai les valeurs de dDateDébutPlanning et de dDateFinPlanning. Est-ce possible ?
    Tu peux :
    -renvoyer une chaîne qui contient plusieurs valeurs
    -un tableau
    -une structure
    -un objet de classe

    Avec autant d'attributs que tu souhaites.

    Tu peux aussi déclarer et modifier des variables globales, ou passer des valeurs par adresse et les modifier.

    Et tu peux créer une collection de procédures globales utilitaires et y mettre ta procédure.

    Cordialement,

    Alex

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup messieurs !
    Donc :
    déclarer et modifier des variables globales
    j'ai pigé effectivement, c'est logique.
    passer des valeurs par adresse et les modifier
    j'ai pigé (c'est ce que Laurent30s a fait non ?). Je ne connaissais pas ce truc, c'est génial.
    créer une collection de procédures globales utilitaires et y mettre ta procédure
    là j'ai pas pigé car je ne sais pas trop ce que c'est... Qu'est ce qu'une collection de procédures globales utilitaires ?

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Tu as un onglet dans l'ide dans lequel il y a les erreurs de compilation, procédures globales, procédures locales, classes...
    Tu sélectionnes procédures globales, tu as par défaut "procédures globales de Projetxxx" (c'est une collection de procédures). En règle générale, on utilise celle-là, mais rien ne t'empêche d'en créer une autre...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Membre actif
    Avatar de alexeyk
    Homme Profil pro
    test
    Inscrit en
    Mai 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : test

    Informations forums :
    Inscription : Mai 2008
    Messages : 62
    Points : 200
    Points
    200
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    ...Tu sélectionnes procédures globales, tu as par défaut "procédures globales de Projetxxx" (c'est une collection de procédures). En règle générale, on utilise celle-là, mais rien ne t'empêche d'en créer une autre...
    Alors chez moi, la collection "Procédures globales de Projetxxx" sert uniquement à avoir quelques procédures très spécifiques au projet. Parfois je la supprime carrément.

    Ensuite j'ai des collections ou des classes utilitaires : partagées entre plusieurs projets et réutilisables (cApp, cErreur, cDb, cReq, cFtp, cChamp, cFen, cGraphe, ...).

    Enfin des collections / classes spécifiques aux objets métiers ou techniques. Par exemple une classes par objet de base de données : _c_erp_Client, _c_erp_Facture, _c_erp_Contrat , _c_ged_Fichier, _c_ged_Document ... C'est plus clair et ça permet de regrouper les méthodes de lecture/écriture/calcul. Ça permet aussi de simplifier les transferts entre bases de données.

    Cordialement,

    Alex

  7. #7
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par alexeyk Voir le message
    Tu peux :
    -renvoyer une chaîne qui contient plusieurs valeurs
    -un tableau
    -une structure
    -un objet de classe
    Cordialement,
    Alex
    En fait il n'y a qu'une seule bonne solution dans ce cas

    - Une structure = NON car comment savoir ce que contient la structure quand on appelle la procédure... Une structure ne doit pas servir de paramètre justement à cause de ce problème de double déclaration.

    - une chaine qui contient plusieurs valeurs = NON
    un peu pour les mêmes raisons que la procédure avec en plus l'impossibilité de connaitre l'ordre de passage et l'obligation de faire des conversions de type

    - Un tableau = NON car il s'agit bien de deux dates mais elles ne sont pas identiques, il faut réserver les tableaux aux collections de variables ayant le même rôle, la même fonction, la même utilité. Ici date début et date fin ne sont pas du tout interchangeables. On ne sait pas en voyant le tableau ce qu'on manipule, on ne sait pas l'ordre de retour et on doit aussi faire des conversions de type si on décide de passer trois paramètres comme dateDebut,dateFin et imaginons un troisième paramètre Etablissement ou Utilisateur .

    - Une variable globale = NON car ce n'est pas le rôle des variables globales qui devraient pratiquement disparaitre de vos projets.
    De plus comment un autre développeur pourrait imaginer que c'est justement cette variable qu'il faut utiliser...

    - Un objet = OUI car on sait ce qu'on manipule des deux côtés de la procédure, on peut passer des types de variables différents dans les membres et cerise sur le gâteau on peut travailler en référence ce qui consomme moins de ressources.

    Même réflexion pour savoir si c'est une procédure ou une procédure globale ou une méthode d'objet, dans 99,99% des cas la réponse est une méthode d'objet.

    Pour finir une réflexion tirée de "Clean code" de M. BOB alias Robert C. Martin
    avoir comme objectif de ne pas passer de paramètres à vos procédures et dans l'impossibilité de le faire limitez vous à un paramètre. Considérez que deux paramètres est déjà le signe d'une faute d'analyse.

    C'est un peu extrême mais c'est payant à la longue.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup pour ces éclaircissements !

  9. #9
    Membre actif
    Avatar de alexeyk
    Homme Profil pro
    test
    Inscrit en
    Mai 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : test

    Informations forums :
    Inscription : Mai 2008
    Messages : 62
    Points : 200
    Points
    200
    Par défaut
    Citation Envoyé par Atsibat Voir le message
    En fait il n'y a qu'une seule bonne solution dans ce cas
    ...
    - Un objet = OUI car on sait ce qu'on manipule des deux côtés de la procédure, on peut passer des types de variables différents dans les membres et cerise sur le gâteau on peut travailler en référence ce qui consomme moins de ressources.
    ...
    C'est un peu extrême mais c'est payant à la longue.
    Créer une classe pour renvoyer deux dates je trouve que c'est n'importe quoi.
    Moi je réserve les classes pour les cas ou il y a une vraie notion objet.

    Pour ce cas je dirais une procédure globale qui modifie deux variables par valeur.
    J’éviterais aussi de manipuler des éléments d'IHM dans le code de la procédure.
    Ton exemple utilise des combos pour le mois et l'année, mais demain ça pourra être autre chose que des combos.
    Enfin je ne suis pas fan du type date, notamment car elles sont initialisées avec une valeur non vide par défaut ! (date du jour?)
    D'ailleurs je ne sais pas si il est possible d'y mettre une chaine vide.
    Le type date est pratique pour les calculs, et il peut facilement être mixé avec des chaines : dMaDate=sMaChaine OU sMaChaine=dMaDate
    Enfin j’évite quand c'est possible de multiplier les paramètres en entrée de la procédure (pour la lisibilité) : ici on regroupera l'année et le mois.
    -----------------------------------------------------------------------------------------------------
    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
     
    // Chaines vides, modifiées par adresse dans ta procédure
    // Si problème de calcul elles sont vides au retours, sinon elles contiennent des dates
    sDateDebPlanning, sDateFinPlanning sont des chaines
     
    // Ici tu a des combos, mais demain ça pourra être autre chose : donc tu passes une chaine
    sAnnéeMoisRef est une chaine = 
    COMBO_AnnéePlanning..ValeurAffichée + COMBO_MoisPlanning..ValeurAffichée
     
    // Apple de la procédure
    // -tu peux avoir une procédure avec le même nom dans plusieurs collections de procédures
    // -dans ce cas tu peux ajouter le nom de la collection avant le nom de la procédure
    // -ex. : valeur retour = collection.procédure(paramètres)
    SI cpgPlanning.pgbPlanningDebutFin(sAnnéeMoisRef, sDateDebPlanning, sDateFinPlanning) ALORS
       // Calcul OK
    SINON
       // Erreur de calcul
    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
    23
    24
    25
    26
    27
    28
    29
     
    // cpgPlanning : collection de procédures globales qui regroupe les calculs de planning
    // pgbPlanningDebutFin : calcul date début et fin planning
    // -bRes : retourne vrai si le calcul s'est bien passé
    // -sAnnéeMoisRef : année et mois de référence pour le calcul
    // -sDateDebPlanning,sDateFinPlanning : résultats du calcul passés par adresse !!! (chaine vide si erreur)
     
    pgbPlanningDebutFin(LOCAL sAnnéeMoisRef est une chaine="", sDateDebPlanning est une chaine="", sDateFinPlanning est une chaine="")
     
    // local : indique clairement un passage par valeur
    // si il n'y a pas le mot local : passage par adresse !!!!
     
    bRes est un booleen
    sAnnee, sMois sont des chaines
     
    sAnnee = sAnnéeMoisRef[[1 A 4]]
    sMois = sAnnéeMoisRef[[5 A 6]]
    ...
    calculs
    ...
    // modification des valeurs passées par adresse !!!
    SI bRes ALORS
        sDateDebPlanning = ...
        sDateFinPlanning = ...
    SINON
       // sDateDebPlanning ET sDateFinPlanning sont vides
    FIN
     
    RENVOYER bRes
    -----------------------------------------------------------------------------------------------------
    Concernant la collection de procédures globales utilitaire :
    -c'est une simple collection de procédures créée par toi dans le projet
    -par défaut toutes les fonctions/procédures dans une collection sont globales
    -elle est utilitaire si tu y as mis des fonctions réutilisables dans plusieurs projets
    -elle est spécifique au projets si c'est des fonctions utilisables dans ce projet uniquement

    Cordialement,

    Alex

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonsoir,

    Pour extraire le mois, pensez éventuellement à la propriété ..mois.

    Une autre manière de calculer DateFinMois est de recourir aux propriétés des dates et d'affecter ..jour = 31. Windev gère les subtilités (février et les mois à 30 jours)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dDateFinMois est une Date = dDateDébutMois
    dDateFinMois..jour = 31

    Pour le codage spécifique, voir les fonctions :
    - PremierJourDeLaSemaine()
    - DernierJourDeLaSemaine()
    - NuméroDeSemaine()
    - SemaineVersDate() une nouveauté 18 !

    Votre code deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dDateDébutMois est une Date = COMBO_AnnéePlanning..ValeurAffichée + ExtraitChaîne(COMBO_MoisPlanning..ValeurAffichée,1,"-") + "01"
    
    //date du 1er lundi pour le planning
    dDateDébutPlanning est une Date = PremierJourDeLaSemaine(dDateDébutMois) 
    OU 
    dDateDébutPlanning est une Date = SemaineVersDate(NuméroDeSemaine(dDateDébutMois), COMBO_AnnéePlanning..ValeurAffichée)
    
    //date du dernier dimanche pour le planning
    dDateFinPlanning est une Date = DernierJourDeLaSemaine(DernierJourDuMois(dDateDébutMois))
    Outre deux variables date ou chaîne, vous pouvez utiliser une variable composée ou une structure pour stocker vos valeurs.
    Au passage et sauf erreur, la variable date est initialisée à "00010101".

    En principe, le type date n'est pas autorisé dans les variables composées et dans les structures (qui partagent d'ailleurs toutes deux les mêmes types de membres), mais l'éditeur de code et le compilateur le tolèrent, sans doute du fait de la similitude entre les types chaîne et date.

    La variable composée ne peut être passée en paramètre, mais elle pourrait être déclarée globale (ce qui ne semble pas la meilleure pratique).

    La structure peut être passée en paramètre à une procédure.
    Je pense que vous pourriez même imaginer de passer un tableau de structures et un indice si vous souhaitez mémoriser sur les divers calculs que vous effectuez.

    Tout ceci en complément des solutions de laurent30s puis alexeyk.

    Hemgé

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

Discussions similaires

  1. Une fonction qui renvoie plusieurs valeurs ?
    Par chuckichucki dans le forum Langage
    Réponses: 9
    Dernier message: 14/01/2011, 13h49
  2. Fonction d'une DLL qui retourne plusieur valeur
    Par vtk37 dans le forum Débuter
    Réponses: 9
    Dernier message: 27/05/2009, 10h01
  3. [Système] Fonction qui renvoie plusieurs valeurs
    Par sebhm dans le forum Langage
    Réponses: 6
    Dernier message: 26/01/2007, 08h43
  4. Réponses: 12
    Dernier message: 23/03/2006, 14h13
  5. appel d'une procédure qui renvoie le résultat d'une requete
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2006, 14h02

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