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