Hallo zusammen,
ich würde gerne mittels eines "globalen Schalters" einen Ablauf innerhalb eines Data-Schritts steuern.
Den Data-Schritt möchte ich nicht extra in ein Makro packen.
Meine Vorstellung ist:
---------------------8<----------------------------
* Globale Variable;
%let flag = 'ja';
* Aufbereitungsschritt;
data aufbereitet;
set rohdaten;
if &flag. eq 'ja' then vorhandene_numvar = 2*vorhandene_numvar;
run;
--------------------->8----------------------------
Was aber mangels einer Makro-Umgebung für den Data-Schritt nicht geht.
Gibt es hier Möglichkeiten?
Beste Grüße
Wolfgang Müller
Hallo, Herr Müller,
ich würde die Anführungszeichen in der Makrovariablendefinition weglassen und dafür doppelte Anführungszeichen um die Makrovariablenreferenz im "Data-Schritt" einfügen.
Beispiel:
%let flag = ja;
data _null_;
if "&flag"='ja' then put 'OK';
run;
Edit: Wie @mfab richtigerweise angemerkt hat, funktioniert Ihr Code auch ohne Änderung. Falls die Makrovariable aber vielleicht doch einmal in einem Makro zum Einsatz kommt, könnten die Anführungszeichen im Variablenwert lästig sein: Bei %IF-Abfragen müsste man darauf achten, die richtigen Anführungszeichen zu verwenden (%if &flag="ja" ... würde nicht funktionieren), %length(&flag)=4 und erst recht %sysfunc(length(&flag))=4 wären kontraintuitiv, ...
Hallo Herr Müller,
ich sehe da kein Problem.
Was genau funktioniert denn bei Ihnen in diesem Ablauf nicht?
Viele Grüße
Michael
Edit: Anmerkung
Wie @FreelanceReinh schon angemerkt hat, kann das mit den Anführungszeichen zu Verwirrung führen.
%let flag = 'irgendwas'; speichert auch die Hochkommas in der Macro-Variablen.
Andererseits führt ein
data ergebnis;
set eingang;
if &flag. eq irgendwas [...]
run;
dazu, dass im Data Step (Program Data Vector) eine neue Variable mit Namen irgendwas angelegt wird.
Daher bietet es sich vielleicht an, das Ganze mit einem "Pseudo-Boolean" abzufangen:
%let flag = 1;
data ergebnis;
set eingang;
if &flag. then a = 2*a;
run;
Achtung: Die Variable flag ist und bleibt ein String, allerdings kann SAS damit umgehen und die Abfrage "if 1 then .." ist wahr, "if 0 then..." wäre falsch.
Wenn man dann die Variable umbenennt wird das recht einfach lesbar, z.B. "if &flag_gesetzt. then ..."
Hallo Herr Müller,
vielleicht hilft Ihnen SYMGET():
* Globale Variable;
%let flag = 'ja';
* Aufbereitungsschritt;
data aufbereitet;
set rohdaten;
flag = symget('flag');
if flag eq "'ja'" then vorhandene_numvar = 2*vorhandene_numvar;
run;
Viel Erfolg!
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.