2017-02-02 5 views
0

Die Notwendigkeit Bewertung eines Makrovariablen außerhalb datastep auszuführen ist und in Abhängigkeit von der Existenz der Variablen, führen Einfügen:Eingangswert Wenn Makrovariable existiert sonst einen anderen Wert

data my_dataSet; 
set ... 
.... 
if %SYMEXIST(Variable_from_prior_code) = 1 then do; 

    dataset_variable = &Variable_from_prior_code.; 

    end; 
else do; 

    dataset_variable = &Some_default_value_from_prior_code; 

end; 

Dies ist jedoch bei Compiler schlägt fehl wenn versucht wird, es als "Scheinbare symbolische Referenz & Variable_from_prior_code" auszuführen. wurde nicht gelöst. Ie. Der Compiler überprüft den Inhalt der if-Anweisung, auch wenn die Bedingung nicht erfüllt ist.

kam ich mit dummer Behelfslösung up: dieses von entgegengesetzter directon zu nähern, fühle mich aber dümmer als Tasche von Dachsen:

if %SYMEXIST(Variable_from_prior_code) = 0 then do; 

    dataset_variable = &Some_default_value_from_prior_code 

    %let Variable_from_prior_code=0; /*Dummy value*/ 

    end; 
else do; 

    dataset_variable = &Variable_from_prior_code.; 

end; 

irgendeine Weise der Compiler aus der Auswertung Inhalt zu beschränken, die es shouldn‘ t aufgrund der Verfassung? Oder alternativ, elegantere Work-around, die keine Erstellung der Variablen erfordern?

+1

Sie vermischen Makrologik (verwendet, um Code zu generieren) und Datenschrittlogik. Wenn Sie Ihren Code in ein Makro einfügen, können Sie% IF verwenden, um den Code bedingt zu generieren. – Tom

Antwort

1

Ich würde sagen, vermeiden Sie Makro-Logik, wenn nicht notwendig! Hier ist ein reiner Datenschrittansatz:

%symdel Variable_from_prior_code; /* make sure variable does not exist */ 
%let Some_default_value=test; /* populate macro variable */ 

data my_dataSet; 
    if SYMEXIST('Variable_from_prior_code') = 1 then do; /* use data step function */ 
    /* note variable name is quoted, else would reference a data step variable value */ 
    dataset_variable = symget('Variable_from_prior_code'); 
    end; 
    else do; 
    /* had to shorten this name to less than max allowed 32 chars */ 
    dataset_variable = symget('Some_default_value'); 
    end; 
run; 

Wie Tom erwähnt, vermischen Sie gerade Makro- und Datenschrittlogik. Makro wird verwendet, um einen Datenschrittcode zu schreiben (ist also im Wesentlichen ein Programmgenerator), und dieser resultierende Datenschrittcode wird ausgeführt, lange nachdem die Makroanweisungen kompiliert/aufgelöst/ausgeführt wurden.

+0

symget hat den Trick gemacht. Getestet und bestätigt zu arbeiten. Einverstanden. Makro Logik ist schlecht Juju. Das Bedürfnis ist jedoch so wie es ist. :((Zum Zusammenführen zweier Legacy-Workflows und der Berechtigung, nur ausgewählte Dateien zu bearbeiten.') – pinegulf

Verwandte Themen