С ограничениями Business Objects (Launchpad 4.1 SP6) мне нужно построить круговую диаграмму. Достаточно просто, но набор данных, который я должен использовать, содержит поле кода, которое оценивается, и в зависимости от возвращаемого строкового значения другое поле суммируется (начисленные минуты данного действия, описываемые значением кода возврата).Business Object Pie Chart Conundrum
Например, [Код] возвращает значение «BRK1», означающее разрыв и оценку числа 15 (с указанием 15 минут). Другой [Code] возвращает «LUNCH» и оценивает число 60 (с указанием 60-минутного обеда). Эти типы кодов возвращают «Subtractive Codes», что означает, что они представляют время, вычитаемое из запланированной работы. В пределах того же поля [Код] также указаны коды, описывающие рабочие сегменты. Например: [Код] возвращает «SB_PHN_SOUTH», указывающий «ведро сдвига», которое оценивается до 540 минут. Ведра сдвига - это «Аддитивные коды».
Таким образом, учитывая эти деловые и программные правила, у меня есть набор данных, который выглядит следующим образом:
EWFMCodeSelect EWFMPieChart
BREAK 2425685
DISC 443075
MISS 83476
NEUTR 2700
NODISC 582787
SHIFT 16120299
Это может быть легко превращена в виде круговой диаграммы, но с одной серьезной ошибки. Все группы, BREAK, DISC, MISS, NEUTR и NODISC являются субтрактивными и относятся к числителю. Код SHIFT является знаменателем. SHIFT представляет 9 часов времени переключения, разрывов и такого вычитания из времени переключения, поэтому на точной круговой диаграмме будет отображаться каждое вычитаемое ведро в процентах от всего времени «SHIFT».
У меня есть две переменные для значений группы в ковши для оценки и суммирования:
=If([Code]InList("BRK1"; "BRK2"; "BRK3"; "LUNCH")) Then"BREAK"
ElseIf([Code]InList("TEAM"; "MTG"; "PROJ"; "TRNG")) Then "DISC"
ElseIf([Code]InList("LATE";"NOSHOW";"UNPAID";"UPVAC")) Then "MISS"
ElseIf([Code]InList("COACH")) Then "NEUTR"
ElseIf([Code]InList("VAC";"LOA";"SICKUP";"SICKPL")) Then "NODISC"
Else("SHIFT")
, а затем:
=If([EWFMCodeSelect]="BREAK") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
ElseIf([EWFMCodeSelect]="DISC") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
ElseIf([EWFMCodeSelect]="MISS") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
ElseIf([EWFMCodeSelect]="NEUTR") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
ElseIf([EWFMCodeSelect]="NODISC") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
ElseIf([EWFMCodeSelect]="SHIFT") Then Sum([TimeDiff (ToInt)]ForEach([Clndr Date];[Time-Interval];[Agent Login];[Code]))
Я пробовал различные методы для Sum ("SHIFT") - (InList («Все остальные коды»)), но я либо получаю ошибку #MULTIVALUE (независимо от того, какие я пытаюсь использовать Контекстные операторы), либо какой-либо другой тип неправильного возвращаемого значения.
Я не нашел сообщений здесь или где-либо еще, описывающих подобную проблему (или решение), поэтому я надеюсь, что некоторые замечательные эксперты Business Objects Webi могут предложить путь к решению.
Благодарим за внимание!
Спасибо, что нашли время Джо, я ценю вашу помощь. Я удалил предложение ELSE в переменной EWFMCodeSelect и отфильтровал блок отчета, чтобы исключить значения SHIFT. Я использовал вашу формулу в новой переменной, которую я нежно вызываю EWFMPieChart (%), удалив переменную CodeSelect в блоке вместе с моей новой переменной, и я получаю ошибку #MULTIVALUE по всем направлениям.Я возился с обычными комбинациями ForEach, которые я использовал для очистки многозначных ошибок в других ситуациях в этом rpt, но безрезультатно. Какие-нибудь дополнительные предложения? –
Можете ли вы обновить свой вопрос с помощью полных формул, которые вы используете сейчас? – Joe
Joe, после изучения далее, я нашел источник ошибки, и он находится внутри самой структуры данных, а не кода, который вы щедро предоставили. Я работаю сегодня, чтобы очистить его от источника, в случае успеха я повторю код, и я ожидаю, что на этот раз он будет работать, как вы описали. Я буду держать вас в курсе. –