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.
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.