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.
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.