我正在尝试在SAS CI上调用MACRO(使用节点进程),但是在尝试执行时收到一条错误消息(1012或3000)。该代码在SAS Enterprise Guide上运行完美。
我尝试删除“调用执行”语法,但未成功。
DATA _NULL_ ;
SET SMS_TEMP END = EOF ;
IF _N_ = 1 THEN DO UNTIL (EOF);
%build_JSON;
END ;
PUT 'Complete';
STOP ;
RUN ;
完整代码:
DATA _NULL_ ;
SET SMS_TEMP END = EOF ;
IF _N_ = 1 THEN DO UNTIL (EOF);
CALL EXECUTE('%build_JSON');
END ;
PUT 'FINAL';
STOP ;
RUN ;
%macro build_JSON;
FILENAME CODE TEMP;
DATA _NULL_;
SET SMS_TEMP;
FILE CODE ;
PUT
'WRITE VALUES "TP_SMS" ' CODSMS :$QUOTE. ';'
/ 'WRITE VALUES "NM_REMETENTESMS" ' REMETENTE :$QUOTE. ';'
/ 'WRITE VALUES "NR_TELEFONECELULARSMS" ' MOBILE :$QUOTE. ';'
/ 'WRITE VALUES "TX_MENSAGEMSMS" ' MSGTEXT :$QUOTE. ';'
/ 'WRITE VALUES "DT_PARAENVIOSMS" ' DATAPARA :$QUOTE. ';'
/ 'WRITE VALUES "DT_LIMITEENVIOSMS" ' DATALIMI :$QUOTE. ';'
/ 'WRITE VALUES "DS_CHAVEORIGEMSMS" ' RESP :$QUOTE. ';'
;
RUN;
PROC JSON OUT="%SYSFUNC(GETOPTION(WORK))/TEST.JSON" PRETTY KEYS NOSASTAGS;
WRITE OPEN OBJECT;
%INCLUDE CODE;
WRITE CLOSE;
RUN;
FILENAME CODE CLEAR;
%MEND build_JSON;
我希望使用SAS CI上的宏(在节点进程上使用SAS代码)。
我该怎么办?
我将尝试确切解释我需要什么:我有一个数据集,我需要为我的数据集中的每一行创建一个JSON文件。之后,我将使用API流程调用另一个宏。我的循环应该是:读取(1),创建JSON文件(2),执行API宏(3)。排除文件(json),然后查找下一个寄存器;
答案 0 :(得分:0)
首先请确保定义宏,然后再调用它。
第二,您的宏每次都在做相同的事情,因此没有多次调用的感觉。
那为什么要一个宏呢?为什么不只调用宏生成的代码?
或者您想定义宏以接受输入参数?如将数据集的名称转换为JSON?如果是这样,数据集列表将来自哪里?
请注意,您的第一步无法执行,因为您的宏会生成多个步骤。生成的第一个PROC或DATA语句将在DO / END块定义的中间结束数据步骤,因此它将失败,因为SAS永远不会看到打开的DO的结束END。
答案 1 :(得分:0)
我在代码中做了一些调整:
DATA _NULL_ ;
IF _N_ = 1 THEN DO UNTIL (EOF);
SET SMS_TEMP END = EOF ;
PUT 'Number line:' NumbLINE;
CALL SYMPUTX('NRL',NumbLINE);
CALL SYMPUTX('RESPTRACKING',RESP);
CALL EXECUTE('%BUILD_JSON');
/*CALL EXECUTE('%CALLAPI'); --- In dev*/
/*CALL EXECUTE('%DELETEFILE'); --- In dev*/
END ;
ELSE DO;
PUT 'FINISH';
END;
RUN ;
上面的代码负责一次调用我所有的MACROS,直到文件结束。
%MACRO BUILD_JSON;
FILENAME CODE TEMP;
DATA _NULL_;
SET SMS_TEMP;
WHERE NROLINHA EQ &NRL.;
FILE CODE ;
PUT
'WRITE VALUES "PITP_SMS" ' CODSMS :$QUOTE. ';'
/ 'WRITE VALUES "PINM_REMETENTESMS" ' REMETENTE :$QUOTE. ';'
/ 'WRITE VALUES "PINR_TELEFONECELULARSMS" ' MOBILE :$QUOTE. ';'
/ 'WRITE VALUES "PITX_MENSAGEMSMS" ' MSGTEXT :$QUOTE. ';'
/ 'WRITE VALUES "PIDT_PARAENVIOSMS" ' DATAPARA :$QUOTE. ';'
/ 'WRITE VALUES "PIDT_LIMITEENVIOSMS" ' DATALIMI :$QUOTE. ';'
/ 'WRITE VALUES "PIDS_CHAVEORIGEMSMS" ' RESP :$QUOTE. ';'
;
RUN;
PROC JSON OUT="%SYSFUNC(GETOPTION(WORK))/TEST.JSON" PRETTY KEYS NOSASTAGS;
WRITE OPEN OBJECT;
%INCLUDE CODE;
WRITE CLOSE;
RUN;
FILENAME CODE CLEAR;
%MEND BUILD_JSON;
我希望创建一个例程来创建JSON文件->然后->调用API宏以发送此JSON->然后->排除此文件->然后->重复。对于数据集的每一行,我将其称为循环过程,至少在《 SAS企业指南》中,它看起来同样有效。
仅当我尝试在经过过程节点的SAS客户智能(CI)上执行此代码时,才会出现此问题。
答案 2 :(得分:0)
从CALL EXECUTE
调用宏时,它将立即执行直到发生代码生成为止。这会使该功能的新手感到困惑,并具有在文档和会议论文中讨论的副作用。
要明确地显示 stack 宏调用语句,使其仅在步骤完成后出现,EXECUTE
应使用%NRSTR
包装宏调用的参数。
call execute ('%NRSTR(
调用宏的源代码 )');