Makros verstecken

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Almut Hahn: Hans-Peter Altenburg, Heinrich Stürzl, Almut Hahn, Carina Ortseifen, Grischa Pfister: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2008

Man möchte mühsam erarbeitete Makros einem anderen zur Verfügung stellen (Kollegen oder Kunden), möchte aber evtl. verhindern, dass derjenige den zugehörigen Code ändern oder auch nur einsehen kann (Stichwort: validierte Makros, Urheberrecht).

SAS bietet dazu die Möglichkeit, fertig kompilierte Makros abzuspeichern.

Kompilierte Makros abspeichern

Um kompilierte Makros abzuspeichern muss man

  1. eine Bibliothek (library) einrichten
  2. zwei Systemoptionen einstellen
  3. das Makro unter einer bestimmtem Option kompilieren

Als Bibliothek könnte man beispielsweise einrichten: libname mymacros „C:\...\Eigene Dateien\MeineMakros“;

Als Systemoptionen müssen dann eingestellt werden: options mstored sasmstore=mymacros; Wobei mstored der SAS Session sagt, dass vorkompilierte Makros verwendet oder erzeugt werden können und sasmstore= erklärt, wo die Makros gesucht bzw. abgelegt werden sollen.

Beim Kompilieren des Makros muss dann die Makro-Option /STORE eingeschaltet sein

%macro rangecheck(mdat) /STORE;
proc means data=&mdat min max;
run;
%mend;

Durch diesen Vorgang wird unter mymacros eine Datei sasmacr.sas7bcat erzeugt, die das/die kompilierte(n) Makro(s) enthält und die dann an den User weitergegeben werden kann.

Man sollte unbedingt auch eine Klartextversion des Makros abspeichern, da sich der Code nicht aus der kompilierten Version rekonstruieren lässt.

Kompilierte Makros verwenden

Beim User müssen in dem Programm, in dem die kompilierten Makros verwendet werden sollen, eine entsprechende Bibliothek und die Systemoptionen wie oben gesetzt sein, also:

libname othmacros „C:\...\Eigene Dateien\FremdMakros“;
options mstored sasmstore=othmacros; 

Die kompilierten Makros können dann wie gewohnt aufgerufen werden. Da der User den Originalcode nicht mehr einsehen kann, sollte man daran denken, eine Anleitung mitzuliefern.

Durch die Verwendung bereits vorkompilierter Makros kommt es übrigens auch zu einer geringfügigen Einsparung in der Rechenzeit.

Bei möglicher Namensgleichheit verschiedener Makros ist folgende Reihenfolge zu berücksichtigen:

  1. Zuerst werden die in der aktuellen SAS-Session erzeugten Makros durchsucht, (work.sasmacr)
  2. anschließend die ggf. Unter sasmstore= hinterlegten
  3. und danach ggf. mit der Option sasautos= eingebundene Makros.

Makros verstecken

Werden kompilierte Makros unter Systemoptionen wie z.B. MPRINT aufgerufen, so kann man im Log den Code weitgehend rekonstruieren. Man kann auch diese Stelle noch „verblinden“, indem man am Anfang des Makros alle diese Optionen abstellt. Um die Funktion des restlichen Programms nicht zu stören, sollte man allerdings die bestehenden Optionen vorher abspeichern und hinterher wieder herstellen. Dies funktioniert beispielsweise mit proc optsave und proc optload (weitere Methoden siehe [1]). Es empfiehlt sich, zum Speichern der Optionen einen Makro-spezifischen Dateinamen zu wählen, damit es nicht zu Kollisionen kommt, falls innerhalb eines Makros ein anderes Makro aufgerufen wird.

%macro rangecheck (mdat) /STORE;

proc optsave out=rangecheck_opt;
run;

options NoMPrint NoMPrintnest NoMlogic NoMlogicNest 
        NoMexecNote NoMFile NoMacrogen NoSymbolgen
        NoNotes NoSource NoSource2;

proc means data=&mdat min max;
run;

proc optload data=rangecheck_opt;
run;

proc datasets library=work nolist;
  delete rangecheck_opt;
quit;

%mend;

Die Liste der Optionen in diesem Beispiel erhebt weder einen Anspruch auf Vollständigkeit noch auf Notwendigkeit. Es ist natürlich jedem selbst überlassen, wie viel er seinem User sichtbar machen möchte.

Literatur

  • Ortseifen et al.: Tipps und Tricks – Nützliche Lösungen zu Problemen und Fragestellungen der SAS Versionen 8, 8.1 und 8.2, Systemoptionen auslesen und speichern, Proceedings der 6. KSFE 2002 Dortmund. Shaker Verlag, 2003.