Как известно для QlikView/Qlik Sense источником может быть множество баз данных. Для обращений к источнику мы формируем строку коннекта. Самый простой коннект выглядит примерно так: «ODBC CONNECT TO [TERADATA];». В статье рассмотрю, как и зачем апгрейдить коннект к источникам данных, использовать коннект в конфигурационном файле, а также какие дополнительные данные можно собирать по коннектам.

Коннект: обычный и через конфигурационный файл

Не буду вдаваться в нюансы создания строки коннекта, отмечу лишь пару примеров строк:

ODBC CONNECT TO [TERADATA];

Какая бы ни была эта строка – отличной практикой является использование файлов со строкой коннекта и дальнейшее использование файлов с помощью оператора include(). В этом случае, если строка коннекта используется в нескольких приложениях, то при каких-либо изменениях в параметрах подключения не придётся вносить корректировки в каждое приложение, а нужно будет лишь заменить строку коннекта в конфигурационном файле.

Та же строка коннекта, но уже в файле:

Вот так будет выглядеть такая строка коннекта в скрипте

Примеры расширенного файла с коннектом

Соответственно, файл со строкой коннекта можно расширять. Ниже рассмотрим 2 примера, как и для чего расширять конфигурационный файл коннекта.

Пример 1.

Бывают случаи, когда одновременно используется несколько серверов, да ещё и требуются дополнительные настройки, тогда вместо одной строки коннекта в файл можно добавить подобный код:

// Переменная указывает на одну из строк коннекта в операторе SWITCH
// Может устанавливаться как в приложении, так и в самом файле
LET vVariantConnect = ‘New_1’;

SWITCH vVariantConnect
CASE ‘Old’

OLEDB CONNECT TO [Variant Connect old];

LET vServer = ‘OLD_SERVER’;
LET ConvertTO = ‘WIN1251’;
LET ConvertFROM = ‘UTF16’;

CASE ‘New_1’

OLEDB CONNECT TO [Variant Connect new];

LET vServer = ‘NEW_SERVER1’;
LET ConvertTO = ‘WIN1251’;
LET ConvertFROM = ‘ISO8859P5’;

CASE ‘New_2’

OLEDB CONNECT TO [Variant Connect new2];

LET vServer = ‘NEW_SERVER2’;
LET ConvertTO = ‘WIN1251’;
LET ConvertFROM = ‘UTF8’;

DEFAULT

OLEDB CONNECT TO [Variant Connect new];

LET vServer = ‘NEW_SERVER1’;
LET ConvertTO = ‘WIN1251’;
LET ConvertFROM = ‘ISO8859P5’;

END Switch

Пример 2.

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

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

Основная идея, при неудачной попытке коннекта, повторять попытки коннекта (по умолчанию 25 раз) с интервалом минута.

Получившийся скрипт:

//Строка коннекта,
SET stringConnect = ‘OLEDB CONNECT TO …’;

//Отключаем остановку выполнения скрипта при ошибке
LET ErrorMode = 0;
LET nAttempt = 0;
//Устанавливаем количество попыток коннекта, numAttemptsFromApp – переменная из приложения, для особо важных приложений я устанавливал большие значения, по умолчанию 25.
LET attempts = If(numAttemptsFromApp > 0, numAttemptsFromApp, 25);
LET sleepTime = 60; //время простоя в секундах

DO
//Если были ошибки при выполнении скрипта, то выполнение скрипта приостанавливается.
If ScriptErrorCount > 0 then
SLEEP $(sleepTime) * 1000;
END If

//Обнуляем переменную со счётчиком ошибок
LET ScriptErrorCount = 0;

//формируем строку в лог
LET attemptsToFinish = If(nAttempt = 0, ”, (attempts – nAttempt) & ‘ attempts left …’ );
TRACE$(attemptsToFinish);

//Попытка коннекта
$(stringConnect); //Строка коннекта.

//Увеличивем счётчик попыток коннекта
LET nAttempt = nAttempt + 1;

//Если ошибки нет или мы достигли attempts, то выходим из цикла.
LOOP until ScriptErrorCount = 0 or nAttempt = attempts;

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

Для этого я добавил несколько параметров и выгрузку в qvd файл:

LET startTime = num(now()); //фиксируем время начала коннекта
LET vAppName = SubField(DocumentName(),’.’, 1); //имя приложения для выгрузки.

Attempts_load:
LOAD
$(nAttempt) as numOfAttempts,
TimeStamp(Floor(‘$(startTime)’, 1/24/60/60)) as TimeStart,
TimeStamp(Floor(now(), 1/24/60/60)) as TimeFinish,
If($(ScriptErrorCount) = 0, 1, 0) as Connect,
DocumentName() as Application,
‘$(typeConnect)’ as TypeConnect
AutoGenerate 1;

//Добавляем уже имеующуюся историю коннектов
If not IsNull(FileSize(‘..\QVData\Connect report\$(typeConnect)_$(vAppName).qvd’)) then
Concatenate(Attempts_load)
LOAD
*
From ..\QVData\Connect report\$(typeConnect)_$(vAppName).qvd (qvd);

END If

//Выгружаем данные
STORE Attempts_load into ‘..\QVData\Connect report\$(typeConnect)_$(vAppName).qvd’;

DROP Table Attempts_load;

В результате можно построить нужную аналитику для лучшего понимания картины (конечно же, в QlikView). Например, такую:

Во вложении есть один из вариантов отчёта.

Вместо заключения

В итоге конфигурационный файл со строкой коннекта можно очень хорошо проапгрейдить и добавить туда:

  • Цикл с попытками подключения;
  • Дополнительные параметры для приложения;
  • Несколько вариантов коннекта;
  • Резервную строку коннекта, если основной источник недоступен;
  • Сохранение данных для аналитики/рассылки о проблемах коннекта;
  • И т.д.

Думаю, много чего ещё можно добавить, всё зависит от потребностей. Коллеги, а что бы вы добавили в файл с коннектом?