Как использовать «Вызов макросов выполнения» в SAS Customer Intelligence

Я пытаюсь вызвать MACRO в SAS CI (используя Node Process), но получаю сообщение об ошибке (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 в Node Process).

Как мне это сделать?

Я попытаюсь объяснить, что именно мне нужно: у меня есть набор данных, который мне нужно создать файл JSON для каждой строки из моего набора данных. После я вызову другой макрос с процессом API. Мой цикл должен быть таким: прочитать (1), создать файл JSON (2), выполнить макрос API (3). Исключить файл из (json) и найти следующий регистр;

Вы должны определить макрос, прежде чем вызывать его.

Tom 22.05.2019 19:35

Вы показали только частичный код для второго шага, создания файла JSON из набора данных. Что вы собираетесь делать с файлом JSON? Выдает ли то, что вы с ним делаете, какие-либо результаты, которые вам нужно агрегировать?

Tom 22.05.2019 21:43
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
338
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сначала убедитесь, что вы определили макрос, прежде чем вызывать его.

Во-вторых, ваш макрос каждый раз делает одно и то же, поэтому нет смысла вызывать его несколько раз.

Так зачем вообще макрос? Почему бы просто не вызвать код, который генерирует макрос?

Или, может быть, вы хотите, чтобы ваш макрос принимал входной параметр? Например, имя набора данных для преобразования в JSON? Если да, то откуда будет браться список наборов данных?

Обратите внимание, что ваш первый шаг не может работать, так как ваш макрос генерирует несколько шагов. Первый сгенерированный оператор PROC или DATA завершит ваш шаг данных в середине определения блока DO/END, поэтому он завершится ошибкой, поскольку SAS никогда не увидит закрывающий END для открывающего DO.

Привет Том, ты прав. Я попытаюсь объяснить, что именно мне нужно: у меня есть набор данных, который мне нужно создать файл JSON для каждой строки из моего набора данных. После я вызову другой макрос с процессом API. Мой цикл должен быть таким: прочитать (1), создать файл JSON (2), выполнить макрос API (3). Исключить файл из (json) и найти следующий регистр;

Thiago Fabri 22.05.2019 21:13

Существует путаница в отношении того, что вы зацикливаете. Ваш внешний шаг данных читает SMP_TEMP, но ваш шаг данных, который записывает данные JSON, генерирует серию операторов WRITE для каждого наблюдения в наборе данных SMS_TEMP. Вы просто хотите, чтобы он написал одно наблюдение? Вы хотите, чтобы он записал все наблюдения, которые существуют для определенного значения некоторой переменной ID?

Tom 22.05.2019 21:37

Привет Том, большое спасибо за ваш интерес и время. Я опубликовал новый ответ ниже, где я показываю вам новый код. У вас есть идеи, как я могу это решить?

Thiago Fabri 23.05.2019 12:54

Я сделал некоторые корректировки в своем коде:

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 Customer Intelligence (CI) через узел процесса.

Теперь у вас возникла проблема синхронизации между установкой переменных макроса с помощью CALL SYMPUTX() и запуском макроса. Передайте значения макросу как параметры, а не как глобальные переменные макроса, и проблема синхронизации исчезнет.

Tom 23.05.2019 15:50
Ответ принят как подходящий

При вызове макроса из CALL EXECUTE он будет немедленно выполняться до момента, когда произойдет генерация кода. Это может сбить с толку начинающих пользователей этой функции и имеет побочные эффекты, описанные в документации и материалах конференций.

Чтобы явно указать операторы вызова макроса куча, чтобы они происходили только после завершения шага, EXECUTE должен использовать аргумент, который %NRSTR оборачивает вызов макроса.

call execute ('%NRSTR(исходный код, который вызывает макрос)');

Другие вопросы по теме