Le premier réflexe de nombreux programmeurs est de tenter d'utiliser les fonctionnalités de macro-variable au moment de l'exécution (run time) via CALL SYMPUT et SYMGET.
Le code ressemble souvent à ceci :
DATA target_ds;
SET source_ds;
/* Tentative d'assigner le nom de la variable à une macro */
CALL SYMPUT('field_val', req_stat);
/* Tentative de récupérer la valeur */
field_stat = SYMGET('field_val');
RUN;
1
DATA target_ds;
2
SET source_ds;
3
/* Tentative d'assigner le nom de la variable à une macro */
4
CALL SYMPUT('field_val', req_stat);
5
/* Tentative de récupérer la valeur */
6
field_stat = SYMGET('field_val');
7
RUN;
Pourquoi cela ne fonctionne pas ? Le résultat de ce code ne sera pas la valeur numérique (ex: 120), mais la chaîne de caractères elle-même (ex: "FIELD_AVG"). La fonction SYMGET récupère le contenu de la macro-variable tel quel (du texte) et ne l'interprète pas comme une référence à une variable du dataset. De plus, la gestion des macro-variables pendant l'exécution d'une étape DATA est complexe car elles ne se mettent pas à jour ligne par ligne comme on pourrait l'espérer pour ce type d'opération.
La solution recommandée
Pour résoudre ce problème de "résolution de chaîne de caractères en nom de variable", il faut abandonner l'idée d'une résolution dynamique par macro pendant l'étape DATA.
Deux approches principales existent :
1. Pour un petit nombre de variables : La condition explicite
Si vous n'avez que quelques colonnes possibles (comme dans notre exemple), la méthode la plus simple et la plus performante reste l'utilisation de blocs conditionnels (IF/THEN/ELSE ou SELECT).
DATA target_ds;
SET source_ds;
SELECT (req_stat);
WHEN ('FIELD_AVG') field_stat = field_avg;
WHEN ('FIELD_SUM') field_stat = field_sum;
OTHERWISE field_stat = .;
END;
RUN;
Vous pouvez utiliser les métadonnées de la table pour construire dynamiquement une instruction SELECT ou une série de IF via une macro de pré-traitement. Cela permet de rendre le code générique et adaptable quelle que soit la structure de la table.
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.