【发布时间】:2016-01-29 09:39:38
【问题描述】:
我有以下在宏内运行的代码。当它以交互模式运行时,它运行得非常好,没有错误或警告。过去两年就是这样。
相同的代码现在已以批处理模式部署,它会生成警告WARNING: Apparent symbolic reference FIRSTRECCOUNT not resolved.,并且没有为宏变量分配值。
我的问题是,有人知道为什么批处理模式和交互模式的行为会有所不同吗?
这里有更多信息:
正在创建数据集,它位于工作库中。
数据集确实通过数据步骤打开。
- `firstreccount' 不会在程序的其他任何地方初始化
- 我有搜索 sas 社区。有一个主题here,但我在批处理初始化中没有与答案中描述的相同的错误。
- warning 上的详细信息,但没有说明它可以在交互模式下工作,但不能在批处理模式下工作。
.
1735 %LET FIRSTSET = work.dataset1;
1744 DATA _NULL_;
1745 IF 0 THEN
1746 SET &FIRSTSET NOBS=X;
1747 CALL SYMPUT('FIRSTRECCOUNT' ,X);
1748 STOP;
1749 RUN;
1755 DATA _NULL_;
1756 IF 0 THEN
1757 SET &SECONDSET NOBS=X;
1758 CALL SYMPUT('SECONDRECOUNT' ,X);
1759 STOP;
1760 RUN;
WARNING: Apparent symbolic reference FIRSTRECCOUNT not resolved.
更新:
因此,我尝试通过将带有警告的代码复制到单独的计划流程中来复制错误,但它根本没有导致任何错误。
顺便说一句,最初的工作是从 SAS DI 工作室部署的。我检查了用户编写的代码节点中的所有行,并确保长度在@RawFocus、@RobertPentridge 推荐的 80 个字符以内,但它没有解决问题。 正如@data_null_ 推荐的那样,我已经检查了 VALIDVARNAME,它在交互模式(“any”的值)和批处理模式(“V7”的值)之间是不同的,但改变这些并没有任何区别。
我重写了逻辑,通过调用attr 来获取开放数据集的观察次数。这消除了警告,但程序仍然会失败,警告在不同的地方弹出。这让我觉得罗伯特·帕特里奇是正确的。同时,我得到一个宏没有被解析的错误。 DI工作室插入了宏来收集性能MI,即使该工作并不意味着收集MI。这让我觉得 SAS DI studio 在部署时没有正确生成代码,所以我手动编辑了部署的代码以删除有问题的宏调用,我还发现有一行带有 MD5 函数的代码在一行上太长了因为传递给它的参数很多,所以我插入了一些空格。最后问题解决了!!
我仍然需要对这项工作做点什么,因为当它从 SAS DI 重新部署时,它会再次产生相同的错误。我现在没有时间进一步研究这个问题。
结论:您在 SAS DI 中编写的内容与部署的内容可能略有不同,这可能导致语法解析在随机位置抛出错误。所以我会将罗伯特的答案标记为正确,因为它让我更接近于解决问题,而不是任何其他答案。
【问题讨论】:
-
对我来说没有意义。我会加上“这条线跑了”;紧接在 STOP 语句之前,以确保执行调用符号。并添加 %put >>&firstreccount
-
添加 symbolgen 和 mprint 并发布日志。典型的错误是行长度太长,但您的代码中没有任何内容显得太长,256 是限制。你是如何批量执行的?与交互式用户 ID 相同?
-
&SECONDSET 的值是多少? SASLOG 第 1750-1754 行是什么?显示更多 LOG,不要编辑它。
-
你试过
call symputx('FIRSTRECCOUNT', X, 'G')吗?也许它出于某种原因将宏存储在本地符号表中。这至少可以排除这个问题。 -
@Quentin 我花了一段时间,但我已经用我的发现更新了我的问题。这与 SAS DI studio 在部署时如何更改代码有关。