L'automatisation est au cœur de la programmation SAS©. Un scénario classique consiste à vérifier le contenu d'une table avant de lancer un traitement : "Si ma table contient des données, lance le rapport standard, sinon lance un rapport d'anomalie."
Bien que la logique semble simple, sa mise en œuvre via le langage macro peut se heurter à deux obstacles majeurs : la portée des variables et le comportement trompeur de certaines variables automatiques comme SQLOBS.
Le Problème : Pourquoi mon code ne voit-il pas l'erreur ?
Imaginons un code structuré en deux macros :
%Check_Data: Vérifie les données et crée un indicateur&error.%Run_Report: Lit&erroret décide quel rapport imprimer.
L'erreur fréquente est de définir la variable &error à l'intérieur de la première macro sans précaution.
1. Le piège de la portée (Scope)
Par défaut, une macro-variable créée à l'intérieur d'une macro (via %LET) est locale. Elle n'existe que le temps de l'exécution de cette macro.
Dès que %Check_Data se termine, la variable &error est détruite. Lorsque %Run_Report tente de lire &error, elle ne trouve rien, et le programme plante (erreur "Apparent symbolic reference not resolved").
La Solution : Il faut déclarer la variable comme globale au début du programme ou avant son utilisation :