Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/04/2011, 16h29   #1
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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 :
%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 :
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
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h46   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
il faut transformer tes variables en macro variables.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 22h05   #3
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
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é !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 07h01   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 :
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 :
INTCK("YEAR", dtnais, date, "C")
en version 9.2 de SAS
2) avec
Code :
FLOOR(YRDIF(dtnais, date, "ACTUAL"))
à partir de SAS 8

Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 09h12   #5
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
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 :
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
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h33   #6
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Petite question : à quoi correspond le paramètre "C" ? peut-il être remplacé par autre chose ??

merci
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h40   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h44   #8
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h53   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 13h39   #10
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Merci à tous pour ces explications, c'était très clair ...

Mais je n'avais rien trouvé dans la doc de mon SAS
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 13h44   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
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.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h44.


 
 
 
 
Partenaires

Hébergement Web