Contents
VBScript для QlikView – что это?
По своей сути, макрос — это программа на VBScript или JScript, с помощью которой можно получить доступ к любым объектам приложения QlikView (Ниже будет описана объектная модель QlikView) и выполнить над ними те или иные действия. Плюс, можно написать какие-то пользовательские функции (нестандартные) для расширения функционала, если такое потребуется.
Среди сообщества специалистов QlikView есть рекомендация избегать использования макросов в приложениях QlikView. Но в некоторых случаях требуется написать один-два макроса, поэтому эта статья должна быть среди остальных на случай острой необходимости 🙂 В этой статье я затрону только язык VBScript.
Что можно делать с помощью макросов
В статье https://luciancotea.wordpress.com/2013/07/18/qlikview-macros-useful-collection/ приведена коллекция полезных макросов, которые можно использовать в документе QlikView. Рассмотрим перечень действий, которые можно осуществить при помощи кода на VBScript:
- Запуск внешней программы
- Экспортировать объект в Excel
- Экспортировать объект в JPG
- Экспортировать объект из скрытого листа в JPG
- Сохранить документ и выйти из QlikView
- Создать клон группового измерения
- Открыть документ с выбором текущего месяца
- Прочитать и записать переменную
- Открыть приложение QlikView, перезагрузить, нажать кнопку и закрыть его (поместите код в файл .vbs)
- Удалить файл
- Получение информации о отчетах
- Отправить почту с помощью Google Mail
- Autozoom — подогнать размер листа под окно
- Импортировать и экспортировать все переменные из файла Excel
- Добавить условное выражение в диаграмму
- Изменить свойство layout для всего объекта за один шаг (AllowMoveSize = False)
- Сбросить INPUT FIELD
- Динамическое обновление (вставка значений из inputboxes в таблицу)
Объектная модель QlikView
Объектная модель QlikView состоит из классов с соответствующими методами. С помощью методов можно выполнять те или иные действия. Действия над объектами в QlikView выполняются в макросах, о которых будет подробно написано ниже.
Существует специальный API Guide QlikView, в котором подробно расписан каждый класс и метод. Я пройдусь кратко по концепции объектной модели. Суть объектной модели заключается в том, чтобы добраться до отдельного поля или диаграммы документа, необходимо знать в какой документ, на каком листе располагается объект.
Как открыть редактор макросов в QlikView?
Ссылки на документацию
QlikView APIs and SDKs — https://help.qlik.com/en-US/qlikview-developer/12.0/Content/APIsAndSDKs.htm
API Guide QlikView 10 (QlikView COM API) — zip файл с руководством
Основы VBScript
Процедура Sub() и Функция Function()
VBScript является подмножеством языка Microsoft Visual Basic for Applications (сокращенно – VBA), поставляемого с Microsoft Office и Visual Basic.
В VBScript предусмотрено два типа процедур: подпроцедуры (subroutines) — ключевое слово Sub, и функции (functions) — обозначаются ключевым словом Function. В обоих случаях процедуры — это блок программного кода.
Рассмотрим подпроцедуру (она не возвращает значение, все действия выполняются в теле подпроцедуры). Подпроцедура может быть с параметром, а может быть без параметра. Описание подпроцедуры выглядит так:
1 2 3 4 |
SUB ExportChartToCSV SET objChart = ActiveDocument.GetSheetObject("CH01") objChart.Export "C:\Data.CSV", ", " END SUB |
Вызов процедуры в коде выглядит как
1 |
Call ExportChartToCSV |
Функции объявляются очень похоже. Единственное отличие — они должны возвращать какое-либо значение. Функция может быть с параметром, а может быть без параметра. Приведем пример функции с параметром (параметр задается в скобках):
1 2 3 4 |
FUNCTION setVariable(name, value) SET v = ActiveDocument.GetVariable("variableName") v.SetContent value,true END FUNCTION |
1 2 3 4 |
FUNCTION getVariable (name) SET v = ActiveDocument.GetVariable("variableName") getVariable = v.GetContent.String END FUNCTION |
Обратить внимание на то, что определение процедуры или функции должно заканчиваться ключевыми словами End Sub или End Function.
SET и DIM
Dim используется для сохранения в переменную какого-то значения
Пример:
1 2 |
DIM filePath filePath = ActiveDocument.Variables("vPDFFlagPath").GetContent.STRING |
Set используется для сохранения объекта
Пример:
1 2 |
SET Doc = ActiveDocument SET Field = Doc.Fields(fieldName).GetPossibleValues |
Переход от класса к классу и вызов метода
Чтобы перейти в дочерний класс и вызвать метод, необходимо перечислить вызов через точку:
1 |
SET Field = ActiveDocument.Fields("Поле 1").GetPossibleValues |
В указанном примере мы переходим от активного документа к полю с названием «Поле 1» и дальше вызываем метод GetPossibleValues. Везде используется точка. Метод вызывается без скобок.
Security
Для того, чтобы иметь возможность обращаться к свойствам листа, необходимо в Sheet Properties зайти на вкладку Security и выбрать пункт “Access Sheet Object Properties”.
Цикл For
Циклы используются в ситуациях, когда нам нужно выполнить какое-либо действие несколько раз. Первая ситуация — мы знаем, сколько раз нужно выполнить какое-либо действие, в этом случае используется конструкция For…Next. Для безусловного выхода из конструкции For…Next используется команда Exit For.
1 2 3 4 5 6 7 8 9 |
Sub ReadStraightTable Set Table = ActiveDocument.GetSheetObject( "CH01" ) For RowIter = 0 to table.GetRowCount-1 For ColIter = 0 to table.GetColumnCount-1 set cell = table.GetCell(RowIter,ColIter) Msgbox(cell.Text) Next Next End Sub |
Комментарий VBScript
Для комментариев используется одиночная кавычка ‘ или rem.
Условие If … Then … Else … End If
1 2 3 4 5 6 |
Function CheckFolderExists(path) Set fileSystemObject = CreateObject("Scripting.FileSystemObject") If Not fileSystemObject.FolderExists(path) Then fileSystemObject.CreateFolder(path) End If End Function |
Прерывание цикла
Вы можете прервать цикл, не дожидаясь выполнения условия завершения цикла. Для принудительного выхода из цикла используется оператор Exit Do.
1 2 3 4 5 6 7 8 9 10 11 |
Sub RemoveDefaultSheet(xlDoc) Do nSheetsCount = xlDoc.Sheets.Count If nSheetsCount = 1 then Exit Do Else xlDoc.Sheets(nSheetsCount).Select xlDoc.ActiveSheet.Delete End If Loop End Sub |
WScript
Программа на языке VBScript сама по себе является объектом WScript сервера сценариев Windows Script Host, (т. е. после запуска программы этот объект уже существует, не нужно давать команду о его создании). Объект WScript – корневой в объектной иерархии Windows Script Host, в которую входят три COM-библиотеки (COM-Component Object Model): WshController, WshNetwork и WshShell.
Объект WScript имеет следующие методы:
- Sleep
- Quit
- Echo
- CreateObject
- ConnectObject
- DisconnectObject
- GetObject
И свойства:
- Arguments
- BuildVersion
- FullName
- Interactive
- Name
- Path
- ScriptFullName
- ScriptName
- Timeout
- Version
Объект Wscript имеет подчиненный объект Shell, с методами:
- AppActivate
- CreateShortcut
- Exec
- ExpandEnvironmentStrings
- LogEvent
- Popup
- Run и пр.
И свойствами:
- CurrentDirectory
- Environment
- SpecialFolder
Что такое JScript и как его использовать в QlikView?
Язык JScript не требует дополнительной установки и входит в состав сервера Windows Script Host, который в свою очередь, является частью операционной системы Windows. Стоит обратить внимание, что хотя JS скрипты и являются разработкой компании Microsoft, но они практически идентичен сценариям языка JavaScript, так что те, кто уже знакомы с JavaScript, с легкостью освоят JScript.
С помощью JScript можно писать различные функции обработки данных (например можно написать функцию для использования рекурсии для обработки строки и использовать ее в скрипте загрузки QlikView), либо можно получать доступ к объектам документа QlikView, который использует объекты Windows (см. объектную модель QlikView).
Синтаксис JScript
Подробнее с языком JScript можно ознакомиться на сайте Программирование на JScript (уроки) >>>
Видео обучение по JScript для написания макросов в QlikView
Еще есть видео уроки по JScript, их можно использовать для обучения написания макросов для приложений QlikView:
Пример макроса на JScript в QlikView
Макрос на JScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
function objtoxml(obj,d) { d = (d) ? d : 0; var rString = "\n"; var pad = ""; for (var i=0;i<d;i++) { pad+=" "; } if (typeof obj==="object") { if (obj.constructor.toString().indexOf("Array")!== -1){ for (i=0;i<obj.length;i++) { rString+=pad+"<item>"+objtoxml(obj[i],d+1)+"</item>\n"; } rString=rString.substr(0,rString.length-1) } else { for(i in obj){ var val=objtoxml(obj[i],d+1); if(!val) return false; var x=i.replace("/",""); x=x.replace(/\//g,"_"); rString+=((rString==="\n")?"":"\n")+pad+"<"+x+">"+val+((typeof obj[i]==="object")?"\n"+pad:"")+"</"+x+">"; } } } else if (typeof obj === "string") { rString=obj; } else if (obj.toString) { rString=obj.toString(); } else { return false; } return rString; } function jsontoxml(json, rootnode) { //return '<?xml version="1.0" encoding="UTF-8"?>\n<root>' + eval("objtoxml("+json+");") + '\n</root>'; // workaround: return 'xmltext\n<'+rootnode+'>' + eval("objtoxml("+json+");") + '\n</'+rootnode+'>\nxmltext'; } function encode (uri){ return encodeURI(uri); }; function decode (uri){ return decodeURI(uri); }; |
Пример использования:
1 2 |
LOAD jsontoxml(json, '$(rootnode)') as xmltext resident step2; |
Видео-примеры написания макросов в QlikView
Макросы на VBScript & JScript в QlikView
1 Comment