2017-05-31 1 views
1

Die Funktionen PATHNAME() und GETOPTION() geben unterschiedliche Ergebnisse für SASAUTOS zurück, wodurch Zweifel entstehen, welche Verzeichnisse für AUTOCALL verwendet werden. Gibt es SASAUTOS existieren als zwei verschiedene "Dinge" passiert, um den gleichen Namen zu besitzen?SAS - So ermitteln Sie, welche Bibliotheken in SASAUTOS enthalten sind

Um etwas Hintergrundwissen zu liefern, verwalte ich ein Verzeichnis für persönliche Dienstprogrammmakros, deren Pfad zu meiner Konfigurationsdatei hinzugefügt wurde.

-SET SASAUTOS (

     "!SASROOT\core\sasmacro" 
     "!SASROOT\aacomp\sasmacro" 
     "!SASROOT\accelmva\sasmacro" 
     "!SASROOT\assist\sasmacro" 
     "!SASROOT\dmscore\sasmacro" 
     "!SASROOT\ets\sasmacro" 
     "!SASROOT\gis\sasmacro" 
     "!SASROOT\graph\sasmacro" 
     "!SASROOT\hps\sasmacro" 
     "!SASROOT\iml\sasmacro" 
     "!SASROOT\or\sasmacro" 
     "!SASROOT\qc\sasmacro" 
     "!SASROOT\stat\sasmacro" 
     "C:\USERS\ME\PERSONAL AUTOCALL" 
     ) 

Dies verhält sich wie erwartet. Wenn ich SAS lade, kann ich alle Makros aufrufen, die sich im Verzeichnis PERSONAL AUTOCALL befinden.

Ich habe auch einen komplexen Prozess, der eine Vielzahl von problemspezifischen Makros erfordert. Diese befinden sich in einem separaten Verzeichnis von meinem PERSONAL AUTOCALL. Da diese Makros unabhängig davon verfügbar sein sollten, wer den Prozess ausführt, sind sie nicht in der Konfigurationsdatei enthalten. Stattdessen lade ich SAS das Verzeichnis in der autocall Suchhierarchie innerhalb der Sitzung. Ich tue dies, indem ich die folgende Aussage mache.

options mautosource mrecall sasautos = (SASAUTOS, 'Z:\Path\To\COMPLEX PROCESS AUTOCALL'); 

Auch dies verhält sich wie erwartet. Wenn das erste Argument SASAUTOS von der Optionsanweisung ausgeschlossen wird, können nur die Makros COMPLEX PROCESS AUTOCALL aufgerufen werden und umgekehrt.

Das Problem tritt auf, wenn ich überwache, welche Verzeichnisse in der Autocall-Suchhierarchie sind. Um dies zu tun, erstelle ich:

%put %sysfunc(pathname(sasautos)); 

Dies gibt die genaue Liste in meiner Konfig-Datei, die oben angegeben. Es fehlt der Pfad COMPLEX PROCESS AUTOCALL, obwohl die Option SASAUTOS= enthalten ist und diese Makros Call-fähig sind.

Wenn ich stattdessen

%put %sysfunc(getoption(sasautos)); 

dann folgenden zurückgegeben.

(SASAUTOS, "'C:\Path\To\COMPLEX PROCESS AUTOCALL'") 

Während die Kombination der beiden %put Aussagen liefern, was ich glaube, dass eine vollständige Auflistung der Autocall-Bibliotheken ist, bin ich ratlos, warum beide benötigt werden.

PATHNAME() gibt den Namen einer Datenbibliothek zurück, in diesem Fall SASAUTOS, die mindestens im Kontext der aktuellen Sitzung mit COMPLEX PROCESS AUTOCALL angehängt sein sollte.

GETOPTION() gibt den Wert einer SAS-Systemoption zurück. Anscheinend unterscheidet sich die Systemoption von der Datenbibliothek.

Bedeuten die verschiedenen Rückgabewerte tatsächlich, dass zwei verschiedene SASAUTOS "Dinge" existieren, eine Bibliothek und die andere eine Option? Wenn ja, wie interagieren sie? Wie kann ich angesichts dieser unerwarteten Diskrepanz sicher sein, dass keine anderen Verzeichnisse als die aufgelisteten Verzeichnisse durchsucht werden?

Antwort

1

Ja, SASAUTOS ist zwei Dinge hier. Es ist eine system option and a fileref. (Beachten Sie, dass es keine Bibliothek ist, es ist nicht wirklich signifikant verschiedene aus einer Bibliothek in den meisten Möglichkeiten, aber es ist nicht eins. Bezeichnenderweise können Sie nicht SAS-Datensätze in SASAUTOS mit normaler Punktnotation verweisen.)

Die Dateireferenzen SASAUTOS wird standardmäßig von der Option SASAUTOS in der Konfig (oder Optionen beim Start) erstellt und setzt OPTION SASAUTOS, um auf diese (und nur diese) anfänglich zu zeigen. Siehe von der oben verlinkten Dokumentseite:

SAS generiert automatisch eine Datei mit dem Namen SASAUTOS. Dies ist der Standardwert der Option SASAUTOS = und verweist auf alle SAS-Autocall-Makros.

Es ist wichtig, sich nicht damit zu beschäftigen, da SAS von SAS verwendet wird, um Systemmakros zu finden. Gern können Sie der Datei "filef" in der Konfiguration Pfade hinzufügen, aber stellen Sie andernfalls sicher, dass Sie sie nicht aus der SASAUTOS-Option entfernen.

Um zu tun, was Sie versuchen zu tun, würde ich sagen, Sie haben drei Möglichkeiten.

Eines ist GETOPTION mit PATHNAME zu kombinieren, wie Sie sehen können; Sie müssten nur die Ergebnisse von GETOPTION an die Ergebnisse von PATHNAME anhängen. Sie könnten es tatsächlich automatisieren; Verwenden Sie GETOPTION, und wenn eines der Ergebnisse wie filerefs (8 Zeichen oder weniger, kein Punkt oder \ oder was auch immer) aussieht, führen Sie PATHNAME für sie aus und hängen Sie die Ergebnisse an.

Zwei ist Ihre persönliche Makro-Bibliothek aus dem Fileref zu entfernen und stattdessen in Ihrem Autoexec anhängen. Sie müssen jedoch vorsichtig sein, wenn Sie andere Bibliotheken hinzufügen.

Drei ist zweiten fileref zu machen, und keine zusätzliche Pfade zu diesen fileref hängen. Das ist nett, weil Sie sicher sein können, dass OPTION SASAUTOS nur zwei Werte hat (fileref SASAUTOS und Ihre MYAUTOS fileref), und dann müssen Sie nur Ihre neuen Dateien anhängen (verwenden Sie PATHNAME, um die aktuell geladenen Pfade zu erhalten, dann fügen Sie dann hinzu Definieren Sie die Dateiref) neu. Das ist am einfachsten zu warten, solange Sie darauf achten, es immer richtig zu definieren (erstellen Sie dazu ein Makro (!))

Es hat auch den Vorteil, dass andere Programmierer einfach ihre eigenen erstellen können core fileref und das Programm funktioniert immer noch für sie (wenn sie eine andere Makro-Bibliothek haben), obwohl ihre Makro-Bibliothek besser die Makros enthalten sollte, die für das Projekt benötigt werden.

+0

SAS wurde nicht zum automatischen Erstellen der SASAUTOS-Dateiref auf allen Plattformen verwendet. Ich musste es definitiv erstellen, um sicherzustellen, dass sowohl Unix- als auch Windows-Umgebungen ähnlich waren. Vielleicht ist es jetzt? – Tom

+0

@Tom Nun, diese Seite ist generisch (nicht von den Betriebssystemspezifikationen), also - vielleicht? Ich habe kein Unix-SAS mehr, um es zu testen, aber ich denke, SAS/UE würde sich technisch qualifizieren? – Joe

+0

Hinzufügen eines Fileref - ordentlich - wie dies auch um die Grenze/Einschränkung von wie viele Werte "einfügen" in SASAUTOS umgehen sollte. –

Verwandte Themen