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

Macro Discussion :

problème comparaison de date


Sujet :

Macro

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut problème comparaison de date
    Bonjour,

    J'ai un petit soucis avec cette macro. Quand je l'exécute et que je fais un options mlogic;
    options mprint;pour une observation à moisNais = 8 et datedm = 12
    il me dit que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %IF moisNais>datedm%THEN age=INTCK('year',dnais,date)-1;
    alors que c'est totalement faux.
    Quand je mets le code dans mon etape data ça fonctionne mais quand je passe par une macro, ça déconne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    %MACRO calculAge;
    moisNais=month(dnais);
    jourNais=day(dnais);
     
    %IF moisNais = datedm %THEN %DO;
    	                	        %IF jourNais > datedj %THEN age=INTCK('year',dnais,ddebeval)-1;
    								%ELSE age=INTCK('year',dnais,date);
    						   %END;
    %IF moisNais>datedm%THEN age=INTCK('year',dnais,date)-1;
    %IF moisNais<datedm %THEN age=INTCK('year',dnais,date);
     
    %MEND calculAge;
    Je ne vois pas du tout pourquoi

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    il faut transformer tes variables en macro variables.
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  3. #3
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    en plus de mettre des & devant tes variables, regarde la fonction %sysfunc pour pouvoir créer age avec la fonction intck.

    age = %sysfunc(intck ...
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Maysa, tu parles "d'une observation avec les valeurs..." ; j'en déduis que tu veux faire ce calcul pour toutes les observations d'une table et créer une variable AGE dans ta table ?
    Dans ce cas, il s'agit de IF normaux, pas de %IF.

    Il est normal que soit vrai : le compilateur macro, chargé d'évaluer les %IF, ne connaît pas les variables SAS. Pour lui, MOISNAIS et DATEDM sont des textes sans signification. Et comme MOISNAIS vient après DATEDM dans un ordre alphabétique, la condition est vraie.
    Par ailleurs, le compilateur macro travaille avant le compilateur SAS ; ton %IF est donc évalué avant le démarrage de l'étape DATA : il ne peut donc pas s'adapter à chaque observation. D'où ma suggestion de faire des IF normaux, si tu veux tester chaque ligne de ta table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %MACRO calculAge;
    moisNais=month(dnais);
    jourNais=day(dnais);
     
    IF moisNais = datedm THEN DO;
       IF jourNais > datedj THEN age=INTCK('year',dnais,ddebeval)-1;
       ELSE age=INTCK('year',dnais,date);
    END;
    IF moisNais>datedm THEN age=INTCK('year',dnais,date)-1;
    IF moisNais<datedm THEN age=INTCK('year',dnais,date);
     
    %MEND calculAge;
    Une dernière chose : ce que tu me sembles en train de recalculer (un âge à un jour précis) peut s'obstenir plus simplement :
    1) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTCK("YEAR", dtnais, date, "C")
    en version 9.2 de SAS
    2) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FLOOR(YRDIF(dtnais, date, "ACTUAL"))
    à partir de SAS 8

    Bon courage.
    Olivier
    Bon courage.
    Olivier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Merci à tous.

    Olivier, tu es en train de me dire que mes 12 lignes de code peuvent être remplacéess par une seule ligne ??
    bien, j'ai donc utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTCK("YEAR", dtnais, date, "C")
    Par contre, je ne comprends pas , je croyais que dans un macro programme il fallait mettre des % devant les if. En tout cas ma macro ne fonctionne pas si j'enlève les % , les variables ne sont pas initialisées.
    J'ai du mal avec ces macros programmes...
    enfin ça fonctionne avec une ligne donc ça va !

    merci et bonne journée

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Petite question : à quoi correspond le paramètre "C" ? peut-il être remplacé par autre chose ??

    merci

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Citation Envoyé par maysa Voir le message
    je croyais que dans un macro programme il fallait mettre des % devant les if
    Oui et non.
    Un macro-programme, c'est avant tout du code qui est stocké dans un coin et copier/collé quand on l'appelle. Il peut contenir de la syntaxe SAS classique et du langage macro, ce dernier repéré par des % et des &.
    Un IF est exécuté uniquement dans une étape DATA, à chaque observation. Sa condition porte généralement sur la valeur d'une variable SAS. Sa conséquence (après THEN) est soit la création/modification d'une variable SAS, soit l'écriture d'une observation (OUTPUT). (Oui, je simplifie un peu. On peut faire plein d'autres choses mais restons aux cas courants.)
    Un %IF est exécuté par le compilateur macro, avant exécution du code SAS. Sa condition porte sur la valeur d'une macro-variable. Sa conséquence (après %THEN) est soit la création/modification d'une macro-variable (%LET), soit un morceau de code SAS qui sera transmis pour exécution.

    Si ton code ne fonctionne pas sans les % devant les IF, c'est peut-être parce que tu n'appelles pas ton macro-programme à l'intérieur d'une étape DATA ? Comme dit plus haut, IF ne fonctionne que dans ce contexte. Et passer par %IF ne te permettra pas un travail "par observation".

    Si ton but est de monter une fonction de calcul d'âge, c'est plutôt une proc FCMP (en SAS 9.2) qu'il te faut plutôt qu'un macro-programme : là tu pourras utiliser la nouvelle fonction dans tous les contextes (SQL, clauses WHERE, etc.).

    J'espère que mes explications t'auront aidé à comprendre pourquoi et quand on met des % aux IF -- mais il ne faut pas rester sur l'idée qu'il en faut systématiquement !

    Olivier
    Bon courage.
    Olivier

  8. #8
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Le "C" (que je tiens d'un post de Stéphane "Datametric" ici) est l'abréviation de "CONTINUOUS". Il permet les calculs en périodes glissantes et non le calcul à partir du nombre de 1ers jours de la période comme fait INTCK par défaut (c'est la valeur "DISCRETE"). Toutes les infos sur INTCK sont dans la doc SAS.
    Bon courage.
    Olivier

  9. #9
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    je rajoute ce lien qui est peut être plus explicite :

    http://support.sas.com/documentation...ls_sect014.htm

    il y a un exemple avec continuous:

    the distance in MONTHS between January 15, 2000, and February 14, 2000, is zero.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Merci à tous pour ces explications, c'était très clair ...

    Mais je n'avais rien trouvé dans la doc de mon SAS

  11. #11
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Citation Envoyé par maysa Voir le message
    Mais je n'avais rien trouvé dans la doc de mon SAS
    dans SAS , t'affiche l'aide avec la touche F1 puis tu saisie:
    Functions and CALL Routines: INTCK Function
    dans l'alglet recherche.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

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

Discussions similaires

  1. Problème comparaison de date
    Par stmastma dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/02/2010, 10h48
  2. Problème comparaison de date sur 4 caractères
    Par carmella dans le forum SQL
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  3. [Dates] Problème comparaison de dates
    Par Davboc dans le forum Langage
    Réponses: 2
    Dernier message: 23/08/2006, 12h23
  4. problème comparaison de date VB
    Par af_airone dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 20/10/2005, 11h18
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

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