Конкурс

1Вопрос:

Имеется исходная таблица в реляционной СУБД:

Контрагент Договор Дебет Кредит
Контрагент1 Договор1 100 120
Контрагент1 Договор2 610 500
Контрагент2 Договор3 30 40
Контрагент2 Договор4 50 50
Контрагент2 Договор5 10 60


Как сделать так, чтобы пользователь WebIntelligence всегда бы видел сальдированные значения Дебета и Кредита, в т.ч. при:
а) выполнении произвольного запроса в Query Panel
б) при изменении контекста вычисления (агрегации) в отчете ?

 

Контрагент Договор Дебет Сальированный Кредит Сальдированный
Контрагент1 Договор1 0 20
Контрагент1 Договор2 110 0
Контрагент2 Договор3 0 10
Контрагент2 Договор4 0 0
Контрагент2 Договор5 0 50

 

Контрагент Дебет Сальированный Кредит Сальдированный
Контрагент1 90 0
Контрагент2 0 60

Изложите способы решения этой задачи.

Комментарии:

Дмитрий Гераськин (Рейтинг: 191) 11:49, 16 мая 2011


Комментарий эксперта

Вариант 1

Добавить в таблицу Webintelligenceформулы со следующей логикой:

Дебет сальдированный           =  (дебет –кредит) * ((дебет –кредит) >=0).

Кредит сальдированный         =  (дебет –кредит) * ((дебет –кредит) <0).

 

Вариант 2.

Создать в SAP BW инфокуб с некумулятивным показателем “Сальдо”, основанном на показателях увеличивающих/уменьшающих сальдо (Дебет и кредит соответственно).

Загрузить в инфокуб SAP BW данные из исходной таблицы СУБД.

Создать Bex Query на основе инфокуба.

Определить в bex query 2 формулы на показателе “Сальдо”:

Дебет сальдированный           = Сальдо * (Сальдо>=0).

Кредит сальдированный         = Сальдо * (Сальдо<0).

Построить BO Query на Bex Query и использовать его в WebIntelligence.

Вариант 3

Создать в SAP BW инфокуб с показателями дебет и кредит.

Загрузить в куб исходную таблицу из СУБД.

Создать Bex Query на основе инфокуба.

Определить в bex query 2 формулы:

Дебет сальдированный           =  (дебет –кредит) * ((дебет –кредит) >=0).

Кредит сальдированный         =  (дебет –кредит) * ((дебет –кредит) <0).

Михаил Макаров (Рейтинг: 135) 15:02, 25 ноября 2011


Комментарий эксперта

Контрагент  Договор  Дебет  Кредит 
Контрагент1 Договор1 100 120
Контрагент1 Договор2 610 500
Контрагент2 Договор3 30 40
Контрагент2 Договор4 50 50
Контрагент2 Договор5 10 60

 

 

Читаю данные в Web Int Rich Client

 

 

Создаю переменные:

«Дебет сальдированный» с формулой

=If[Дебет]>[Кредит] Then[Дебет]-[Кредит] Else0

«Кредит сальдированный» с формулой

=If[Дебет]<[Кредит] Then[Кредит]-[Дебет] Else0

 

Замещаю колонку «Дебет» переменной «Дебет сальдированный»

Замещаю колонку «Кредит» переменной «Кредит сальдированный»

 

Копирую таблицу (вниз) и в копии меняю локальный контекст вычисления

Вроде все проверки по заданию выполнены.

Если только под фразой «а) выполнении произвольного запроса в QueryPanel» не крылся какой-то тайный и непонятый мной смысл, так как под термином «произвольный» можно понимать многое чего J.

Сергей Дыжин (Рейтинг: 41) 15:05, 25 ноября 2011


Комментарий эксперта

Для создания независимых от содержания запроса в QueryPanelмер, содержащих сальдированные значения Дебета и Кредита, необходимо обратиться к построению логики на уровне юниверса.

Для начала определим юниверс, соответствующий условиям поставленной задачи:

Где измерения определены следующим образом:

  • Контрагент              "BI-expert-2".Partner
  • Договор                     "BI-expert-2".Contract
  • Кредит                                  sum("BI-expert-2".Credit)
  • Дебет                        sum("BI-expert-2".Debit)

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

Для определения сальдо введем вспомогательную меру min_Deb_Cred, которая будет возвращать минимальное из значений Дебета и Кредита со следующим значением определением:

CASE WHEN @Select(Меры\Дебет) <= @Select(Меры\Кредит) THEN @Select(Меры\Дебет)  ELSE @Select(Меры\Кредит) END

Т.к. мера вспомогательная, то определим ее, как невидимую пользователям:

Следующим шагом будет определение требуемых мер: Сальдированный Дебет и Сальдированный Кредит.

Данные меры будут возвращать разницу значений Дебета/Кредита и нашей дополнительной меры соответственно:

  • Дебет                        @Select(Меры\Дебет)-@Select(Меры\min_Deb_Cred)
  • Кредит                                  @Select(Меры\Кредит)-@Select(Меры\min_Deb_Cred)

Т.к. агрегированные значения этих мер не могут быть рассчитаны на уровне WebIntelligence, то необходимо указать им агрегацию на уровне БД:

Итоговый юниверс будет иметь следующий вид:

Таким образом, мы получили юниверс с мерами Сальдированный Дебет и Сальдированный Кредит, при выборе которых пользователь получит значения, отвечающие всем условиям поставленной задачи.