Как замаскировать «ИЛИ» с помощью списка переменных, переданного с помощью SYSPBUFF в макросе - PullRequest
0 голосов
/ 17 мая 2018

Я использую SYSPBUFF для передачи различных чисел параметров в макрос. В частности, я прохожу через список государств. Одно из используемых состояний - Орегон или «ИЛИ», и это одно состояние вызывает у меня ошибку.

Я получаю сообщение об ошибке "ОШИБКА: символьный операнд был найден в функции% EVAL или в условии% IF, где требуется числовой операнд. Условие было: & ST ^ = ОШИБКА. Условие в цикле% DO% WHILE & ST ^ = привело к неверному или отсутствующему значению. Макрос перестанет выполняться.

Я использовал все различные маски цитирования, чтобы попытаться решить эту проблему, но ни одна из них не работает.

& STATES включает в себя следующие состояния: AK, AZ, CA, HI, ID, NV, OR, WA

Вот мой текущий код:

RSUBMIT;
PROC SQL;
connect to oracle
(path=DW user=&USER pw=&PW);
%macro DTCNT() / parmbuff; 
%let i=1;
%let ST=%scan(&SYSPBUFF,&I);  

%do %while (&ST^=);
CREATE TABLE MD_&ST._IP_ADJDT_CNTS_S1 AS
select *
from connection to oracle
  (SELECT adjudication_date,
          count (*) as LINE_CNT 
   from MD_r&NUM..&ST._IP_hdr_f
   group by adjudication_date
   order by adjudication_date);

      %let i=%eval(&I+1);  
      %let ST=%scan(&SYSPBUFF,&I);
      %end;
%mend DTCNT;
%DTCNT(&STATES);

disconnect from oracle;
QUIT;
ENDRSUBMIT;

Любая помощь будет принята с благодарностью.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Существует большая статья о том, как проверять пустые макропеременные, Чанг Чунг: «Это пустой параметр макроса» .

Для вашей простой программы мне гораздо проще просто использовать %length() для проверки пустых макропеременных.

%do %while (%length(&ST));
0 голосов
/ 17 мая 2018

Проблема здесь - Орегон. Его сокращение - ИЛИ, которое также является зарезервированным словом (упс!). Помните, что язык макросов - это просто текст, который затем анализируется как обычно - поэтому, когда он находит & ST и переводит в OR, он видит это как

%do %while (or ^= )

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

Здесь вы можете использовать макро-кавычки, чтобы SAS не воспринимал это как логический оператор. %SUPERQ мне подходит, но некоторые из них должны работать.

Вот пример. Я добавил еще кое-что для сканирования, чтобы справиться с паренами.

%let states=AK,AZ,CA,HI,ID,NV,OR,WA;
%macro DTCNT() / parmbuff; 
%let i=1;
%put &=syspbuff.;
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));
%put &=st.;

%do %while (%superq(ST)^=);
%put &=st;
%let i=%eval(&i.+1);
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));  
%end;
%mend DTCNT;
%DTCNT(&STATES);
...