Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Occasional Contributor
Beiträge: 15
Globale Variable abfragen - nicht (!) innerhalb eines Makros

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

 

 

Trusted Advisor
Beiträge: 1.114
Re: Globale Variable abfragen - nicht (!) innerhalb eines Makros
[ Bearbeitet ]

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

Frequent Contributor
Beiträge: 108
Re: Globale Variable abfragen - nicht (!) innerhalb eines Makros
[ Bearbeitet ]

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 @FreelanceReinhard 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 ..."

Occasional Contributor
Beiträge: 8
Re: Globale Variable abfragen - nicht (!) innerhalb eines Makros

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!