|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre actif
![]() |
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; Quand je mets le code dans mon etape data ça fonctionne mais quand je passe par une macro, ça déconne... Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() |
il faut transformer tes variables en macro variables.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
|
|
|
00
|
|
|
#3 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
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 |
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
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) avec en version 9.2 de SAS 2) avec à partir de SAS 8 Bon courage. Olivier |
||
|
|
00
|
|
|
#5 |
|
Membre actif
![]() |
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é : 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
|
|
|
00
|
|
|
#6 |
|
Membre actif
![]() |
Petite question : à quoi correspond le paramètre "C" ? peut-il être remplacé par autre chose ??
merci |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Citation:
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 |
|
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
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.
|
|
|
00
|
|
|
#9 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
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. |
|
|
00
|
|
|
#10 |
|
Membre actif
![]() |
Merci à tous pour ces explications, c'était très clair ...
![]() Mais je n'avais rien trouvé dans la doc de mon SAS |
|
|
00
|
|
|
#11 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com