特定のマクロ変数が存在しないか存在しないかをチェックする単純なマクロを作成しようとしています。通常、これには2つのステートメント(%symexist
)が必要です。存在する場合は、それがヌル値であるかどうかを検出する追加のロジックです。以下のコードは、そのすべてを1つにまとめたものです。一貫性のないマクロ変数データ型
%macro isnull(macvar);
%sysevalf(%superq(%superq(macvar)) NE %str(), boolean);
%mend isnull;
問題
戻り値は常に文字のようですので、私は、%if
文で%isNull()
を使用することはできません。この動作は、オープンコード内またはマクロ内にある場合には異なります。私は
を試してみた何
私は数値として解決していないマクロにそれを絞り込むました。私は%sysfunc(putn())
〜%cmpres()
〜%sysfunc(compress())
でそれを囲むことからすべてを試しました。オープンコードの場合は数値です。それが別のマクロにある場合、それは文字です。あなたは、このコードでそれを見ることができます:
/* Miss2 resolves incorrectly as character */
%macro check;
%let miss1=%sysevalf(%superq(asdf) =, boolean);
%let miss2=%isNull(asdf);
%put Miss1: %datatyp(&miss1);
%put Miss2: %datatyp(&miss2);
%mend;
%check;
/* Miss2 resolves correctly as numeric */
%let miss1=%sysevalf(%superq(asdf) =, boolean);
%let miss2=%isNull(asdf);
%put Miss1: %datatyp(&miss1);
%put Miss2: %datatyp(&miss2);
私はマクロが存在し、同時にブランクではないの両方かどうかを確認するために%if
文でこれを使用することができるようにしたい
をしたいです。
%macro foo;
%if(%isNull(sysuserid) = 1) %then %put sysuserid exists;
%if(%isNull(asdffdsa) = 0) %then %put asdffdsa does not exist;
%if(%isNull(sysuserid) > 0) %then %put this should resolve;
%if(%isNull(asdffdsa) > 0) %then %put this should not resolve;
%mend;
%foo;
これを見ても間違いから始めると、マクロ変数には 'タイプ'がありません。それらは_all_テキストです。 – Joe
%MISSM()を関数であるかのように扱いたい場合は、セミコロンを生成できません!! – Tom