Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Декабрь 18, 2017, 07:49:15 pm

Автор Тема: Загрузка новых данных из таблицы транзакций  (Прочитано 1911 раз)

Оффлайн ml_25

  • Новичок
  • *
  • Сообщений: 7
  • Страна: kg
  • Рейтинг: +0/-0
    • Просмотр профиля
Выручите, плз..

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

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1005
  • Страна: ru
  • Рейтинг: +103/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #1 : Октябрь 12, 2016, 07:23:30 pm »
Привет.
По этой теме хорошая подборка здесь

Оффлайн ml_25

  • Новичок
  • *
  • Сообщений: 7
  • Страна: kg
  • Рейтинг: +0/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #2 : Октябрь 13, 2016, 10:35:39 am »
Да, смотрел, но воспроизвести в практике не получилось.

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

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


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

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

Re: Загрузка новых данных из таблицы транзакций
« Ответ #2 : Октябрь 13, 2016, 10:35:39 am »

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1005
  • Страна: ru
  • Рейтинг: +103/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #3 : Октябрь 13, 2016, 11:42:05 am »
Привет, если дата из вашего источника однозначно определяет новую запись или измененную, то можете опираться на нее.
Значения $(LastExecTime) и $(BeginningThisExecTime) берете из существующего Qvd и скрипта.

Оффлайн ml_25

  • Новичок
  • *
  • Сообщений: 7
  • Страна: kg
  • Рейтинг: +0/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #4 : Октябрь 13, 2016, 12:21:27 pm »
Да, именно так и определяет. Это новые транзакции. Старые не меняются/не удаляются.

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


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

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1005
  • Страна: ru
  • Рейтинг: +103/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #5 : Октябрь 14, 2016, 06:54:51 am »
Вот смотрите, в запросе вы хотите чтобы отрабатывалось условие с переменными (WHERE PeriodT >= #$(LastExecTime)# AND PeriodT < #$(BeginningThisExecTime)#), а где определяется их значение?

Оффлайн ml_25

  • Новичок
  • *
  • Сообщений: 7
  • Страна: kg
  • Рейтинг: +0/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #6 : Октябрь 14, 2016, 07:41:38 am »
а где определяется их значение?


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

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

Re: Загрузка новых данных из таблицы транзакций
« Ответ #6 : Октябрь 14, 2016, 07:41:38 am »

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1005
  • Страна: ru
  • Рейтинг: +103/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #7 : Октябрь 15, 2016, 01:32:36 pm »
Привет.

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

Оффлайн ml_25

  • Новичок
  • *
  • Сообщений: 7
  • Страна: kg
  • Рейтинг: +0/-0
    • Просмотр профиля
Re: Загрузка новых данных из таблицы транзакций
« Ответ #8 : Октябрь 18, 2016, 06:56:26 am »
Да, вы правы, опыта маловато, сразу об этом сказал :) Тем не менее, решение задачи нашел.
Ответ оказался на поверхности и заключался в функции 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;

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

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