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 ;