Wert aus Tabelle als Parameter übergeben an Makro übergeben

Hallo,

besteht die Möglichkeit, einen Wert aus der Tabelle per Parameter an ein Makro zu übergeben.

/* Beispiel erstellen */
data work.test;
  
do Umsatz = 1 to 500 by 15;
    
output;
  
end;
  
format GrKl $20.;
run;

/* Beispiel Makro */
%macro Umsatzgroessenklasse(value);
  
%if &value <= 100 %then
    
"Kleiner hundert";
%mend Umsatzgroessenklasse;

/* Beispiel Ausführung */
data work.test;
  
set work.test;
  GrKl = %Umsatzgroessenklasse(Umsatz);
run;

So das das Makro wie eine Funktion einzusetzen wäre. Das könnte man dann ja für beliebige Dinge erstellen.
Bei dem Beispiel hier kommt allerdings folgende Fehlermeldung:

FEHLER 22-322: Syntaxfehler, erwartet wird eines der folgenden: ein Name, eine Zeichenkette in Hochkommata,
               eine numerische Konstante, eine Datetime-Konstante, ein fehlender Wert, INPUT,
PUT.  

Wenn so eine Möglichkeit nicht existiert, dann schreibe ich es klassisch (so wie ich es kenne - arbeite noch nicht so lange mit SAS):

data work.test;
  
set work.test;
  
if Umsatz < 100 then do;
    GrKl =
"Kleiner hundert";
  
end;
run;

Vielen Dank für Lösungsvorschläge oder komplett neue Ideen :).

Freundliche Grüße
Pascal

IFC

Wenn Sie folgenden Makro verwenden, erhalten Sie je nach Wert von Umsatz einen anderen Text. Ihr Lösungsansatz wurde in zweierlei Hinsicht verbessert: der Makro muss Data-Step-Code erzeugen (Sie hatten Makrocode verwendet) und der vom Makro zurückgegebene Code darf in Kombination mit dem den Makro aufrufenden Code keinen Syntaxfehler ergeben (Ihr Makro hätte eine IF-Anweisung im Rahmen einer Zuweisung erzeugt - GrKL = IF Umsatz ...;, was syntaktisch nicht korrekt ist).

%macro Umsatzgroessenklasse(value);
  ifc (&value <=
100, "< hundert", ">= hundert")
%mend Umsatzgroessenklasse;

Funktion IFC

Hallo Herr Mangold,
woher stammt die Funktion IFC?
Ich habe sie weder im SAS-Base von Version 8.2 noch im SAS-Base von Version 9.1.3 gefunden?
Gruß+Danke
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Funktion IFC in Dokumentation

Hallo Herr Kneilmann,

in der Online-Dokumentation finden Sie die Funktion unter folgendem Punkt:

Online-Dokumentation
BASE SAS
- SAS Language Reference: Dictionary
- Dictionary of Language Elements
- Functions and CALL Routines
- IFC Function / IFN Function

Gruß,
Pascal

Online-Doku

Steht im Language Dictionary von SAS 9.1.3, siehe hier.

Danke

Hallo
und Danke,
ich hatte "natürlich" nur in der Doku zu V8.2. gesucht, aber auch in einer SAS-V9.1.3-Session das ifc() ausprobiert.
Irgendetwas muß ich falsch gemacht haben, denn ich habe (glaube ich) irgendwelche Fehlermeldungen bekommen ....
Na ja, jetzt weiß ich wo's steht und ich habe ifc() erneut ausprobiert, jetzt klappt's.
Danke und Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Nachfrage

Hallo,

vielen Dank für Ihre schnelle Antwort. Wieder was dazugelernt. ifc kannte ich noch nicht.

Erzeugt er dabei nicht diesen Text?
"Kleiner hundert" mit %put.
Wäre im Dataset dann GrKl = "Kleiner hundert"
(Hatte eben keine Anführungszeichen)

%macro Umsatzgroessenklasse(value);
  
%if &value <= 100 %then
    
"Kleiner hundert";
%mend Umsatzgroessenklasse;

%put %Umsatzgroessenklasse(50);

Und dabei denke ich, dass er halt das Wort "Umsatz" welches ich als Parameter übergebe (siehe erster Beitrag), als Wort nimmt und nicht den Wert aus der Tabelle. Und besteht diese Möglichkeit? Ich hatte mal was von "call symput" gelesen?

Ansonsten:
Wie würde der Code aussehen, wenn noch mehr Möglichkeiten zur Verfügung stehen sollen.

Also folgendermaßen:

%macro Umsatzgroessenklasse(value);
  Zwischen
0 und 100 dann hundert.
  
Zwischen 101 und 200 dann zweihundert.
  
usw.
%mend Umsatzgroessenklasse;

Hoffe, ich habe mir verständlich ausgedrückt.