Standardisez vos développements SAS : Créez automatiquement vos macros et fichiers de tests

Ce code est également disponible en : Deutsch English Español Français
Niveau de difficulté
Débutant
Publié le :
Simon

Le Conseil de l'Expert

Simon
Expert SAS et fondateur.

Plutôt que de s'appuyer sur des commandes système externes (X commands), %newmacro utilise le langage SAS natif pour écrire dynamiquement les fichiers .sas. La gestion des variables globales (g_curr) et la vérification préalable de l'existence des fichiers (fileexist) en font un outil sûr, qui évite l'écrasement accidentel du travail existant tout en garantissant un formatage uniforme des métadonnées (auteur, version)."

La macro 'newmacro' prend un nom de macro ('name') et un ID source optionnel ('srcid'). Elle vérifie l'existence de 'srcid' ou utilise une variable globale 'g_curr'. Elle utilise ensuite les macros '%canonicalname' et '%getpath' pour déterminer les chemins des fichiers de macro et de test. Si les fichiers n'existent pas, elle crée les fichiers avec un contenu boilerplate (copyright, author, date, time), incluant un espace réservé pour le code de la macro et des assertions de test basiques, en utilisant des étapes DATA _NULL_ pour écrire dans les fichiers.
Analyse des données

Type : SASHELP


Ce script ne traite pas directement de données. Il s'appuie sur des fonctions SAS internes pour la date/heure et la gestion de fichiers (comme 'date()', 'year()', 'put()', 'fileexist()', 'symexist()'). Il utilise également des macros externes ('%canonicalname', '%getpath') qui peuvent être considérées comme des dépendances, mais pas comme des sources de données externes non gérées.

1 Bloc de code
MACRO
Explication :
Ce bloc définit la macro '%newmacro' qui génère un nouveau fichier macro SAS et un fichier de test associé. Elle utilise les macros '%canonicalname' et '%getpath' pour normaliser le nom de la macro et déterminer le chemin du fichier de sortie. Elle écrit des informations de copyright et des commentaires standards, puis le code boilerplate pour la macro et les tests dans les fichiers spécifiés. L'utilisation de DATA _NULL_ permet d'écrire directement dans des fichiers.
Copié !
1%macro newmacro(name, srcid=);
2 %IF "&srcid."="" %THEN
3 %DO;
4 
5 %IF not %symexist(g_curr) %THEN
6 %DO;
7 %put ERROR: SOURCE Folder not specified!;
8 %return;
9 %END;
10 %ELSE
11 %DO;
12 %let srcid=&g_curr;
13 %END;
14 %END;
15 %local fname;
16 %let fname=%canonicalname(&name.);
17 
18 %IF "&fname."="" %THEN
19 %DO;
20 %put ERROR: Specified macro name <&name.> is invalid!;
21 %return;
22 %END;
23 %local path;
24 %let path=%getpath(&fname., srcid=&srcid.);
25 
26 %IF "&path"="" %THEN
27 %DO;
28 %put ERROR: SOURCE Folder not specified!;
29 %goto testfile;
30 %END;
31 %ELSE %IF %sysfunc(fileexist(&path.)) %THEN
32 %DO;
33 %put NOTE: Macro<&fname.> has already existed!;
34 %goto testfile;
35 %END;
36
37 %local author;
38 %let author=Daniel YU;
39 
40 DATA _null_;
41 file "&path.";
42 year=put(year(date()), 4.);
43 date=put(date(), yymmdd10.);
44 time=put(time(), tod8.);
45 put '/*************************************************';
46 put '* Copyright(c) ' year 'coco, All Rights Reserved.';
47 put "* @html/SAS Help Center_ isAuthorized Action.html &author.";
48 put '* @since ' date time;
49 put '* @code_sas_json_prod_multi/dsc_cdm_version_update_de.json 1.0';
50 put "* ";
51 put '*************************************************/';
52 put ' ';
53 put '%macro ' "&fname.();";
54 put ' %* Please write code here;;';
55 put '%mend;';
56 stop;
57 RUN;
58 
59%testfile:
60 %let path=%getpath(&fname., suffix=_test, srcid=&srcid.);
61 
62 %IF "&path"="" %THEN
63 %DO;
64 %put ERROR: SOURCE Folder not specified!;
65 %return;
66 %END;
67 %ELSE %IF %sysfunc(fileexist(&path.)) %THEN
68 %DO;
69 %put NOTE: Macro<&fname.> test has already existed!;
70 %return;
71 %END;
72 
73 DATA _null_;
74 file "&path.";
75 put "%*Please write test code here;;";
76 put '%*%asserteq( ,%' "&fname.());";
77 put '%*%assertne( ,%' "&fname.());";
78 put '%*%assertref( );';
79 RUN;
80 
81%mend;
L'Astuce Pro
Utilisez l'instruction %abort cancel au lieu de %return pour interrompre la macro en cas d'erreur fatale (comme un dossier source manquant) : cela permet non seulement d'arrêter l'exécution de la macro, mais aussi de stopper immédiatement la soumission du reste du programme SAS, évitant ainsi l'exécution en cascade d'étapes DATA ou procédures basées sur un fichier qui n'a pas pu être créé.
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(c) 2015 coco, All Rights Reserved.