Der erste Reflex vieler Programmierer ist der Versuch, Makrovariablen-Funktionalitäten zur Laufzeit (run time) über CALL SYMPUT und SYMGET zu verwenden.
Der Code sieht oft so aus:
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;
Warum funktioniert das nicht? Das Ergebnis dieses Codes wird nicht der numerische Wert (z.B. 120) sein, sondern die Zeichenfolge selbst (z.B. "FIELD_AVG"). Die Funktion SYMGET ruft den Inhalt der Makrovariablen unverändert (als Text) ab und interpretiert ihn nicht als Referenz auf eine Variable im Datensatz. Darüber hinaus ist die Verwaltung von Makrovariablen während der Ausführung eines DATA-Schritts komplex, da sie sich nicht Zeile für Zeile aktualisieren, wie man es für diese Art von Operation erwarten würde.
Die empfohlene Lösung
Um dieses Problem der "Auflösung einer Zeichenfolge in einen Variablennamen" zu lösen, muss man die Idee einer dynamischen Makroauflösung während des DATA-Schritts aufgeben.
Es gibt zwei Hauptansätze:
1. Für eine kleine Anzahl von Variablen: Die explizite Bedingung
Wenn Sie nur wenige mögliche Spalten haben (wie in unserem Beispiel), ist die einfachste und effizienteste Methode die Verwendung von bedingten Blöcken (IF/THEN/ELSE oder 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;
Sie können die Metadaten der Tabelle verwenden, um dynamisch eine SELECT-Anweisung oder eine Reihe von IF-Anweisungen über ein Vorverarbeitungs-Makro zu erstellen. Dadurch wird der Code generisch und anpassbar, unabhängig von der Tabellenstruktur.
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.