Всем привет, в продолжение моей статьи «Сравнение двух QVD и поиск различающихся строк данных«, решил подготовить краткий How-to на предмет того, как похожую задачу решить для QVW.

Постановка задачи

Итак, постановка задачи: вы вносите изменения в документ QVW и хотите убедиться, что случайно «не зацепили» ничего лишнего. Для этого вам требуется некий экран, на котором будут наглядно показаны точки различий между двумя версиями документа — новой и старой. Вы смотрите на этот экран и проверяете, что каждое найденное различие – это действительно результат ваших осознанных изменений.

НА ЗАМЕТКУ! Если находите среди различий несанкционированное, значит что-то сломали своими неосторожными действиями, а правки нужно откатить.

Область поиска различий будет определена как: Скрипт, Объекты интерфейса, Макет (см. выделение желтым на эталонной структуре файла QVW на скриншоте ниже). Иными словами, на экране вам нужно видеть все новые и изменившиеся измерения/выражения в чартах, все изменившиеся строки кода скрипта, все изменения свойств объектов на листах. А вот искать различия в Модели данных и самих Данных НЕ нужно, ведь модель — это результат работы скрипта (а его изменения вы контролируете), а данные вообще никак не зависят от документа и могут меняться при каждой перезагрузке (их контроль — это как раз задача сверки QVD, ссылку на статью привел выше).

Формат файлов .qvw 32 39 Скрипт загрузки ProduccSubCa Eeqcry: PraduccSuEcaceqoryID, мате аз ErcductSuEcaEeqa:yName, ПОМ [ • • . xls) ff, e±edded iaEe1s, tabie i3 PradueESuECazeqary$) ИНЕАЕ EXISTS(PrcductSubcateacryID) ; Объекты интерфейса Лото 2011 2012 01 02 оз 04 Feb saIe.— ssssk 2012 Сжатые данные ProductSubcate... ProductSubcate... Mocntain Bbes 1 2 Road Bikes З Touring Handebars 4 Области поиска изменений Макет ProductCategor... 1 1 1 ЛОО 2012 от 02 оз 04 2 Fetj 7349 орт: .

Решение задачи

Для решения задачи будет задействована такая функциональность как «QlikView Project Files». Вкратце ее задача заключается в том, чтобы извлечь из указанного QVW-файла мета-данные относительно его внутреннего состава и сохранить в наборе человеко- и машино-читаемых XML-файлов.

НА ЗАМЕТКУ! Про состав XML файлов можно почитать в QlikView Reference Manual в разделе 9.1, здесь приводить эту информацию смысла особого нет, все достаточно наглядно.

Вообще говоря, функциональность «QlikView Project Files» создавалась для интеграции с Source Control системами, такими как Microsoft Team Foundation Server и Subversion/SVN. Она особенно актуальна для организации работы команд разработчиков.

НА ЗАМЕТКУ! Подробно интеграция освещена в документе QlikView 11 Source Control Walkthrough (гуглится).

Активация этой функциональности выполняется очень просто: в той же папке, где размещен QVW-файл, нужно вручную создать папку с аналогичным именем и суффиксом «-prj». Например, для файла «MyQVFile.qvw» создать папку «MyQVFile-prj», открыть QVW и сразу же сохранить. В папке появятся XML-файлы, описывающие внутреннюю структуру QVW, как на скриншоте ниже.

Iry Share with Name Allproperties xml BU01.xml CHI 07 .xml CHIog.xml CHI 13.xml CHI 14.xml cs13.xml CT14.xml CT15.xml CT16.xml DocBinary. dat Doclnternals xml Docproperties xml 1806. xml laog.xml 1810.xml IB12.xml IB15.xml LB18.xml LBłg.xml LB67.xml LB68.xml • iscsi (LI:) • QIikViel,v • 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 08.01.2016 18:42 Dev • QVW Version Comparison New folder • 13. OTqeT no CTM.Ioad-prj Date modified 04.02.2016 14:38 04.02.2016 14:38 XML Document XML Document XML Document XML Document XML Document XML Document XML Document XML Document XML Document XML Document DAT File XML XML XML XML XML XML XML XML XML XML XML XMI Document Document Document Document Document Document Document Document Document Document Document Dnrł Irnenr

Эти файлы достаточно наглядны для чтения их человеком, а скрипт загрузки так и вовсе хранится в plain text. Для объектов визуализации создаются отдельные XML с описанием их свойств (именование — через Object ID), для структур всего документа (закладки, переменные и т.п.) — общие XML (именование смысловое).

Соответственно, для поиска различий между двумя QVW-документами можно воспользоваться таким сценарием:

  1. Создать prj-папки для измененного и исходного QVW-файлов, наполнить их XML-файлами.
  2. С помощью выбранного инструмента (см. ниже) запустить процедуру сравнения XML-файлов по содержимому.
  3. Локализовать различающиеся XML-файлы — это будет список тех мест, где были сделаны изменения в новом QVW-документе.
  4. Для каждой изменившийся пары XML «стало-было» локализовать конкретные различающиеся строки — это будет описание того, какие изменения были сделаны.

А теперь, как реализовать этот сценарий в конкретном инструменте — файловом менеджере Total Commander.

1. Открываете в левой панели папку с XML-файлами нового документа (в моем случае в имени суффикс dev), в правой панели — старого (суффикс prod), и запускаете команду «Синхронизировать каталоги».

виа1 сн107 снизд сн113 сн114 сн115 CS13 СГ14 СГ15 СГ16 в DocBinay DocInternals LB1aa LB133 LB142 LB179 LB18 LB182 LB183 LB184 LB19 LB191 а байт ив 8 Мб. файлов: а ив 62 Total Commander (хб4) 8.50 - Yasilij Petrenko Тайлы Выделение Команды Сеть Вид Конфигурация Запуск 10 Кб 08.01.2016 18:41 10 Кб 08.01.2016 18:42 5 Мб 04.02.2016 14:36 5 Мб 04.02.2016 14:38 1 Мб 04.02.2016 14:36 1 Мб 08.01.2016 18:42 15 Кб 08.01.2016 18:42 15 Кб 08.01.2016 18:41 В Кб 08.01.2016 18:42 В Кб 08.01.2016 18:41 В Кб 08.01.2016 18:42 В Кб 08.01.2016 18:41 В Кб 08.01.2016 18:42 В Кб 08.01.2016 18:41 11 Кб 08.01.2016 18:42 13 Кб 04.02.2016 14:36 43 Кб 04.02.2016 14:38 43 Кб 04.02.2016 14:36 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 33 Кб 08.01.2016 18:42 33 Кб 08.01.2016 18:41 31 Кб 08.01.2016 18:42 31 Кб 08.01.2016 18:41 41 Кб 08.01.2016 18:42 41 Кб 08.01.2016 18:41 14 Кб 08.01.2016 18:42 16 Кб 04.02.2016 14:36 12 Кб 08.01.2016 18:42 15 Кб 04.02.2016 14:36 13 Кб 08.01.2016 18:42 17 Кб 04.02.2016 14:36 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 13 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 12 Кб 08.01.2016 18:41 12 Кб 08.01.2016 18:42 666 Справка [iscsi] 820 гб из 2047 гб свободно Синхронизировать каталоги [iscsi] 820 гб из 2047 гб свободно 13. Отчет по СТ М.аеч-ргј Нег"оп Сот рагКоп\Д3. Отчет по СТ тип xml xml xml xml Размер Дата «Папка» 04.02.2016 14:36 342 Кб 04.02.2016 14:36 250 Кб 04.02.2016 14:36 245 Кб 08.01.2016 18:41 267 Кб 04.02.2016 14:36 49 байт 08.01.2016 18:41 13. Отчет по СТ М.'оаа-ргј Нег"оп Сот рагКоп\Д3. Отчет по СТ Тип Размер Дата «Папка» 08.01.2016 18:42 в виа1 сн107 снизд сн113 сн114 CS13 СГ14 СГ15 СГ16 DocBinay DocInternals xml xml xml 317 Кб 08.01.2016 18:42 249 Кб 08.01.2016 18:42 245 Кб 08.01.2016 18:42 49 байт 08.01.2016 18:42 Нег"оп СотрагКоп\Д3. Отчет по СТ М.аеч-ргј> F3 Просмотр F4 Правка Копирование звад LIB1a LB1aa LB133 LB142 LB179 LB18 LB182 LB183 LB184 LB19 LB191 LB193 LB194 LB195 а байт ив 8 Мб. РБ Перемещение файлов: а ив 57 F7 Каталог Alt+ F4 Выход

2. В появившемся диалоговом окне ставите опции, выделенные желтым, и запускаете сравнение. На экран выводятся отдельные XML-файлы, в которых были найдены различия. Это ответ на вопрос «где были сделаны изменения«. Четко видно, какие объекты были просто изменены, какие добавлены вновь.

Total Commander (хб4) 8.50 - Yasilij Petrenko Тайлы Выделение Команды Сеть Вид Конфигурация Запуск [iscsi] 820 гб из 2047 гб свободно 13. Отчет по СТ М.аеч-ргј Нег"оп Сот рагКоп\Д3. Отчет по СТ Тип Размер Дата 5 214 CH1D7„ml 666 [iscsi] 820 гб из 2047 гб свободно 13. Отчет по СТ М.'оаа-ргј Нег"оп Сот рагКоп\Д3. Отчет по СТ Тип Размер Дата xml «Папка» 04.02.2016 14:36 342 Кб 04.02.2016 14:36 xml «Папка» 08.01.2016 18:42 317 Кб 08.01.2016 18:42 666 Синхронизация каталогов Version Comparison\13 Штчет по СТ Млјеи-рј\ Ш: Version Comparison\1 З Сравнить lB главном окне' асимметрично с подкаталогами по содержимому Показывать: Ш4Ш2ЛБ Ш4Ш2ЛБ Ш4Ш2ЛБ Ш4Ш2ЛБ дубликаты уникальные Размер Имя 325 377 AllProperties xml 255 ЦБ CH1DS„ml 1 434 ВЫ CH113„ml 12 221 Doclntemals xml 44 043 D ocProperties xml 14 Б4Б lB15„ml 43 588 LoadS CTipt 20 953 QlikVieAProiect xml 2 492 SH1S„ml 2 5ББ SH47„ml Штчет по Синхронизироват Закрьть Пустые каталоги игнорировать дату AllProperties xml CH1D7„ml сеч 1 CH113„ml Doclntemals xml D ocProperties xml LB2D3„ml LoadS CTipt QlikVieAProiect xml SH47„ml ТВТ „гг“ Размер Дата 351 Ш4Ш2ЛБ 14:3845 5 2Б2 Ш4Ш2ЛБ 14:3845 25Б Ш4Ш2ЛБ 14:3845 Ш4Ш2ЛБ 14:3845 273 Ш4Ш2ЛБ 14:3845 13 770 Ш4Ш2ЛБ 14:3845 44 043 Ш4Ш2ЛБ 14:3845 1Б 420 Ш4Ш2ЛБ 14:3845 15 539 Ш4Ш2ЛБ 14:3845 18 107 Ш4Ш2ЛБ 14:3845 12 831 Ш4Ш2ЛБ 14:3845 4Б 739 Ш4Ш2ЛБ 14:3845 21 543 Ш4Ш2ЛБ 14:3845 2 Ш4Ш2ЛБ 14:3845 2 БОБ Ш4Ш2ЛБ 14:3845 74 103 Ш4Ш2ЛБ 14:3845 4:38 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 4:38 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 8:42 k”iew Найдено файлов: 1Б/Б2 (Шпинаковьж: 0/4Б. Различных: F3 Просмотр F4 Правка 11. Чникальньж слева: Копирование 5 Чникальньж справа: Ш] РБ Перемещение Каталог Alt+F4 Выход

3. Чтобы увидеть конкретные изменения «стало-было», выделяете курсором нужную пару и дважды щелкаете (или команда контекстного меню «Сравнить по содержимому»). На экран выводится содержимое левого и правого XML-файла, а конкретные отличия подсвечиваются красным. Это ответ на вопрос «какие изменения были сделаны«.

Вот в принципе и все. Этот метод вошел в мой арсенал уже давно, и стал просто рефлекторным — ни одно перемещение QVW в продуктив не обходится без такой проверки. Времени занимает немного — буквально пару минут (для крупных файлов использую способ Open without data через контекстное меню RightQlik), зато сильно добавляет уверенности в своих действиях.

В заключение пара советов.

ВАЖНО!

  1. Во избежание возможных коллизий, prj-каталоги следует создавать вне продуктивных папок QlikView!
  2. У метода есть одно замеченное ограничение — почему-то в XML не сохраняются значения переменных. Поэтому будьте внимательны, если меняете переменные, их изменения вы тут не увидите. Также не сохраняются параметры триггеров (объекты/события/действия).
  3. Помимо Total Commander есть и другие инструменты для решения задачи сравнения по содержимому XML: Notepad++ (с плагином) и утилита WinMerge.
  4. Не забывайте о создании резервных копий, тестировании любых изменений в скрипте перед переносом в продуктив, и анализе возможных косвенных зависимостей с помощью Lineage-Dependency Analyzer.

P.S. Читал как-то интервью разработчика Total Commander Кристана Гислера, оказалось, что функциональность сравнения по содержимому — одна из самых сложных при реализации. Вот цитата:

«Какие черты и возможности в TC были наиболее сложны в реализации, и какими из них вы гордитесь само сильно?

Могу достаточно уверенно сказать, что наиболее сложной частью TC является редактор «Сравнить по содержанию», где вы можете параллельно редактировать два файла в соседних панелях, и разница в них каждый раз подсвечивается немедленно. При реализации этого редактора учитывалась очень много тонкостей, порой весьма неочевидных и глубокомысленных, отладка этой части программы также заняла очень много времени».

Источник цитаты: http://blogerator.org/page/windows-total-commander-iview