Format sas格式并非总是由宏创建,语法检查失败

Format sas格式并非总是由宏创建,语法检查失败,format,sas,sas-macro,Format,Sas,Sas Macro,我有一个sas宏,如果满足某些条件,它将创建一个用户定义的格式,稍后在宏中使用。但是,并不总是创建此用户格式。因此,当sas在调用宏时验证语法时,它会出错,因为当不满足条件时,用户定义的格式未知。使用用户定义格式的语句包装在if条件中,该条件尚未满足,但宏仍有错误 任何克服这个问题的建议都得到了广泛的接受。解决这个问题的一个好方法是在条件创建之前创建一个实际上什么都不做的伪格式。这样,您就可以防止错误 %macro fizz_buzz(format=0); *Format that does n

我有一个sas宏,如果满足某些条件,它将创建一个用户定义的格式,稍后在宏中使用。但是,并不总是创建此用户格式。因此,当sas在调用宏时验证语法时,它会出错,因为当不满足条件时,用户定义的格式未知。使用用户定义格式的语句包装在if条件中,该条件尚未满足,但宏仍有错误


任何克服这个问题的建议都得到了广泛的接受。

解决这个问题的一个好方法是在条件创建之前创建一个实际上什么都不做的伪格式。这样,您就可以防止错误

%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);

你所说的
如果
条件是什么意思?SAS将在数据步骤开始执行之前检查其语法。因此,无法通过使用
IF
或类似的执行时间代码来阻止在数据步骤中引用格式。因此,即使IF语句中的条件永远不可能为true,此代码也会生成错误

data bad;
  if 0=1 then format x $1XYZ.;
run;
如果使用宏
%If
语句,以便在宏创建的SAS代码中从不生成对格式的引用,则不应出现任何错误。因此,如果宏生成了类似的数据步骤,并使用
%if
防止宏生成无效的格式名称,则代码将正常运行

data good;
%if (0=1) %then %do;
  format x $1XYZ.;
%end;
run;
很可能您只想使用宏变量来保存格式名称,如果未创建格式,则将其设置为空

data good;
   format x &format_name ;
run;

建议添加说明问题的示例宏。这将澄清您使用的是数据步骤IF还是宏%IF。还将说明其他潜在问题/解决方案。