Relatório Cruzado ou Matriz no Fortes Report

26/01/2024

0

Boa tarde, estou buscando ajuda para o Fortes Report em Delphi, de como fazer um relatório estilo o da foto
https://i.stack.imgur.com/pjSoE.jpg
, estou usando Delphi 11 CE e Firebird 3.0 como base de Dados, fiz alguns testes dentro do IBExpert, mas não ficou bom o resultado utilizando as filiais (conforme foto) como colunas, até pensei em pivotar as datas, porém fiquei pensando sem sair muito do lugar na questão de criar as colunas dentro do relatório em tempo de execução. Não tenho interesse em mudar o componente de relatório para o Fast Reports, que já vi que possui o matrix/crosstab dependendo a versão do Fast Reports pois a impressão do relatório vai ficar aparecendo o detalhe de licenciamento, o que não é algo que eu deseje na impressão final. Segue abaixo a SQLs que eu pretendo usar
SELECT
escala_filiais.descricao||' ('||SUBSTRING(100+EXTRACT(HOUR FROM escala_filiais.horario_ABERTURA)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM escala_filiais.horario_ABERTURA)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM escala_filiais.horario_FECHAMENTO)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM escala_filiais.horario_FECHAMENTO) FROM 2 FOR 2)||')' "FILIAL",
LIST((
CASE
WHEN domingo.CARGO = 1 THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')'
WHEN domingo.cargo = 2 THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')'
WHEN domingo.cargo = 3 AND (DOMINGO.horario_i = escala_filiais.horario_ABERTURA AND DOMINGO.horario_f = escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev
WHEN domingo.cargo = 3 AND (DOMINGO.horario_i <> escala_filiais.horario_ABERTURA OR DOMINGO.horario_f <> escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')'
WHEN domingo.cargo = 4 AND (DOMINGO.horario_i = escala_filiais.horario_ABERTURA AND DOMINGO.horario_f = escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev
WHEN domingo.cargo = 4 AND (DOMINGO.horario_i <> escala_filiais.horario_ABERTURA OR DOMINGO.horario_f <> escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')'
WHEN domingo.cargo = 6 AND (DOMINGO.horario_i = escala_filiais.horario_ABERTURA AND DOMINGO.horario_f = escala_filiais.horario_FECHAMENTO) THEN 'Depósito: '||funcionarios.nome_abrev
WHEN domingo.cargo = 6 AND (DOMINGO.horario_i <> escala_filiais.horario_ABERTURA OR DOMINGO.horario_f <> escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')'
WHEN domingo.cargo = 5 AND (DOMINGO.horario_i = escala_filiais.horario_ABERTURA AND DOMINGO.horario_f = escala_filiais.horario_FECHAMENTO) THEN 'Depósito Central: '||FUNCIONARIOS.nome_abrev
WHEN domingo.cargo = 5 AND (DOMINGO.horario_i <> escala_filiais.horario_ABERTURA OR DOMINGO.horario_f <> escala_filiais.horario_FECHAMENTO) THEN funcionarios.nome_abrev||' ('||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_i)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_i)FROM 2 FOR 2)||' - '||SUBSTRING(100+EXTRACT(HOUR FROM DOMINGO.horario_f)FROM 2 FOR 2)||':'||SUBSTRING(100+EXTRACT(minute FROM DOMINGO.horario_f) FROM 2 FOR 2)||')' else null end), ' - ') AS FUNCIONARIO,
DOMINGO.DATA,
DOMINGO.horario_i "INICIO",
DOMINGO.HORARIO_F "FIM",
funcionarios_cargo.descricao "CARGO"
FROM escala_domingo DOMINGO
LEFT JOIN funcionarios on funcionarios.id = DOMINGO.funcionario
LEFT JOIN escala_filiais on escala_filiais.id = domingo.filial
LEFT JOIN funcionarios_cargo on funcionarios_cargo.id = DOMINGO.cargo
WHERE DOMINGO.CAB = 1
GROUP by DOMINGO.data, "FILIAL", "INICIO", "FIM", "CARGO", DOMINGO.CARGO
ORDER BY DOMINGO.DATA, "FILIAL", DOMINGO.CARGO, "FUNCIONARIO"

Os demais tratamentos como o campo cab que está o filtro vou tratar dentro do delphi, pois aqui está somente a tabela que terio os dados para cruzar
Raoni

Raoni

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar