Publié le :
Macro SASHELP

Vérification d'existence de variable macro avec portée

Ce code est également disponible en : Deutsch English Español
Cette macro, nommée `mvartest`, étend la fonctionnalité de la fonction macro `%SYMEXIST()` de SAS©. Elle permet de déterminer si une variable macro existe, non seulement par son nom, mais aussi au sein d'une portée macro spécifique. Les paramètres d'entrée sont `mvar` (le nom de la variable macro à vérifier) et `scope` (la portée macro optionnelle dans laquelle effectuer la recherche). La macro construit dynamiquement une clause WHERE pour interroger la vue système `sashelp.vmacro`. Elle retourne la valeur `1` si la variable macro est trouvée dans la portée spécifiée (ou globalement si aucune portée n'est fournie), et `0` sinon.
Analyse des données

Type : SASHELP


La macro interroge exclusivement la vue système `sashelp.vmacro`, qui contient des métadonnées sur toutes les variables macros existantes dans la session SAS. Aucune autre source de données externe n'est utilisée ni créée.

1 Bloc de code
Logique macro (construction de clause WHERE)
Explication :
Ce premier bloc initialise trois variables macro locales : `dsid` (pour l'identifiant du jeu de données), `rc` (pour le code de retour) et `where` (pour la clause de filtrage). Il construit ensuite la clause `WHERE` qui sera utilisée pour interroger la vue `sashelp.vmacro`. Si le paramètre `scope` est fourni, la recherche est limitée à la portée spécifiée, convertie en majuscules. Sinon, la recherche exclut la portée de la macro actuelle (`&sysmacroname`). Enfin, la clause `WHERE` est complétée pour inclure le nom de la variable macro à rechercher (`&mvar`), également converti en majuscules.
Copié !
1%local dsid rc where;
2 
3%IF %LENGTH(&scope) %THEN %let where=scope=%upcase("&scope");
4%ELSE %let where=scope ^= "&sysmacroname" ;
5%let where=name=%upcase("&mvar") and &where;
2 Bloc de code
Fonctionnalités macro d'accès aux données
Explication :
Ce second bloc exécute la logique de vérification. Il utilise la fonction `%sysfunc(open())` pour ouvrir la vue système `sashelp.vmacro` en y appliquant la clause `WHERE` définie précédemment. Si l'ouverture du jeu de données est réussie (c'est-à-dire que `&dsid` n'est pas nul), la macro tente de récupérer un enregistrement à l'aide de `%sysfunc(fetch(&dsid))`. Si un enregistrement est trouvé (indiqué par un code de retour différent de -1), cela signifie que la variable macro existe dans la portée recherchée. Le jeu de données est ensuite fermé avec `%sysfunc(close(&dsid))`. La macro retourne `1` si la variable macro est trouvée et `0` sinon.
Copié !
1%let dsid = %sysfunc(open(sashelp.vmacro(where=(&where))));
2%IF (&dsid) %THEN %DO;
3 %eval(%sysfunc(fetch(&dsid)) ^= -1)
4 %let rc = %sysfunc(close(&dsid));
5%END;
6%ELSE 0;
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.