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.
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.