ЕСЛИ C ошибка броска функции в операторе IN - PullRequest
0 голосов
/ 30 апреля 2020

Кто-нибудь сталкивался с приведенной ниже ошибкой:

options symbolgen mprint mlogic minoperator;
%macro test /minoperator mindelimiter=',';
%let var1 = EXPORT;
%if &var1 in (EXPORT, TEST,TEST1) %then %let var_final1=1;
%put &=var_final1.;
%let var_final2 = %sysfunc(ifc(&var1= EXPORT,1,2));
%put &=var_final2;
%let var_final3 = %sysfunc(ifc(&var1 in (EXPORT, TEST,TEST1),1,2));
%put &var_final3;
%mend;
%test;

var_final1 и var_final2 работают нормально, тогда как для var_final3, где мы имеем функцию c, я получаю следующую ошибку:

ERROR: Argument 1 to function IFC referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number.
ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC argument list.  Execution of %SYSCALL statement or %SYSFUNC 
       or %QSYSFUNC function reference is terminated.

Не уверен, почему оператор IN не работает с функциями IF C или IFN?

Может кто-нибудь предложить, пожалуйста.

Спасибо

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Это очень сложная работа% SYSFUN C (). Он должен выяснить, как преобразовать ваш макрос-текст в переменные / выражения, которые он может передать функции, которую он пытается вызвать. В этом случае он не может понять оператор IN. Возможно, он не знает о параметре MINOPERATOR.

Вы можете исправить это, упростив проблему, добавив явный вызов к %EVAL(), чтобы все, что нужно передать функции IFN (), было результирующий ноль или единица.

%let var_final3 = %sysfunc(ifc(%eval(&var1 in (EXPORT, TEST,TEST1)),1,2));
0 голосов
/ 30 апреля 2020

Я думаю, вам просто нужно вычислить выражение «in», чтобы функция ifn или if c воспринимала его как логическое значение:

options symbolgen mprint mlogic minoperator;
%macro test /minoperator mindelimiter=',';
%let var1 = EXPORT;
%if &var1 in (EXPORT, TEST,TEST1) %then %let var_final1=1;
%put &=var_final1.;
%let var_final2 = %sysfunc(ifc(&var1= EXPORT,1,2));
%put &=var_final2;
%let var_final3 = %sysfunc(ifc(%eval(&var1 in (EXPORT, TEST,TEST1)),1,2));
%put &var_final3;
%mend;
%test;
...