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 :

Fonction Age pour calculer age personne [WD18]


Sujet :

WinDev

  1. #21
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Novembre 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Bonjour
    Finalement, j'ai trouvé mes erreurs.
    En fait, la table que j'ai essayé d'afficher la colonne COL_Age pour afficher l'Âge d'une personne est une table que j'ai créé à partir d'une requête (une requête qui doit afficher toutes les personnes nées entre deux dates), à partir de la même requête, j'ai pu afficher l'Âge d'une personne dans la colonne COL_Age en en introduisant la fonction Age WLangage avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WL.Age(GestionPersonnel.DateDeNaissance)
    En mettant cette valeur dans une variable de type date, masque de saisie sous format JJJJ J MMMM AAAA, et une valeur retournée MMJJAAAA j'ai pu obtenir, de façon automatique, sans aucune programation 51__1102 pour 51 ans 11 mois 02 jours. j'ai pensé obtenir les résultats que j'ai voulus en faisant la combinaison de masque de saisie et valeur retournée, sans programmer car, j'ai pu avoir Mercredi 21 oct 1986 pour la date de naissance, de type date, en combinant masque de saisie Jjjj JJ Mmm AAAA et valeur retournée AAAAMMJJ.
    J'ai suivi vos conseils et j'ai supprimé le code que j'ai mis dans ma requête ci-dessus. Mais, en aucun cas, je ne réussis malheureusement pas à mettre dans la colonne COL_Age les résultats souhaités.
    Je vous ai demandé alors l'emplacement probable du code car, j'ai tout essayé.........
    Finalement, je décide de former une autre table contenant l'Age à partir du fichier source........et c'est réussi !!!
    En conclusion, la table formée à partir d'une requête n’obéit qu'aux critères mis dans la requête.
    Merci à vous tous........

  2. #22
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    C'est dommage de s'arrêter là...
    Ton problème vient du fait que tu ne comprends pas la gestion des événements de Windev.
    Visiblement, tu as créé une table remplie par liaison aux données (description de la table, onglet "contenu", "remplissage par Fichier/Requête")
    Dans ce type de table, les colonnes sont directement reliées aux données.
    Si tu cliques sur une colonne, et que tu regardes l'onglet "liaison", tu verras la rubrique à laquelle la colonne est liée.
    Mais rien ne t'empêche d'ajouter une colonne à cette table. Une colonne qui sera calculée par programmation.
    Pour ça, tu as besoin d'avoir
    1. Une colonne COL_DateDeNaissance, que tu peux rendre invisible si tu veux (onglet IHM, sur la colonne).
      Relie cette colonne à ta rubrique
    2. Une colonne COL_Age, visible, et reliée à aucune rubrique.
    3. La procédure AgeEnLettres déclarée comme ça :
      Code Procédure AgeEnLettres : 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
       
      PROCEDURE AgeEnLettres(LOCAL dDateNaiss est une Date)
      LOCAL
      	dAge est une Date
      	sAge est une chaîne
      	nNbSepar est un Entier
      	nPosSepar est un Entier	//Position du dernier "$", celui qui doit être remplacé par " et " dans une phrase française correcte.
       
      dAge = Age(dDateNaiss)
      SI dAge..Année > 0 ALORS sAge = dAge..Année + " an" + Répète("s", dAge..Année > 1)
      SI dAge..Mois > 0 ALORS sAge += ["$"] + dAge..Mois + " mois"	//L'astuce pour afficher le "s" au pluriel est inutile pour le mot "mois"
      SI dAge..Jour > 0 ALORS sAge += ["$"] + dAge..Jour + " jour" + Répète("s", dAge..Jour > 1)
      nNbSepar = ChaîneOccurrence(sAge, "$")
      nPosSepar = PositionOccurrence(sAge, "$", nNbSepar)
      sAge = sAge[[A nPosSepar -1]] + " et " + sAge[[1 + nPosSepar A]]	//Remplace le dernier $ par " et "
      sAge = Remplace(sAge, "$", ", ")	//Remplace le premier $ par une virgule, si besoin (cas où l'on n'a pas de mois par exemple)
      RENVOYER sAge

    Ensuite, dans l'événement "Affichage d'une ligne" de ta table, tu ajoutes le code suivant :
    Code Affichage d'une ligne : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COL_Age = AgeEnLettres(COL_DateDeNaissance)

    Si tu ne comprends pas bien ce que fait ma version de la fonction, tu peux aussi prendre la tienne. Mais elle à le défaut de ne pas gérer les cas comme "30 ans et 12 jours". Elle affiche "30 ans, 0 mois et 12 jours"

  3. #23
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Novembre 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    En fait, je ne veux pas ,disons, copier bêtement ce que font les autres, pour dire que je dois comprendre ce que je fais. Si vous le voulez bien, pouvez vous interpréter ou de déchiffrer ce dernier code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nNbSepar = ChaîneOccurrence(sAge, "$")
    nPosSepar = PositionOccurrence(sAge, "$", nNbSepar)
    sAge = sAge[[A nPosSepar -1]] + " et " + sAge[[1 + nPosSepar A]]	//Remplace le dernier $ par " et "
    sAge = Remplace(sAge, "$", ", ")
    Merci pour la disponibilité

  4. #24
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Citation Envoyé par zonoelson Voir le message
    En fait, je ne veux pas ,disons, copier bêtement ce que font les autres, pour dire que je dois comprendre ce que je fais.
    C'est bien le but de ce forum.

    Donc, la différence entre ma fonction et la tienne, c'est qu'elle gère les cas à 0 en ne mettant les séparateurs que si besoin.
    Tu obtiendras donc des résultats comme ça :
    • 30 ans, 5 mois et 3 jours
    • 30 ans et 28 jours (et pas 30 ans 0 mois et 28 jours)
    • 30 ans et 1 mois (et pas 30 ans 1 mois et 0 jour)
    • 6 mois et 18 jours (et pas 0 an 6 mois et 18 jours)
    • 30 ans (et pas 30 ans 0 mois et 0 jour)
    • 8 mois (et pas 0 an 8 mois et 0 jour)
    • 23 jours (et pas 0 an 0 mois et 23 jour)


    Pour gérer ça, tu as besoin de
    1. Séparer les deux dernières informations par le mot " et "
    2. S'il y a plus de deux informations, séparer les premières par une ", "


    Donc le code maintenant :
    On a séparer chaque information par un "$"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nNbSepar = ChaîneOccurrence(sAge, "$")
    => repère le dernier "$" dans la chaîne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPosSepar = PositionOccurrence(sAge, "$", nNbSepar)
    => repère la position du dernier "$" dans la chaine


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sAge = sAge[[A nPosSepar -1]] + " et " + sAge[[1 + nPosSepar A]]
    => remplace le dernier "$" par " et "


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sAge = Remplace(sAge, "$", ", ")
    [/CODE]
    => remplace tous les "$" restants par ", " (ce principe fonctionne donc, qu'il y ait ou non des "$" restants)

  5. #25
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Novembre 2013
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci infiniment à tous, pour le rendre plus excitant, j'ai ajouté ceci:
    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 AgeEnLettres(LOCAL dDateNaiss est une Date)
    LOCAL
    	dAge est une Date
    	sAge est une chaîne
    	nNbSepar est un entier
    	nPosSepar est un entier	//Position du dernier "$", celui qui doit être remplacé par " et " dans une phrase française correcte.
     
    dAge = Age(dDateNaiss)
    SI dAge..Année > 0 ALORS sAge = dAge..Année + " an" + Répète("s", dAge..Année > 1)
    SI dAge..Mois > 0 ALORS sAge += ["$"] + dAge..Mois + " mois"	//L'astuce pour afficher le "s" au pluriel est inutile pour le mot "mois"
    SI dAge..Jour > 0 ALORS sAge += ["$"] + dAge..Jour + " jour" + Répète("s", dAge..Jour > 1)
    SI dAge..Année> 60 ALORS
    	sAge=dAge..Année + " an" + Répète("s", dAge..Année > 1)
    	sAge += ["$"] + dAge..Mois + " mois"
    	sAge += ["$"] + dAge..Jour + " jour" + Répète("s", dAge..Jour > 1) + "  En âge de retraité  "
    	COL_AGE[IndiceEnCours]..Couleur=RougePastel
    FIN
    nNbSepar = ChaîneOccurrence(sAge, "$")
    nPosSepar = PositionOccurrence(sAge, "$", nNbSepar)
    sAge = sAge[[A nPosSepar -1]] + " et " + sAge[[1 + nPosSepar A]]	//Remplace le dernier $ par " et "
    sAge = Remplace(sAge, "$", ", ")	//Remplace le premier $ par une virgule, si besoin (cas où l'on n'a pas de mois par exemple)
    RENVOYER sAge

  6. #26
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Parfait, ça marche effectivement, mais en faisant ça tu bloques ta fonction. Elle pouvait être appelée à partir de n'importe où, là elle peut seulement être appelée à partir de ta table.
    (Par exemple, tu pouvais placer le code dans un double clic de ta table pour qu'il t'affiche l'âge dans une boite de dialogue.
    Code du doubleClic sur ligne de la table : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SI TableInfoXY(MoiMême..Nom, tiNomColonne, SourisPosX(), SourisPosY()) = COL_DateDeNaissance..Nom ALORS
        Info(AgeEnLettres(COL_DateDeNaissance)
    FIN
    A la place, je te conseillerai donc de passer un paramètre "par référence".
    Pour ça, il faut enlever le mot clé LOCAL devant le paramètre de ta fonction.
    En faisant ça, si tu modifies la valeur du paramètre dans la fonction, la valeur est également modifiée dans le code appelant.
    Voilà ce que ça donne.
    Code d'affichage d'une ligne : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LOCAL
    	nCouleurLigne est un entier = COL_Age[IndiceEnCours()]..Couleur
     
    COL_Age = AgeEnLettres(COL_DateDeNaissance, nCouleur)
    COL_Age..Couleur = nCouleur
    Code de la procedure AgeEnLettres : 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
     
    PROCEDURE AgeEnLettres(LOCAL dDateNaiss est une Date, nCouleur est un Entier = Noir)
    LOCAL
    	dAge est une Date
    	sAge est une chaîne
    	nNbSepar est un entier
    	nPosSepar est un entier	//Position du dernier "$", celui qui doit être remplacé par " et " dans une phrase française correcte.
     
    dAge = Age(dDateNaiss)
    SI dAge..Année > 0 ALORS sAge = dAge..Année + " an" + Répète("s", dAge..Année > 1)
    SI dAge..Mois > 0 ALORS sAge += ["$"] + dAge..Mois + " mois"	//L'astuce pour afficher le "s" au pluriel est inutile pour le mot "mois"
    SI dAge..Jour > 0 ALORS sAge += ["$"] + dAge..Jour + " jour" + Répète("s", dAge..Jour > 1)
    SI dAge..Année> 60 ALORS
    	sAge += ",  en âge de retraite"
    	nCouleur=RougePastel	//Le fait de l'attribuer ici permet de changer la valeur dans la procédure appelante.
    FIN
    nNbSepar = ChaîneOccurrence(sAge, "$")
    nPosSepar = PositionOccurrence(sAge, "$", nNbSepar)
    sAge = sAge[[A nPosSepar -1]] + " et " + sAge[[1 + nPosSepar A]]	//Remplace le dernier $ par " et "
    sAge = Remplace(sAge, "$", ", ")	//Remplace le premier $ par une virgule, si besoin (cas où l'on n'a pas de mois par exemple)
    RENVOYER sAge

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Calcul de l'age d'une personne
    Par stephyugh dans le forum Développement
    Réponses: 12
    Dernier message: 21/03/2017, 23h09
  2. formule pour calculer age
    Par Daniela dans le forum Excel
    Réponses: 3
    Dernier message: 19/09/2011, 15h21
  3. Calcul age d'une personne
    Par amirad dans le forum VB.NET
    Réponses: 6
    Dernier message: 29/07/2009, 11h55
  4. Formule(s) pour calculer l'age
    Par Eric5151 dans le forum Deski
    Réponses: 3
    Dernier message: 28/05/2008, 16h15
  5. Calcul Age
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/01/2005, 08h56

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