Добрый день!!!
Подскажите как можно организовать загрузку обновленных данных. А именно имеется около 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.
День добрый,
для начала, ответ на второй вопрос.
Дополнительное поле формируется в операторе 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.
Спасибо с этим разобрался, только сложность у меня возникла немного в другом:
мне нужно проверить дату в
mid([fcsNotificationEF/procedureInfo/collecting/endDate],9,2)& ' ' & Month (mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,10))& ' ' &mid([fcsNotificationEF/procedureInfo/collecting/endDate],1,4) as [Дата окончания подачи документов]
и если она больше текущей даты то записать в ячейку "Статус" значение "окончен" а если меньше то поставить значение "текущий"
извиняюсь если не правильно что то объясняю и задаю глупые вопросы... сам только начал вникать в дебри программирования)
Что касается загрузки из файлов.
Я правильно понимаю, что XML-файлы формируются каждый день один раз и не меняются?
Здесь может быть несколько вариантов.
В любом случае, необходимо написать приложение для обработки данных и формирования QVD-файла либо qvd-файлов, без визуализации, только скрипт.
Для написания скрипта необходимо продумать алгоритм.
Например, можно сначала получить перечень файлов, затем в цикле обойти каждый, обработать с отметкой в перечне, и затем подгружать только файлы, у которых нет отметки в листинге файлов.
Либо, определить папку для новых файлов, и после обработки перемещать обработанный оригинал в папку с обработанными файлами.
Есть и еще варианты, главное - исключить загрузку файла, который уже обработан, и это можно сделать несколькими способами. Думаю, вам будет легче выбрать способ, который подойдет в вашей ситуации.
Когда вы решите задачу с обработкой только новых xml-файлов, тогда уже можно будет определиться с пополнением "главного" qvd-файла .
Для написания скрипта потребуется разобраться в функционале Qlikview.
Скачайте документацию (//http://), вам придется разобраться самому как работает qlikview на этапе обработки данных.
Код может получится непростым
да именно так. файлы формируются один раз и потом не изменяются. А вот как их исключить из повторной обработки так и не могу до думаться). буду разбираться.
Самый простой вариант - отдельная папка для новых файлов.
Обработали - перенесли.
Цитата: admin от 13 апреля 2015, 07:40:46
Самый простой вариант - отдельная папка для новых файлов.
Обработали - перенесли.
а как тогда оставлять старые данные в файле для обработки, если файлы убираются то после перезагрузки скрипта будут доступны только новые данные. нам необходим анализ данных за весь период.
А вот это уже инкрементальная загрузка.
Самый простой случай, по схеме:
//обрабатываем свежие данные
temptable:
load a,b,c from xml;
//загружаем старые данные
concatenate
load a,b,c from ранеезагруженные.qvd;
//сохраняем новые + старые в один файл
store * from temptable into ранеезагруженные.qvd;
execute "коммандная строка на удаление файлов из папки";
Примерно так, но внимательнее ознакомьтесь с материалами по инкрементальной загрузке.
Возможно, потребуется предусмотреть проверку ключей, дублей.
После запуска написанной программы у вас должен формироваться файл, который вы уже и будете подтягивать в приложения для анализа. При этом, программу можно запускать на сервере по расписанию.
Пользователь будет работать уже с одним файлом, загружая данные практически мгновенно хоть в Qlikview, хоть в Qlik Sense.
Добавлю ссылок:
http://www.quickintelligence.co.uk/qlikview-incremental-load/ (http://www.quickintelligence.co.uk/qlikview-incremental-load/)
https://community.qlik.com/message/483661#483661 (https://community.qlik.com/message/483661#483661)