Проблема с отчетом Proc: я получаю значение, выбранное в переменную - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть макрос вроде:

%macro links;
PROC SQL;
CREATE TABLE T_US  AS
    SELECT DISTINCT
    ID_SECON,
    NO_BEN,
    s_an
     FROM rm.BENEF
;
QUIT; 

proc sql;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;
%mend links;

Затем я создаю отчет, используя ODS:

%macro theRep();

options topmargin=1in bottommargin=1in
        leftmargin=0.25in rightmargin=0.25in
;

ods tagsets.ExcelXP path="&cheminEx." file="&fi" style=seaside
options(autofit_height="yes"
        pagebreaks="yes"
        orientation="portrait"
        papersize="letter"
        WIDTH_POINTS = "12" WIDTH_FUDGE = ".0625"
        absolute_column_width="110,175,180,200"
        );

ods escapechar="^";

%theODS;

ods tagsets.ExcelXP close;
ods listing;
%mend theRep;

%macro theODS;
ods tagsets.ExcelXP 
options(sheet_interval="none"
        sheet_name="thename"
        );

proc report data=T_US nowindows spanrows missing noheader
    style(report)=[frame=box rules=all
        foreground=black Font_face='Times New Roman' font_size=10pt
        background=none]
    style(column)=[Font_face='Times New Roman' font_size=10pt just=left]
;

    col ID_SECON NO_BEN s_an;

    define ID_SECON / group order=data noprint;
    define NO_BEN / style(column)=[verticalalign=top];
    define s_an / style(column)=[verticalalign=top];

    compute before ID_SECON / style=[verticalalign=middle background=#f0f0f                     foreground=blue fontweight=bold font_size=12pt];
    line ID_SECON $25.;
    endcomp ;

    title j=center height=12pt 'The title';
run;

%mend theODS;

Отчет показывает приятно.Но проблема в следующем:

Значение переменной max_sign отображается в конце отчета, даже если я не просил об этом в определяющей части.

Пожалуйста, вы можете помочь?Почему переменная, которой нет в наборе данных, T_US появляется в отчете?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Предложение SQL :into переносит значение из запроса выбора в одну или несколько макропеременных в зависимости от синтаксиса.Выбранный выход не подавляется автоматически при использовании :INTO.Вывод SQL подавляется с помощью параметра NOPRINT или оператора RESET NOPRINT; (только для SQL).

Таким образом, вы захотите

proc sql noprint;
  select max(input(substr(s_an,1,4),4.)) into :max_sign
  from T_US
;

Предложение :INTO также имеет *Параметр 1011 *, который полезен, когда переданные значения используются в заголовке или сноске, а передача по умолчанию имеет начальные или конечные пробелы.

into :max_sign TRIMMED
0 голосов
/ 13 февраля 2019

Как отмечали другие, хитрость заключается в использовании into :(some name) и noprint.Кроме того, вы должны знать, что макропеременным является символьная строка по своей природе.Почему это имеет значение?Если вы храните число в макропеременной, оно сохраняется цифра за цифрой точно в том виде, в котором вы ее вводите;поэтому настоятельно рекомендуется отформатировать число до присвоения его макро-переменной.

Другими словами, если истинное значение равно 2.36581, и вы форматируете его как 2.4 и присваиваете егоmacrovariable нет способа вернуть более высокую точность обратно.Все, что хранится в макросе, это «два, полный, четыре».

0 голосов
/ 13 февраля 2019

Возможно, значение max_sign отображается из-за этого шага:

proc sql;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;

Не PROC REPORT.Попробуйте добавить параметр NOPRINT, чтобы подавить вывод из PROC SQL:

proc sql NOPRINT;
    select max(input(substr(s_an,1,4),4.)) into :max_sign
    from T_US
;
quit;
...