Utilise les tables de métadonnées SAS internes (`dictionary.tables` et `dictionary.macros`) pour obtenir des informations sur l'environnement SAS et les variables macro.
1 Bloc de code
PROC SQL
Explication : Vérifie l'existence des tables temporaires WORK.CURRMV0 et WORK.CURRMV1 dans la bibliothèque WORK pour déterminer si une exécution précédente a eu lieu, en utilisant des variables macro pour stocker les résultats.
Copié !
%macro getMacVars(incl_autos=0, isPost=0, newMVonly=1);
proc sql noprint;
select count(*) into :hasPriorMV from dictionary.tables where libname='WORK' and upcase(memname)='CURRMV0';
select count(*) into :hasCurrMV from dictionary.tables where libname='WORK' and upcase(memname)='CURRMV1';
quit;
select count(*) into :hasPriorMV from dictionary.tables where LIBNAME='WORK' and upcase(memname)='CURRMV0';
5
select count(*) into :hasCurrMV from dictionary.tables where LIBNAME='WORK' and upcase(memname)='CURRMV1';
6
QUIT;
7
2 Bloc de code
MACRO
Explication : Gère les conditions d'exécution spécifiques pour `isPost=1`. Si aucune table précédente n'existe, affiche un message d'erreur et quitte. Si une table courante (`CURRMV1`) existe et qu'on est en mode post-traitement, supprime `CURRMV0` et renomme `CURRMV1` en `CURRMV0` pour préparer la comparaison.
Copié !
%if &hasPriorMV=0 and &isPost=1 %then %do;
%put ::: sorry, the getMacVars macro must be run with isPost=0 prior to a run with isPost=1;
%goto exitMV;
%end;
%if &hasCurrMV=1 and &isPost=1 %then %do;
proc datasets lib=work memtype=data nolist nodetails;
DELETE currMV0;
CHANGE currMV1=currMV0;
run; quit;
%end;
1
%IF &hasPriorMV=0 and &isPost=1 %THEN %DO;
2
%put ::: sorry, the getMacVars macro must be RUN with isPost=0 prior to a RUN with isPost=1;
Explication : Collecte les informations (scope, name, value) de toutes les variables macro depuis la table système `dictionary.macros`. Exclut les variables système spécifiques et applique un filtre sur les variables automatiques si `incl_autos` est à 0. Le résultat est stocké dans une table temporaire nommée `currMV0` ou `currMV1` selon la valeur du paramètre `isPost`.
Copié !
proc sql;
create table currMV&isPost as
select scope, name, value as value_&isPost
from dictionary.macros
WHERE name NOT in ('HASPRIORMV', 'HASCURRMV')
%if &incl_autos=0 %then %do;
and scope^='AUTOMATIC'
%end;
order by scope, name;
quit;
1
PROC SQL;
2
create TABLE currMV&isPost as
3
select scope, name, value as value_&isPost
4
from dictionary.macros
5
WHERE name NOT in ('HASPRIORMV', 'HASCURRMV')
6
%IF &incl_autos=0 %THEN %DO;
7
and scope^='AUTOMATIC'
8
%END;
9
order BY scope, name;
10
QUIT;
11
4 Bloc de code
PROC SQL Data
Explication : Si `isPost` est vrai, ce bloc effectue la comparaison des variables. Si `newMVonly` est vrai, il utilise `EXCEPT` pour trouver les variables dans `currMV1` qui ne sont pas dans `currMV0`. Sinon, il utilise `UNION` pour combiner les variables des deux tables. Ensuite, il crée la table `MVchanges` en joignant les résultats (`keepMV`) avec les tables `currMV0` et `currMV1` pour afficher les valeurs précédentes et actuelles des variables.
Copié !
%if &isPost %then %do;
%if &newMVonly %then %do;
proc sql;
create table keepMV as
select scope, name from currMV1
EXCEPT
select scope, name from currMV0
order by scope, name;
quit;
%end;
%else %do;
proc sql;
create table keepMV as
select * from
(
select scope, name form currMV0
union
select scope, name from currMV1
)
order by scope, name;
quit;
%end;
proc sql;
create table MVchanges as
select a.scope, a.name, %if &newMVonly=0 %then mv0.value_0 length=75; mv1.value_1 length=75
from
keepMV A
%if &newMVonly=0 %then %do;
left join
currMV0 mv0
on a.scope=mv0.scope and a.name=mv0.name
%end;
left join
currMV1 mv1
on a.scope=mv1.scope and a.name=mv1.name
order by a.scope, a.name;
quit;
Explication : Affiche les changements détectés dans la table `MVchanges` avec un titre approprié, en fonction de l'option `newMVonly`. Finalement, supprime toutes les tables temporaires créées pendant l'exécution du macro (`currMV0`, `keepMV`, `MVchanges`) pour nettoyer l'espace de travail.
Copié !
title "changes to macro variables since last check %if &newMVonly %then -- SHOWING NEWLY CREATED MV ONLY;";
proc print data=MVchanges noobs width=min; run;
proc datasets lib=work memtype=data nolist nodetails; delete currMV0 keepMV MVchanges; run; quit;
%end;
%exitMV:
%MEND; *getMacVars();
1
title "changes to macro variables since last check %if &newMVonly %then -- SHOWING NEWLY CREATED MV ONLY;";
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Copyright J Smith, 24 Feb 2023
« Cette macro illustre parfaitement l'utilité des tables DICTIONARY (ou de la libname Sashelp) pour l'introspection du système.
Contrairement à un simple %PUT _ALL_, qui sature le journal (log) et rend l'analyse visuelle pénible, %getMacVars structure l'information sous forme de table. L'approche en deux phases (isPost 0/1) automatise la comparaison que le développeur devrait normalement faire manuellement. C'est un excellent exemple d'automatisation du suivi de session, permettant de garder une trace structurée de l'évolution de la table des symboles »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.