1 октября 2009 г.

Кое-что о функции Exists ()

В очередной раз приветствую Вас, коллеги, на страницах своего блога.
Сегодня я расскажу Вам об особенностях работы функции Exists() в QlikView. Исходя из информации, любезно предоставленной нам производителем в справке к программному продукту, мы имеем следующий формат применения этой функции:

Exists( field [ , expression ] ),
где field – это имя поля (или выражение, вычисляющее имя поля) предварительно загруженное в документ QlikView; expression – это выражение, вычисляющее значение поля, которое собственно и проверяется на наличие в поле field. Если 2ой параметр опущен, то подразумевается текущее значение поля.
Исходя из этой справочной информации можно сделать предположение, что функция Exists() работает только c ранее загруженными данными, т.е. поле, указанное первым параметром должно быть загружено предыдущими операторами LOAD и/или SQL SELECT в документ QlikView. Однако, это предположение будет не совсем верным. Для иллюстрации всего выше сказанного давайте сделаем небольшой пример документа QlikView и убедимся в этом на практике.
И так, создаем новый документ, сохраняем его на диске, открываем редактор скрипта и добавляем следующий код:
Budget:
Load * Inline [
User, Budget
Tom, 10000
Jane, 20000
May, 22000
Graham, 12300
];
Sales:
Load * Inline [
User, Sales
Tom, 11000
Jane, 19000
May, 21000
Graham, 13300
John, 23456
]
Where Exists(User);
После выполнения данного скрипта, создайте объект Простая таблица и выведите в нее поля: User, Budget и Sales. Вы увидите в таблице 4 строки и для каждой из них будет определено значение в полях Budget и Sales. Иными словами, Вы не увидите строку с пользователем John и его суммой продаж, т.к. в скрипте, при загрузке данных по продажам,Вы указали, что хотите грузить только данные тех пользователей, которые уже были ранее загружены в документ, т.е. в нашем случае это те пользователи, по которым есть данные по бюджету. Этот пример собственно демонстрирует, так скажем, явное применение функции Exists(), т.е. так как это описано в справочном файле.
Далее создадим новый документ (или можно внутри того же самого документа, закомментировав предыдущий код загрузки) и добавим в него следующий код загрузки данных:
Sales:
Load
RowNo() As row,
User,
Sales,
If(Exists(User,User), 1, 0) As Exists
;
Load * Inline [
User, Sales
John, 12222
Tom, 11000
Jane, 19000
May, 21000
Graham, 13300
John, 23456
];
Здесь как Вы видите мы предварительно не загружаем поле User в документ и в тоже время используем функцию Exists по этому полю. Загружаем данные, и создадим еще один объект Простая таблица, в которую выведем поля в порядке их загрузки в документ: row, User, Sales и Exists. И что Вы видите? А видеть Вы должны примерно следующее:Sales Иными словами, функция Exists() отработала корректно и в этом случае. То есть мы можем применять данную функцию для проверки записей также и внутри одного оператора загрузки данных.
На этом пожалуй я остановлюсь и пожелаю Всем новых открытий и приятных впечатлений от работы с QlikView.

2 комментария:

  1. буквально в пятницу открыла следующую особенность (ну может быть это не баг, а такая фича) функции Exists:
    если поле, которое является аргументом функции Exists ( в примерах выше это поле User) оканчивается на знак "," (запятая), то такое значение пропускается функцией. Это повторяется как при загрузке данных через qvd файл (там и нашла), так и при использовании INLINE

    ОтветитьУдалить
  2. Спасибо, до этого не очень понимал работу этой функции. Вы разжевали. Супер!

    ОтветитьУдалить