WARNING: An argument to the function INTNX referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.

Всем добрый день.

Сегодня урок будет посвящен неправильной работе с функций INTNX, а именно использование ее совместно с %SYSFUNC.

Дело в том, что случай с которым столкнулся неприятен тем, что в логе SAS выдается Warning, т.е. ошибка как таковая не возникает, вследствие чего процесс бежит дальше, хотя он уже неправильный. Таким образом если у нас есть некие мониторы, которые настроены на отлавливание ошибок, то они не сработают в нашем случае.

Итак, обычная работа с функцией INTNX (выведем первое число текущего месяца):

Мы видим, что параметр month и beginning находятся в кавычках.

Теперь попробуем туже схему выполнить через %SYSFUNC:

Мы получили ошибку из заголовка:

WARNING: An argument to the function INTNX referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.

Помимо этого значение макро переменной x оказалось пустым.

Обратите внимание, что параметры month и beginnign также стоят в кавычках.

Данная проблема решается тем, что мы убираем с перечисленных параметров кавычки:

В этом же варианте все хорошо.

Еще раз хочу сказать, что коварность данной проблемы состоит в том, что вылезает просто Warning, а не ошибка!

До скорых встреч!

Николай.

SAS Forum 2013. Moscow.

Всем добрый день.

Вчера прошел SAS Forum 2013 в Москве, на котором смог побывать и я.

В первую очередь хочется сказать, что подобные мероприятия расцениваю как великолепная возможность встретиться со своими друзьями-коллегами с которыми уже не один год поднимали различные SAS (да и не только SAS) проекты во многих Банках страны.

Как всегда правило, что «мир тесен» к IT отрасли относиться как нельзя лучше. Особенно очень узкой ее части касающейся SAS.

Был очень рад встретить друзей-коллеги из:
Банка Возрождения: Саша, Миша, Леша, Володя. Надеюсь в следующем году придут все!
Банк ВТБ24: Игорь, Женя.
Банк Нордеа: Денис.
Банк ОТП: Саша.
Альфабанк: Миша, Дима.
Банк ВТБ: Вячеслав
Лето Банк: Володя
и многие другие…

Конечно же все залы сразу посетить не удалось, но тенденция которую задал еще в самом начале Валерий Панкратов прослеживалась практически везде, а именно:

В ближайшем будущем (к сожалению это может затянуться на годы в России) нас ждет  переход на новую версию SAS 9.4 и уход кластеры.
Обещают что скорость вычислений будет повышена в 100 раз, за счет In-Memory технологий.

Также нас ждет достаточно сильные изменения в аналитических продуктах в декабре 2013 года.

Еще раз хочу отметить, что очень рад был увидеть друзей, со многими из которых удастся увидеться лишь снова через год на SAS Forum 2014 года.

Всем до скорых встреч!

С вами был Николай.

Number of observations in Data Set. Количество строк в таблице.

 Всем добрый день.

Довольно часто возникает необходимость понять сколько записей в той или иной таблице.
В принципе, если таблица небольшая то можно просто написать select count(1) from table и в качестве результата увидим количество записей.

Но бывают случаи, когда размер таблицы достаточно большой (несколько десятков гигабайт). Тогда в таком случае вышеуказанная операция становиться затратна по времени выполнения.

Как же быть в таком случае?

В таком случае нам на помощь приходит функция  — ATTRN 

Приведем пример использования данной функции:

Возьмем табличку на несколько миллионов записей:

Многие используют опцию nobs:


И мы видим, что в макро переменную nobs записалось количество строк в таблице — 8 671 962.

А теперь давайте проведем следующий эксперимент:

Возьмем и удалим половину записей, а именно все что больше 4 миллионов:

И теперь опять посмотрим сколько у нас записей в таблице:

И что мы видим?! А видим мы, что кол-во записей не изменилось.

Почему же так?

А дело тут в том, что nobs показывает кол-во физических строк, в том числе и помеченных как удаленные.

От сюда вывод, что nobs лучше не пользоваться.

Тогда возникает вопрос, а чем же пользоваться для определения кол-ва записей ???

И на этот вопрос также есть ответ — NLOBS параметр — показывает кол-во логических записей:

Так что пользуйтесь!

SAS Base. Check create table. Проверка наличия таблицы.

Всем добрый день!

Сегодня речь пойдет о проверке наличия таблицы в библиотеке.

Бывают такие ситуации, когда табличка по тем или иным причинам не создалась, но используется дальше в Вашем коде.
В таких случаях мы получаем сообщение об ошибке, что данной таблице не существует. Наш код прерывается и процесс не отрабатывает.

Как этого можно избежать?

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

Макрос выглядит следующим образом:

При этом основная идея заключается в проверке нахождения нашей таблицы в dictionary.tables.

Лог выполнения данного макроса выглядит следующим образом в зависимости есть таблица или нет:

Ниже привожу видео версию данного урока:

До скорых встреч.

С уважением,
Николай.

SAS Visual Analytics 6.1. License Renew.

Всем добрый день.

Сегодня займемся обновлением лицензии для продукта SAS Visual Analytics 6.1.

И так для начала посмотрим как выглядит картина мира, когда лицензия sas просрочена:

Теперь займемся непосредственно обновлением лицензии.  Весь процесс будет состоять из трех частей.

1.  Обновляем лицензию SAS Foundation.
Так как SAS Visual Analytics развернут у нас на Unix системе, нам понадобиться Putty:

2. Вторым шагом обновляем метаданные. Для этого потребуется запустить SASDeploymentManager, а также нужно иметь какой-нибудь X-client, установленный на локальную машину:
Теперь посмотрим что у нас получилось после обновления SAS Foundation и метаданных:
Как мы видим из возникшей ошибки, мы сделали не все обновления.
3.  И завершающий шаг — обновляем лицензию для нашего LASR сервера:
И теперь давайте посмотрим что же у нас получилось:
Вот в принципе и все что Вам нужно сделать для обновления лицензий. 
С уважением,
Николай.

SAS Enterprise Guide. HotKeys. Горячие клавиши Вам в помощь.

Всем добрый день.

Сегодняшний урок будет посвящен удобству написания кода в SAS Enterprise Guide.

Для этого мы познакомимся с небольшим набором горячих клавиш, которые значительно облегчат нам жизнь:

Итак еще раз:
CTRL+/  — Закомментировать выделенную область.
CTRL+Shift+/  — Снять комментарии с выделенной области.

CTRL+F2 — Поставить/отменить реперную точку.
Shift+F2  — Перескочить на следующую реперную точку.

CTRL+[  — Перейти к открывающейся скобке
CTRL+]  — Перейти к закрывающейся скобке.

P.S. 
Хотел отметить еще один замечательный факт: данные наборы горячих клавиш работают не только в SAS Enterprise Guide, но и в обычном SAS Base.  Так что пользуйтесь.

PROC PWENCODE. Шифрование паролей.

Всем добрый день!

Сегодня урок посвящен шифрованию паролей.

Довольно часто можно видеть, что пользователи в своих программах используют пароль в явном виде. Данная практика не совсем правильна.

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

И так пример шифрования пароля:

Из примера видно, что пароль который мы хотим зашифровать мы помещаем в кавычки. Зашифрованный же пароль видно в логах.

Кстати иногда можно встретить следующий вид шифрования (что в принципе одно и тоже):

Далее используйте в своих программах уже шифрованный пароль. Так более безопасно.

Примеры использования шифрованных паролей можно найти в уроках, посвященных sas access to oracle. Там как раз использовался всегда шифрованный пароль:

  1. пример_1
  2. пример_2 
P.S.  Кстати говоря никто не сможет сделать обратное действие, т.е по шифрованному паролю получить оригинал. Так что пользуйтесь на здоровье.
С уважением,
Николай. 

SAS. How get latest hotfixes? Как получить все необходимые hotfixes.

Все добрый день.

Не для кого не секрет, что время от времени выходят новые обновления и хотфиксы, которые исправляют некие ошибки в текущем релизе продукта SAS.

Сегодня речь пойдет о том как получить эти самые хотфиксы.

Для этого Вам необходимо сделать всего несколько шагов:

1. Скачать программу SASHFADD
2. Запустить jar-файл sas.tools.viewregistry.jar из папки SASHomedeploymntreg
3. Перенести файлы DeploymentRegistry в директорию, где установлена SASHFADD
4. Запустить SASHFADD
5. Скачать все необходимые Hotfixes.
Ниже привожу краткую видео инструкцию:

Следующим шагом после получение всех необходимых Hotfixes будет накатить эти самые хотфиксы. Но об этом в другой раз.
С уважением,
Николай.

SAS Macro variable and ampersands.

Всем привет!

В сегодняшнем уроке рассмотрим такой интересный момент, как процесс компиляции макро переменных в зависимости от количества амперсандов стоящих перед этой переменной.

Для лучшего понимания компиляции советую подключить опцию: options symbolgen;

И так давайте рассмотрим пример:
Создадим две макро  переменных, причем значение первой макро переменной является названием второй.

В данном примере все понятно. Теперь добавим еще один амперсанд:

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

Добавим еще один амперсанд:

Теперь мы видим, что на первом шаге два амперсанда были превращены в один, а следующий (т.к. он остался один) был расценен как макро переменная и вернул значение firstmacro. На следующем шаге наш амперсанд (который получился из двух первых) был применен уже к firstmacro и мы получили в результате значение second_.
Рассмотрим четыре амперсанда:
Здесь все просто. Две пары схлопнулись в два аперсанды и они уже затем опять схлопнулись в один. 
Рассмотрим пять аперсандов:
В принципе здесь также по аналогии все понятно:
&&&&&macro1 =  (&&)(&&)(&macro1) -> &&firsmacro=(&&)firstmacro -> &firstmacro -> _second.
Далее привожу видео, где эксперимент проводился с 6 и 7 амперсандами.

Источник к данной статье можно посмотреть здесь!
С уважением,
Николай. 

SAS. Create range of macro variable. Создание массива макропеременных.

Всем добрый день!

Задача создания макро переменных довольно распространена.
Обычно для этого каждый использует то что ему больше нравиться:

  1. %Let
  2. Call symput
  3. Proc SQL  into
Сегодня поговорим как раз о последнем способе заведения макро переменных (proc sql), так как именно он позволяет создавать массив из этих самых переменных. 
В ниже предложенном примере будем помещать все переменные из некой таблицы в макро переменные, причем не важно сколько рассматриваемая таблица содержит строк. 
Для простоты эксперимента возьмем таблицу из библиотеке sashelp таблица Cars, таким образом вы сможете повторить приведенные примеры на своих платформах.
Обычно мы привыкли создавать макро переменные следующим образом:
Из приведенного лога видно, что в макро переменную a1 записалась лишь одна запись (Acura), являющаяся первой записью в таблице sashelp.cars
Данная ситуация нас не устраивает, мы все-таки хотели записать все интересующие нас данные из поля make

Поэтому видоизменим наш код, добавив после макро переменной код: separate by :
Вот теперь видно, что все наши уникальные значения поля make были записаны в одну макро переменную a1.
Хочу обратить внимание на еще одну макро переменную sqlobs — она очень полезна и хранит значение количества строк, которое пробежал наш запрос. 
Теперь все же вернемся к нашей теме статьи и создадим все же массив из макро переменных.
Для этого еще раз видоизменим наш код  поставив тире после нашей макро переменной.
Мы видим, что было выявлено 38 записей и все они были положены в макро переменные: a1,a2,a2,…,a37,a38.
Покажем это, выведя эти переменные в цикле с помощью следующего макроса:
Вы можете видеть, что наша макро переменная &sqlobs очень помогла в организации цикла. С помощью нее мы можем понять — а сколько же макро переменных мы создали нашим запросом.
Надеюсь данная урок оказался для Вас полезным.
Более подробную информацию можно получить здесь!
С уважением,
Николай.