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.
The codes and examples provided on WeAreCAS.eu are for educational purposes. It is imperative not to blindly copy-paste them into your production environments. The best approach is to understand the logic before applying it. We strongly recommend testing these scripts in a test environment (Sandbox/Dev). WeAreCAS accepts no responsibility for any impact or data loss on your systems.
SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. WeAreCAS is an independent community site and is not affiliated with SAS Institute Inc.
This site uses technical and analytical cookies to improve your experience.
Read more.