2016-04-22 5 views
1

Ich habe ein SAS-Makro, die, wenn bestimmte Bedingungen erfüllt sind, ein benutzerdefiniertes Format erstellt, das später im Makro verwendet wird. Dieses Benutzerformat wird jedoch nicht immer erstellt. Wenn also die Syntax beim Aufruf des Makros überprüft wird, sind Fehler als benutzerdefiniertes Format nicht bekannt, wenn die Bedingung nicht erfüllt ist. Die Anweisung, das benutzerdefinierte Format zu verwenden, wird in eine if-Bedingung eingeschlossen, die nicht erfüllt ist, aber die Makro-Still-Fehler.Sas-Format nicht immer von Makro erstellt fehlschlägt Syntaxüberprüfung

Jeder Rat zur Überwindung dieses Problems wurde sehr gut erhalten.

+2

Vorschlagen Hinzufügen eines Beispielmakros, das Ihr Problem darstellt. Dies würde klären, ob Sie den Datenschritt IF oder Makro% IF verwenden. Erläutert auch andere mögliche Probleme/Lösungen. – Quentin

Antwort

1

Ein guter Weg, um damit fertig zu werden, ist ein Dummy-Format zu erstellen, das vor der bedingten Erstellung gar nichts macht. Auf diese Weise haben Sie etwas, um den Fehler zu verhindern.

%macro fizz_buzz(format=0); 
*Format that does nothing; 
proc format; 
    value FIZZBUZZF 
    other=[best.] 
    ; 
quit; 

*Conditionally created same format; 
%if &format=1 %then %do; 
    proc format; 
    value FIZZBUZZF 
     3,6,9,12='FIZZ' 
     5,10='BUZZ' 
     15='FIZZBUZZ' 
     other=[2.] 
    ; 
    quit; 
%end; 

data _null_; 
    do _i = 1 to 15; 
    put _i fizzbuzzf.; 
    end; 
run; 
%mend fizz_buzz; 

%fizz_buzz(format=0); 
1

Was meinen Sie mit IF Zustand? SAS prüft die Syntax eines DATA-Schritts, bevor es mit der Ausführung beginnt. So kann nicht verhindert werden, dass die Referenz im Datenschritt formatiert wird, indem ein IF oder ein ähnlicher Ausführungszeitcode verwendet wird. Dieser Code erzeugt also einen Fehler, obwohl die Bedingung in der IF-Anweisung niemals wahr sein kann.

data bad; 
    if 0=1 then format x $1XYZ.; 
run; 

Wenn Sie ein Makro %IF Anweisung verwenden, so dass der Verweis auf Format nie in der SAS-Code erzeugt wird, der das Makro erstellt dann sollten Sie keine Fehler haben. Wenn also ein ähnlicher Datenschritt von einem Makro generiert wurde und eine %IF verwendet wurde, um zu verhindern, dass der Makro den ungültigen Formatnamen generiert, wird der Code ohne Fehler ausgeführt.

data good; 
%if (0=1) %then %do; 
    format x $1XYZ.; 
%end; 
run; 

Höchstwahrscheinlich werden Sie wollen einfach nur eine Makrovariable verwenden, um die Formatnamen zu halten und es leer gesetzt, wenn das Format nicht erstellt.

data good; 
    format x &format_name ; 
run; 
Verwandte Themen