Я пытаюсь использовать макрос PARMBUFF, чтобы повторить шаг данных с 20 различными определениями клиентов (один пример ниже).Имя/название макроса как переменной внутри макроса SAS
DATA _NULL_;
%GLOBAL bank1;
%LET bank1 = O.OWNER LIKE 'XXXXX%';
RUN;
Шаг данных создает отдельные таблицы, определенные макросами клиента, которые создаются выше.
%MACRO CLIENTBUILD/PARMBUFF;
%LET N=%SYSFUNC(COUNTW(&SYSPBUFF,%STR(,)));
%DO I=1 %TO &N;
%LET CLIENT=%SCAN(%QSYSFUNC(COMPRESS(%BQUOTE(&SYSPBUFF),%STR(%(%)))),&I,%STR(,));
CREATE TABLE CLIENT AS
SELECT DISTINCT C.DATE,
C.TIME,
C.RELEASE,
C.TASK
FROM CALLS C
INNER JOIN OWN_GRNT O ON SUBSTR(C.TASK,1,9)= O.TASK
AND &CLIENT
;
%END;
%MEND;
Я хотел бы создать эту таблицу с именем (String) макрокоманды ... но у меня возникают проблемы, ссылающихся строку макроса для имени таблицы. Я пытался переформатировать макрос следующим образом (для того, чтобы попытаться взывать строку/имя макроса для имени таблицы) с помощью
%MACRO CLIENTBUILD/PARMBUFF;
%LET N=%SYSFUNC(COUNTW(&SYSPBUFF,%STR(,)));
%DO I=1 %TO &N;
%LET CLIENT=%SCAN(%QSYSFUNC(COMPRESS(%BQUOTE(&SYSPBUFF),%STR(%(%)))),&I,%STR(,));
CREATE TABLE '&CLIENT' AS
SELECT DISTINCT C.DATE,
C.TIME,
C.RELEASE,
C.TASK
FROM CALLS C
INNER JOIN OWN_GRNT O ON SUBSTR(C.TASK,1,9)= O.TASK
AND &CLIENT
;
%END;
%MEND;
Then calling the macro out with –
PROC SQL;
%CLIENTBUILD(&NCT);
QUIT;
Но это приводит к ошибке:
ERROR: The value &CLIENT is not a valid SAS name.`
Есть ли решение вызывать название макроса, которое зависит от макрокоманды, используемой для определения клиента? После того, как вы решили, я хотел бы просто создать каждый набор данных клиента с ....
Proc SQL;
%CLIENTBUILD(&bank1,&bank2,&bank3,..........);
QUIT;
Удалить одинарные кавычки вокруг & CLIENT - как в 'CREATE TABLE & client AS ...' Одиночные кавы маскируют переменную & CLIENT от разрешения. Таблицы SAS не могут начинаться с '&', и это дает вам ошибку. – DomPazz
Проблема с этим заключается в том, что она решит фактическое определение макроса (O.OWNER LIKE 'XXXXX%') вместо имени - «bank1» ... Я хочу, чтобы он разрешался внизу в «WHERE & CLIENT», (ошибка в исходном сообщении ... вместо AND и CLIENT) и использовать строку (bank1) в качестве имени таблицы ... – SMW
Используйте макрокоманду (например, '% nrstr') для управления разрешением. И если вы хотите, чтобы 'bank1' не' & bank1', у вас возникнут трудности, потому что это не так, как работают макро переменные SAS. Вам нужно будет пересмотреть подход здесь - в частности, похоже, что вы должны передать два параметра, а не один. – Joe