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