Обновление данных в Qlikview

Автор PadijVD, 13 апреля 2015, 04:54:05

« назад - далее »

PadijVD

Добрый день!!!
Подскажите как можно организовать загрузку обновленных данных. А именно имеется около 300 000 xml файлов число которых увеличивается ежедневно примерно на три пять тысяч. в каждом файле также примерно около 50 строк, перезагружать данные соответственно занимает очень много времени... привожу пример кода для удобства.
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='Пн;Вт;Ср;Чт;Пт;Сб;Вс';

export:
Load
FileName() as [Имя файла],
    [fcsNotificationEF/id] as id,
    [fcsNotificationEF/purchaseNumber] as [№ закупки],
    mid([fcsNotificationEF/docPublishDate],9,2) as [День публикации закупки],
    Month(mid([fcsNotificationEF/docPublishDate],1,10)) as [Месяц публикации закупки],
    mid([fcsNotificationEF/docPublishDate],1,4) as [Год публикации закупки],
    mid([fcsNotificationEF/docPublishDate],9,2)& ' ' & Month (mid([fcsNotificationEF/docPublishDate],1,10))& ' ' &mid([fcsNotificationEF/docPublishDate],1,4) as [Дата публикации закупки],
    ceil(Month(mid([fcsNotificationEF/docPublishDate],1,10))/3)&' квартал' as Квартал,
    [fcsNotificationEF/href] as [Ссылка на ООС],
    [fcsNotificationEF/purchaseObjectInfo] as [Предмет закупки],       
    [fcsNotificationEF/lot/maxPrice] as [НМЦК],
    [fcsNotificationEF/lot/financeSource] as [Источник финансирования],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/deliveryTerm] as [Сроки поставки товара],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/applicationGuarantee/amount] as [Обеспечение заявки],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/contractGuarantee/amount] as [Обеспечение контракта],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/contractGuarantee/part] as [Процент на обеспечение исполнения контракта],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/applicationGuarantee/part] as [Процент на обеспечение заявки],
    [fcsNotificationEF/lot/customerRequirements/customerRequirement/kladrPlaces/kladrPlace/kladr/fullName]&' '&[fcsNotificationEF/lot/customerRequirements/customerRequirement/kladrPlaces/kladrPlace/deliveryPlace] as [Место доставки товара, выполнения работ],
    mid([fcsNotificationEF/procedureInfo/bidding/date],9,2)& ' ' & Month (mid([fcsNotificationEF/procedureInfo/bidding/date],1,10))& ' ' &mid([fcsNotificationEF/procedureInfo/bidding/date],1,4) as [Дата Аукциона/Определения победителя],
    mid([fcsNotificationEF/procedureInfo/collecting/startDate],9,2)& ' ' & Month (mid([fcsNotificationEF/procedureInfo/collecting/startDate],1,10))& ' ' &mid([fcsNotificationEF/procedureInfo/collecting/startDate],1,4) as [Дата начала подачи документов],
    [fcsNotificationEF/procedureInfo/collecting/place]&'  '&[fcsNotificationEF/ETP/name]&'   по адресу  '&[fcsNotificationEF/ETP/url] as [Место подачи заявки],
    [fcsNotificationEF/procedureInfo/collecting/order] as [Порядок подачи заявок],
    mid([fcsNotificationEF/procedureInfo/collecting/endDate],9,2)& ' ' & Month (mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,10))& ' ' &mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,4) as [Дата окончания подачи документов],
    [fcsNotificationEF/ETP/name] as [Площадка],
    [fcsNotificationEF/ETP/url] as [Адрес площадки],
    [fcsNotificationEF/placingWay/name] as [Тип закупки],
    Replace([fcsNotificationEF/lot/purchaseObjects/purchaseObject/OKPD/code],'.','_') as [ОКПД],
    [fcsNotificationEF/lot/purchaseObjects/purchaseObject/OKPD/name] as [Наименование ОКПД],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactEMail] as [EMail заказчика],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPhone] as [Телефон заказчика],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactFax] as [Факс заказчика],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/lastName] as [Фамилия ОЛ],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/firstName] as [Имя ОЛ],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/middleName] as [Отчество ЛО],
    [fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/lastName]&' '&[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/firstName]&' '&[fcsNotificationEF/purchaseResponsible/responsibleInfo/contactPerson/middleName] as [ФИО ответственного лица заказчика],
    [fcsNotificationEF/purchaseResponsible/responsibleOrg/fullName] as [Заказчик],
    [fcsNotificationEF/purchaseResponsible/responsibleOrg/postAddress] as [Почтовый адрес],
    [fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress] as [Фактический адрес],
    trim(subfield([fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress],',',3)) as [Область],
    trim(subfield([fcsNotificationEF/purchaseResponsible/responsibleOrg/factAddress],',',4)) as [Город],
    [fcsNotificationEF/purchaseResponsible/responsibleOrg/INN] as [ИНН заказчика],
    [fcsNotificationEF/purchaseResponsible/responsibleOrg/KPP] as [КПП заказчика],
    %Key_export_2C54E0F74D336CCA    // Key for this table: export
FROM [C:\Users\padij_000\Desktop\123\fcsNotificationEA44*.xml] (XmlSimple, Table is [export]);
// End of [аукцион.xml] LOAD statements


Так и не понял как это сделать с помощью Инкрементальной загрузки.

и еще вопрос не могу понять как добавить в таблицу дополнительное поле которое берется не из исходных данных а добавляется самим qlikview.

admin

День добрый,
для начала, ответ на второй вопрос.
Дополнительное поле формируется в операторе Load.
Например

temp1:
LOAD F1, F2, F1+F2 as F3  INLINE [
    F1, F2
    1, 2
    4, 3
    5, 6
    3, 7
];

В исходной таблице только два поля F1 и F2, третье поле формируется в операторе load, в данном случае сумме двух полей F1,F2 назначено новое имя F3.


PadijVD

#2
Спасибо с этим разобрался, только сложность у меня возникла немного в другом:
мне нужно проверить дату в
mid([fcsNotificationEF/procedureInfo/collecting/endDate],9,2)& ' ' & Month (mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,10))& ' ' &mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,4) as [Дата окончания подачи документов]

и если она больше текущей даты то записать в ячейку "Статус" значение "окончен" а если меньше то поставить значение "текущий"
извиняюсь если не правильно что то объясняю и задаю глупые вопросы... сам только начал вникать в дебри программирования) 

admin

Что касается загрузки из файлов.
Я правильно понимаю, что XML-файлы формируются каждый день один раз и не меняются?
Здесь может быть несколько вариантов.
В любом случае, необходимо написать приложение для обработки данных и формирования QVD-файла либо qvd-файлов, без визуализации, только скрипт.
Для написания скрипта необходимо продумать алгоритм.
Например, можно сначала получить перечень файлов, затем в цикле обойти каждый, обработать с отметкой в перечне, и затем подгружать только файлы, у которых нет отметки в листинге файлов.
Либо, определить папку для новых файлов, и после обработки перемещать обработанный оригинал в папку с обработанными файлами.
Есть и еще варианты, главное - исключить загрузку файла, который уже обработан, и это можно сделать несколькими способами. Думаю, вам будет легче выбрать способ, который подойдет в вашей ситуации.

Когда вы решите задачу с обработкой только новых  xml-файлов, тогда уже можно будет определиться с пополнением "главного" qvd-файла .

admin

Для написания скрипта потребуется разобраться в функционале Qlikview.
Скачайте документацию, вам придется разобраться самому как работает qlikview на этапе обработки данных.
Код может получится непростым

PadijVD

да именно так. файлы формируются один раз и потом не изменяются. А вот как их исключить из повторной обработки так и не могу до думаться). буду разбираться.

admin

Самый простой вариант - отдельная папка для новых файлов.
Обработали - перенесли.

PadijVD

Цитата: admin от 13 апреля  2015, 07:40:46  
Самый простой вариант - отдельная папка для новых файлов.
Обработали - перенесли.

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

admin

#8
А вот это уже инкрементальная загрузка.
Самый простой случай, по схеме:

//обрабатываем свежие данные
temptable:
load a,b,c from xml;

//загружаем старые данные
concatenate
load a,b,c from ранеезагруженные.qvd;

//сохраняем новые + старые в один файл
store * from temptable into ранеезагруженные.qvd;

execute "коммандная строка на удаление файлов из папки";

Примерно так, но внимательнее ознакомьтесь с материалами по инкрементальной загрузке.
Возможно, потребуется предусмотреть проверку ключей, дублей.
После запуска написанной программы у вас должен формироваться файл, который вы уже и будете подтягивать в приложения для анализа. При этом, программу можно запускать на сервере по расписанию.
Пользователь будет работать уже с одним файлом, загружая данные практически мгновенно хоть в Qlikview, хоть в Qlik Sense.


Яндекс.Метрика