Aktuellen Pfad eines SAS-Programms ermitteln

Hallo,

derzeit verwende ich eine Sammlung mehrere SAS-Programme, wobei ein Hauptprogramm
per Include mehrere Unterprogramme aufruft.


%include    "E:\SAS\Routinen\Sub_A_Init.sas"                   / NOsource2;

Dann habe ich das mit einer Makrovariablen verwendet


/* Hauptprogramm: main.sas */
%Let Path_Main = E:\SAS   /* Pfad zum Hauptprogramm */

%include    "&Path_Main\Routinen_Input\Sub_A_Init.sas"          / NOsource2;
%include    "&Path_Main\Routinen_Input\Sub_B_Read.sas"          / NOsource2;
%include    "&Path_Main\Routinen_Input\Sub_C_Correct.sas"       / NOsource2;
%include    "&Path_Main\Routinen_Calc\Calculation_A_Global.sas" / NOsource2;
%include    "&Path_Main\Routinen_Calc\Calculation_B_Group.sas"  / NOsource2;
%include    "&Path_Main\Routinen_Calc\Calculation_B_Case.sas"   / NOsource2;

Jetzt würde ich gerne das Hauptptogramm verschiebbar in verschiedenen Verzeichnissen haben. Dann könnte ich von dem System verschiedene lauffähige Versionen halten,ohne die Letstatements anzupassen.

FRAGE: Wie kann ich das Letstatment in der Art bekommen:

%Let Path_Main = 'aktueller Pfad von main.sas'

Ein Workaround ist auch willkommen!

Grüße // Martin Schäfer

Neue Funktionen in SAS 9

Guten Morgen,
wenn ich's richtig verstanden habe, liefert die neue Funktion SAS_EXECFILEPATH vielleicht das gewünschte Ergebnis. Sie gibt den Namen und Pfad des aktuellen Programms zurück

%put %sysget(SAS_EXECFILEPATH);
Daneben gibt's noch SAS_EXECFILENAME für den Dateinamen
%put %sysget(SAS_EXECFILENAME);
Beste Grüße
Felix Mader

Main-Programm teilen in zwei Macrovariablen Pfad und Name

Hallo,

ich weiß nicht, ob ich die Frage richtig verstanden hatte.

Sie könnten doch bereits Ihr Main-Programm als Macro-Variable definieren, z.B. so:


%let pfad = E:\SAS\Routinen\;
%let main = Sub_A_Init.sas;

%include "&pfad.&main.";

und danach können dann die weiteren Unterprogramme aufgerufen werden, etwa so:


%include "&pfad.Unterprogramm";

Hatte ich die Frage so richtig verstanden?

Guten Morgen Herr Kolbe

Sie haben das Aufrufproblem für das Hauptprogramm gelöst.

Jetzt mag ich noch einen Schritt weiter gehen. Ich würde gerne komplett auf die Let-Zuweisung des Anfangspfades verzichten können. Die Idee dahinter war, dass SAS aus der Position im Verzeichnis des startenden Programms (seinem Pfad), diesen ersten Pfad ermittelt und in Folge, wie Sie ja gezeigt haben, die weiteren Pfade aufbaut. Das SAS-System hat zumindest die Pfadinformation, denn wenn man Änderungen im Code gemacht hat, werden diese normalerweise in die Orginaldatei gespeichert.

Man könnte die Frage auch so stellen:

Welches SAS-Programm wurde zuletzt aufgerufen, welcher Verzeichnispfad führt zu seiner Position und wie komme ich an diesen Pfad?

So ganz einfach scheint das unter SAS nicht zu gehen....

Schauen Sie mal bitte hier:

Das war ein Volltreffer.

Also ich habe das Macro aus dem Link
genommen und um die Pfadausgabe erweitert.


%macro pname;
%global pprogpath ppnamefull ppath;

%let pprogpath=;
%let ppnamefull=;
%let ppath=;

data _null_;
   set sashelp.vextfl;
   if (substr(fileref,
1,3)='_LN' or substr
   (fileref,
1,3)='#LN' or substr(fileref,1,3)='SYS') and
   index(upcase(xpath),
'.SAS')>0 then do;
   call symput(
"pprogpath",trim(xpath));
end; run;

%let ppnamefull=%scan(&pprogpath,-1,\/);
%let ppath=%SUBSTR( &pprogpath, 1, %index(&progpath,&ppnamefull)-1);  

%mend pname; %pname;

%put ppath=&ppath;
%put ppnamefull=&ppnamefull;
%put pprogpath=&pprogpath;

Damit habe ich den Pfad der gerade laufenden SAS-Datei (dem Programm) und kann alle Includepfade relativ setzen. Somit ist mein Ziel erreicht mehrere Dateien im Includeverbund komplett im Dateisystem verschiebbar zu halten. Erweitern könnte man dies jetzt noch hinsichtlich der Batcherkennung.

Das Makro ist ab SAS 6 lauffähig. Ab SAS 9 ist natürlich die Lösung von Felix Mader die Variante der Wahl.

Vielen Dank // Martin Schäfer

kleiner Fehler

Das Makro ist klasse :-) Allerdings sollten noch zwei Kleinigkeiten erwähnt werden:

1. Winziger Fehler &progpath -> &pprogpath
%let ppath=%SUBSTR( &pprogpath, 1, %index(&pprogpath,&ppnamefull)-1);

2. STOP;
Nach der Zeile "call symput..." sollte noch ein STOP; eingefügt werden (wie auch in der SAS-Note beschrieben), damit die aktuelle Datei ausgegeben wird. Fehlt das STOP; wird die zuletzt geöffnete Datei ausgegeben und das muss ja nicht immer richtig sein. :-)

Gruß aus Hamburg
Marco Schmidt