【问题标题】:How to use "Call Execute Macros" on SAS Customer Intelligence如何在 SAS Customer Intelligence 上使用“调用执行宏”
【发布时间】:2019-10-09 02:37:13
【问题描述】:

我正在尝试在 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)。排除文件out(json),查找下一个寄存器;

【问题讨论】:

  • 调用前需要先定义宏。
  • 您只展示了第二步的部分代码,即从数据集创建 JSON 文件。您打算如何处理 JSON 文件?你用它做什么会产生你需要聚合的任何输出吗?

标签: sas


【解决方案1】:

当从CALL EXECUTE 调用宏时,它会立即执行到代码生成点。这可能会使该功能的新手用户感到困惑,并且在文档和会议论文中讨论了副作用。

要显式stack宏调用语句以便它们仅在步骤完成后发生,EXECUTE 应使用%NRSTR 包装宏调用的参数。

call execute ('%NRSTR(调用宏的源代码)');

【讨论】:

    【解决方案2】:

    首先确保在调用宏之前定义它。

    其次,你的宏每次都在做同样的事情,所以它多次调用是没有意义的。

    那么为什么要有一个宏呢?为什么不直接调用宏生成的代码呢?

    或者你想定义你的宏来接受一个输入参数?比如要转换成 JSON 的数据集名称?如果是这样,数据集列表将来自哪里?

    请注意,您的第一步无法执行,因为您的宏会生成多个步骤。生成的第一个 PROC 或 DATA 语句将在 DO/END 块的定义中间结束您的数据步骤,因此它将失败,因为 SAS 永远不会看到打开 DO 的结束 END。

    【讨论】:

    • 嗨,汤姆,你是对的。我将尝试准确解释我需要什么:我有一个数据集,我需要为我的数据集中的每一行创建一个 JSON 文件。之后我将使用 API 进程调用另一个宏。我的循环应该是:读取 (1),创建 JSON 文件 (2),执行 API 宏 (3)。排除文件out(json),查找下一个寄存器;
    • 您对循环的内容感到困惑。您的外部数据步骤正在读取 SMP_TEMP,但您正在写入 JSON 数据的数据步骤正在为 SMS_TEMP 数据集中的每个观察结果生成一系列 WRITE 语句。你只是想让它写一个观察结果吗?你想让它写出对于某个 ID 变量的某个特定值存在的所有观察结果吗?
    • 嗨,汤姆,非常感谢您的关注和时间。我在下面发布了一个新答案,我在其中向您展示了一个新代码。您知道我该如何解决吗?
    【解决方案3】:

    我对我的代码做了一些调整:

    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 ;
    

    上面的这段代码负责一一调用我所有的宏,直到文件结束。

    %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 Enterprise Guide 上运行良好。

    当我尝试在 SAS 客户智能 (CI) 上执行此代码时,就会出现此问题。

    【讨论】:

    • 现在您已经引入了在使用 CALL SYMPUTX() 设置宏变量和宏运行之间的时间问题。将值作为参数传递给宏而不是全局宏变量,时间问题就会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多