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