5 Replies Latest reply: Dec 15, 2016 2:48 PM by Andrey Khoronenko RSS

    Не правильно работает функция IF

    Yuriy Butsan

      С помощью диаграммы (карта дерева или круговая диаграмма) хочу отобразить приезд автомобиля на торговую точку. Сформировал в 5 групп: не посещена, во время, до начала ВО, приезд в перерыв и после окончания ВО. Временное окно двух типов: 1) с 7 до 13 или 2) с 7 до 12 и с 13 до 17 (с учетом перерыва). В точности прописал эту же формулу в Эксель, все работает правильно. В Qlik Sense неправильно отображает приезд автомобиля. Пример: ВО с 7 до 12 +  с 13 до 17, приезд авто в 12:44, считает, как "Во время", но должно быть "Приезд в перерыв". Подскажите, пожалуйста, где именно ошибка? Возможно я не правильно понимаю принцип работы данной функции. Скрипт ниже.

       

       

      if(@38='-1', 'Не посещена',

       

      if(@41='-1',

             if (((@44>@39) and (@44<@40)),'Во время',

                  if (@44<@39,'До начала ВО','После окончания ВО')),

               

             if (((@44>@39) and (@44<40)) or ((@44>41) and (@44<@42)), 'Во время',

                  if(((@44>@40) and (@44<@41)), 'Приезд в перерыв',

                     if((@44<@39), 'До начала ВО', 'После окончания ВО'))))) as [Приезд на ТТ],

       

          @38 as [Точность объединения],

          @39 as [Начало первого временного окна],

          @40 as [Окончание первого временного окна],

          @41 as [Начало второго временного окна],

          @42 as [Окончание второго временного окна],

          @44 as прибытие,

        • Re: Не правильно работает функция IF
          Andrey Khoronenko

          Доброго времени суток, Юрий!

           

          В приведенном коде не очень понятна проверка if(@41='-1'... (вторая строка), т.к. по определению далее @41 as [Начало второго временного окна].

          Кроме того, раз есть два варианта окна (быстрее всего это связанно с анализом обычного рабочего дня и субботы), следовательно до проверок времени прибытия с параметрами начала и окончания окон, как представляется, должна быть проверка типа окна.

          В целом я бы осуществлял следующую последовательность проверок:

          1. Проверка факта посещения

          2. Проверка типа окна

          3. Проверка на прибытие до начала рабочего дня

          4. Проверка на прибытие после окончания рабочего дня

          5. Проверка на прибытие в перерыв (только для рабочих дней)

          6. Все остальное - прибытие вовремя.

           

          Извините, что от руки, но дерево проверок выглядит, как представлено на рисунке ниже

           

          ДеревоРешений.jpg

          С уважением

           

          Андрей

            • Re: Не правильно работает функция IF
              Yuriy Butsan

              (В приведенном коде не очень понятна проверка if(@41='-1'... (вторая строка), т.к. по определению далее @41 as [Начало второго временного окна].)

              У меня есть CSV файл, где по умолчанию в поле 41 выгружает значение "-1" есть нет данных.

               

               

              Кроме того, раз есть два варианта окна (быстрее всего это связанно с анализом обычного рабочего дня и субботы), следовательно до проверок времени прибытия с параметрами начала и окончания окон, как представляется, должна быть проверка типа окна.

               

              Не совсем так, два варианта окна за счет того, что у некоторых клиентов может быть перерыв в работе. Это может быть любой день недели с пн по вс (доставка 7 дней)

               

              В целом я бы осуществлял следующую последовательность проверок:

              1. Проверка факта посещения

              2. Проверка типа окна

              3. Проверка на прибытие до начала рабочего дня

              4. Проверка на прибытие после окончания рабочего дня

              5. Проверка на прибытие в перерыв (только для рабочих дней)

              6. Все остальное - прибытие вовремя.

               

              Извините, что от руки, но дерево проверок выглядит, как представлено на рисунке ниже

              Спасибо большое за оперативную обратную связь. Очень полезно.

               

              Получается, вот тот алгоритм, что я написал изначально, работает правильно, но я не понимаю, почему он не работает в скрипте загрузки, а в редакторе выражений все работает. Ниже точно такой же пример, только адаптирован под редактор выражений + с комментарием. Можете, пожалуйста, объяснить этот момент?

               

              //Был ли визит?

              if([Точность объединения]='-1', 'Не посещена',

              //Есть ли второе ВО?

                    if([Начало второго временного окна]='-1',

                //ИСТИНА!!!!

              //Попал ли в ВО?

                          if ((([прибытие]>[Начало первого временного окна]) and ([прибытие]<[Окончание первого временного окна])),'Во время',

              //Приезд до начала ВО был?

                          if ([прибытие]<[Начало первого временного окна],'До начала ВО','После окончания ВО')),        

               

                                  //ЛОЖЬ!!!!

              //Попал ли во ВО с до и с до?

                          if ((([прибытие]>[Начало первого временного окна]) and ([прибытие]<[Окончание первого временного окна])) or (([прибытие]>[Начало второго временного окна]) and ([прибытие]<[Окончание второго временного окна])), 'Во время',

              //Приезд в перерыв был?

                               if((([прибытие]>[Окончание первого временного окна]) and ([прибытие]<[Начало второго временного окна])), 'Приезд в перерыв',

              //Приезд до начала ВО1 был?

                                    if(([прибытие]<[Начало первого временного окна]), 'До начала ВО', 'После окончания ВО')))))

                • Re: Не правильно работает функция IF
                  Andrey Khoronenko

                  Юрий, доброе утро!

                   

                  Вроде логика данных теперь понятна. Как я понимаю, @39 as [Начало первого временного окна] - это время начала любого типа окна, т.к. их значения совпадают, а @41 as [Начало второго временного окна] - это признак, первое или второе окно анализируется, раз его значение по существу логическое (название поля чуть вводит в заблуждение).


                  Нарисовал дерево решений по Вашему коду, аналогично приведенному мною ранее. На мой взгляд, судя по полученному результату, Ваша логика должна работать. Значит, по идее, теперь надо искать ошибки в синтаксисе или в данных.

                   

                  Есть пару соображений (исходя из того, что вижу, о том пишу, т.к. другой информации просто нет).

                   

                  1. Нет ли просто случайных ошибок в приведенном Вами коде - например, нет знака @ перед номером поля (если Вы его просто скопировали сюда из редактора скрипта, выделено красным цветом ниже)?

                   

                  if(@38='-1', 'Не посещена',

                   

                  if(@41='-1',

                         if (((@44>@39) and (@44<@40)),'Во время',

                              if (@44<@39,'До начала ВО','После окончания ВО')),

                        

                         if (((@44>@39) and (@44<40)) or ((@44>41) and (@44<@42)), 'Во время',

                              if(((@44>@40) and (@44<@41)), 'Приезд в перерыв',

                                 if((@44<@39), 'До начала ВО', 'После окончания ВО'))))) as [Приезд на ТТ],

                   

                      @38 as [Точность объединения],

                      @39 as [Начало первого временного окна],

                      @40 as [Окончание первого временного окна],

                      @41 as [Начало второго временного окна],

                      @42 as [Окончание второго временного окна],

                      @44 as прибытие,

                   

                  2. На первый взгляд, возможно проверяются на соответствие разные типы данных, например время и логическое значение 0 или -1 (ниже выделено красным)

                   

                  if(@38='-1', 'Не посещена',

                   

                  if(@41='-1',

                         if (((@44>@39) and (@44<@40)),'Во время',

                              if (@44<@39,'До начала ВО','После окончания ВО')),

                        

                         if (((@44>@39) and (@44<40)) or ((@44>41) and (@44<@42)), 'Во время',

                              if(((@44>@40) and (@44<@41)), 'Приезд в перерыв',

                                 if((@44<@39), 'До начала ВО', 'После окончания ВО'))))) as [Приезд на ТТ],

                   

                      @38 as [Точность объединения],

                      @39 as [Начало первого временного окна],

                      @40 as [Окончание первого временного окна],

                      @41 as [Начало второго временного окна],

                      @42 as [Окончание второго временного окна],

                      @44 as прибытие,

                   

                  Исходя из того, что @39 - это время начала и первого, и второго ВО, а @41 просто логический признак вида ВО, надо в коде везде в сравнениях @41 заменить на @39.

                   

                  С уважением

                   

                  Андрей

                    • Re: Не правильно работает функция IF
                      Yuriy Butsan

                      Спасибо большое! Действительно была ошибка в скрипте. Исправил и теперь все работает.

                       

                      Скажите, пожалуйста, если у меня этот алгоритм прописан в скрипте загрузки, это ускоряет вычисления в модели или не имеет значения, где он прописан в скрипте загрузки или редакторе выражений?

                        • Re: Не правильно работает функция IF
                          Andrey Khoronenko

                          При небольшом объеме данных (сотни тысяч строк) разницу Вы быстрее всего на практике не заметите. Но в целом надо, на мой взгляд, руководствоваться следующим.

                           

                          Как известно, программы Qlik работают как бы в два этапа: сначала из внешних источников данные посредством скрипта загружаются в хранилище Qlik, а затем на основании этих данных хранилища строятся диаграммы. При изменении данных хранилища в процессе очередной загрузки автоматически пересчитываются все диаграммы.

                           

                          Диаграммы Qlik можно в самом общем случае использовать в двух режимах:

                          1. Изменение (или возможность изменения) диаграмм - данные в хранилище Qlik регулярно обновляются в процессе работы скрипта загрузки, впоследствии пользователь работая с диаграммами использует отборы, сценарии анализа и т.п. - классический анализ данных.

                          2. Диаграммы играют роль неизменных панелей индикаторов, на которые в результате периодического обновления данных в процессе работы скрипта загрузки выводятся значения определенных показателей (по аналогии, датчик уровня топлива в автомобиле). Представляется, что пользователь не работает с диаграммами Qlik, только наблюдает за ними и их не изменяет.

                           

                          Первый режим основной и собственно на его использование направлено совершенствование программ Qlik разработчиком. Второй режим несколько искусственный и может использоваться для предоставления высшему руководству компании определенных данных, обновляемых с заданной периодичностью (ну не будет генеральный директор или президент корпорации на практике изучать Qlik, а вот посмотреть показатели на ноутбуке, планшетнике или смартфоне вполне может).

                           

                          Если интервал между загрузками достаточно большой (десятки минут, часы, дни), что характерно практически всегда для первого (основного) варианта режима работы и в большинстве случаев для второго, то конечно предпочтительно все вычисления поместить в скрипт загрузки. По крайней мере при изменении диаграмм вычислений будет меньше и сами вычисления/изменения диаграммы пройдут быстрее.

                           

                          Если же используется второй режим, причем с небольшим интервалом времени обновлений (десятки секунд, минуты), то здесь я бы все определял экспериментальным путем (сильное влияние оказывают каналы связи, характеристики вычислительной техники и т.п.), заранее понимая, что вычисления в диаграммах будут производиться быстрее, чем при загрузки скрипта.

                           

                          Учитывая, что второй режим с небольшими интервалами загрузки на практике представляется некоторой экзотикой и используется не часто, по крайней мере в случае решения задачи Вашего класса, я бы рекомендовал обсуждаемые нами вычисления вынести в скрипт. Пересчет диаграмм в последующем будет происходить быстрее, что особенно будет заметно на больших объемах данных (десятки и сотни миллионов строк).