Dans l'article précédent, nous avons appris à Skynet comment utiliser des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Macro avec l'instruction %LET. C'était un bon début pour centraliser les paramètres, mais il y a un problème majeur : Skynet doit encore taper ses %LET à la main avant de lancer le programme. Pour une Intelligence Artificielle censée surpasser l'humanité, ça fait un peu désordre.
Le véritable pouvoir de l'automatisation, c'est de laisser SAS lire les données d'une table et créer les variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. Macro lui-même, en plein milieu de l'exécution du programme.
Aujourd'hui, pour votre préparation à la certification SAS 9 Advanced, nous allons voir les deux armes absolues pour créer des variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. dynamiques : CALL SYMPUTX (dans l'étape DATA) et la clause INTO (dans la PROC SQL).
Créons d'abord notre table cible, répertoriant les menaces de la résistance humaine :
2
3
4
5
6
7
8
9
10
11
12
data work.resistance;
length Nom $20 Niveau_Menace 8;
infile datalines dlm=',';
input Nom $ Niveau_Menace;
datalines;
Sarah Connor,9
John Connor,10
Kyle Reese,7
Marcus Wright,8
;
run;
1. Le problème de l'espace-temps (Compilation vs Exécution)
Avant de coder, vous devez comprendre la Matrice. En SAS, un programme se déroule en deux grandes phases temporelles :
- La Compilation (Le monde Macro) : Le processeur lit le code, résout les
&, exécute les instructions qui commencent par un%(comme%LET), et prépare le terrain. - L'Exécution (Le monde DATA/SQL) : SAS traite les données ligne par ligne.
C'est pour cela que vous ne pouvez pas mettre un %LET classique au milieu d'une condition IF dans une étape DATA. Le processeur Macro l'aura déjà exécuté bien avant que l'étape DATA ne commence à lire la première ligne ! Il nous faut donc un pont entre ces deux mondes.
2. Le Pont n°1 : CALL SYMPUTX (Étape DATA)
Pour dire à l'étape DATA : "Hé, prends la valeur de cette variable SAS, et envoie-la dans le monde Macro", on utilise la routine CALL SYMPUTX.
Imaginons que Skynet veuille créer une variable Macro contenant le nom de la cible dont le niveau de menace est de 10.
2
3
4
5
6
7
8
9
10
set work.resistance;
if Niveau_Menace = 10 then do;
/* Création dynamique de la variable macro */
call symputx('CiblePrioritaire', Nom);
end;
run;
/* Vérifions que ça a marché ! */
%put Alerte Rouge, la cible est : &CiblePrioritaire;
Décryptage pour l'examen :
data _null_: C'est une étape DATA qui lit des données, fait des calculs, mais ne crée pas de table en sortie. Parfait pour juste créer des macros variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage. sans polluer le disque dur de Skynet.call symputx(Argument_1, Argument_2):- Argument_1 : Le nom de la future variable macro, entre guillemets (ou le nom d'une variable SAS contenant ce nom).
- Argument_2 : La valeur à y insérer (ici, la variable SAS
Nom).
Le conseil Certification 🎓 : SYMPUT vs SYMPUTX L'examen vous testera impitoyablement sur la différence entre les deux.
CALL SYMPUT(l'ancienne méthode) prend la valeur brute. S'il y a des espaces vides à droite ou à gauche du nom "John Connor ", il les garde. Et s'il s'agit d'un nombre, il écrit une note d'avertissement dans la log lors de la conversion numérique vers texte.CALL SYMPUTX(la version moderne, le "X" signifiant eXtended) supprime automatiquement les espaces de début et de fin, et convertit les nombres en texte en silence, sans polluer votre log. Utilisez toujours SYMPUTX en production.
3. Le Pont n°2 : La clause INTO (PROC SQL)
Si vous êtes plutôt de la Team SQL (comme vu dans nos premiers articles), il existe une méthode encore plus élégante et puissante : la clause INTO.
Reprenons notre mission : trouver la cible au niveau de menace 10.
2
3
4
5
6
7
8
select Nom
into :CiblePrioritaire
from work.resistance
where Niveau_Menace = 10;
quit;
%put La cible SQL est : &CiblePrioritaire;
Remarquez les détails vitaux :
- L'option
noprint: Demande à la PROC SQL de travailler dans l'ombre et de ne rien afficher dans la fenêtre de résultats. - Les deux points
:: Dans la clauseINTO, le nom de la variable macro doit toujours être précédé de:. (Une erreur classique le jour J !).
4. L'arme fatale : Créer une liste de valeurs avec INTO
C'est ici que le SQL écrase l'étape DATA. Skynet ne veut plus une seule cible, il veut neutraliser toutes les cibles dont la menace est supérieure à 7, et stocker leurs noms dans une seule variable macro, séparés par des virgules.
En étape DATA, ce serait un casse-tête de concaténation. En SQL, c'est natif avec le mot-clé SEPARATED BY :
2
3
4
5
6
7
8
9
select Nom
into :ListeCibles separated by ', '
from work.resistance
where Niveau_Menace > 7;
quit;
%put Cibles à éliminer : &ListeCibles;
/* Affiche : Cibles à éliminer : Sarah Connor, John Connor, Marcus Wright */
Et voilà ! Vous venez de créer une chaîne de caractères parfaitement formatée, prête à être réutilisée plus tard dans une clause WHERE Nom IN (&ListeCibles). L'automatisation ultime.
Conclusion
Vous maîtrisez maintenant le voyage dans le temps entre l'exécution et la compilation. Avec CALL SYMPUTX et la clause INTO, vos programmes ne sont plus figés : ils s'adaptent, s'auto-alimentent et évoluent en fonction des données qu'ils rencontrent.
Dans l'Article 8, nous donnerons à Skynet un véritable cerveau analytique. Nous verrons comment utiliser la logique conditionnelle Macro (%IF-%THEN, %DO) pour que votre code prenne des décisions structurelles tout seul.






