sas - 宏变量: Apparent symbolic reference not resolved

标签 sas sas-macro

我在以下(部分)宏中遇到未解析的宏变量的问题:

DATA _NULL_;
  SET TempVarFormat END=Last;
  LENGTH FormatValues $10000;
  RETAIN FormatValues;
  IF &OnlyNumeric = 1 THEN
    FormatValues = CATX(" ",FormatValues,STRIP(LookUpValue)||
    " = "||CATQ("A",TRIM(LookupDescription)));
  ELSE
    FormatValues = CATX(" ",FormatValues,CATQ("A"
    ,LookUpValue)||" = "||CATQ("A"
    ,TRIM(LookupDescription)));
  Test = STRIP(FormatValues);
  PUT Test /* To test buildup of variable */;
  IF Last THEN CALL SYMPUT('FormatValuesM',STRIP(FormatValues));
  IF Last THEN CALL SYMPUT('DataCollectionFK',DataCollectionFK);
RUN;
/* Make format with PROC FORMAT*/
%IF &OnlyNumeric = 1 %THEN %DO;
  PROC FORMAT LIB=WORK;
  VALUE DC&DataCollectionFK.A&AttributeFK.Format &FormatValuesM;
  RUN;
%END;
%ELSE %IF &OnlyNumeric = 0 %THEN %DO;
  PROC FORMAT LIB=WORK;
  VALUE $DC&DataCollectionFK.A&AttributeFK.Format &FormatValuesM;
  RUN;
%END;

我收到以下警告

Apparent symbolic reference FORMATVALUESM not resolved.

如果我查看日志 &DataCollectionFK 已解决,但 &FormatValues 未解决

PROC FORMAT LIB=WORK; VALUE DC170A570Format &FormatValuesM;

有人可以建议吗?这让我发疯。

我也在没有 STRIP() 函数的情况下测试了它,并将 CALL SYMPUT 替换为 PUT 以查看变量是否已分配值。这一切都运行良好。

日志副本(根据评论中的要求)

4         +
      DATA _NULL_; SET TempVarFormat END=Last; LENGTH

5         + FormatValues $10000; RETAIN FormatValues; IF 1 = 1 THEN FormatValues = CATX(" 
",FormatValues,STRIP(LookUpValue)|| " = "||CATQ("A",TRIM(LookupDescription))); ELSE 
FormatValues = CATX(" ",FormatValues,CATQ("A" ,LookUpValue)||" = "||CATQ("A" ,TRIM
6         +(LookupDescription))); Test = STRIP(FormatValues); PUT Test ; IF Last THEN CALL 
SYMPUT('DataCollectionFK',DataCollectionFK); IF Last THEN CALL SYMPUT('FormatValuesM',Test); 
RUN;

NOTE: Numeric values have been converted to character values at the places given by: 
      (Line):(Column).
      6:107   
1 = "Ja"
1 = "Ja" 0 = "Nee"
NOTE: There were 2 observations read from the data set WORK.TEMPVARFORMAT.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

6         +
        PROC FORMAT LIB=WORK;  VALUE DC170A1483Format &FormatValuesM;  RUN;;

NOTE: Format DC170A1483FORMAT is already on the library.
NOTE: Format DC170A1483FORMAT has been output.
NOTE: PROCEDURE FORMAT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

打印日志

MPRINT(CONSTRUCTVARIABLEFORMAT):   DATA TestDataSetFormat;
MPRINT(CONSTRUCTVARIABLEFORMAT):   SET TempVarFormat END=Last;
MPRINT(CONSTRUCTVARIABLEFORMAT):   LENGTH FormatValues $10000;
MPRINT(CONSTRUCTVARIABLEFORMAT):   RETAIN FormatValues;
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF 1 = 1 THEN FormatValues = CATX(" 
",FormatValues,STRIP(LookUpValue)|| " = "||CATQ("A",TRIM(LookupDescription)));
MPRINT(CONSTRUCTVARIABLEFORMAT):   ELSE FormatValues = CATX(" ",FormatValues,CATQ("A" 
,LookUpValue)||" = "||CATQ("A" ,TRIM(LookupDescription)));
MPRINT(CONSTRUCTVARIABLEFORMAT):   Test = STRIP(FormatValues);
MPRINT(CONSTRUCTVARIABLEFORMAT):   PUT Test ;
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF Last THEN CALL 
SYMPUT('DataCollectionFK',DataCollectionFK);
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF Last THEN CALL SYMPUT('FormatValuesM',Test);
MPRINT(CONSTRUCTVARIABLEFORMAT):   RUN;
MPRINT(CONSTRUCTVARIABLEFORMAT):   PROC FORMAT LIB=WORK;
WARNING: Apparent symbolic reference FORMATVALUESM not resolved.
MPRINT(CONSTRUCTVARIABLEFORMAT):   VALUE DC170A1483Format &FormatValuesM;
MPRINT(CONSTRUCTVARIABLEFORMAT):   RUN;

编辑更多尝试: 问题在于,由于某种原因,宏变量在数据步骤期间没有获取值。在运行宏之前用空值加载宏变量,使得 该脚本不会给出错误。但该变量被解析为空变量。

删除 IF Last THEN 部分也不会改变结果。

最佳答案

当然,使用PROC FORMATcntlin=选项来传递包含相关格式名称、开始、结束、标签的数据集会更容易/更简单值(value)观...

一个简单的例子...

/* Create dummy format data */
data formats ;
  fmtname = 'MYCHARFMT' ;
  type = 'C' ;
  do n1 = 'A','B','C','D','E' ;
    start = n1 ;
    label = repeat(n1,5) ;
    output ;
  end ;
  fmtname = 'MYNUMFMT' ;
  type = 'N' ;
  do n2 = 1 to 5 ;
    start = n2 ;
    label = repeat(strip(n2),5) ;
    output ;
  end ;
  drop n1 n2 ;
run ;

/* dummy data looks like this... */
 fmtname     type    start    label

MYCHARFMT     C        A      AAAAAA
MYCHARFMT     C        B      BBBBBB
MYCHARFMT     C        C      CCCCCC
MYCHARFMT     C        D      DDDDDD
MYCHARFMT     C        E      EEEEEE
MYNUMFMT      N        1      111111
MYNUMFMT      N        2      222222
MYNUMFMT      N        3      333333
MYNUMFMT      N        4      444444
MYNUMFMT      N        5      555555

/* Build formats from dataset */
proc format cntlin=formats library=work ; run ;

还可以在格式数据集中定义其他几个字段,以满足低/高/缺失值、范围等的要求。

请参阅 SAS 文档 > http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002473464.htm

关于sas - 宏变量: Apparent symbolic reference not resolved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23537763/

相关文章:

sas - 使用经度和纬度获取国家/地区

sas - 在SAS中制作目录(Windows)

sas - 如何在 SAS 中将条件作为宏参数传递

sas - 从SAS中的字符串中删除单引号

sas - 在 SAS 中组合和合并行

适用于 Microsoft Office (AMO) 的 Excel 加载项 - 使用 VBA 删除存储过程对象和保留值

datetime - SAS 将字符串转换为日期时间

sql - 在 SAS 的 Proc SQL 中使用宏变量

sas - 如何计算 SAS 中宏变量的数据类型

sas - 在 SAS 数据集成中,创建用户编写的转换以在某些条件成立时跳过进一步的作业执行而不会给出错误