Sas 宏变量:未解析明显的符号引用
我对以下(部分)宏中的未解析宏变量有问题: 我收到以下警告Sas 宏变量:未解析明显的符号引用,sas,sas-macro,Sas,Sas Macro,我对以下(部分)宏中的未解析宏变量有问题: 我收到以下警告 Apparent symbolic reference FORMATVALUESM not resolved. 如果我查看日志,&DataCollectionFK已解决,但&FormatValues未解决 PROC FORMAT LIB=WORK; VALUE DC170A570Format &FormatValuesM; 有人能给我一些建议吗?它快把我逼疯了 我也在没有STRIP()函数的情况下测试了它,并将调用SYMPU
Apparent symbolic reference FORMATVALUESM not resolved.
如果我查看日志,&DataCollectionFK已解决,但&FormatValues未解决
PROC FORMAT LIB=WORK; VALUE DC170A570Format &FormatValuesM;
有人能给我一些建议吗?它快把我逼疯了
我也在没有STRIP()函数的情况下测试了它,并将调用SYMPUT替换为PUT,以查看是否为变量赋值。这一切都很好
日志副本(根据评论中的要求)
打印日志
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;
使用其他一些尝试进行编辑:
问题在于,由于某种原因,宏变量在datastep期间没有获得值。在运行宏之前,加载带有空值的宏变量会使
脚本没有给出错误。但该变量被解析为空变量
删除IF Last-THEN部分也不会改变结果。使用
PROC FORMAT
的cntlin=
选项传递包含相关格式名称、开始、结束、标签值的数据集肯定会更容易/更简单
一个简单的例子
/* 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 ;
/*创建虚拟格式数据*/
数据格式;
fmtname='MYCHARFMT';
类型='C';
do n1=‘A’、‘B’、‘C’、‘D’、‘E’;
开始=n1;
标签=重复(n1,5);
产出;
结束;
fmtname='MYNUMFMT';
类型='N';
do n2=1至5;
启动=n2;
标签=重复(条带(n2),5);
产出;
结束;
滴注n1和n2;
跑
/*虚拟数据看起来像这样*/
fmtname类型起始标签
MYCHARFMT C A AAAAA
MYCHARFMT C B BBBBBB
MYCHARFMT C CCCC
MYCHARFMT C D DDDD
MYCHARFMT C E Eeeee
MYNUMFMT N 111111
MYNUMFMT N 2 22222
MYNUMFMT N 333333
MYNUMFMT N 4 4444
MYNUMFMT N 5 555555
/*从数据集生成格式*/
proc format cntlin=格式库=工作;跑
可以在格式数据集中定义其他几个字段,以适应低/高/缺失值、范围等
请参阅SAS文档>我无法重新创建错误。你能发布与数据步骤相关的日志吗?谢谢你的帮助。我按照你的要求添加了日志@mjsqu
错误在哪里消失了?!错误显示在这些块的上方。执行宏的次数相同。正如您在日志中看到的,行PROC FORMAT LIB=WORK;值DC170A1483格式和格式VALUESM;运行代码>宏变量之一未解析。所以格式是空的。你能用OPTIONS MPRINT代码>打开了吗?日志中的行不一定包含&FormatValuesM
的值,除非该选项处于启用状态。我不知道这个选项。。。我一定会进一步研究这个问题。我仍然不明白为什么我的宏不工作。我只是不担心它。你的代码并不是一个很好的方法;您的宏可能出了问题(可能是范围界定问题,也可能是您的问题中未包含的其他问题)。尽管这个答案没有回答这个问题,但它给出了一个更好的建议。谢谢你理解了这个计划,并为我指出了一个更好的方向。它就像一个符咒!
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;
/* 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 ;