Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: ml_25 от 12 октября 2016, 12:14:22

Название: Загрузка новых данных из таблицы транзакций
Отправлено: ml_25 от 12 октября 2016, 12:14:22
Выручите, плз..

Как реализовать инкрементальную загрузку для таблицы транзакций из SQL базы?

Исходные данные:
В базе данных есть таблица транзакций с полями:
№, Дата, Сумма
1   01.04.2016 08:05:47   500
2   03.04.2016 10:09:12   350
....
235   12.10.2016 15:05:21   740

Задача:
Создать скрипт загрузки в QlikView, который позволить загружать из базы данных только новые данные (данные с последней успешной загрузки), а остальные - из qvd-файла.

Спасибо заранее!
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: admin от 12 октября 2016, 07:23:30
Привет.
По этой теме хорошая подборка здесь (http://help.qlik.com/ru-RU/qlikview/12.0/Subsystems/Client/Content/QVD_Incremental.htm)
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: ml_25 от 13 октября 2016, 10:35:39
Да, смотрел, но воспроизвести в практике не получилось.

Не совсем понятно, как определить эти значения:

----------------
QV_Table:
SQL SELECT PrimaryKey, X, Y FROM DB_TABLE
WHERE ModificationTime >= #$(LastExecTime)#
AND ModificationTime < #$(BeginningThisExecTime)#;

Concatenate LOAD PrimaryKey, X, Y FROM File.QVD (qvd);
STORE QV_Table INTO File.QVD;
----------------


Понимаю, что ответ должен быть очевиден, но опыта очень мало...
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: admin от 13 октября 2016, 11:42:05
Привет, если дата из вашего источника однозначно определяет новую запись или измененную, то можете опираться на нее.
Значения $(LastExecTime) и $(BeginningThisExecTime) берете из существующего Qvd и скрипта.
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: ml_25 от 13 октября 2016, 12:21:27
Да, именно так и определяет. Это новые транзакции. Старые не меняются/не удаляются.

Вот скрипт, подскажите в нем, плз, как взять эти значения (так, чтобы автоматически обновлялись):


----------------------------------------------------------
SET ThousandSep=' ';
SET DecimalSep=',';
SET MoneyThousandSep=' ';
SET MoneyDecimalSep=',';
SET MoneyFormat='# ##0,00р.;-# ##0,00р.';
SET TimeFormat='h:mm:ss';
SET DateFormat='DD.MM.YYYY';
SET TimestampFormat='DD.MM.YYYY h:mm:ss[.fff]';
SET MonthNames='янв;фев;мар;апр;май;июн;июл;авг;сен;окт;ноя;дек';
SET DayNames='Пн;Вт;Ср;Чт;Пт;Сб;Вс';


OLEDB CONNECT32 TO [Provider=SQLOLEDB.1;Persist Security Info=False;User ID=dbuser;Data Source=192.168.10.10;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=PC01;Use Encryption for Data=False;Tag with column collation when possible=False];

Transactions:
LOAD AccountID,
    PeriodT,
    Month(PeriodT) as МесяцТранзакции,
    Day(PeriodT) as ДеньТранзакции,
    TotalSum,
    TransactionID;
SQL SELECT AccountID,
    PeriodT,
    TotalSum,
    TransactionID
FROM database.dbo.Transactions
WHERE PeriodT >= #$(LastExecTime)#
AND PeriodT < #$(BeginningThisExecTime)#;

LOAD AccountID,
    PeriodT,
    МесяцТранзакции,
    ДеньТранзакции,
    TotalSum,
    TransactionID
FROM database_transactions.qvd (qvd);
STORE Transactions INTO database_transactions.qvd;
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: admin от 14 октября 2016, 06:54:51
Вот смотрите, в запросе вы хотите чтобы отрабатывалось условие с переменными (WHERE PeriodT >= #$(LastExecTime)# AND PeriodT < #$(BeginningThisExecTime)#), а где определяется их значение?
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: ml_25 от 14 октября 2016, 07:41:38
Цитата: admin от 14 октября  2016, 06:54:51  
а где определяется их значение?


собственно в этом то и вопрос... понимаю, что их надо как-то и где-то определить, но не знаю как
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: admin от 15 октября 2016, 01:32:36
Привет.

Я так понимаю, что в этой области опыта пока маловато.
Рекомендую изучить:
Управление данными (http://help.qlik.com/ru-RU/sense/3.0/pdf/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8.pdf)
Синтаксис скрипта и функции диаграммы (http://help.qlik.com/ru-RU/sense/3.0/pdf/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B8%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B.pdf)
И начать с простых задач.
http://help.qlik.com/ru-RU/sense/3.0/Content/Tutorials.htm (http://help.qlik.com/ru-RU/sense/3.0/Content/Tutorials.htm)
Название: Re: Загрузка новых данных из таблицы транзакций
Отправлено: ml_25 от 18 октября 2016, 06:56:26
Да, вы правы, опыта маловато, сразу об этом сказал :) Тем не менее, решение задачи нашел.
Ответ оказался на поверхности и заключался в функции ReloadTime:

Скрипт загрузки (может кому пригодится):


//-------------------------------
OLEDB CONNECT32 TO [Provider=SQLOLEDB.1;Persist Security Info=False;User ID=dbuser;Data Source=192.168.10.10;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=PC01;Use Encryption for Data=False;Tag with column collation when possible=False];

LET LastExecTime=DayEnd(ReloadTime()-1);
LET ThisExecTime=DayEnd(Today()-1);

Transactions:
LOAD AccountID,
    PeriodT,
    Month(PeriodT) as МесяцТранзакции,
    Day(PeriodT) as ДеньТранзакции,
    TotalSum,
    TransactionID;
SQL SELECT AccountID,
    PeriodT,
    TotalSum,
    TransactionID
FROM database.dbo.Transactions
WHERE PeriodT > '$(LastExecTime)'
AND PeriodT <= '$(ThisExecTime)';

LOAD AccountID,
    PeriodT,
    МесяцТранзакции,
    ДеньТранзакции,
    TotalSum,
    TransactionID
FROM database_transactions.qvd (qvd);

STORE Transactions INTO database_transactions.qvd;

//-------------------------------

Пояснение: загружаются все новые транзакции с конца дня, предыдущего дню последней загрузки.