Publié le :

Suivi des changements de variables macro

En attente de validation
Attention : Ce code nécessite des droits administrateur.
Ce macro (`getMacVars`) est conçu pour suivre les changements dans les variables macro définies dans l'environnement SAS©. Il fonctionne en deux phases : lors de la première exécution (`isPost=0`), il enregistre l'état actuel des variables macro dans une table temporaire (`WORK.CURRMV0` ou `WORK.CURRMV1`). Lors d'une exécution subséquente (`isPost=1`), il compare l'état actuel avec l'état précédent. Des options permettent d'inclure ou non les variables automatiques (`incl_autos`) et de montrer uniquement les nouvelles variables créées depuis la dernière vérification (`newMVonly`). L'analyse utilise les tables de métadonnées SAS© (`dictionary.tables` et `dictionary.macros`) et des tables temporaires. Si le macro est exécuté pour la première fois avec `isPost=1` sans exécution préalable avec `isPost=0`, un message d'erreur est affiché. Les résultats sont présentés via `PROC PRINT` et les tables temporaires sont nettoyées à la fin.
Analyse des données

Type : INTERNE


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é !
1%macro getMacVars(incl_autos=0, isPost=0, newMVonly=1);
2 
3 PROC SQL noprint;
4 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é !
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;
3 %goto exitMV;
4 %END;
5 %IF &hasCurrMV=1 and &isPost=1 %THEN %DO;
6 PROC DATASETS lib=work memtype=DATA nolist nodetails;
7 DELETE currMV0;
8 CHANGE currMV1=currMV0;
9 RUN; QUIT;
10 %END;
11 
3 Bloc de code
PROC SQL Data
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é !
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é !
1 %IF &isPost %THEN %DO;
2 %IF &newMVonly %THEN %DO;
3 PROC SQL;
4 create TABLE keepMV as
5 select scope, name from currMV1
6 EXCEPT
7 select scope, name from currMV0
8 order BY scope, name;
9 QUIT;
10 %END;
11 %ELSE %DO;
12 PROC SQL;
13 create TABLE keepMV as
14 select * from
15 (
16 select scope, name form currMV0
17 union
18 select scope, name from currMV1
19 )
20 order BY scope, name;
21 QUIT;
22 %END;
23 
24 PROC SQL;
25 create TABLE MVchanges as
26 select a.scope, a.name, %IF &newMVonly=0 %THEN mv0.value_0 LENGTH=75; mv1.value_1 LENGTH=75
27 from
28 keepMV A
29 %IF &newMVonly=0 %THEN %DO;
30 left join
31 currMV0 mv0
32 on a.scope=mv0.scope and a.name=mv0.name
33 %END;
34 left join
35 currMV1 mv1
36 on a.scope=mv1.scope and a.name=mv1.name
37 order BY a.scope, a.name;
38 QUIT;
39 
5 Bloc de code
PROC PRINT
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é !
1 title "changes to macro variables since last check %if &newMVonly %then -- SHOWING NEWLY CREATED MV ONLY;";
2 PROC PRINT DATA=MVchanges noobs width=min; RUN;
3 
4 PROC DATASETS lib=work memtype=DATA nolist nodetails; delete currMV0 keepMV MVchanges; RUN; QUIT;
5 %END;
6 
7 %exitMV:
8 
9%MEND; *getMacVars();
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


Banner
Le Conseil de l'Expert
Expert
Stéphanie
Spécialiste Machine Learning et IA.
« 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 »