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.
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.