Привет всем.
Вот казалось бы самая простая крос таблица
процент понятно как щитается а вот сощитать его в итогах такимже макаром не выходит, Sum - выдаёт какуюто астрономическую цифру.
Вопрос: Как сощитать процент в итогах?
Ну, что тут сказать? Была у меня такая задача. Сразу скажу, решить её на основе именно кросса мне не удалось. Сам посуди... Для вычисления итогового процента ни какая из аггрегатных функций (сумма, среднее и т.д.) не подходит. Тут надо оперировать уже итоговыми значениями. Т.е. надо сначала вычислить суммы твоих полей, а потом посчитать итоговый процент по формуле S1*100/S2. Так вот, сделать это можно только в событии OnBeforePrint ячейки, куда будет этот процент записываться. Но в этот момент получить значения двух других ячеек, содержащих итоговые суммы, ну ни как не выходит. Более того, попытка заранее их расчитать в датасете, а в нужный момент просто подставить, тоже не пройдёт, поскольку в момент отрисовки кросс-таба исходный датасет уже не используется, т.е. курсор стоит на одном месте и всё (кросс рисуется по заранее подготовленной матрице). Нельзя определить что именно нужно подставить.
Короче, я решил эту проблему отказавшись от кросса в пользу вертикальных бэндов, т.е. в пользу кросса старого стиля. Тоже помаяться пришлось, но результата добился. Так что, если ситуация позволяет, копни в сторону вертикальных бэндов.
Легче показать. Вот тебе небольшой примерчик.
На случай, если у тебя не установлены TfrxFIBQuery и иже с ними (ты в этом случае не увидишь запросов, но увидишь ссылки на них в мемках отчёта и в коде), дополню:
Здесь используются два запроса:
/* qPlanFact: Возвращает детальную информацию о плановых и фактических показателях
на каждую дату периода для каждой статьи расхода/прихода */
select pf.inout, pf.inout_item, i.name inout_item_name, pf.on_date,
sum(pf.plan_in) - sum(pf.plan_out) sum_plan,
sum(pf.fact_in) - sum(pf.fact_out) sum_fact
from suf_plan_fact_details(:center, :period, :plan_state) pf
left join suf_inout_item i on i.id = pf.inout_item
where i.id is not null
group by pf.inout, pf.inout_item, i.name, pf.on_date
/* qByItems: Возвращает суммарные показатели план-факт для каждой статьи прихода/расхода
за весь период */
select pf.inout, pf.inout_item, i.name,
sum(pf.plan_in - pf.plan_out) plan_sum,
sum(pf.fact_in - pf.fact_out) fact_sum
from suf_plan_fact_by_items(:center, :period, :plan_state, null) pf
left join suf_inout_item i on i.id = pf.inout_item
group by pf.inout, pf.inout_item, i.name
order by pf.inout, i.name
Замени их подходящими по смыслу своими запросами, да потестируй. В любом случае, тебе ведь главное - структура отчёта, а не запросы. Это лишь один из вариантов. Здесь я итоговые суммы вычисляю отдельным запросом, а потом подставляю, а можно использовать вертикальные бэнды итогов. Ну, короче, посмотри, а будут возникать вопросы, пиши.
Здравствуйте. Прочитала ваши примеры по Отчет по ДСС. Подскажите, пожалуйста, как сделать итоги по горизонтали в фастрепорте в вертикальных бэндах. И если можно поподробнее о вашем отчете(почему столько Мастер дата) и почему у вас шапка на мастер дата1
Комментарии
Ну, что тут сказать? Была у меня такая задача. Сразу скажу, решить её на основе именно кросса мне не удалось. Сам посуди... Для вычисления итогового процента ни какая из аггрегатных функций (сумма, среднее и т.д.) не подходит. Тут надо оперировать уже итоговыми значениями. Т.е. надо сначала вычислить суммы твоих полей, а потом посчитать итоговый процент по формуле S1*100/S2. Так вот, сделать это можно только в событии OnBeforePrint ячейки, куда будет этот процент записываться. Но в этот момент получить значения двух других ячеек, содержащих итоговые суммы, ну ни как не выходит. Более того, попытка заранее их расчитать в датасете, а в нужный момент просто подставить, тоже не пройдёт, поскольку в момент отрисовки кросс-таба исходный датасет уже не используется, т.е. курсор стоит на одном месте и всё (кросс рисуется по заранее подготовленной матрице). Нельзя определить что именно нужно подставить.
Короче, я решил эту проблему отказавшись от кросса в пользу вертикальных бэндов, т.е. в пользу кросса старого стиля. Тоже помаяться пришлось, но результата добился. Так что, если ситуация позволяет, копни в сторону вертикальных бэндов.
На случай, если у тебя не установлены TfrxFIBQuery и иже с ними (ты в этом случае не увидишь запросов, но увидишь ссылки на них в мемках отчёта и в коде), дополню:
Здесь используются два запроса:
Замени их подходящими по смыслу своими запросами, да потестируй. В любом случае, тебе ведь главное - структура отчёта, а не запросы. Это лишь один из вариантов. Здесь я итоговые суммы вычисляю отдельным запросом, а потом подставляю, а можно использовать вертикальные бэнды итогов. Ну, короче, посмотри, а будут возникать вопросы, пиши.
Здравствуйте. Прочитала ваши примеры по Отчет по ДСС. Подскажите, пожалуйста, как сделать итоги по горизонтали в фастрепорте в вертикальных бэндах. И если можно поподробнее о вашем отчете(почему столько Мастер дата) и почему у вас шапка на мастер дата1