Logique Macro conditionnelle : Mettez un vrai cerveau dans votre code

Cet article en deux mots :

Plongez dans le cerveau de Skynet pour dompter la logique conditionnelle et itérative du langage Macro SAS. Entre l'usage obligatoire de l'enveloppe %MACRO et les subtilités mathématiques des fonctions %EVAL et %SYSEVALF, découvrez comment automatiser la génération de code comme un expert.

Jusqu'ici, Skynet a appris à stocker des paramètres (%LET) et à lire des données à la volée (CALL SYMPUTX). C'est génial, mais ça manque cruellement de libre arbitre. Que se passe-t-il si Skynet doit exécuter un programme différent selon que la cible est protégée ou non ? Ou s'il doit déployer 5 Terminators d'affilée en boucle ?

Pour la certification SAS 9 Advanced, vous devez maîtriser la logique conditionnelle Macro (%IF-%THEN) et les boucles (%DO). Mais attention, le monde Macro a ses propres règles mathématiques, et elles peuvent vite rendre fou un développeur humain.

1. La règle d'or : Il vous faut une enveloppe Macro

C'est le piège numéro 1 de l'examen. Vous ne pouvez pas écrire un %IF n'importe où au milieu de votre programme SAS. La logique Macro conditionnelle (tout ce qui commence par un % comme %IF, %THEN, %DO) doit obligatoirement se trouver à l'intérieur d'une définition de Macro (entre %MACRO et %MEND).

Créons la première routine de décision de Skynet :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Définition de notre Macro avec un paramètre */
%macro Deploiement_Tactique(Menace);

/* Si la menace est critique, on sort l'artillerie lourde */
%if &Menace = CRITIQUE %then %do;
%put ALERTE MAXIMALE : Déploiement d'un T-1000 !;
proc sql;
select * from work.arsenal where Puissance > 90;
quit;
%end;

/* Sinon, on envoie le modèle standard */
%else %do;
%put Menace mineure : Déploiement d'
un T-800.;
%end;

%mend;

/* Appel de la macro */
%Deploiement_Tactique(CRITIQUE)

Pourquoi c'est puissant ? Contrairement à un IF dans une étape DATA qui s'exécute pour chaque ligne du tableau, le %IF s'exécute avant même que le code ne tourne. Si la menace n'est pas critique, le bloc contenant la PROC SQL ne sera même pas envoyé au processeur SAS. C'est comme s'il n'avait jamais été écrit. Skynet génère du code sur mesure.

2. Le clonage : Les boucles %DO

Skynet doit envoyer trois unités dans le passé, respectivement en 1984, 1991 et 2004. Au lieu d'écrire trois fois le même code de déploiement, nous allons utiliser une boucle %DO itérative.

1
2
3
4
5
6
7
8
9
10
11
%macro Assaut_Temporel;

/* Boucle de 1 à 3 */
%do i = 1 %to 3;
%put Génération du rapport de mission numéro &i... ;
/* Imaginez ici une PROC PRINT ou une étape DATA complexe */
%end;

%mend;

%Assaut_Temporel

Astuce Certification : Dans une boucle %DO i = 1 %to 3, la variable i devient automatiquement une variable Macro locale (nous parlerons des portées de 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. dans le prochain article). Vous pouvez l'utiliser avec &i.

3. Les Mathématiques selon Skynet : Le piège textuel

C'est ici que les développeurs SAS s'arrachent les cheveux le jour de l'examen. Rappelez-vous l'Article 6 : Dans le monde Macro, TOUT est texte.

Regardez ce code :

1
2
3
4
5
%let T_Actuels = 10;
%let Nouveaux_T = 5;
%let Total = &T_Actuels + &Nouveaux_T;

%put Le total est de &Total terminators.;

Que va afficher la log ? Le total est de 15 terminators ? FAUX ! La log affichera : Le total est de 10 + 5 terminators.

Le processeur Macro n'est pas une calculatrice, c'est une machine à écrire. Il a vu "10", un "+", et un "5", et il a bêtement recopié le texte.

Pour forcer Skynet à faire des mathématiques, vous devez utiliser la fonction %EVAL :

1
2
%let Total_Calcule = %eval(&T_Actuels + &Nouveaux_T);
%put Le total est de &Total_Calcule terminators.; /* Affiche bien 15 ! */

4. Les virgules flottantes : L'appel de %SYSEVALF

Vous pensiez que %EVAL allait résoudre tous vos problèmes ? Essayez de lui faire calculer des nombres à virgule. Skynet calcule le taux de réussite d'une mission :

1
%let Taux = %eval(99.9 / 2); /* ERREUR ! */

Crash système ! %EVAL ne sait faire que des calculs sur des nombres entiers. Dès qu'il voit un point décimal, il panique et renvoie une erreur textuelle.

Pour calculer des nombres décimaux, vous devez invoquer le grand frère : %SYSEVALF.

1
2
%let Taux_Reel = %sysevalf(99.9 / 2);
%put Taux de réussite : &Taux_Reel %; /* Affiche 49.95 % */

Le récap' pour l'examen 🎓

Si vous ne deviez retenir que trois choses pour la certification :

  1. %IF-%THEN s'utilise exclusivement à l'intérieur d'une %MACRO.
  2. %EVAL sert à évaluer des expressions mathématiques et logiques avec des nombres entiers.
  3. %SYSEVALF sert à évaluer des expressions avec des nombres décimaux (flottants).

Conclusion

Skynet a maintenant un cerveau. Il peut analyser 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., prendre des décisions structurelles sur le code à générer, exécuter des tâches en boucle et même résoudre des équations au vol.

Cependant, à force de 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. macro dans tous les sens, la mémoireGemini said
Espace de stockage temporaire (RAM) utilisé par le moteur CAS pour charger et traiter les données à haute vitesse, minimisant les accès disque pour optimiser les performances de SAS Viya.
de Skynet risque de saturer. Dans l'Article 9, nous aborderons un concept crucial et potentiellement désastreux si mal maîtrisé : la portée 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. (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. Globales vs Locales). Ne confondez jamais l'environnement de test avec la production !

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.