Avec SAS 9.1.3 et SAS9.2 de nouveaux warning apparaissent. En voici deux que vous pouvez faire disparaître dans le cas où ils ne reflètent pas un problème dans votre programme.
- Avec PROC SQL, je crée une nouvelle table du même nom que la table source.
- Dans un data set je réduis la longueur d’une variable
1. Utiliser le même nom de data set en entré et en sortie avec PROC SQL
Pour illustrer le sujet, je vais d’abord créer un data set appelé ONE avec deux variables X et Y.
data one;
x=‘A’;
y=‘B’;
run;
Ensuite je vais créer avec PROC SQL un nouveau data set du même nom ONE qui ne contiendra que la variable X.
proc sql;
create table one as
select x
from one;
quit;
Le message dans la log ressemble à ceci:
WARNING: This CREATE TABLE statement recursively reference the target table. A consequence of this is a possible data integrity problem.
Pour ne plus avoir ce message dans la log, ajouter l’option UNDO_POLICY=NONE
proc sql undo_policy=none;
create table one as
select x
from one;
quit;
Ce cas existe depuis SAS 9.1.3.
2. Réduire la longueur d’une variable dans une étape data
Une solution pour changer la longueur d’une variable est de définir sa longueur dans une instruction LENGTH avant de lire les données avec un SET par exemple.
Depuis SAS 9.2, si la nouvelle longueur est plus petite que l’ancienne un WARNING apparaît dans la log. Ceci est une bonne chose car cela vous permet de repérer d’éventuelles coupures (truncations) de vos données.
Dans certains cas cependant, vous savez pertinemment que le nombre de caractères dans données est au plus X et que dès lors elles ne seront pas coupées en réduisant la longueur.
Vous pouvez vous épargner le warning en encadrant votre étape data des options globales VARLENCHK=nowarn et VALENCHK=warm.
Je vous conseille d’appliquer cette option localement afin de pouvoir continuer à repérer d’autres coupures potentielles non prévues.
data two;
length x $32;
x=‘A’;
run;
data two_a;
length x $1;
set two;
run;
WARNING : Multiple lengths were specified for the variable x by input data set(s). This may cause truncation of data.
options varlenchk=nowarn;
data two_b
length x $1;
set two;
run;
options varlenchk=warn;
Notez cependant, qu’avec SAS 9.1.3 ou SAS 9.2, un warning apparaît dès lors que la variable est donnée dans une instruction BY. L’option VARLENCHK de SAS 9.2 ne vous enlèvera pas le warning. Je vous conseille donc de changer votre longueur au préalable si vous ne voulez pas ce WARNING.
data two_b;
length x $1;
set two;
by x;
run;
WARNING: Multiple lengths were specified for the BY variable x by input data sets and LENGTH, FORMAT, INFORMAT statements. This may cause unexpected results.
Lectures complémentaires :
- Deux manières de créer un data set vide
- Qui a la priorité : RETAIN ou SET ? (article protégé : devenez correspondant ou écrivez un article pour obtenir le mot de passe)
- Changer la longueur d’une variable avec PROC SQL (instruction ALTER)
3 angles de vue sur les commentaires
avril 24, 2008Il 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.
1. Désactiver une instruction : 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.
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é.
*proc print data=cnt_pct;
*run;
Note : On n’utilisera pas cette syntaxe étoile/point-virgule :
2. Désactiver un bloc de texte plus globales : 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.
/*
*Calcul des fréquences;
proc freq…;
run;
*Générer une table;
proc report…;
run;
*/
Note : 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.
3. Les commentaires et le langage macro :
Les différences entre les instructions à l’intérieur et la l’extérieur d’une définition de macro : 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.
%macro commentaires;
%*IF….;
%mend;
*%commentaires;
Le cas particulier des conditions : seul le /**/ peut-être utilisé entre un %if et un %else.
%macro commentaire;
%IF … %THEN %DO; … %END;
/* l’autre notation n’est pas possible ici*/
%ELSE …
%mend commentaire;
Une macro sans nom : la troisième méthode pour écrire un commentaire est de créer une macro sans nom.
%macro;
Mon texte est inactif ici.
%mend;
Publié dans Data Management, Documenter, Langage Macro, Par niveaux, Par thématique, SAS débutant | Tagué commentaires, SAS, syntaxe | Leave a Comment »