Macro erzeugt Dateifilter

Ein Macro bearbeitet die Datei Basis und gibt den Namen einer Variablen Var1 mit den Ausprägungen 0 und 1 aus. Jetzt soll das gleiche Macro für Var1=0 erneut laufen. Daraufhin gibt es Var2 mit den Ausprägungen 0 und 1 aus und soll dann für Var1=0 und Var2=0 erneut laufen usw.

In der Datei basis soll also ein Filter gesetzt werden, der abhängig von Ausgabe des Macros ist.

Ich kriegs nicht hin und wäre froh über Hilfe.

Vilen Dank im Vorraus!

VG SAS-Fidi

Hallo SAS-Fidi, ich hätte

Hallo SAS-Fidi,

ich hätte hier ein sinnleeres, aber laufendes, Beispiel. Es werden auf eine Variable solange Zufallswerte aufaddiert, bis alle Ausprägungen der Variable ungerade sind. Die Variablen werden vorher auf ganze Zahlen gerundet.

/*
Basis wird solange durchgenudelt
bis die Summe aller Filtervariablen, die vorher definiert wurden
ungleich 0 ist oder die maximale Rundenzahl erreicht ist
benutzt Variable Var zur Berechnung
*/
%MACRO Filter(Basis,Out,Prefix, Var, max=0);
%LOCAL ENDE I;
%LET I = 0;
%LET ENDE = 0;
data &Out;
set &BASIS.;
run;
%DO %WHILE (NOT &ENDE. );
%LET I = %EVAL(&I. + 1);
%PUT ROUND &I.;
data &OUT.;
drop zaehler;
set &OUT. end = Ende;
%IF &I. > 1 %THEN %DO;
if sum(of &PREFIX.1- &PREFIX.%EVAL(&I. - 1)) = 0 then do;
&VAR. = &VAR. + floor(ranuni(0) * 5);
%END;
%ELSE %DO;
&VAR. = round(&VAR., 1);
%END;
&PREFIX.&I. = %Berech(&VAR.);
IF &PREFIX.&I. = 0 then Zaehler + 1;
%IF &I. > 1 %THEN %DO;
end;
%END;

if Ende and (Zaehler = 0) then call symput ("Ende","1");
run;
%IF &MAX. > 0 AND &ENDE. = 0 %THEN %LET ENDE = %EVAL(&I. GE &MAX.);
%END;
%MEND Filter;

/* Macro zur Berechnung eines 0/1 Wertes*/
%MACRO Berech(Var1);
mod(&VAR1., 2)
%MEND Berech;

options nomprint nomlogic nonotes;
%Filter(Sashelp.Class, Class, Filter,weight, max=10);
options Notes;

Schöne Grüße

Jan

Hm, ich hab hier ein

Hm,

ich hab hier ein Beispiel, das zwar wiedermal nicht schön ist, aber zeigt, was ich meine:

data test;
a=1;
b=0;
run;

%macro versuch(datei);
%let filter=if B=0 then c=3;
data malsehen;
set &datei;
&filter;
run;
%mend;

%versuch(test);

proc print;run;

Das Programm, das ich hier habe, ist zwar komplizierter, aber es soll letztlich das gleiche tun.

Die Variable filter wird dort so definiert:

%let drüber=%sysfunc(round((&i./2),1));
%let dot_1=node&eb.&drüber;
%if %sysfunc(mod(&drüber.,2)=1) %then %let filter=%sysfunc(&filter||&dot_1||=1);/*wenn ungerade*/
%if %sysfunc(mod(&drüber.,2)=1) %then %let filter=%sysfunc(&filter||&dot_1||=2);/*wenn gerade*/

(wobei &eb und &i Zählvariablen in den übergeordneten Schleifen sind.)

Wenn ich dann weiter unten auf &filter zugreifen will, ist diese Variable nicht definiert. Warum?

VG SAS-Fidi

Lokal und Global

Hallo,
könnte das Problem mit global bzw. lokal zusammenhängen?
Wenn die Macro-Variable filter irgendwo oben definiert wurde ... könnte das irgendwo auch ein anderer Macro sein???
Dann muß die Macro-Variable filter als globale Macro-Variable definiert sein! Dazu gibt es mehrere Möglichkeiten.

Eine ist, die Macro-Variable filter ausserhalb einer Macro-Definition zu definieren bzw. zu initialisieren.

Die andere Möglichkeit ist, sie mit %global filter; global zu machen. In diesem Fall darf sie aber nicht zuvor lokal gemacht worden sein ....

Für genauere Tipps fehlt (mir) eine komplettes vollständiges Beispiel!

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Die Variable Filter wird in

Die Variable Filter wird in der gleichen Schleife als global definiert.

Ein vollständiges Beispiel ist da schwierig, denn es ist noch in der Mache und ohne Zusammenhang schwierig ztu verstehen.

So sieht es bisher aus:

%macro ebene(datei,varlist1=,ebene=,maxziel=);
%let string00=;
%let anzdot=%eval(&ebene**2);
%let eb_1=%eval(&ebene-1);
%do i=1 %to &anzdot;
%do eb=&eb_1 %to 1 %by -1;
%global filter;
%let filter =;
%let drüber=%sysfunc(round((&i./2),1));
%global dot_1;
%let dot_1=node&eb.&drüber;
%if %sysfunc(mod(&drüber.,2)=1) %then %let filter=%sysfunc(&filter||&dot_1||=1);/*ungerade*/
%if %sysfunc(mod(&drüber.,2)=1) %then %let filter=%sysfunc(&filter||&dot_1||=2);/*gerade*/
%end;

%let liste=&varlist1;
%local pattern;
%local regtext;
%Let raus=%str(s/ string&eb_1.&dot_1. / /);
%let Pattern = %sysfunc(prxparse(&Raus.));
%IF &Pattern. NE . %THEN %DO; %sysfunc(prxchange(&Pattern.,1,%str(&liste.))); %END;

data start;
set basis;
/*&filter;*/ /*<*******************************************************************************************/
run;
%einzel(baum,drpscale2,varlist1=&liste,max=&maxziel,ebene=&ebene,cut=&i);
%end;
%mend;

%ebene(start,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=1,maxziel=2);

Wie gesagt, ist es noch sehr unfertig.

VG SAS-Fidi

&Filter wird niemals definiert

Hallo SAS-Fidi,

in deinem Beispiel wird Filter niemals definiert, für Ebene < 2. In deinem Macro wird die globale Variable Filter in der inneren Schleife definiert. Du rufst das Macro mit dem Wert Ebene = 1 auf. Dies führt in der inneren Schleife zu dem Ausdruck
%DO EB = 0 %TO 1 %BY -1;
Dies führt dazu, dass die innere Schleife niemals ausgeführt wird, also wird auch keine globale Variable Filter definiert.

%macro ebene(datei,varlist1=,ebene=,maxziel=);
%let anzdot=%eval(&ebene.**2);
%let eb_1=%eval(&ebene.-1);
%do i=1 %to &anzdot;
%do eb=&eb_1 %to 1 %by -1;
%PUT Hier gelangt das Macro nie hin, für Werte < 2;
%end;

%end;
%mend;

Schöne Grüße

Jan

Hm, das stimmt, das muß noch

Hm, das stimmt, das muß noch abgefangen werden.

Das ist aber wohl nicht das einzige Problem, denn so sieht das Log für ebene=5 aus:

278 %ebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere
278! alter
MLOGIC(EBENE): Beginning execution.
279 nikotin bmiscale durchblut herzinf apoplex mpathie moedem
279! sysdruck diasdruck,ebene=5,maxziel=2);
MLOGIC(EBENE): Parameter DATEI has value baum
MLOGIC(EBENE): Parameter VARLIST1 has value visuscale hba1c ydiab typdiab
hypscale fette niere alter nikotin bmiscale durchblut herzinf
apoplex mpathie moedem sysdruck diasdruck
MLOGIC(EBENE): Parameter EBENE has value 5
MLOGIC(EBENE): Parameter MAXZIEL has value 2
MLOGIC(EBENE): %LET (variable name is STRING00)
MLOGIC(EBENE): %LET (variable name is ANZDOT)
MLOGIC(EBENE): %LET (variable name is EB_1)
MLOGIC(EBENE): %DO loop beginning; index variable I; start value is 1;
stop value is 25; by value is 1.
MLOGIC(EBENE): %DO loop beginning; index variable EB; start value is 4;
stop value is 1; by value is -1.
MLOGIC(EBENE): %GLOBAL FILTER
MLOGIC(EBENE): %LET (variable name is FILTER)
MLOGIC(EBENE): %LET (variable name is DRÜBER)
MLOGIC(EBENE): %GLOBAL DOT_1
MLOGIC(EBENE): %LET (variable name is DOT_1)
ERROR: Expected close parenthesis after macro function invocation not found.
ERROR: Required operator not found in expression: %sysfunc(mod(&drüber.,2)=1)
ERROR: The macro CARTEBENE will stop executing.
MLOGIC(EBENE): Ending execution.
280
281 proc print data=aufheb noobs;
ERROR: File WORK.AUFHEB.DATA does not exist.
282 run;

NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds

VG SAS-Fidi

Klammersetzung

Hallo SAS-Fidi,

vermutlich kommt die Fehlermeldung aus folgender Zeile:

%if %sysfunc(mod(&drüber.,2)=1) %then ... /* Syntaxfehler */

%if %sysfunc(mod(&drüber.,2))=1 %then ... /* korrekte Syntax */

Schöne Grüße

Jan

Fast, aber noch nicht ganz!

Oh, danke! Manchmal ist man echt betriebsblind!

Jetzt sieht es so aus:

%macro ebene(datei,varlist1=,ebene=,maxziel=);
/*Startebene ist Ebene 0!!!*/
%global filter;
%let string00=;
%let anzdot=%eval(2**&ebene); /*hier war auch ein Fehler!*/
%let eb_1=%eval(&ebene-1);
%do i=1 %to &anzdot;
%if &ebene>=2 %then
%do eb=&eb_1 %to 1 %by -1;

%if &ebene=0 %then %let &filter=;
%let drüber=%sysfunc(round((&i./2),1));
%global dot_1;
%let dot_1=node&eb.&drüber;
%if %sysfunc(mod(&drüber.,2))=1 %then %let filter=%sysfunc(&filter||&dot_1||=1);/*ungerade*/
%if %sysfunc(mod(&drüber.,2))=0 %then %let filter=%sysfunc(&filter||&dot_1||=2);/*gerade*/
%end;

%let liste=&varlist1;
%local pattern;
%local regtext;
%Let raus=%str(s/ string&eb_1.&dot_1. / /);
%let Pattern = %sysfunc(prxparse(&Raus.));
%IF &Pattern. NE . %THEN %DO; %sysfunc(prxchange(&Pattern.,1,%str(&liste.))); %END;

data baum;
set basis;
&filter; /*<*******************************************************************************************/
run;
%cut(baum,drpscale2,varlist1=&liste,max=&maxziel,ebene=&ebene,cut=&i);
%if (&ebene=1 and &i=1) %then %let filter=%sysfunc(&node11||=1);
%if (&ebene=1 and &i=2) %then %let filter=%sysfunc(&node11||=2);
%end;
%mend;

%ebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=1,maxziel=2);

proc print data=aufheb noobs;
run;

Die Variablen node&ebene&cut werden im Macro cut jeweils als global angelegt:

data merken;
set merken;
if _n_=1;
ebene=&ebene;
%global node&ebene.&cut.;
/*rename node&ebene.&cut.=node;*/
run;

Das Log sieht so aus:

MLOGIC(EBENE): Beginning execution.
896 nikotin bmiscale durchblut herzinf apoplex mpathie moedem
896! sysdruck diasdruck,ebene=1,maxziel=2);
MLOGIC(EBENE): Parameter DATEI has value baum
MLOGIC(EBENE): Parameter VARLIST1 has value visuscale hba1c ydiab typdiab
hypscale fette niere alter nikotin bmiscale durchblut herzinf
apoplex mpathie moedem sysdruck diasdruck
MLOGIC(EBENE): Parameter EBENE has value 1
MLOGIC(EBENE): Parameter MAXZIEL has value 2
MLOGIC(EBENE): %GLOBAL FILTER
MLOGIC(EBENE): %LET (variable name is STRING00)
MLOGIC(EBENE): %LET (variable name is ANZDOT)
MLOGIC(EBENE): %LET (variable name is EB_1)
MLOGIC(EBENE): %DO loop beginning; index variable I; start value is 1;
stop value is 2; by value is 1.
MLOGIC(EBENE): %IF condition &ebene>=2 is FALSE
MLOGIC(EBENE): %LET (variable name is LISTE)
MLOGIC(EBENE): %LOCAL PATTERN
MLOGIC(EBENE): %LOCAL REGTEXT
MLOGIC(EBENE): %LET (variable name is RAUS)
MLOGIC(EBENE): %LET (variable name is PATTERN)
MLOGIC(EBENE): %IF condition &Pattern. NE . is TRUE
MPRINT(EBENE): visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck;

NOTE: Line generated by the macro function "SYSFUNC".
1 visuscale hba1c ydiab typdiab hypscale fette niere alter
---------
180
1 ! nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck
1 ! diasdruck
MPRINT(EBENE): data baum;
MPRINT(EBENE): set basis;
NOTE: Line generated by the macro variable "FILTER".
1 &node11||=1
--
180
MPRINT(EBENE): ||=1;
MPRINT(EBENE): run;

ERROR 180-322: Statement is not valid or it is used out of proper order.

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.BAUM may be incomplete. When this step was stopped
there were 0 observations and 24 variables.
WARNING: Data set WORK.BAUM was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds

Es wird also laaaaaaangsam besser, oder?

VG SAS-Fidi

Verkettungsoperator?

Hallo SAS-Fidi,

wahrscheinlich ist hier noch ein Fehler, da Texte in Macros nicht mit dem Verkettungsoperator verkettet werden:

%let filter=%sysfunc(&filter||&dot_1||=2);

/* wahrscheinlich gemeint */
%let filter=&filter.&dot_1. = 2;

Dies kommt in mehreren Varianten im Text vor.

Außerdem gibt es immer noch Code in der inneren Schleife, der nie erreicht wird.

/* wird niemals ausgeführt, da die Bedingung für die Schleife ist ... */
%IF &Ebene. >= 2 %THEN %DO ...;
%if &ebene=0 %then %let &filter=;
...;
%END;

Schöne Grüße

Jan

Uh, das kommt davon, wenn man

Uh, das kommt davon, wenn man aus einem anderen Programm Zeilen klaut.

Jetzt sieht es so aus:

%macro ebene(datei,varlist1=,ebene=,maxziel=);
/*Startebene ist Ebene 0!!!*/
%global filter;
%let string00=;
%let anzdot=%eval(2**&ebene);
%let eb_1=%eval(&ebene-1);
%do i=1 %to &anzdot;
%if &ebene>=2 %then
%do eb=&eb_1 %to 1 %by -1;

%if &ebene=0 %then %let &filter=;
%let drüber=%sysfunc(round((&i./2),1));

%let dot_1=&node&eb.&drüber;
%global dot_1;
%if %sysfunc(mod(&drüber.,2))=1 %then %let filter=if &filter.&dot_1=1;/*ungerade*/
%if %sysfunc(mod(&drüber.,2))=0 %then %let filter=if &filter.&dot_1=2;/*gerade*/
%end;
%if &ebene=0 %then %let dot_1=;
%if &ebene=1 %then %let dot_1=&node01;
%let liste=&varlist1;
%local pattern;
%local regtext;
%Let raus=%str(s/ string&eb_1.&dot_1. / /);
%let Pattern = %sysfunc(prxparse(&Raus.));
%IF &Pattern. NE . %THEN %DO; %sysfunc(prxchange(&Pattern.,1,%str(&liste.))); %END;

%if ebene=0 %then %let filter=;
%if (&ebene=1 and &i=1) %then %let filter=if &node01=1;
%if (&ebene=1 and &i=2) %then %let filter=if &node01=2;

data baum;
set basis;
&filter;
run;

%cut(baum,drpscale2,varlist1=&liste,max=&maxziel,ebene=&ebene,cut=&i);

%end;
%mend;

Leider läuft es immer noch nicht. Das liegt wohl in erster Linie daran, daß aus den Macro Cut für die node-Variablen Leerstrings kommen. Das Problem dort ist, daß in einem Data-Step eine Variable node&ebene.&cut. berechnet wird. Diese Variable soll dann nach der Berechnung als global definiert werden, damit ich sie in Ebene verwenden kann. Leider funbktioniert das nicht.

Gruß
SAS-Fidi

Mein jetziger falscher Code

Mein jetziger falscher Code (Auszug aus dem Macro!):

...
data merken;
set merken;
if _n_=1;
ebene=&ebene;
%global node&ebene.&cut.;
%let node&ebene.&cut=%sysget(node&ebene.&cut);
run;
...

In der Datei merken gibt es eine Variable node&ebene.&cut. Diese Variable soll nach Abschluß des Macros auch andseren Macros zur Verfügung stehen.

Gruß
SAS-Fidi

call symput

Hallo SAS-Fidi,

die globale Variable sollte bereits vorher definiert sein.

Die Zuweisung zu einer Macrovariablen erfolgt mit symput.

Die Ansprache der neuen Macrovariablen erfolgt mit doppeltem &&.

%GLOBAL node&ebene.&cut.;

....

/* Wertzuweisung */
Data _NULL_;
set merken(obs=1);
call symput("node&ebene.&cut.",PUT(node&ebene.&cut., Best32.));
run;

...

/* Wertausgabe */
%put &&node&ebene.&cut.;

...

Schöne Grüße

Jan

Grummel jetzt läuft soweit

Grummel jetzt läuft soweit alles, aber ausgerechnet &filter wird nicht richtig erzeugt.

Ebene 0 (hier ist alles noch ok!):

MPRINT(EBENE): data baum;
MPRINT(EBENE): set basis;
MPRINT(EBENE): ;
MPRINT(EBENE): run;

Ebene 1 (auch noch alles ok!):

MPRINT(EBENE): data baum;
MPRINT(EBENE): set basis;
MPRINT(EBENE): if mpathie =1;
MPRINT(EBENE): run;

Ebene 2 (hier geht gar nichts mehr!):

MPRINT(EBENE): data baum;
MPRINT(EBENE): set basis;
NOTE: Line generated by the macro variable "FILTER".
1 if mpathie =1ydiab =1
-----
22
MPRINT(EBENE): if mpathie =1ydiab =1 ;
MPRINT(EBENE): run;

ERROR 180-322: Statement is not valid or it is used out of proper order.

ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +,
-, /, ;, <, <=, <>, =, >, ><, >=, AND, EQ, GE, GT, IN, LE, LT,
MAX, MIN, NE, NG, NL, NOTIN, OR, ^=, |, ||, ~=.

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.BAUM may be incomplete. When this step was stopped
there were 0 observations and 24 variables.
WARNING: Data set WORK.BAUM was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds

Es fehlt das and in der Variablen &filter. Eigentlich sollte die Variable so aussehen:

if mpathie =1 and ydiab =1 ;

Das Macro ebene sieht aktuell so aus:

%macro cartebene(datei,varlist1=,ebene=,maxziel=);
/*Startebene ist Ebene 0!!!*/
%global filter;
%let string00=;
%let anzdot=%eval(2**&ebene);
%let eb_1=%eval(&ebene-1);
%do i=1 %to &anzdot;
%if &ebene>=2 %then
%do eb=&eb_1 %to 1 %by -1;

%if &ebene=0 %then %let &filter=;
%let drüber=%sysfunc(round((&i./2),1));

%let dot_1=&node&eb.&drüber;
%global dot_1;
%if %sysfunc(mod(&drüber.,2))=1 %then %let filter= &filter.&dot_1=1;/*ungerade*/
%if %sysfunc(mod(&drüber.,2))=0 %then %let filter= &filter.&dot_1=2;/*gerade*/
%end;
%if &ebene=0 %then %let dot_1=;
%if &ebene=1 %then %let dot_1=&node01;
%let liste=&varlist1;
%local pattern;
%local regtext;
%Let raus=%str(s/ string&eb_1.&dot_1. / /);
%let Pattern = %sysfunc(prxparse(&Raus.));
%IF &Pattern. NE . %THEN %DO; %sysfunc(prxchange(&Pattern.,1,%str(&liste.))); %END;

%if ebene=0 %then %let filter=;
%if (&ebene=1 and &i=1) %then %let filter=if &node01=1;
%if (&ebene=1 and &i=2) %then %let filter=if &node01=2;

data baum;
set basis;
&&filter;
run;

%cart1cut(baum,drpscale2,varlist1=&liste,max=&maxziel,ebene=&ebene,cut=&i);

%end;
%mend;

%cartebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=0,maxziel=2);

%cartebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=1,maxziel=2);

%cartebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=2,maxziel=2);

VG SAS-Fidi

AND auch an Filter zuweisen

Hallo SAS-Fidi,

der Fehler steckt m. E. in der Filterzuweisung.

%if %sysfunc(mod(&drüber.,2))=1 %then %let filter= &filter. AND &dot_1=1;/*ungerade*/
/* statt */
%if %sysfunc(mod(&drüber.,2))=1 %then %let filter= &filter.&dot_1=1;/*ungerade*/

Schöne Grüße

Jan

So, endlich bin ich dazu

So, endlich bin ich dazu gekommen am Macro weiter zu arbeiten!

So sieht es jetzt aus:

%macro ebene(datei,varlist1=,ebene=,maxziel=);
/*Startebene ist Ebene 0!!!*/
%global stop;
%let stop=0;
%if &ebene=0 %then %do; %global filter01; %let filter01=; %end;
%let string00=;
%let eb_1=%eval(&ebene-1);
%let anzdot=%eval(2**&ebene);
%do z=1 %to &anzdot;
%if &ebene>=2 %then
%do eb=&ebene %to 1 %by -1;
%let anz_1=%eval(2**&eb_1);
%global drueber;
%let drueber=%sysfunc(round((&anz_1./2),1));
/*%global dot_1;*/
%if &&node&eb_1.&drueber. eq . %then %do; %let dot_1=; %let stop=1; %end;
%else %let dot_1=&&node&eb_1.&drueber;
%if &&filter&eb_1.&drueber. eq . %then %do; %let filter&eb_1.&drüber.=; %let stop=1; %end;
%else %do;
%if %sysfunc(mod(&z.,2))=1 %then %do; %global filter&ebene.&z.; %let filter&ebene.&z.= &&filter&eb_1.&drueber. and &dot_1=1; %end;/*ungerade*/
%if %sysfunc(mod(&z.,2))=0 %then %do; %global filter&ebene.&z.; %let filter&ebene.&z.= &&filter&eb_1.&drueber. and &dot_1=2; %end;/*gerade*/
%end;
%end;
%if &ebene=0 %then %let dot_1=;
%if &ebene=1 %then %let dot_1=&node01;
%let liste=&varlist1;
%local pattern;
%local regtext;
%Let raus=%str(s/ string&eb_1.&dot_1. / /);
%let Pattern = %sysfunc(prxparse(&Raus.));
%IF &Pattern. NE . %THEN %DO; %sysfunc(prxchange(&Pattern.,1,%str(&liste.))); %END;
%if (&ebene=1 and &z=1) %then %do; %global filter11; %let filter11=if &node01=1; %end;
%if (&ebene=1 and &z=2) %then %do; %global filter12; %let filter12=if &node01=2; %end;
%if &stop ne 1 %then %do;
data baum;
set basis;
&&filter&ebene.&z.;
run;
%1cut(baum,drpscale2,varlist1=&liste,max=&maxziel,ebene=&ebene,cut=&z);
%end;
%end;
%mend;

%ebene(baum,varlist1=visuscale hba1c ydiab typdiab hypscale fette niere alter
nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck diasdruck,ebene=3,maxziel=2);

Leider macht es immer noch nicht so ganz, was ich möchte. Für Ebene=2 ergibt sich für data baum folgendes:

Cut=1: if mpathie =1 and ydiab=1;
Cut=2: if mpathie =1 and ydiab=2;
Cut=3: if mpathie =1 and ydiab=1;
Cut=4: if mpathie =1 and ydiab=2;

Es soll aber dort stehen:

Cut=1: if mpathie =1 and ydiab=1;
Cut=2: if mpathie =1 and ydiab=2;
Cut=3: if mpathie =2 and ydiab=1;
Cut=4: if mpathie =2 and ydiab=2;

VG SAS-Fidi

Sodele, hab das Problem

Sodele, hab das Problem selbst gelöst!

Das einzige, was jetzt noch stört, ist folgende Felhermeldung, die allerdings keinerlei Auswirkungen hat:#

MLOGIC(EBENE): %GLOBAL FILTER11
MLOGIC(EBENE): %LET (variable name is FILTER11)
NOTE: Line generated by the macro function "SYSFUNC".
1 visuscale hba1c ydiab typdiab hypscale fette niere alter
---------
180
1 ! nikotin bmiscale durchblut herzinf apoplex mpathie moedem sysdruck
1 ! diasdruck
MLOGIC(EBENE): %IF condition (&ebene=1 and &z=2) is FALSE
MLOGIC(EBENE): %IF condition &stop ne 1 is TRUE
MPRINT(EBENE): data baum;
MPRINT(EBENE): set basis;
MPRINT(EBENE): if mpathie =1;
MPRINT(EBENE): run;

ERROR 180-322: Statement is not valid or it is used out of proper order.

Sie taucht in allen Versionen des Macros auf.

VG SAS-Fidi