DATA labor;
input probe testident $ ergebnis einheit $ grenzw_ind $;
put _all_;
cards;
1 Ca/S 2.04 mmol/l -
1 Cl/S 116 mmol/l +
1 TGL 217 mg/dl +
2 Ca/S 2.36 mmol/l +
2 Cl/S 101 mmol/l -
2 UA/S 6.7 mg/dl +
3 Ca/S 1.86 mmol/l -
3 Cl/S 97 mmol/l -
3 TGL 35 mg/dl -
RUN;
options symbolgen;
%macro anlegen(st_test);
format &st_test._value $10.
&st_test._unit $10.
&st_test._flag_patho $5.;
%mend anlegen;
%macro merken(st_test);
retain &st_test._value;
retain &st_test._unit;
retain &st_test._flag_patho;
%mend merken;
%macro leer(st_test);
&st_test._value = "";
&st_test._unit = "";
&st_test._flag_patho = "";
%mend leer;
%macro bedingung(lim_test, st_test);
/* Wenn hier Datastep-Code anstelle von Makrocode generiert wird, läuft das Programm */
if &testid = &lim_test then do;
&st_test._value = ergebnis;
&st_test._unit = einheit;
&st_test._flag_patho = grenzw_ind;
end;
%mend bedingung;
DATA labor2;
format h_probe 5.;
set work.labor;
%anlegen (ca)
%anlegen (cl)
%anlegen (trg)
%anlegen (ua) /* Darf ich den Strichpunkt hier setzen? Ja, sinnlos ist er trotzdem :-) */
if probe=h_probe then do;
%merken (ca)
%merken (cl)
%merken (trg)
%merken (ua) /* Darf ich den Strichpunkt hier setzen? Ja, sinnlos ist er trotzdem :-) */
end;
else do;
%leer (ca)
%leer (cl)
%leer (trg)
%leer (ua) /* Darf ich den Strichpunkt hier setzen? Ja, sinnlos ist er trotzdem :-) */
end;
/* An dieser Stelle müsste der Aufruf des Makros „bedingung“ erfolgen, a la…*/
%bedingung (Ca/S, ca);
%bedingung (Cl/S, cl);
%bedingung (TRG, trg);
%bedingung (UA/S, ua);
/*… allerdings mit der Zuweisung einer laufende Variablen (testident) statt der gerade gezeigten Aufrufe. Dass es so nicht funktionieren kann, ist mir klar, weil die Makros vor dem DataStep ausgeführt werden. Aber wie kann’s funktionieren? Mit call symputx? Aber wie? */
call symputx ('testid', testident); /* call symputx: Ausführung zur Laufzeit des DataSteps*/
h_probe=probe;
retain h_probe;
RUN; Wenn das Makro %Bedingung Datastep code generiert funktioniert es auch 🙂
... View more