2015-05-27 2 views
0

У меня есть набор данных (liste_institution), которые содержат все имя переменной, которую я хочу «define» в моем заявлении proc report. Вот мой код, который работает, когда я вызываю свой макрос не динамически (%create_institution(815);). Если я использую оператор данных с выполнением вызова (в комментарии в моем коде), он не работает. Причина в том, что, когда я использую вызов, код не интерпретируется в отчете PROC REPORT, поэтому он дает мне ошибку.Динамически создавать определение в PROC REPORT

proc report data = ventes_all_inst4 
          missing split = "*" nowd 
          style(header)=[font_weight=bold background = #339966 foreground = white] 
          style(column)=[cellwidth=15cm]; 

    %macro create_institution(institution); 

     define TOTAL_&institution./display "TOTAL*($)" style(column)=[cellwidth=4cm]; 

    %mend; 
      /* Give error when I use this data step */ 
      /*data _null_; 
       set liste_institution; 
       call execute('%create_institution(' || INS || ');'); 
      run;*/ 
      %create_institution(815); 

run; 

Есть простой способ создать динамически определить заявление в ОТЧЕТЕ PROC из набора данных, которые содержат имя столбца.

ответ

0

В принципе, у вас есть непонимание того, как работают макросы и время. Вам нужно скомпилировать список макросов, предшествующий отчету proc, но вы не можете использовать call execute, потому что это фактически выполняет код. Вам нужно создать макро переменную.

Самый простой способ сделать это следующим образом:

proc sql; 
    select cats('%create_institution(',ins,')') 
    into :inslist separated by ' ' 
    from liste_institution 
    ; 
quit; 

, что делает &inslist, который в настоящее время список учреждений (с макровызове).

Вы также можете использовать переменные across, чтобы это стало проще; у вас будет одна строка на ins, с одной переменной с этим значением (которая определяет имя столбца) и другой отдельной переменной со значением, которое идет в части таблицы данных. Затем SAS автоматически создаст столбцы для каждого значения across. Переменные - одна из вещей, которая делает proc report чрезвычайно мощным.

+0

Подход 'call execute' невозможен, но вам нужно будет сгенерировать весь блок proc report на шаге данных, а не только повторяющиеся биты. Подход Джо прекрасен до тех пор, пока вы не нажмете предел символов макропеременной. – user667489

+0

Я не стал упоминать об этом, потому что я был бы в восторге от сообщения, в котором было достаточно 25-значных по времени столбцов, чтобы попасть в этот предел;) – Joe

+0

Это работает, спасибо, теперь только процесс sql-оператор снова дает мне ошибку, например, если SAS пытается интерпретировать код, он отлично работает, когда я вызываю свою макроперемену в мой отчет о proc! – user1842455

Смежные вопросы