6 Replies Latest reply: Sep 7, 2015 7:08 AM by Коробов Владислав RSS

    Работа с таблицами

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

      Таблица.png

      В таблице есть поля "Год" и "Месяц" и в них по мимо стандартных значений года и месяца есть значение "Текущий".

      Так же есть 3 выражения "Количество", "СкладFREE" и "СкладРезерв".

      собственно задача - поле "количество" должно показываться всегда, а поля СкладFREE И СкладРезерв, только под годом и месяцем со значением "Текущий".

      и вот я никак не соображу, как это можно реализовать.

        • Re: Работа с таблицами
          Vladimir Kochetov

          Добрый день.

          Попробуйте прописать выражение в Conditional:

          01.png

           

          Нужно написать, что-то типа: в Expresion "СкладFREE" нужно написать: Год = 'Текущий' or Месяц = 'Текущий'

          • Re: Работа с таблицами
            Sergey Polekhin

            Добрый день,

             

            Полагаю, что решить задачу "в лоб" с использованием одной диаграммы вы не сможете.

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

            Поэтому обходными путями в вашем случае могут являться: 1) использование нескольких объектов визуализации; 2) создание собственных объектов визуализации (разработка на JavaScript) с требуемыми вам свойствами.

             

            Более детальная информация приведена ниже. Извиняюсь за длинное описание, по полагаю, что оно позволит более детально понять возможности/ограничения стандартных объектов визуализации. Также ниже я описал некоторые вопросы оптимизации, которые может быть полезно знать при работе с большими объемами данных, т.к. очевидно, что интерактивность и удобство объектов визуализации зависит не только от того, что именно объект отображает, но и то, какой объем данных он "переваривает" каждый раз перед тем, как показать конечный результат пользователю, т.е. то, насколько быстро объект будет пересчитываться при отборе пользователем каких-либо данных.

             

             

            Детали:

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

             

            Дело в том, что у каждого объекта визуализации есть правила вычислений выражений, задаваемых в свойствах этого объекта. И для правильной настройки параметров объекта визуализации нужно понимать не только правила вычисления самих выражений, но и контекст их вычислений.

             

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


            Явно задать контекст выражения можно с использованием функции Aggr() и/или использованием префикса Total. Например:

            1. Выражения Sum(Field1) и Aggr( Sum(Field1), Field2) будут отличаться как результатом вычислений, так и их последовательностью. Результатом вычисления выражения Sum(Field1) будет единственное значение равное сумме всех значений поля Field1. Результатом же вычисления выражения Aggr( Sum(Field1), Field2) будет набор значений сумм поля Field1, рассчитанных для каждого значения поля Field2. Т.е. фактически вычисление будет состоять из двух этапов: 1) поиск всех уникальных значений поля Field2 и 2) расчет выражения Sum(Field1) для каждого из ранее найденных значений поля Field2. 
            2. Результаты же выражений Sum(Field1) и RangeSum( Aggr( Sum(Field1), Field2) не будут отличаться, но будут различаться последовательности вычислений этих выражений. В данном случае вычисление второго выражения будет состоять уже не из двух, а из трех этапов: 1) поиск всех уникальных значений поля Field2; 2) расчет выражения Sum(Field1) для каждого из ранее найденных значений поля Field2; 2) расчет функции RangeSum(), по сути выполняющей суммирование всех значений, полученных на предыдущем этапе.


            Неявно контекст вычисления задается типом объекта визуализации.

            Например, объект визуализации "Текстовый объект" сам не задает контекст вычислений.


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

            Использование префикса Total в выражениях позволяет при вычислениях полностью или частично отключить контекст, заданный измерениями на закладке "Измерения". Но в целом, можно сказать, что выражения объекта"Диаграмма" указываемые в свойстве "Описание" могут рассматриваться в контексте каждого из значений данных, описываемых измерениями этой диаграммы.

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


            Именно поэтому вы не сможете определить выражениями правила отображения/вычисления столбцов таблицы в зависимости от значения измерений, задаваемых на закладке "Измерения". Эти выражения вычисляются целиком для всего объекта визуализации, т.е. вне контекста конкретных значений измерений.



            Оптимизация вычислений на больших объемах данных.
            С точки зрения оптимизации производительности работы объектов визуализации неплохо понимать, как выполняются вычисления в самих выражениях.


            Последовательность обработки любого выражения:

            1. Для любой функции агрегации используемой в выражении, вычисляется набор данных, для которого применимо это выражение и на основе которого будут проводиться реальные вычисления. Задача этого этапа - минимизировать объем расчетов, что позволит минимизировать как время расчетов, так и ресурсы, используемые для расчета. Формирование набора данных выполняется на основе анализа выражения множества, т.е. выражения заключенного в фигурные скобки (выделены зеленым цветом), например,
              Sum( {1 < Field1 = {'Значение'} >} Field2)
            2. Вычисляется сама функция агрегации для набора данных, отобранного на этапе 1 (см. выше).
            3. Если выражение имеет вид If( Условие, Sum( {1 < Field1 = {'Значение'} >} Field2, False), то перед вычислением функции выполняется проверка условия, заданного функцией If(), а уже затем рассчитывается набор данных и функция агрегации (т.е. выполняются пп.1 и 2). Несмотря на то, что это кажется очевидным, обращаю на это отдельное внимание, т.к. это будет важно впоследствии.

             

            Исходя из того, что выражения могут вычисляться в контексте заданном явно или неявно, наличие контекста может существенно влиять на объемы и скорость вычислений.

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

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

            • Re: Работа с таблицами
              Yevgeniy Popov

              Добрый день.

              Предлогаю вот такой способ, может подойдет.

               

              Можно добавить вычисляемое измерение:

              =if(Month='Текущий',Test,'Количество')

               

              "Test" создать самому:

              Test:

              load*Inline

              [Test

              Количество

              СкладFREE

              СкладРезерв

              ];

               

              И в выражениях будет одно выражение

              if(Test = 'Количество', sum(bla)

              ,if(Test = 'СкладFREE',sum(bla bla)

              ,if(Test = 'СкладРезерв',sum(bla bla bla),sum(bla))))