Relatório Dinâmico
Introdução
O Relatório Dinâmico foi desenvolvido com a finalidade de facilitar o processo de desenvolvimento dos relatórios para nossos clientes.
Com esta ferramenta, o tempo de desenvolvimento será reduzido, pois os filtros serão criados dinamicamente.
Não será necessária a compilação do sistema para subir as alterações do relatório, ou seja, o processo de teste será mais rápido.
Além disso, o cliente não precisará aguardar a liberação de versão para ter a disponibilidade do relatório.
Tela de Cadastro
A tela de manutenção do Relatório Dinâmico encontra-se no Gerenciador Interno.
Caminho: Desenvolvimento > Relatórios Dinâmicos > Relatório Dinâmico
Aba Principal
Descrição dos principais campos desta aba:
- Status: Define se o relatório irá aparecer no sistema do cliente.
- Padrão: Se estiver como Sim, o relatório será enviado automaticamente para o cliente quando for executada uma atualização.
- Versão mínima: Campo para indicar a versão mínima que a base do cliente precisa estar para receber o relatório.
- Descrição: Título da tela do relatório.
- Cliente: Cliente que solicitou o relatório.
- Relatório: Campo para indicar o layout. Ao gravar o relatório, caso este campo estiver em branco, o sistema perguntará se o usuário deseja incluir um novo layout. Confirmando esta mensagem, o sistema exibirá uma tela onde será desenvolvido o layout.
- Menu: Caminho do relatório que será exibido no menu da tela principal do cliente. Se já houver um menu com o mesmo caminho indicado neste campo, será exibida uma mensagem de erro para o cliente.
Descrição dos campos do módulo (permissões):
- Modulo: Campo não editável, gerado automaticamente com base no ID do cliente e no nome do relatório. Este campo é o nome do modulo que será cadastrado na base do cliente, portanto não poderá conter mais de um modulo com o mesmo nome.
- Descrição: Nome da permissão que aparecerá na tela de Permissões de Usuário no sistema do cliente.
- Tipo, Grupo e SubGrupo: Campos para indicar o caminho da permissão. Somente o campo SubGrupo é editável.
- Sistema: Sistema em que o cliente poderá acessar o relatório. Caso o sistema indicado for Futura Server, o relatório também ficará disponível para os sistemas Gourmet Server e Futura Farmacia Server.
Aba Filtros
Descrição dos campos desta aba:
- Descrição: Nome do campo que aparecerá na tela de filtros.
- Filtro Manual: A opção Sim será utilizada para filtros que necessitam passar algum valor por parâmetro. Ex: Empresa, Status de Pedido, Período, etc...
A opção Não será utilizada para filtros que não precisam passar valor por parâmetro, como por exemplo, um filtro para trazer somente produtos com estoque positivo.
- Tipo de Dado: Campo para indicar o tipo de dado do filtro. Ficará habilitado somente se o Filtro Manual for Sim.
- Lookup: Utilizado para indicar um registro da base de dados. Ex: Cliente, Fornecedor, Tipo de Pedido, etc...
- Lookup Lista: Semelhante ao Lookup, porém, é possível indicar mais de um registro neste campo.
- Data: Filtro para indicar uma data.
- Data Período: Filtro para indicar um período de data.
- Integer: Utilizado para filtros em que é possível indicar somente números.
- String: Utilizado para filtros em que é possível indicar letras e números.
- Enumerado: Neste tipo de dado, as opções do filtro serão exibidas em um Combo Box. A descrição e o valor das opções deverão ser preenchidas no campo Tipo Enumerado.
- Sim/Não: Exibirá um Combo Box com as opções Sim e Não.
- Tipo Lookup: Ficará habilitado somente quando o Tipo de Dado for Lookup ou Lookup Lista. Neste campo será informado o tipo de registro que o usuário irá indicar no filtro.
Obs 1: Se for necessário a inclusão de um novo tipo neste campo, favor não esquecer de incluir a tela de consulta na Unit uTOtr_RelatorioDinamicoUtils.
Obs 2: A classe TPF_Consulta está em uma Unit específica (bPF_ConsultaRelatorioDinamico), utilizada somente para o relatório dinâmico. Qualquer alteração feita na Unit do Genérico, a mesma deverá ser feita nesta Unit.
- Posição: Posição em que o filtro será exibido na tela. Há uma validação para não permitir indicar uma posição duplicada.
- Tipo Enumerado: Ficará habilitado somente quando o filtro de dado for Enumerado. No campo Valor, podemos indicar números, letras e palavras. Para a opção Todos, devemos indicar o valor -1 (ver imagem).
- Parâmetro de Filtro: Campo para indicar o parâmetro do filtro que será utilizado no SQL. Este campo ficará habilitado somente quando o campo Filtro Manual estiver como Sim.
- Parâmetro de Filtro (2): Campo para indicar o segundo parâmetro do filtro. Até o momento, é utilizado apenas para filtros de Data Período.
- Parâmetro de Ativação: Campo para indicar o parâmetro de ativação. Mais detalhes deste campo estão logo abaixo.
SQL / Parâmetros
No código SQL, deveremos incluir os Parâmetros e os Parâmetros de Ativação.
O Parâmetro de Ativação é utilizado para não quebrar o SQL quando algum parâmetro possuir valor Null.
As condições no Where devem seguir o seguinte padrão: AND ((:PARAMETRO_ATIVACAO = 'N') OR (:PARAMETRO_VALOR = CAMPO))
O Parâmetro de Ativação deverá ser comparado com 'N', e a condição do parâmetro do valor deverá ser com OR.
Para melhor entendimento, segue um exemplo de SQL utilizando todos os tipos de filtros possíveis:
PEDIDO
SELECT PED.ID FROM PEDIDO PED INNER JOIN CADASTRO CAD ON (CAD.ID = PED.FK_CADASTRO) INNER JOIN TIPO_PEDIDO TPPED ON (TPPED.ID = PED.FK_TIPO_PEDIDO) LEFT JOIN SYS_USUARIO USU ON (USU.ID = PED.FK_USUARIO_PED) LEFT JOIN CADASTRO VEND ON (VEND.ID = PED.FK_VENDEDOR) LEFT JOIN CADASTRO_GRUPO CAGR ON ( CAGR.ID = CAD.FK_CADASTRO_GRUPO) LEFT JOIN NOTA_FISCAL NF ON (NF.FK_PEDIDO = PED.ID AND NF.MODELO_DOC_FISCAL IN (0,24)) WHERE (TPPED.TIPO = 0) AND ((:LOOKUP_EMPRESA_ATIVACAO = 'N') OR (:LOOKUP_EMPRESA = PED.FK_EMPRESA)) AND ((:LOOKUP_LISTA_CLIENTES_ATIVACAO = 'N') OR (PED.FK_CADASTRO IN (SELECT RESULT FROM SP_GET_CONJUNTO_INTEIRO(:LOOKUP_LISTA_CLIENTES)))) AND ((:ENUMERADO_STATUS_ATIVACAO = 'N') OR (:ENUMERADO_STATUS = PED.STATUS)) AND ((:DATA_EMISSAO_ATIVACAO = 'N') OR (:DATA_EMISSAO = PED.DATA_EMISSAO)) AND ((:DATA_PERIODO_EMISSAO_ATIVACAO = 'N') OR (PED.DATA_EMISSAO BETWEEN :DATA_PERIODO_EMISSAO AND :DATA_PERIODO_EMISSAO_2)) AND ((:INTEGER_NRO_PEDIDO_ATIVACAO = 'N') OR (:INTEGER_NRO_PEDIDO = PED.NRO_PEDIDO))
PEDIDO_ITEM
SELECT IT.ID, FROM PEDIDO_ITEM IT INNER JOIN PEDIDO PED ON (PED.ID = IT.FK_PEDIDO) INNER JOIN PRODUTO PR ON (PR.ID = IT.FK_PRODUTO) LEFT JOIN PRODUTO_UNIDADE UN ON (UN.ID = PR.FK_PRODUTO_UNIDADE) LEFT JOIN CLASSIFICACAO_FISCAL CF ON (PR.FK_CLASSIFICACAO_FISCAL = CF.ID) WHERE ((:FILTRO_NAO_MANUAL_ESTOQUE_ATIVACAO = 'N') OR ((SELECT SALDO FROM SP_GET_PRODUTO_SALDO(PED.FK_EMPRESA, PR.ID)) > 0)) --Filtro manual: NÃO AND ((:SIM_NAO_UTILIZA_BALANCA_ATIVACAO = 'N') OR (:SIM_NAO_UTILIZA_BALANCA = UN.UTILIZA_BALANCA)) AND ((:STRING_CLASS_FISCAL_ATIVACAO = 'N') OR (:STRING_CLASS_FISCAL = CF.CLASSIFICACAO))