Tenho um relatório de fatura que estou desenvolvendo para o faturamento de alguns projetos. O tablix principal possui vários grupos, nesta ordem:
- ProjectGroup
- TicketGroup
- NoteGroup
- Detalhes (detalhes de cobrança reais)
Os dados podem acabar se parecendo com algo assim:
project_id ticket_id note_id hours billing_agreement_id billed_hours
----------- ----------- ----------- ------------ -------------------- ------------
1 1 1 0.50 4 0.75
1 1 2 0.50 5 1.00
1 1 3 1.00 7 1.00
1 1 8 5.00 7 3.00
1 1 8 5.00 2 2.00
2 2 4 4.00 1 4.00
2 2 5 2.00 6 3.00
Em outras palavras, um tíquete é atribuído a um projeto, notas são inseridas em um tíquete (com um número correspondente de horas trabalhadas) e as horas de notas são cobradas para um ou mais acordos/contratos (se um acordo de bloqueio de tempo estiver esgotado, o restante pode transbordar para outro contrato, por exemplo). Tudo isso está funcionando bem, no que diz respeito ao aplicativo.
Agora estou criando o relatório de fatura e preciso fornecer um total geral de horas trabalhadas no final do relatório. Dê uma olhada na 4ª e 5ª linhas (com note_id = 8). O rodapé do relatório usa Sum(hours)
, que acaba contando essa nota como 10 horas. Ambos note_id
e hours
vêm da linha de notas e devem ser somados de acordo. Incluir hours
na expressão de agrupamento para NoteGroup não tem nenhum efeito no comportamento de Sum, naturalmente.
Existe uma maneira direta de fazer o Reporting Services somar as horas, observando apenas os valores agrupados desse grupo, em vez das linhas de detalhes? Ainda não consigo pensar em nada particularmente elegante. Posso recorrer a acrobacias estranhas de código personalizado, se necessário.
Bem, depois de muitas experiências, não consegui encontrar uma boa maneira de fazer isso no Reporting Services. Tentei usar uma função personalizada para acumular o total de horas (chamada na célula que exibe as horas no cabeçalho NoteGroup) e, em seguida, outra função personalizada no rodapé da tabela que recuperaria o valor, mas os valores acumulados seriam redefinidos nas quebras de página.
No final, eu deturpei a consulta em diversas subconsultas. É chato, mas funciona. Seria legal se você pudesse fazer algo como
SUM(hours) OVER(DISTINCT note_id PARTITION BY client_id)
...