Выручите, плз..
Как реализовать инкрементальную загрузку для таблицы транзакций из 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-файла.
Спасибо заранее!
Привет.
По этой теме хорошая подборка здесь (http://help.qlik.com/ru-RU/qlikview/12.0/Subsystems/Client/Content/QVD_Incremental.htm)
Да, смотрел, но воспроизвести в практике не получилось.
Не совсем понятно, как определить эти значения:
----------------
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;
----------------
Понимаю, что ответ должен быть очевиден, но опыта очень мало...
Привет, если дата из вашего источника однозначно определяет новую запись или измененную, то можете опираться на нее.
Значения $(LastExecTime) и $(BeginningThisExecTime) берете из существующего Qvd и скрипта.
Да, именно так и определяет. Это новые транзакции. Старые не меняются/не удаляются.
Вот скрипт, подскажите в нем, плз, как взять эти значения (так, чтобы автоматически обновлялись):
----------------------------------------------------------
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;
Вот смотрите, в запросе вы хотите чтобы отрабатывалось условие с переменными (WHERE PeriodT >= #$(LastExecTime)# AND PeriodT < #$(BeginningThisExecTime)#), а где определяется их значение?
Цитата: admin от 14 октября 2016, 06:54:51
а где определяется их значение?
собственно в этом то и вопрос... понимаю, что их надо как-то и где-то определить, но не знаю как
Привет.
Я так понимаю, что в этой области опыта пока маловато.
Рекомендую изучить:
Управление данными (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)
Да, вы правы, опыта маловато, сразу об этом сказал :) Тем не менее, решение задачи нашел.
Ответ оказался на поверхности и заключался в функции 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;
//-------------------------------
Пояснение: загружаются все новые транзакции с конца дня, предыдущего дню последней загрузки.