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

  1. #1
    Nouveau Candidat au Club
    [Résolu] recherche prochaine date anniversaire 4D V13
    Bonjour,
    j'ai un fichier personne avec un champ date d'anniversaire.
    Comment écrire la méthode qui permettrait de trouver la date du prochain anniversaire à souhaiter?
    A noter que certaines dates ne sont pas renseignées.
    J'ai fait une recherche pour sélectionner ceux avec date renseignée, puis date anniversaire > date du jour, puis un tri
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    CHERCHER([Personne];[Personne]DateNaissance#!00/00/00!;*)
    CHERCHER PAR FORMULE([Personne];[Personne]DateNaissance>Date du jour)
    TRIER([Personne];[Personne]DateNaissance;>)

    mais j'obtiens toujours 00/00/00. Où est l'erreur?
    Si vous pouvez m'aider, j’apprécierai beaucoup
    Merci
    Dominique

  2. #2
    Membre du Club
    Bonjour

    Plusieurs soucis dans ton code :

    - tu ne peux pas enchaîner CHERCHER et CHERCHER PAR FORMULE dans la même requête

    - ton CHERCHER PAR FORMULE ne recherche aucune formule et se contente de chercher les personnes qui ne sont pas encore nées ce qui ne devrait pas te renvoyer grand monde

    - le principe de recherche par "supérieur à" la date de jour ne tient pas la route : le 31 décembre, la prochaine date anniversaire à souhaiter se situera en janvier.

    - tu ne recherches qu'une simple date, c'est dommage de manipuler tout le fichier à cause de ça.

    Je te propose la méthode suivante (il y en a sûrement d'autres) :

    Désolé mon code est en anglais mais tu le passeras facilement en français avec la doc de 4D

    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
    C_DATE($vd_Birthday)
    C_LONGINT($n;$vl_Current_Month;$vl_Current_Day)
    QUERY([Personne];[Personne]DateNaissance#!00-00-00!)
    If (Records in selection([Personne])>0)  //pour être sûr d obtenir un résultat et ne pas partir dans une boucle sans fin
      $vd_Birthday:=Current date  //Date de départ (qui ne sera pas utilisée)
      $n:=0
      SET QUERY DESTINATION(Into variable;$n)//pas la peine de récupérer une sélection, on veut juste savoir si des fiches Personne correspondent
      While ($n=0)//on fera au pire du pire 365 itérations ce qui n est rien pour 4D
        $vd_Birthday:=Add to date($vd_Birthday;0;0;1)  //la première recherche s effectuera à partir de demain, et ensuite on ajoute une journée, ce qui marchera aussi entre le 31 décembre et le 1er janvier
        $vl_Current_Month:=Month of($vd_Birthday)
        $vl_Current_Day:=Day of($vd_Birthday)
        QUERY BY FORMULA([Personne];(Month of([Personne]DateNaissance)=$vl_Current_Month)&(Day of([Personne]DateNaissance)=$vl_Current_Day))//On cherche les personnes qui ont leur date anniversaire ce jour précis
      end while
      SET QUERY DESTINATION(Into current selection)
      ALERT("Prochain anniversaire à souhaiter : "+String($vd_Birthday))//la dernière date cherchée est la bonne
    end if

  3. #3
    Nouveau Candidat au Club
    Merci
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  4. #4
    Nouveau Candidat au Club
    re merci
    Citation Envoyé par dom1202 Voir le message
    Merci beaucoup pour cette réponse précise et complète.
    Effectivement plusieurs erreurs y compris que ma logique est stupide!...
    Merci pour le code, je vais étudier... j'ai beaucoup à apprendre sur 4D...
    Dominique
    J'ai traduit en français et adapté à ma méthode principale.
    evidemment maintenant cela fonctionne
    Encore Merci
    Dominique