Загрузка новых данных из таблицы транзакций

Автор ml_25, октября 12, 2016, 12:14:22 pm

« предыдущая - следующая »

ml_25

Выручите, плз..

Как реализовать инкрементальную загрузку для таблицы транзакций из 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-файла.

Спасибо заранее!

admin


ml_25

Да, смотрел, но воспроизвести в практике не получилось.

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

----------------
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;
----------------


Понимаю, что ответ должен быть очевиден, но опыта очень мало...

admin

Привет, если дата из вашего источника однозначно определяет новую запись или измененную, то можете опираться на нее.
Значения $(LastExecTime) и $(BeginningThisExecTime) берете из существующего Qvd и скрипта.

ml_25

Да, именно так и определяет. Это новые транзакции. Старые не меняются/не удаляются.

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


----------------------------------------------------------
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;

admin

Вот смотрите, в запросе вы хотите чтобы отрабатывалось условие с переменными (WHERE PeriodT >= #$(LastExecTime)# AND PeriodT < #$(BeginningThisExecTime)#), а где определяется их значение?

ml_25

Цитата: admin от октября 14, 2016, 06:54:51 am
а где определяется их значение?



собственно в этом то и вопрос... понимаю, что их надо как-то и где-то определить, но не знаю как

admin

Привет.

Я так понимаю, что в этой области опыта пока маловато.
Рекомендую изучить:
Управление данными
Синтаксис скрипта и функции диаграммы
И начать с простых задач.
http://help.qlik.com/ru-RU/sense/3.0/Content/Tutorials.htm

ml_25

Да, вы правы, опыта маловато, сразу об этом сказал :) Тем не менее, решение задачи нашел.
Ответ оказался на поверхности и заключался в функции 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;

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

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


Рейтинг@Mail.ru Яндекс.Метрика