LesezeichenAbonnierenRSS-Feed abonnieren
wmueller
Fluorite | Level 6

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

 

 

3 ANTWORTEN 3
FreelanceReinh
Jade | Level 19

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

mfab
Quartz | Level 8

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

CKothenschulte
Obsidian | Level 7

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!

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 3 Antworten
  • 1245 Aufrufe
  • 3 Kudos
  • 4 in Unterhaltung