<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>langage-macro &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/langage-macro/</link>
	<description>Feed of posts on WordPress.com tagged "langage-macro"</description>
	<pubDate>Mon, 08 Sep 2008 09:08:58 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Répéter une action sur plusieurs variables avec le langage macro]]></title>
<link>http://thesasreference.wordpress.com/?p=326</link>
<pubDate>Wed, 13 Aug 2008 06:00:53 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/?p=326</guid>
<description><![CDATA[
Sous SAS, deux possibilités sont envisageables pour répéter une action sur plusieurs variables. ]]></description>
<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-401" src="http://thesasreference.wordpress.com/files/2008/08/boucle_fr.jpg" alt="" width="448" height="224" /></p>
<p>Sous SAS, deux possibilités sont envisageables pour répéter une action sur plusieurs variables. Dans le cas d'un data step, la syntaxe de l'ARRAY est tout à fait appropriée. Dans d'autres cas, le langage macro peut s'avérer plus pertinent. Voici donc une présentation de l'approche via le langage macro.</p>
<p><strong><span style="color:#ff6600;">1. L'exemple</span></strong></p>
<p>Pour illustrer le propos, le programme aura pour but de définir un PROC REPORT contenant toutes les variables du data set SASHELP.CLASS. Si on connaît le nom des variables, la syntaxe se résume de la manière suivante.</p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>proc report</strong></span> <span style="color:#0000ff;">data</span>=sashelp.class;<br />
   <span style="color:#0000ff;">columns</span> name age sex weight height;<br />
   <span style="color:#0000ff;">define</span> name   / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define</span> age    / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define </span>sex    / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define </span>weight / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define </span>height /<span style="color:#0000ff;"> display</span>;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p>Mais si on ne connaît pas le nom des variables par avance, il faut automatiser la tâche.</p>
<p><strong><span style="color:#ff6600;">2. Remplacer le nom des variables par des macros variables</span></strong></p>
<p>Dans l'exemple suivant, le nom de chaque variable est sauvegardé dans une macro variable. Ces macros variables ont une structure particulière :</p>
<p style="padding-left:30px;"><strong>un préfixe commun + un nombre</strong></p>
<p><span style="font-family:Courier New;"><span style="color:#0000ff;">%let</span> class1 = name;<br />
<span style="color:#0000ff;">%let</span> class2 = age;<br />
<span style="color:#0000ff;">%let</span> class3 = sex;<br />
<span style="color:#0000ff;">%let</span> class4 = weight;<br />
<span style="color:#0000ff;">%let</span> class5 = height;</span></p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>proc report</strong></span> <span style="color:#0000ff;">data</span>=sashelp.class;<br />
   <span style="color:#0000ff;">columns</span> name age sex weight height;<br />
   <span style="color:#0000ff;">define</span> &#38;<span style="color:#008080;">class1.</span> / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define</span> &#38;<span style="color:#008080;">class2.</span> / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define</span> &#38;<span style="color:#008080;">class3.</span> / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define</span> &#38;<span style="color:#008080;">class4.</span> / <span style="color:#0000ff;">display</span>;<br />
   <span style="color:#0000ff;">define</span> &#38;<span style="color:#008080;">class5.</span> / <span style="color:#0000ff;">display</span>;<br />
<span style="color:#000080;"><strong>run</strong></span>;</span></p>
<p><strong><span style="color:#ff6600;">3. Répéter l'instruction DEFINE grâce à une boucle</span></strong></p>
<p>Grâce à cette structure particulière, une boucle peut être envisagée. L'instruction DEFINE est alors répétée autant de fois qu'il y a de variables. La boucle est définie par une macro variable "I" qui prend des valeurs allant de 1 à 5. La partie nombre de la macro variable est donc remplacée par la valeur de la macro variable "I".</p>
<p><strong>NOTE </strong>: Pour résoudre la macro variable lors de la première boucle, SAS effectue deux lectures. A la première lecture, les deux perluètes (<em>ampersand</em>) &#38;&#38; se transforment en un seul ; &#38;i. se transforme en 1. On a donc &#38;CLASS1. A la deuxième lecture, SAS résout la macro variable &#38;CLASS1. comme précédemment.</p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">%macro</span></strong> <strong><em>test</em></strong>;<br />
   proc report data=sashelp.class;<br />
   columns name age sex weight height;<br />
   <span style="color:#0000ff;">%do</span> i=<strong><span style="color:#008080;">1</span></strong> <span style="color:#0000ff;">%to </span><strong><span style="color:#008080;">5<br />
</span></strong>      define &#38;&#38;class&#38;<span style="color:#008080;">i.</span> / display;<br />
  <span style="color:#0000ff;"> %end</span>;<br />
   run;<br />
<strong><span style="color:#000080;">%mend</span></strong> test;<br />
<em><strong>%test</strong></em>;</span></p>
<p><strong><span style="color:#ff6600;">4. Créer les macros variables de manière automatique</span></strong></p>
<p>Pour créer les macros variables automatiquement, il faut agir en deux étapes.</p>
<ol>
<li>Enregistrer chacune des noms de variables du data set choisi dans PROC REPORT (SASHELP.CLASS) dans un nouveau data set (LST_VAR) et plus particulière dans une variable (NAME).</li>
<li>Associer un numéro à chaque nom de variable (compteur) et convertir l'information en macro variable (CALL SYMPUT).</li>
</ol>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong>;<br />
   <span style="color:#0000ff;">create</span> <span style="color:#0000ff;">table</span> lst_var <span style="color:#0000ff;">as</span><br />
      <span style="color:#0000ff;">select</span> name<br />
      <span style="color:#0000ff;">from</span> dictionary.columns<br />
      <span style="color:#0000ff;">where</span> upcase(<span style="color:#0000ff;">libname</span>)=<span style="color:#800080;">'SASHELP'</span> <span style="color:#0000ff;">and<br />
</span>            upcase(memname)=<span style="color:#800080;">'CLASS'</span>;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>data</strong></span> <span style="color:#0000ff;">_null_</span>;<br />
   <span style="color:#0000ff;">set</span> lst_var;<br />
   cnt+<span style="color:#008080;"><strong>1</strong></span>;<br />
   <span style="color:#0000ff;">call</span> symput (cats(<span style="color:#800080;">'CLASS'</span>,put(cnt,<span style="color:#008080;">best.</span>)),name);<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><strong><span style="color:#ff6600;">5. Compter le nombre de variables de manière automatique</span></strong></p>
<p>Si le nombre de variable dans le data set n'est pas connu à l'avance, il faut le retrouver. Cette information est ensuite sauvegardée dans une macro variable, disons MAX_VAR, et remplacera notre nombre 5. L'article "<a href="http://thesasreference.wordpress.com/2008/02/07/creer_macro_variable/">3 méthodes pour construire des macro variables sans macro</a>" vous donnera plus de précisions concernant la création d'une macro variable.</p>
<p><strong>Obtenir rapidement le nombre de variables dans un data set</strong> : Un moyen pour trouver le nombre de variables est de faire appel au dictionnaire de SAS intitulé TABLES.</p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>proc sql <span style="color:#0000ff;">noprint</span></strong></span>;<br />
   <span style="color:#0000ff;">select</span> nvar<span style="color:#0000ff;"> into </span>: max_var<br />
   <span style="color:#0000ff;">from</span> dictionary.tables<br />
   <span style="color:#0000ff;">where</span> upcase(libname)=<span style="color:#800080;">'SASHELP'</span> <span style="color:#0000ff;">and</span><br />
         upcase(memname)=<span style="color:#800080;">'CLASS'</span>;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><strong>Plus de flexibilité sur la liste des variables concernées</strong> : Un autre moyen pour compter le nombre de variables est d'agir en deux étapes.</p>
<ul>
<li>Enregistrer dans un variable d'un nouveau data set chacune des noms de variables de SASHELP.CLASS.</li>
<li>Compter le nombre d'observations dans ce data set. Vous pouvez vous reporter à l'article "<a href="http://thesasreference.wordpress.com/2008/04/14/compter_obs/">Combien d'observations dans mon data set</a>" pour plus de précisions sur les différentes alternatives.</li>
</ul>
<p>Dans notre exemple, il s'agit de créer le data set LST_VAR pour la première étape. Le code de la section 4 est tout à fait suffisant pour cela. Ensuite, CALL SYMPUTX peut servir à sauvegarder l'information dans une macro variable.</p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> <span style="color:#0000ff;">_null_</span> ;<br />
   call symputx(<span style="color:#800080;">'max_var'</span>,_N_-<span style="color:#008080;"><strong>1</strong></span>);<br />
   <span style="color:#0000ff;">set</span> lst_var;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><strong>Pourquoi vous ai-je proposé cette alternative ?</strong>  Ici, toutes les variables sont sélectionnées. Mais si seulement quelques une sont choisies, seule la seconde alternative marche. Voici quelques sous-sélections possibles.</p>
<ul>
<li>Sélectionner toutes les variables numériques,</li>
<li>Sélectionner toutes les variables finissant pas _X,</li>
<li>etc.</li>
</ul>
<p><strong><span style="color:#ff6600;">En résumé</span></strong> : En résumé, le code se décompose en 2 étapes : créer les macros variables et utiliser ces macros variables pour définir une boucle.</p>
<p><span style="color:#008000;font-family:Courier New;">*1. Créer les macros variables CLASS1 à CLASS5, MAX_VAR.;</span></p>
<p><span style="color:#008000;font-family:Courier New;">*1.1 Créer le data set LST_VAR servant de fichier de référence.;</span></p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong>;<br />
<span style="color:#0000ff;">   create</span> <span style="color:#0000ff;">table</span> lst_var <span style="color:#0000ff;">as</span><br />
<span style="color:#0000ff;">      select</span> name<br />
<span style="color:#0000ff;">      from</span> dictionary.columns<br />
<span style="color:#0000ff;">      where</span> upcase(<span style="color:#0000ff;">libname</span>)=<span style="color:#800080;">'SASHELP'</span> <span style="color:#0000ff;">and<br />
</span>            upcase(memname)=<span style="color:#800080;">'CLASS'</span>;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><span style="color:#008000;font-family:Courier New;">*1.2 Créer les macro variables CLASS1-CLASS5 en se basant sur le data set LST_VAR créé précédemment.;</span></p>
<p><span style="font-family:Courier New;"><span style="color:#000080;"><strong>data</strong></span> <span style="color:#0000ff;">_null_</span>;<br />
<span style="color:#0000ff;">   set</span> lst_var;<br />
   cnt+<span style="color:#008080;"><strong>1</strong></span>;<br />
<span style="color:#0000ff;">   call</span> symput (cats(<span style="color:#800080;">'CLASS'</span>,put(cnt,<span style="color:#008080;">best.</span>)),name);<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><span style="color:#008000;font-family:Courier New;">*1.3 Créer la macro variable VAR_MAX en se basant sur le data set LST_VAR créé précédemment.;</span></p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> <span style="color:#0000ff;">_null_</span> ;<br />
   call symputx(<span style="color:#800080;">'max_var'</span>,_N_-<span style="color:#008080;"><strong>1</strong></span>);<br />
<span style="color:#0000ff;">   set</span> lst_var;<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><span style="color:#008000;font-family:Courier New;">*2. Reporting : appeler les différentes macro variables pour créer la boucle autour de l'instruction DEFINE.;</span></p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">%macro</span></strong> <strong><em>test</em></strong>;<br />
proc report data=sashelp.class;<br />
   columns name age sex weight height;<br />
<span style="color:#0000ff;">   %do</span> i=<strong><span style="color:#008080;">1</span></strong> <span style="color:#0000ff;">%to <span style="color:#000000;">&#38;</span></span><span style="color:#008080;"><strong>max_var.</strong><span style="color:#000000;">;</span><br />
</span>      define &#38;&#38;class&#38;<span style="color:#008080;">i.</span> / display;<br />
<span style="color:#0000ff;">   %end</span>;<br />
run;<br />
<strong><span style="color:#000080;">%mend</span></strong> test;<br />
<em><strong>%test</strong></em>;</span></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mon paramètre de macro est-il rempli ?]]></title>
<link>http://thesasreference.wordpress.com/?p=124</link>
<pubDate>Sun, 18 May 2008 06:00:44 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/?p=124</guid>
<description><![CDATA[Une macro sous SAS peut dans certains cas être comparée à un questionnaire. A chaque question (pa]]></description>
<content:encoded><![CDATA[<p>Une macro sous SAS peut dans certains cas être comparée à un questionnaire. A chaque question (<em>parameter</em>) correspond plusieurs réponses possibles (<em>parameter value</em>). Certains réponses peuvent êtes obligatoires, d'autres facultatives. Dans le cas où la réponse est impérative mais n'est pas fournie par l'utilisateur, il faut pouvoir l'avertir : arrêter l'exécution du programme de manière propre et l'informer des éléments à fournir. Trois notions de programmation aideront à construire cette vérification (<em>check</em>).</p>
<p><strong><span style="color:#ff6600;">1. Passer un message</span></strong></p>
<p><strong>Une condition en langage macro</strong> : ici, une macro est définie. Des instructions globales sont exécutées, si le paramètre de la macro est vide. Cette condition est donc définie avec une instruction du langage macro %IF ... %THEN ... %DO; ...; %END;</p>
<p><strong>Un message dans la log</strong> : l'objectif est d'informer l'utilisateur sur la nécessité d'une valeur pour le paramètre INPUT_VAL. Pour faire apparaître ce texte d'ERREUR dans la log, l'instruction du langage macro %PUT fera le travail.</p>
<p><strong>Pas besoin de guillemets avec %IF ou %PUT</strong> : le paramètre d'une macro est une forme de macro variable. Pour retrouver sa valeur, son nom est donc entouré d'un symbole &#38; et d'un point. Si cette valeur doit apparaître dans une chaîne de caractères entre guillemets, il faut impérativement utiliser des guillemets doubles. Dans le cas contraire, comme ici dans une instruction %IF ou %PUT, on se passe de guillemets pour résoudre la macro variable.</p>
<p>%macro test_param (input_val=,output_val=);<br />
%if &#38;input_val. = %then<br />
   %do;<br />
      %put ERREUR: Le macro paramètre INPUT_VAL= est obligatoire;<br />
   %end;<br />
*suite du programme;<br />
%mend test_param;<br />
%test_param (input_val=,output_val=);</p>
<p><strong>Personnaliser son message</strong> : quand SAS rencontre une erreur, il utilise le mot ERROR dans la log. Pour distinguer ce message des votre, vous pouvez ajouter un mot-clé comme le nom de la macro. Par exemple : "ERROR - TEST_PARAM: the INPUT_VAL= macro parameter is mandatory.".</p>
<p><span style="color:#ff6600;"><strong>2. Gérer les caractères spéciaux</strong></span> : il est fréquent d'avoir des valeurs autres que les chiffres et les lettres de l'alphabet comme valeur pour un paramètre de macro. Vous aurez souvent besoin de définir l'emplacement des données sources et celui où les outputs seront sauvegardées. Pour cela, les paramètres auront des valeurs du type c:/mon_projet/mesdonnees ou encore c:/mon_projet/mes_resultats. Il existe des macros fonctions : %BQUOTE et %NBRQUOTE pour tenir compte de la barre inclinée (<em>slash)</em> et d'autres caractères spéciaux.</p>
<ul>
<li><strong>%BQUOTE</strong> : les symboles suivants sont gérés avec la fonction %BQUOTE() : ' " ( ) + - * / &#60; &#62; = ¬ ^ ~ ; , blanc AND OR NOT EQ NE LE LT GE GT</li>
<li><strong>%NBRQUOTE</strong> : si, en plus, vous avez les symboles &#38; (et) et % (pourcentage), il faudra faire appel à la macro fonction %NBRQUOTE().</li>
</ul>
<p>SAS online DOC :</p>
<ul>
<li><a href="http://support.sas.com/onlinedoc/913/getDoc/fr/mcrolref.hlp/z3514bquote.htm">%BQUOTE et %NBRQUOTE Functions</a></li>
<li><a href="http://support.sas.com/onlinedoc/913/getDoc/fr/mcrolref.hlp/a001061316.htm">Using the %BQUOTE and %NBRQUOTE Functions</a></li>
</ul>
<p><span style="color:#ff6600;"><strong>3. Enjamber un programme</strong></span></p>
<p>Si la condition n'est pas remplie, on peut demander à SAS d'ignorer une partie du code grâce à la syntaxe de %GOTO. Il était également possible de demander à SAS d'arrêter son exécution en plein milieu. Certes, enjamber le code permet d'avoir une log plus propre, puisque seuls nos messages apparaissent. Mais surtout, cela permet de poursuivre l'exécution du programme. Ainsi, si un appel de macro ne fonctionne pas, rien n'empêche de continuer la soumission d'autres appels de cette macro.</p>
<p>Dans un premier temps, il s'agit de définir une balise. A partir de cette position, SAS pourra continuer son exécution. Ici, la balise s'appelle FIN_PGM. Elle est ajoutée juste avant la fin du la macro.</p>
<p>Dans un second temps, si le paramètre est vide, SAS est prié d'ignorer le code qui suit jusqu'à la balise. Pour cela, dans la condition, l'instruction %GOTO est ajoutée.</p>
<p>%macro test_param (input_val=,output_val=);<br />
%if &#38;input_val. = %then<br />
   %do;<br />
      %put ERREUR: Le macro paramètre INPUT_VAL= est obligatoire;<br />
      <strong>%goto fin_pgm;<br />
</strong>   %end;<br />
*suite du programme;<br />
<strong>%fin_pgm:</strong><br />
%mend test_param;<br />
%test_param (input_val=,output_val=);</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[3 angles de vue sur les commentaires]]></title>
<link>http://thesasreference.wordpress.com/?p=110</link>
<pubDate>Thu, 24 Apr 2008 06:00:25 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/?p=110</guid>
<description><![CDATA[Il existe trois notations différentes pour écrire des commentaires dans un programme SAS. Chacune]]></description>
<content:encoded><![CDATA[<p>Il existe trois notations différentes pour écrire des commentaires dans un programme SAS. Chacune à ses avantages et ses limites. En en prenant connaissance ici, vous pourrez faire des choix stratégiques.</p>
<p><strong><span style="color:#ff6600;">1. Désactiver une instruction</span></strong> : un commentaire entre une étoile et un point virgule est la plus rapide des notations. Celle-ci fait usage de la particularité de la syntaxe SAS. En effet, chaque instruction se termine par un point-virgule. En ajoutant une étoile (asterisk) en tête, l'instruction est désactivée.</p>
<p>Lors du développement d'un programme, on est amené à suspendre certaines instructions ou à en activer ponctuellement. C'est le cas la procédure PROC PRINT, qui permet d'avoir un aperçu du contenu d'un jeu de donné. </p>
<p>*proc print data=cnt_pct;<br />
*run;</p>
<p><strong>Note : On n'utilisera pas cette syntaxe étoile/point-virgule</strong> :</p>
<ul>
<li>pour suspendre un large bloc de texte</li>
<li>si les guillemets ne sont pas fermés dans le commentaire</li>
<li>entre deux instructions PUT ou deux instructions CALL EXECUTE.</li>
</ul>
<p><strong><span style="color:#ff6600;">2. Désactiver un bloc de texte plus globales</span></strong> : L'étoile/point-virgule  peut-être incluse dans d'autres  commentaires plus larges définis pas /* */. Ainsi on peut choisir d'annoter des titres de rubriques d'un programme avec *; . Ainsi on pourra englober ces titres dans une zone de désactivation plus grande.</p>
<p>/*<br />
*Calcul des fréquences;<br />
proc freq...;<br />
run;</p>
<p>*Générer une table;<br />
proc report...;<br />
run;<br />
*/</p>
<p><strong>Note</strong> : On pourra choisir de fermer le bloc par /***/ au lieu de */. Ainsi, en enlevant seulement le /* en début de commentaire, l'intégralité du code est réactivée et fonctionne sans que la notation de fin soit impérativement supprimée.</p>
<p><strong><span style="color:#ff6600;">3. Les commentaires et le langage macro</span></strong> :</p>
<p><strong>Les différences entre les instructions à l'intérieur et la l'extérieur d'une définition de macro</strong> : les instructions macro doivent avoir l'étoile après le symbole pourcentage à l'intérieur d'une définition de macro. On continuera à mettre l'étoile avant si l'instruction est à l'extérieur de la définition de macro. La notation /**/ ne rencontre pas de difficulté particulière.</p>
<p>%macro commentaires;<br />
%*IF....;<br />
%mend;<br />
*%commentaires;</p>
<p><strong>Le cas particulier des conditions</strong> : seul le /**/  peut-être utilisé entre un %if et un %else.</p>
<p>%macro commentaire;<br />
   %IF ... %THEN %DO; ... %END;<br />
 /* l'autre notation n'est pas possible ici*/ <br />
  %ELSE ...<br />
%mend commentaire;</p>
<p><strong>Une macro sans nom</strong> : la troisième méthode pour écrire un commentaire est de créer une macro sans nom.</p>
<p>%macro;<br />
Mon texte est inactif ici.<br />
%mend;</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Le luxe des macros, B.A.BA de la syntaxe]]></title>
<link>http://thesasreference.wordpress.com/?p=59</link>
<pubDate>Mon, 18 Feb 2008 19:00:22 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/?p=59</guid>
<description><![CDATA[ 
Pour répéter un même programme SAS avec quelques nuances, trois possibilités s&#8217;offrent ]]></description>
<content:encoded><![CDATA[<p><img src="http://thesasreference.wordpress.com/files/2008/02/voiture_bleue.jpg" alt="voiture_bleue.jpg" /> </p>
<p>Pour répéter un même programme SAS avec quelques nuances, trois possibilités s'offrent à vous :</p>
<ol>
<li>la macro,</li>
<li>le data _null_,</li>
<li>le call execute.</li>
</ol>
<p>Aujourd'hui, je vous propose de voir la notation de base pour la création d'une macro. Pour pouvoir ensuite développer vos propres macros, vous devrez savoir comment résoudre une macro variable.</p>
<p><span style="color:#ff6600;"><strong>1. Définition et appel : le minimum </strong></span></p>
<p><strong>1.1 Encadrer votre programme entre les instructions %MACRO et %MEND : </strong>une des caractéristiques du langage macro est l'utilisation du signe pourcentage (%) devant des mots-clés. Ceux qui créent une macro n'échappent pas à la règle. On trouve le %MACRO pour annoncer le début de la définition et le %MEND pour arrêter la définition. Pourquoi le mot %MEND ? M est la référence au mot MACRO et END est le mot FIN en anglais.</p>
<p>%macro;<br />
*mon programme SAS;<br />
%mend;</p>
<p><strong>Important :</strong> on s'assurera que la définition de la macro est terminée avant d'en commencer une nouvelle.</p>
<p><strong>1.2 Un nom pour ma macro :</strong> il faudra aussi donner un nom à la macro pour pouvoir l'identifier par la suite.</p>
<p>%macro monlisting;<br />
*mon programme SAS;<br />
%mend monlisting;</p>
<p>L'utilisation du nom de la macro en clôture n'est pas obligatoire mais c'est un bon repère dans votre programme.</p>
<p><strong>1.3 Appel de macro </strong>: pour appeler votre macro, il vous suffit ensuite de faire précéder le nom de la macro du signe pourcentage.</p>
<p>%monlisting;</p>
<p><span style="color:#ff6600;"><strong>2. Imaginez un questionnaire en ligne avec des champs à remplir</strong></span> : parfois une valeur est inscrite par défaut, parfois le texte à remplir est libre ou réduit à un éventail de proposition. Dans notre cas, le champ est un paramètre de la macro. Derrière chacun de ces champs se cache un nom. Il faudra donc donner un nom à ce paramètre. Et enfin, la valeur d'origine est optionnelle. Ces paramètres, qui permettent de nuancer le programme, sont définis dans l'instruction %macro :</p>
<p>%macro monlisting(annee=ALL,imprimer=NO,patient=);</p>
<p><strong>2.1 Utiliser les valeurs par défaut : </strong>pour appeler la macro en utilisant les paramètres par défaut, on écrira soit la macro sans paramètres, ou on pourra rappeler les valeurs d'origine pour améliorer la lisibilité, si besoin est.</p>
<p>%monlisting;<br />
%monlisting(annee=ALL,imprimer=NO,patient=);</p>
<p><strong>2.2 Changer les valeurs des paramètres : </strong>pour appeler la macro avec une option d'impression différente, le paramètre imprimer sera ajouté :</p>
<p>%monlisting (imprimer=YES);</p>
<p><strong>Important :</strong> ici j'ai fait le choix de vous présenter la notation la plus pratique, mais ce n'est pas la seule. Le signe égal est indiqué même si tous les paramètres n'ont pas de valeur par défaut. Ainsi lors de l'appel de macro, on pourra agir sur les paramètres :</p>
<ul>
<li>plus besoin de lister tous les paramètres</li>
<li>plus besoin de respecter l'ordre d'origine des paramètres</li>
</ul>
<p><strong><span style="color:#ff6600;">3. Utiliser les valeurs des paramètres dans le programme</span> : </strong>les paramètres d'une macro sont considérés comme des macros variables et rappelés dans le programme comme tels.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[3 méthodes pour construire des macros variables sans macro]]></title>
<link>http://thesasreference.wordpress.com/?p=34</link>
<pubDate>Thu, 07 Feb 2008 20:52:34 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/?p=34</guid>
<description><![CDATA[
Les macro-variables peuvent être créées soit à l’intérieur d’une macro, soit à l’extér]]></description>
<content:encoded><![CDATA[<p><img src="http://thesasreference.wordpress.com/files/2008/02/lego.jpg" alt="" /></p>
<p>Les macro-variables peuvent être créées soit à l’intérieur d’une macro, soit à l’extérieur. Ici je vous propose de voir comment les créer indépendamment d’une macro. Pour une valeur brute indépendante du reste de votre programme, je vous propose le statement %let. Pour des macros variables définies à partir d’autres informations disponibles dans un jeu de données, vous aurez le choix entre le statement ‘CALL SYMPUT’ dans un data step et le mot clé ‘INTO :’ dans une procédure SQL.</p>
<p><span style="color:#ff6600;"><strong>1. Assigner une valeur manuellement</strong></span> : L'instruction <a href="http://support.sas.com/onlinedoc/913/getDoc/de/mcrolref.hlp/a000543704.htm">%LET</a> sert à définir une macro variable quand vous connaissez la valeur à donner à votre macro variable à l’avance et qu’elle n’est pas fonction de vos données. Tapez la valeur de votre macro-variable. Pour chaque %LET statement une macro variable est créée. Faites suivre %LET du nom de la variable et saisissez sa valeur après le signe égal.</p>
<pre><span><span style="color:#0000ff;">%let</span> projet=53269 ;</span></pre>
<p><span style="color:#ff6600;"><strong>2. Créer une macro variable dans un data step</strong></span> : pourquoi vouloir passez par un data step ? Voici deux exemples : assigner la valeur d’une variable automatique comme _N_ ; créer une boucle pour créer autant de macros variables qu’il y a de valeurs distinctes dans une variable.</p>
<p><strong>2.1 La distinction entre CALL SYMPUT et CALL SYMPUTX : </strong>les arguments de <a href="http://support.sas.com/onlinedoc/913/getDoc/de/lrdict.hlp/a000127861.htm">CALL SYMPUT</a> sont le nom de la macro variable dans un premier temps, et sa valeur dans un second temps. Jusqu’à SAS 8.2, on devait convertir les valeurs numériques en valeur caractères, via la fonction PUT, pour créer la macro variable. Depuis SAS 9, on peut directement utiliser la valeur numérique avec <a href="http://support.sas.com/onlinedoc/913/getDoc/de/lrdict.hlp/a002295697.htm">CALL SYMPUTX</a>.</p>
<p><span style="font-size:10pt;font-family:Courier New;"><strong><span style="color:#000080;">data</span></strong> <span style="color:#0000ff;">_null_</span> ;<br />
   <span style="color:#0000ff;">set </span>demo;<br />
   <span style="color:#0000ff;">call</span> symputx(<span style="color:#800080;">'Nb_boucle'</span>,_N_);<br />
<strong><span style="color:#000080;">run</span></strong>;</span></p>
<p><strong>Pourquoi cette nouveauté si tardive ? </strong>Parce que la valeur d’une macro variable est toujours caractère. Dans un macro statement tel %if…, vous aurez besoin d’une macro fonction pour faire la somme de deux macro variables. En dehors, vous devrez écrire la macro variable entre double guillemets.</p>
<p><strong>2.2</strong> <strong>Un seul CALL SYMPUT(X) et plusieurs macros variables</strong> : si vous avez un jeu de données avec deux variables : une contenant le nom de vos futures macro-variables et l'autre leur valeur, vous pouvez avec un seul CALL SYMPUT/SYMPUTX créer toutes les macro-variables. Pour cela, il vous suffit de mettre le nom des deux variables dans les paramètres. Cette fois-ci il n'y a plus de guillemets.</p>
<table border="0">
<tbody>
<tr>
<td>Niveau</td>
<td>Dose</td>
</tr>
<tr>
<td>Dose1</td>
<td>50</td>
</tr>
<tr>
<td>Dose2</td>
<td>100</td>
</tr>
<tr>
<td>Dose3</td>
<td>150</td>
</tr>
</tbody>
</table>
<pre><span>call symputx (niveau,dose);</span></pre>
<p><span style="color:#ff6600;"><strong>3. Créer une macro variable dans une procédure SQL</strong></span> : Vous pouvez répondre à trois besoins avec PROC SQL : 1) sauvegarder une valeur unique dans une macro variable, comme le nombre total d’observations dans un jeu de données ; 2) sauvegarder toutes les valeurs prises par une variable dans une seule macro variable, en jouant avec SEPARATED BY. 3) créer autant de macro variable qu’il y a de valeurs sélectionnées.</p>
<p><strong>3.1 Une macro variable ayant une seule valeur</strong> : pour sauvegarder le nombre d’observations d’un data set dans une variable CNT, vous écririez select count(*) as cnt from demo ; Pour sauvegarder cette information dans une macro variable CNT vous remplacerez ‘AS’ par ‘<a href="http://support.sas.com/onlinedoc/913/getDoc/de/mcrolref.hlp/a000543554.htm">INTO :</a>’</p>
<p><span style="font-size:10pt;font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong>;<br />
   <span style="color:#0000ff;">select</span> count(*) <span style="color:#0000ff;">into</span> : cnt<br />
      <span style="color:#0000ff;">from</span> sashelp.class ;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><strong>3.3</strong> <strong>Plusieurs macros variables à partir de plusieurs valeurs</strong>: la syntaxe suivante permet de créer plusieurs macros variables à partir de plusieurs calculs extraits d'un même data set.</p>
<p><span style="font-family:Courier New;"><span style="color:#000080;">proc sql</span>;<br />
   <span style="color:#0000ff;">select distinct</span> count(age), count(*)<br />
              <span style="color:#0000ff;">into</span> : cnt_age,<br />
                   : cnt_rec<br />
       <span style="color:#0000ff;">from</span> sashelp.class;  <br />
<span style="color:#000080;">quit</span>;</span></p>
<p>Si les noms de variables ont un nom schématique (base + nombre incrémenté par 1), la syntaxe suivante peut être appliquée.</p>
<p><span style="font-size:10pt;font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong>;<br />
   <span style="color:#0000ff;">select distinct</span> age <span style="color:#0000ff;">into</span> : pop1-:pop6<br />
      <span style="color:#0000ff;">from </span>sashelp.class;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><strong>3.4 Plusieurs valeurs dans une seule macro variable</strong>: vous pouvez aussi décider de sauvegarder ces cinq valeurs dans une seule macro variable. Ne listez alors qu’un nom. Au moment d’appeler votre macro vous observerez que seule la première valeur apparaît si vous n’avez pas précisez un délimiteur comme un espace ou une virgule entre les observations via SEPARATED BY. Par défaut, le délimiteur est en effet un passage à la ligne. Voici deux exemples :</p>
<p><span style="font-size:10pt;font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong>;<br />
   <span style="color:#0000ff;">select distinct</span> age <span style="color:#0000ff;">into</span> : age_space<br />
                            separated <span style="color:#0000ff;">by</span> ' '<br />
      <span style="color:#0000ff;">from</span> sashelp.class;<br />
</span><span style="font-size:10pt;font-family:Courier New;">   <span style="color:#0000ff;">select distinct</span> age <span style="color:#0000ff;">into</span> : age_comma<br />
                           separated <span style="color:#0000ff;">by</span> ','<br />
      <span style="color:#0000ff;">from</span> sashelp.class;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span><br />
 <br />
<strong>3.5 La macro variable automatique SQLOBS</strong> : Enfin sachez qu’il existe une macro variable automatique SQLOBS qui sauvegarde le nombre d’observation de la dernière procédure SQL. Cette fonction peut s’avérer pratique à condition de bien garder à l’esprit qu’il ne faudra pas par la suite intercaler d’autres SQL statement qui changeraient la valeur de cette macro variable automatique.</p>
<p><strong>3.6 Extra</strong></p>
<p><strong>L'option NOPRINT</strong> : Par défaut, les valeurs d’un select statement sont affichées dans la log, si aucun jeu de données n’est crée. Si vous ne souhaitez pas voir la valeur des macros variables s’afficher dans votre log arrêter via l’option <strong>NOPRINT</strong> :</p>
<p><span style="font-family:Courier New;">   <span style="color:#000080;"><strong>proc sql </strong></span><span style="color:#0000ff;">noprint</span>;<br />
      <span style="color:#008000;">*ma sélection;</span><br />
   <strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><strong>Important</strong>: si aucun record n'est sélectionné avec la PROC SQL, la macro variable n'est pas créée. Dans l'exemple ci-dessous, la macro variable MAX_AGE n'apparaît pas dans la liste des variables de l'utilisateur disponible dans la log.</p>
<p><span style="font-family:Courier New;"><strong><span style="color:#000080;">proc sql</span></strong> <span style="color:#0000ff;">noprint</span>;<br />
   <span style="color:#0000ff;">select</span> max(age) <span style="color:#0000ff;">into</span> : max_age<br />
   <span style="color:#0000ff;">from</span> sashelp.class<br />
   <span style="color:#0000ff;">where</span> age &#62; 18;<br />
<strong><span style="color:#000080;">quit</span></strong>;</span></p>
<p><span style="font-family:Courier New;"><span style="color:#0000ff;">%put</span> _user_;</span></p>
<p><strong><span style="color:#ff6600;">4. Supprimer une macro variable globale</span></strong></p>
<p>Les macros variables globales sont disponibles tout le long de la session. On peut choisir d'écraser la valeur en créant une nouvelle macro variable portant le même nom ou choisir de la supprimer. Dans la version 9.1.3, l'instruction globale<a href="http://support.sas.com/onlinedoc/913/getDoc/de/mcrolref.hlp/a001651249.htm"> %SYMDEL </a>fait supprime les macros variables globales pour vous. Pour ce qui est des variables locales, il n'y a pas d'instructions pour la simple raison que la valeur de la macro variable ne peut pas être rappelée en dehors de la macro.</p>
<p><span style="font-family:Courier New;"><span style="color:#0000ff;">%symdel</span> cnt cnt_age cnt_rec pop1 pop2 pop3 pop4 pop5 pop6 age_space age_comma;</span></p>
<p><strong>NOTE</strong> : Pour définir une condition basée sur une macro variable, il faut qu'elle existe. Si une macro variable n'est pas créée, faute de valeur à assigner, il est conseillé de définir au préalable une valeur par défaut avec un %LET par exemple. Elle pourra ensuite être actualisée par une des trois méthodes mentionnées ci-dessus. Une autre solution est de s'assurer de l'existence de la macro variable avec la fonction <a href="http://support.sas.com/onlinedoc/913/getDoc/de/mcrolref.hlp/a002636452.htm">%SYMEXIST</a>.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Un besoin ponctuel de variables macros]]></title>
<link>http://thesasreference.wordpress.com/2008/01/26/distinguer-les-variables-macros-via-2-exemples/</link>
<pubDate>Thu, 24 Jan 2008 18:24:26 +0000</pubDate>
<dc:creator>The SAS Reference</dc:creator>
<guid>http://thesasreference.wordpress.com/2008/01/26/distinguer-les-variables-macros-via-2-exemples/</guid>
<description><![CDATA[
Cet article requiert une connaissance préalable de la syntaxe pour créer des macros et des variab]]></description>
<content:encoded><![CDATA[<p><img src="http://thesasreference.wordpress.com/files/2008/02/heure.jpg" alt="Horloge" /></p>
<p><em>Cet article requiert une connaissance préalable de la syntaxe pour créer des macros et des variables macros.</em></p>
<p><span style="color:#ff6600;"><strong>1. Deux types de variables macros utilisateur</strong></span> : lorsque vous définissez un paramètre dans votre macro, vous créez une variable macro. Vous pouvez récupérer la valeur de cette variable macro n’importe où à l’intérieur de votre macro. Vous ne pourrez pas l’appeler en dehors de votre macro par défaut. C’est d’ailleurs ce que vous voulez la plupart du temps. Ainsi vous pourrez redéfinir une variable macro du même nom, plus tard, sans risquer d’utiliser une valeur antérieure. On parle de <strong>variable macro locale</strong> (<em>local macro variable</em>). Par contre, si vous voulez l’utiliser en dehors de la macro, vous devez clairement le préciser avant de lui assigner une valeur. On parle alors de <strong>variable macro globale</strong> (<em>global macro variable</em>).</p>
<p><strong><span style="color:#ff6600;">2. Trois mots-clés pour afficher les statuts des variables macros dans la log</span> : %put</strong> pour savoir quel statut porte votre variable macro, vous pouvez utiliser le statement propre au langage macro afin de les afficher dans la log. On fera suivre %put des mots-clés suivants : <strong></strong></p>
<ul>
<li><strong>_global_</strong> ou <strong>_local_ </strong>pour limiter la sélection à un statut donné parmi les macros variables utilisateur,</li>
<li><strong>_user_</strong> pour voir toutes macro-variables de l'utilisateur</li>
<li><strong>_all_</strong> pour lister toutes les variables macros, y compris celles définies par le système SAS.</li>
</ul>
<p><strong><span style="color:#ff6600;">3. Changer de statut </span>: </strong>pour qu’une variable macro a priori locale soit globale, faites usage du statement propre au langage macro <strong>%global</strong> suivi du nom des variables séparées par des espaces.</p>
<p><strong><span style="color:#ff6600;">4. Un exemple de variable macro locale </span>:</strong> Dans ce premier exemple, la variable macro est créée dans une macro. On appelle la macro et affiche la valeur de la macro variable dans la log via le %put statement inclus dans la macro. Une fois l'appel de macro terminé, on affiche toutes les variables macros pour constater que la macro variable locale n’existe plus.</p>
<pre><span>%macro ex_local(x=);
   %put _all_;
%mend ex_local;
%ex_local;
%put _all_;</span></pre>
<p><strong>5. Un exemple de variable macro globale :</strong> dans ce second exemple, la macro variable définie dans la macro est préalablement enregistrée comme globale. On appelle la macro et montre sa valeur grâce au %put statement inséré dans la macro. Après l'appel de macro, on liste toutes les variables macros dans la log pour remarquer que la variable macro qui est globale est toujours présente.</p>
<pre><span>%global y;
%macro ex_global(y=);
   %put _local_;
%mend ex_global;
%ex_global;
%put _all_;</span></pre>
]]></content:encoded>
</item>

</channel>
</rss>
