2009-02-11 22 views
6

In meinem Code habe ich mehrere Makros. Makro A ist das Hauptmakro. Makro A ruft dann Makro B auf, welches wiederum Makro C aufruft.SAS: Aufrufen eines Makros aus einem anderen ... Reihenfolge der Makrodefinitionen

Muss ich sie in SAS in umgekehrter Reihenfolge definieren? Mit anderen Worten, muss ich zuerst Makro C definieren, dann Makro B und dann Makro A zuletzt? Oder spielt es eine Rolle, da SAS den gesamten Code liest, bevor er den Befehl zum Ausführen der Makros tatsächlich trifft? Kann ich zu diesem Zweck den Befehl ausführen, um das Makro als erste Anweisung in meinem Code auszuführen und dann die Makros unter dem Befehl zu definieren?

Danke!

Antwort

3

Zuerst müssen Sie ein Makro definieren, bevor es aufgerufen wird.

Zweitens ist es egal, wo das Makro aufgerufen wird, solange Sie es zuvor geladen haben.

Um Ihr Problem zu vertiefen: Die Autocall-Bibliothek ist dein Freund. Wenn Sie SAS-Administrator nicht zulassen, werden Sie Ihre Makros in der Autocall Bibliothek setzen, können Sie die Autocall wie so anhängen:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/ 

options sasautos=(sasautos mymacros) mautosource; 
+0

Technisch gesehen lädt die Autocall-Bibliothek keine Makros 'vorhand'. Wenn der Benutzer versucht, ein Makro auszuführen, und dieser Makro noch nicht definiert wurde, sucht SAS in der Autocall-Bibliothek danach. Wenn es einen Dateinamen gefunden hat, der dem Aufruf entspricht und diese Datei einen Makronamen enthält, der dem Aufruf entspricht, wird das Makro nur dann kompiliert. Wenn Sie dann Änderungen an dieser Datei in der AutoCAD-Bibliothek vornehmen, müssen Sie den Code erneut manuell einreichen, damit diese Änderungen in einer interaktiven SAS-Sitzung verfügbar werden. –

1

Sie müssen ein Makro vor dem Aufruf definieren, damit die Zeile mit "% A" der Definition von Makro A folgen muss. Die Reihenfolge der anderen Makrodefinitionen spielt keine Rolle, solange sie vorher definiert sind Sie heißen. Normalerweise richte ich in meinen Programmen ein Hauptmakro ein, wie du es beschreibst, dann ruft die letzte Zeile des Programms dieses Makro auf.

Eine andere Option, die in Betracht gezogen werden sollte, besteht darin, eine Makro-Autocall-Bibliothek einzurichten, die die Definitionen vieler Makros enthält. Dies funktioniert am besten für wiederverwendbare Makros, sodass Sie sie nicht in jedem Programm neu definieren müssen.

3

ein Makro definiert werden muss, bevor sie aufgerufen wird. Aus Performancegründen ist es am besten, kein Makro innerhalb eines anderen zu definieren. Wenn Sie dies tun, wird es jedes Mal neu definiert, wenn Sie das äußere Makro aufrufen. die folgenden Werke fein:

%macro a; 
    %put a; 
    %b 
%mend a; 

%macro b; 
    %put b; 
    %c 
%mend b; 

%macro c; 
    %put c; 
%mend c; 

%*-- %a is main --*; 
%a 
/* on log 
a 
b 
c 
*/ 
0

Es gibt zwei Aspekte der Makrocode in SAS definiert werden: der Makrocode, und die Makroparameter zusammengestellt wird:

Makrocode:

Die Der Makrocode selbst ist sehr einfach, wenn das Token %macro gefunden wird, beginnt das SAS-System ein SAS-Makro zu kompilieren und kompiliert weiter, bis es ein %mend Token erreicht. Die einzigen wirklichen Probleme, denen Sie begegnen können, sind, wenn Sie den Makro-Code aktualisieren und ihn nicht erneut kompilieren, bevor Sie ihn ausführen - in diesen Situationen wird immer noch die alte Version ausgeführt, die er in der Makro-Bibliothek hat. Wenn Sie versuchen, ein Makro zu kompilieren, das ein anderes Makro aufruft, das noch nicht definiert wurde, erhalten Sie eine Fehlermeldung. Aus diesen Gründen müssen sie in der Reihenfolge programmiert werden, in dem sie aufgerufen werden (wie im folgenden Beispiel gezeigt:% level3 kommt vor% Level2, die vor% ebenen1 kommt)

Makrovariablen: Wenn Makro definiert, Variablen gibt es zwei Bereiche: Global und Lokal. Einmal definiert, kann auf globale Variablen überall und zu jeder Zeit zugegriffen werden. Lokale Variablen existieren jedoch nur lokal während der Ausführung des Makros, in dem sie definiert wurde.Durch die Erweiterung, wenn das Makro, wo die lokale Variable definiert wurde, alle anderen Makros aufruft, wird die lokale Makrovariable noch zugänglich sein:

Arbeitsbeispiel:

Im folgenden Beispiel sind die Makros definiert In umgekehrter Reihenfolge zu verhindern, dass SAS einen Appellent Aufruf von Makro Warnung zurückgibt.

Das Diagramm unten zeigt die Struktur der folgenden Makros in dem folgenden Beispiel:

|-----------------------------| 
|GLOBAL      | 
| |------------------------| | 
| |LEVEL1     | | 
| | |-------------------| | | 
| | |LEVEL2    | | | 
| | | |--------------| | | | 
| | | | LEVEL3  | | | | 
| | | |--------------| | | | 
| | |-------------------| | | 
| |------------------------| | 
|-----------------------------| 

Kompilieren die verschachtelten Makros:

%macro level3 ; 
    %put **** START LEVEL3 **** ; 
    %local G1; 
    %let G1=Local ; 

    %do i=1 %to 2 ; 
    %put In the macro do loop I=&i ; 
    %end ; 

    %put The value of I at level3 is: &I ; 
    %put Are we accessing global or local G1 variable here: &G1 ; 

    %put **** END LEVEL3 ****; 
%mend level3 ; 


%macro level2 ; 
    %put **** START LEVEL2 **** ; 
    %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ; 

    %put Are we accessing global or local G1 variable here: &G1 ; 
    %put Can we access local variables here: &L1 ; 

    %level3 ; 

    %put The value of I in level2 is: &I ; 
    %put **** END LEVEL2 ****; 
%mend level2 ; 

Kompilieren der Top-Level-Makro (die die oben wiederum ruft zwei Makros) und führen Sie es aus:

%let G1=Global; 
%macro level1 ; 
    %put **** START LEVEL1 **** ; 
    %let L1=Yes; 

    %put Are we accessing global or local G1 variable here: &G1 ; 
    %put Can we access local variables here: &L1 ; 

    %level2 ; 

    %put The value of I outside of the local macro is: &I ; 
    %put Are we accessing global or local G1 variable here: &G1 ; 

    %put **** END LEVEL1 ****; 
%mend level1 ; 
%level1 ; 

Punkte zu beachten, wenn th e log:

  • Außerhalb% level3, kehrt & ich eine Warnung, dass die Makrovariable nicht existiert nicht
  • Innerhalb% level3, wenn & G1 bezeichnet wird, wird der Wert in der lokalen Bereich gespeichert zurück von% level3.Once außerhalb von% level3 gibt der Wert auf den global gespeicherten Wert zurück.