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/01/2008, 12h00   #1
Membre habitué
 
Inscription : juillet 2006
Messages : 284
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 284
Points : 107
Points : 107
Par défaut Verifier l'existence d'une variable

Bonjour, j'ai trouvé sur le Net un petit programme SAS qui permet de vérifier l'existence d'une variable dans une table SAS.

Je l'ai executé et il marche mais le problème c'est qu'il y a des choses que je ne comprends pas dans ce code.

Le jeu de données :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA BIDON;
INPUT X1 X2 Y1 Y2 X5 $;
LABEL X1 = 'LIBELLE X1';
LABEL X2 = 'LIBELLE X2';
LABEL Y1 = 'LIBELLE Y1';
LABEL Y2 = 'LIBELLE Y2';
LABEL X5 = 'LIBELLE X5';
CARDS;
1 5 5 1161 ABÉLIEN
35 6 3 1336 ALMÉRIC
82 1 5 1499 ANIEL
;
RUN;
La macro

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%MACRO VAREXIST(DSN,VAR);
   %GLOBAL EXIST;
   %IF &DSN NE %THEN %STR(
						    DATA _NULL_;
							IF 0 THEN SET &DSN(KEEP = &VAR);
							STOP;
							RUN;
						   );
	%IF &SYSERR = 0 %THEN %LET EXIST = YES;
				    %ELSE %LET EXIST = NO;
%MEND VAREXIST;
 
%VAREXIST(DSN = BIDON, VAR = X1);
 
%PUT ∃
Donc ici je ne comprends pas le "NE" de "IF &DSN NE %THEN", le %STR et le &SYSERR.

Merci de votre aide.

ash_rmy.
ash_rmy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2008, 14h50   #2
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Salut,

la macro que tu as trouvé me semble bien compliqué pour pas grand chose ...

%IF &DSN NE %THEN => Test si le paramètre DSN est renseigné (n'est pas égal à vide).
Dans ton exemple DSN=BIDON donc on rentre dans le %IF

%STR => permet de ne pa prendre en compte, lors de la compilation de la macro des caractères spéciaux comme ' " ;

&syserr (pour système error) est une variable système qui se met à 1 quand il y a eu une ERROR dans la log.

En fait ta macro lit la table &DSN en gardant la variable &VAR. Si cette variable n'existe pas, ça provoque une erreur et ça met &syserr à 1 ...

C'est pas très propre car ça met forcément une erreur dans la log ...

Pour vérifier l'existence d'une variable tu peux voir si elle est présente dans la table sashelp.vcolumn qui est une vue système qui liste toute les variables de toutes tes tables

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
%GLOBAL varexist;
%macro VAREXIST(lib=,TABLE=,VAR=);
    /* première solution qui met longtemps à tourner
    data _NULL_;
         set SASHELP.VCOLUMN;
         WHERE libname="%UPCASE(&lib)" AND memname="%UPCASE(&table)"
                   AND name="&var";
         call symput('varexist',compress(_N_));
    run ;
    */
    /*deuxième solution plus rapide*/
    proc sql noprint;
        SELECT count(*)
        INTO :varexist
        FROM DICTIONARY.COLUMNS /* équivalent de sashelp.vcolumn */
        WHERE libname="%UPCASE(&lib)" AND memname="%UPCASE(&table)"
                   AND name="&var";
    quit;
 
    %IF &varexist>0 %then %put &VAR existe dans la TABLE &TABLE;
    %else %put &var n%str(%')existe pas;
 
%mend;
 
%varexist(lib=WORK,TABLE=BIDON,VAR=X1);
Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2008, 18h10   #3
Membre habitué
 
Inscription : juillet 2006
Messages : 284
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 284
Points : 107
Points : 107
Merci bien Steel,

dans ton code, je ne comprends pas bien le de
Code :
%else %put &var n%str(%')existe pas;
.

Qu'est ce que c'est que le %' ?

Merci.
ash_rmy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2008, 09h37   #4
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Juste pour compléter sur syserr : vaut 0 si l'éxecution s'est bien effectué sans message d'avertissement ... peut prendre aussi les valeurs 1,2,4,>4 quand des erreurs se sont produites.
fafabzh6 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 07h13.


 
 
 
 
Partenaires

Hébergement Web