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.
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.