QlikView 11 – Call EDX task from web-client on click button

Введение

Загрузку данных в QlikView-отчетах (с расширением .qvw) можно осуществить несколькими путями:
1. В разработчике отчетов (Qv.exe), нажав кнопку Загрузка.
2. При запуске разработчика с опцией загрузки: qv.exe /r reportname.qvw
3. Используя консоль управления QlikView Management Console (http://localhost:4780/qmc/SourceDocuments.htm), в которой настраивается задание по расписанию (scheduler task) для выбранного отчета.
4. В веб-клиенте для пользователей (Access Point), используя внешние расширения (QlikView Extension), которые запускают задания по расписанию созданные в QlikView Management Console (QlikView Management Service).
Первые два метода (1, 2) применяют для загрузки новых данных вручную. Два нижних метода (3, 4), автоматизируют процесс обновления данных в отчетах. Метод 4 работает в связке с методом 3, и привносит расширенные возможности автоматизации обновления данных в отчетах самим пользователем отчета.

Загрузка данных в web-клиенте QlikView по нажатию кнопки

За основу инструкции взяты файлы и информация, предоставленные на сайте: http://qvextcalledxfromajax.codeplex.com/wikipage?title=Installation&referringTitle=Documentation.
CallEDXFromAjax_ArchitectureOverview

Все настройки выполнялись на машине под Windows Server 2008 R2, где развернута серверная часть QlikView 11.

1. Для начала качаем файлы:
• The web service — EDX Wrapper Webservice v1.0.1.zip
• The QlikView extension — CallEDXFromAjax_v1_0_0.qar
2. Разархивируем EDX Wrapper Webservice v1.0.1.zip на диск C (получим C:\ EDXWrapper_v_1_0_1).
3. От имени администратора запускаем CallEDXFromAjax_v1_0_0.qar, который проинсталлирует новые расширения для QlikView в профиль пользователя (будет создана папка с объектами %LOCALAPPDATA%\QlikTech\QlikView\Extensions\Objects\CallEDXFromAjax).
4. Чтобы эти расширения могли использовать все пользователи QlikView, следует скопировать папку %LOCALAPPDATA%\QlikTech\QlikView\Extensions\Objects\CallEDXFromAjax в C:\ProgramData\QlikTech\QlikViewServer\Extensions\Objects.

5. Далее настраиваем веб-службу EDX Wrapper Webservice на IIS 7.0 под .NET Framework 4.0.30319.
5.1. Заходим в консоль IIS (Internet Information Services (IIS) Manager)
5.2. Добавляем новый веб сайт с именем EDXWrapper и портом 8080:

Web Site

5.3. Затем добавим в пул приложений новый пул EDXWrapper с поддержкой .NET Framework 4.0.30319:

App pool properties

5.4. Проверяем в добавленном сайте EDXWrapper версию используемого aspnet_client (должна присутствовать в списке версия 4_0_30319):

Если в списке отсутствует версия aspnet_client – system_web — 4_0_30319, то следует выполнить следующий код в командной строке:
cmd> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe –i
После чего в ISS во всех веб сайтах должна появиться версия aspnet client – 4.0.30319.

5.5. Перезапускаем IIS.
5.6. Проверяем работу нашего сайта, для этого в Internet Explorer вводим адрес: http://localhost:8080/QlikViewTasks.asmx
home edxtrigger
В разделе TiggerEDXTask можно проверить работу процесса обновления данных в отчете, но для этого следует выполнить п.6 данной инструкции.
test edxtrigger

6. Создаем задание по расписанию в QlikView Management Console для обновления данных в имеющемся отчете (в моем случае отчет KPI.qvw).
6.1. Для этого заходим в консоль управления QlikView Management Console и переходим в раздел Documents. Поскольку отчеты размещены в каталоге по умолчанию C:\ProgramData\QlikTech\SourceDocuments, то заходим в закладку Source Documents и выбираем отчет, например, KPI.qvw.
console docs

6.2. Справа нажимаем на кнопку (Add Task Manually). Откроется окно настройки задания. В закладке General – задаем имя задания (например, KPITASK) и включаем его (Enabled).
task general
В закладке Reload разрешаем перезагрузку (Enable).
tasks reload
Далее переходим в закладку Triggers и добавляем ( Add) новый триггер, срабатывающий на событие On an external events. Пароль можно не задавать.
trigger edx
В остальных закладках (Reduce, Distribute, Document Information, Server) я оставил все как есть по умолчанию.
После того, как все параметры заданы, жмем Apply.

7. Задание создано, теперь заходим в разработчик отчетов (QV.exe), где нужно добавить новый объект для обновления данных из веб-клиента.
7.1. В разработчике открываем наш отчет (например, KPI.qvw), далее включаем вид WebView.
qv web mode

7.2. Жмем по форме правой кнопкой мыши и в контекстном меню выбираем Новый Объект Листа (New object page).
new object

7.3. В открывшемся меню заходим в Объекты расширения и выбираем Call EDX From Ajax. И перетаскиваем объект на форму отчета.
New object on form

7.4. Далее заходим в Свойства нового объекта и настраиваем его.
edx properties
В Свойствах в разделе Call EDX From Ajax параметру Webservice URL задаем значение: http://:<QV server>:<port>/QlikViewTasks.asmx (где <QV server> — имя компьютера, где установлена серверная часть QlikView, <port> — указанный в IIS, 8080).

NOTE:
Следует знать, что имя компьютера указывается также, как и при вызове QlikView Access Point. Например, если веб-клиент вызывается http://srvqv.test.int:8080/qlikview/index.htm, тогда в параметре Webservice URL указывается адрес: http://srvqv.test.int:8080/QlikViewTasks.asmx.

Для параметра Task Name: имя задания созданного в п.6 (в моем случае, KPITASK).
edx properties 1
В разделе Behaviour оставляем все по умолчанию, и переходим в раздел Translation, где зададим новое имя для кнопки и уведомления выполнения загрузки.
edx properties 2
В разделе Caption задаем имя объекту, например, Load data.
edx properties 3

7.5. Теперь уменьшим размер нашего объекта, чтобы он мог разместиться на форме, и сохраним все изменения в отчете.
resize edx on form

ВНИМАНИЕ! Объект Call EDX From Ajax предназначен и работает только в веб-клиенте QlikView (Access Point)! В разработчике отчетов (Qv.exe) он не поддерживается, и при нажатии будет выдавать ошибку:
warning
А также Call EDX From Ajax корректно работает в браузере Internet Explorer 8, 9, 10, 11.

8. Откроем наш отчет (KPI.qvw) в веб-клиенте QlikView через Internet Explorer, и испытаем добавленный в него объект Call EDX From Ajax. Нажмем на кнопку UPLOAD и дождемся выполнения загрузки данных:
web-client
EDX status
Если все завершилось успешно, то все настройки были выполнены, верно. Иначе сверьте свои настройки с данной инструкцией, или проверяйте корректность вашего кода в редакторе скриптов, или смотрите в сторону прав доступа.

Реклама

Как получить инициалы (INITIALS) из ФИО (NAME)

  • Oracle 10, 11

Данная конструкция позволяет из ФИО (NAME) сотрудника получить фамилию (LASTNAME), имя (FIRSTNAME), отчество (FATHERNAME) и иницалы (INITIALS).

with t as
(select 'Иванов Петр Васильевич' as name from dual)
select t.name,
regexp_replace(t.name, ' (.*)') LASTNAME,
regexp_replace(t.name, ' (.*)|^[^ ]* ') FIRSTNAME,
regexp_replace(t.name, '(.*) ') FATHERNAME,
regexp_replace(regexp_replace(t.name, ' (.*)|^[^ ]* '),'.*','.',2,1)||regexp_replace(regexp_replace(t.name, '(.*) '),'.*','.',2,1) INITIALS
from t;

NAME                    LASTNAME  FIRSTNAME  FATHERNAME  INITIALS
----------------------  ------    ----       ----------  ----                                                            
Иванов Петр Васильевич  Иванов    Петр       Васильевич  П.В.

Расчет рабочих часов в указанном периоде

Я рассматривал случай рабочего дня с 08:00 по 17:00, включая обед с 12:00 по 13:00. Функция рассчитывает количество часов, которые попадают в заданный диапазон времени с учетом выходных дней (суббота и воскресенье), рамок рабочего дня и обеда.

CREATE OR REPLACE function worktime(beg_datetime in date, end_datetime in date)
return number
as
    kol_day number;
    type arr_table is table of number index by binary_integer;
    arr arr_table;
    res number default 0;
    
begin

   -- Чистим массив
   arr.delete;
   
 if beg_datetime < end_datetime then
   -- Расчет количества дней в заданном периоде дат
   kol_day := round(trunc(end_datetime) - trunc(beg_datetime));
   
   for i in 0..kol_day loop
      -- Проверка выходных дней (exclude Sunday, Saturday)
      if not to_char(beg_datetime + i, 'd') in (7, 1) then 
        -- Расчет количества рабочего времени по каждому дню
        arr(i) := case        
        -- если промежуточный день
        when not trunc(beg_datetime + i) in (trunc(beg_datetime), trunc(end_datetime)) 
            then 8
        -- если даты заданного дипазона совпадают
        when kol_day = 0 and trunc(beg_datetime + i) = trunc(end_datetime) then
           round(end_datetime - (beg_datetime + i), 3) 
        else case 
             -- если начало периода
             when trunc(beg_datetime + i) = trunc(beg_datetime) and
             to_char(beg_datetime, 'hh24') >= 8 and to_char(beg_datetime, 'hh24') < 12 
                then round((((trunc(beg_datetime) + 17/24) - beg_datetime)*24) - 1,3)
             when trunc(beg_datetime + i) = trunc(beg_datetime) and 
             to_char(beg_datetime, 'hh24') >= 13 and to_char(beg_datetime, 'hh24') < 17
                then round((((trunc(beg_datetime) + 17/24) - beg_datetime)*24),3)
             -- если конец периода
             when trunc(beg_datetime + i) = trunc(end_datetime) and
             to_char(end_datetime, 'hh24') >= 8 and to_char(end_datetime, 'hh24') < 12 
                then round((end_datetime - (trunc(end_datetime) + 8/24)) * 24,3)
             when trunc(beg_datetime + i) = trunc(end_datetime) and 
             to_char(end_datetime, 'hh24') >= 13 and to_char(end_datetime, 'hh24') < 17
                then round((end_datetime - (trunc(end_datetime ) + 8/24 + 1/24)) * 24,3)     
             -- ошибка
             else 0
             end
        end;
        
        -- Расчет суммароного рабочего времени за период
        res:= res + arr(i);
      
      end if;
                        
   end loop;

 else
 res:=-1;    
    DBMS_OUTPUT.PUT_LINE('Указан неверный диапазон дат!');
 
 end if;
   return res;
end;
/

Пример, вызова функции:

select worktime(to_date('07.04.2014 16:12:34','dd.mm.yyyy hh24:mi:ss'), to_date('20.04.2014 09:20:15','dd.mm.yyyy hh24:mi:ss')) RES from dual;

RES
---
72.791