El primer reflejo de muchos programadores es intentar usar las funcionalidades de macrovariables en tiempo de ejecución (run time) a través de CALL SYMPUT y SYMGET.
El código a menudo se ve así:
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;
¿Por qué esto no funciona? El resultado de este código no será el valor numérico (ej: 120), sino la propia cadena de caracteres (ej: "FIELD_AVG"). La función SYMGET recupera el contenido de la macrovariable tal cual (texto) y no lo interpreta como una referencia a una variable del dataset. Además, la gestión de las macrovariables durante la ejecución de un paso DATA es compleja porque no se actualizan línea por línea como se podría esperar para este tipo de operación.
La solución recomendada
Para resolver este problema de "resolución de cadena de caracteres a nombre de variable", es necesario abandonar la idea de una resolución dinámica por macro durante el paso DATA.
Existen dos enfoques principales:
1. Para un número reducido de variables: La condición explícita
Si solo tiene unas pocas columnas posibles (como en nuestro ejemplo), el método más simple y eficiente sigue siendo el uso de bloques condicionales (IF/THEN/ELSE o 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;
Puede utilizar los metadatos de la tabla para construir dinámicamente una instrucción SELECT o una serie de IF a través de una macro de preprocesamiento. Esto permite que el código sea genérico y adaptable, independientemente de la estructura de la tabla.
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.