SAS: Aufruf ein Makro von einer anderen ... Reihenfolge der Makrodefinitionen

StackOverflow https://stackoverflow.com/questions/537283

  •  22-08-2019
  •  | 
  •  

Frage

In meinem Code habe ich mehrere Makros. Makro-A ist das Haupt Makro. Makro A ruft dann Makro B, die wiederum ruft Makro C

In SAS, habe ich sie in nach hinten, um definieren? Mit anderen Worten, muss ich zuerst Makro C definieren, dann Makro B, dann Makro Eine letzte? Oder ist es gleichgültig, da SAS den gesamten Code liest, bevor es tatsächlich trifft den Befehl, um die Makros ausführen? Was das betrifft, kann ich den Befehl des Makros als erste Anweisung in meinem Code und dann definieren die Makros unter dem Befehl auszuführen?

Danke!

War es hilfreich?

Lösung

Zunächst müssen Sie einen Makro definieren, bevor sie aufgerufen wird.

Zweitens spielt es keine Rolle, wo das Makro wie aufgerufen wird, solange Sie es vor Hand geladen haben.

Um auf Ihre Frage zu erarbeiten: Die Autocall Bibliothek dein Freund. Wenn Sie SAS-Administrator nicht zulassen, werden Sie Ihre Makros in der Autocall Bibliothek setzen, können Sie die Autocall wie so anfügen:

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

options sasautos=(sasautos mymacros) mautosource; 

Andere Tipps

hat ein Makro definiert werden, bevor sie aufgerufen wird. Aus Performance-Gründen ist es am besten nicht ein Makro innerhalb eines anderen zu definieren - wenn Sie dies tun, dann wird es jedes Mal, rufen Sie das äußere Makro neu definiert werden. 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
*/

Sie müssen ein Makro definieren, bevor sie aufgerufen wird, so dass die Zeile mit „% A“ müßte die Definition von Makro A. Die Reihenfolge der anderen Makrodefinitionen keine Rolle spielt folgen, solange sie, bevor sie definiert sind, werden genannt. Typischerweise in meinen Programmen setze ich einen Haupt Makro auf wie Sie beschreiben, dann ist die letzte Zeile des Programms ruft das Makro aus.

Eine weitere Möglichkeit zu prüfen, ist ein Makro Autocall Bibliothek einzurichten, die die Definitionen vieler Makros enthält. Dies funktioniert am besten für wiederverwendbares Makros, so dass Sie sie in jedem Programm nicht neu definieren.

Es gibt zwei Aspekte des Makrocode in SAS definiert werden: der Makrocode, und der Makroparameter erstellt wird:

Makrocode:

Der Makrocode selbst ist sehr einfach, dass, wenn das %macro Token das SAS-System mit einem SAS-Makro zu kompilieren beginnt auftritt und hält Kompilieren, bis es eine %mend Token trifft. Die einzigen wirklichen Probleme können Sie stoßen, wenn Sie Makrocode aktualisiert und müssen neu kompiliert wird es nicht vor der Ausführung - in diesen Situationen wird es noch die alte Version führen Sie es in der Makro-Bibliothek hat. Durch die Erweiterung, versuchen, wenn Sie einen Makro zu erstellen, das ein anderes Makro aufruft, die dann definierte nicht schon erhalten Sie eine Fehlermeldung erhalten. Aus diesen Gründen müssen sie in der Reihenfolge programmiert werden, in der sie aufgerufen werden (wie im folgenden Beispiel gezeigt:% level3 bevor% Level2 kommt, die vor% ebenen1 kommt)

Makrovariablen: Bei der Definition von Makro Variablen gibt es zwei Bereiche: Globale und lokale. Einmal definiert, können globale Variablen überall und jederzeit abgerufen werden. Allerdings gibt es lokale Variablen 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 werden die Makros sind in umgekehrter Reihenfolge definiert SAS Rückkehr ein Scheinbare Aufruf von Makro Warnung verhindern.

Das folgende Diagramm zeigt die Struktur der folgenden Makros in dem folgende 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 Sie die Top-Level-Makro (die wiederum die beiden oben genannten Makros ruft) und führen Sie es:

%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 beachten bei der Überprüfung des Protokolls:

  • Außerhalb% level3, & I gibt eine Warnung, dass der Makrovariable tut nicht vorhanden
  • Innerhalb% level3, wenn & G1 aufgerufen wird, gibt sie den Wert gespeichert in der lokale Geltungsbereich% level3.Once außerhalb% level3, den Wert zurückkehrt auf den Wert gespeichert global
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top