如何在SAS Customer Intelligence上使用“调用执行宏”

时间:2019-05-22 14:54:41

标签: sas

我正在尝试在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),然后查找下一个寄存器;

3 个答案:

答案 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( 调用宏的源代码 )');