Introdução


O relatório dinâmico visa de forma transparente e simples, permitir que sejam inseridos componentes que irão compor a saída do relatório, isto é, seu resultado final apresentado. Desta forma, temos uma interface que pode ser confeccionada e customizada em poucos passos, trazendo um dinamismo e maior rapidez na execução dos relatórios do sistema.  Dessa forma podem ser passados parâmetros de seleção por contratos, subunidades, cliente/fornecedor, entre outros.

Como utilizar


O relatório dinâmico deve ser acessado em Shopping / Relatórios / Relatório Dinâmico. Este menu possui permissão, então o usuário deve ter a sua respectiva permissão habilitada para utilizá-lo.

É importante frisar que toda a modificação resultante na tela do relatório dinâmico deve ser primeiro realizada nos relatórios que irão fornecer os parâmetros para a exibição da tela. Abaixo vamos mostrar como realizar essa alteração.

Existem duas opções de tipo de retorno de componentes:

As tabelas disponíveis para passagem de parâmetros para execução do relatório dinâmico são as seguintes:

Tabela


DescriçãoParâmetro MULTIRECORD (IN)Parâmetro MULTIRECORD (FILTER)Parâmetro LOOKUP 
No RelatórioNa Consulta SQL

FCFO

Cliente / FornecedorMRE_XCLIENTE_INMRE_XCLIENTE_FILTERLKP_XCLIENTE:CODCOLCFO :CODCFO

XALGCONTRATOADMPROPRIETARIO

Locador do Contrato de AdministraçãoMRE_XLOCADOR_INMRE_XLOCADOR_FILTERLKP_XLOCADOR:CODCOLCFOPROP :CODCFOPROP

XALGCONTRATOLOCLOCATARIO

Locatário do contrato de locaçãoMRE_XLOCATARIO_INMRE_XLOCATARIOFILTERLKP_XLOCATARIO:CODCOLCFOLOCATARIO :CODCFOLOCATARIO

FLAN

Lançamentos MRE_IDLAN_INMRE_IDLAN_FILTERLKP_IDLAN:CODCOLLAN :IDLAN

XALGIMOVEL

ImóvelMRE_XIMOVEL_INMRE_XIMOVEL_FILTERLKP_XIMOVEL:CODCOLIMOVEL :CODIMOVEL

XCONTRATOLOC

Contrato de LocaçãoMRE_XCONTRATOLOC_INMRE_XCONTRATOLOC_FILTERLKP_XCONTRATOLOC:CODCOLCONTLOC :CODCONTLOC

XEMPREENDIMENTO

EmpreendimentoMRE_XEMPREENDIMENTO_INMRE_XEMPREENDIMENTO_FILTERLKP_XEMPREENDIMENTO:COD_PESS_EMPR

XUNIDADE

UnidadesMRE_XUNIDADE_INMRE_XUNIDADE_FILTERLKP_XUNIDADE:COD_PESS_EMPR :NUM_UNID

XSUBUNIDADE

SubunidadesMRE_XSUBUNIDADE_INMRE_XSUBUNIDADE_FILTERLKP_XSUBUNIDADE:COD_PESS_EMPR :NUM_UNID :NUM_SUB_UNID

XCONDITEMCOBR

Item de CobrançaMRE_XCONDITEMCOBR_INMRE_XCONDITEMCOBR_FILTERLKP_XCONDITEMCOBR:CODITEMCOBR

FCXA

Contas/CaixaMRE_FCXA_INMRE_FCXA_FILTERLKP_FCXA:CODCOLCXA :CODCXA

GCCUSTO

Centros de CustoMRE_GCCUSTO_INMRE_GCCUSTO_FILTERLKP_GCCUSTO:CODCOLCCUSTO :CODCCUSTO

TTBORCAMENTO

Natureza Orçamentária/FinanceiraMRE_TTBORCAMENTO_INMRE_TTBORCAMENTO_FILTERLKP_TTBORCAMENTO:CODCOLNATFINANCEIRA :CODNATFINANCEIRA

Os tipos de parâmetros abaixo também são compatíveis e podem ser passados como componentes para geração do relatório dinâmico:

XCLIENTE

Cliente / FornecedorMRE_XCLIENTE_INMRE_XCLIENTE_FILTERLKP_XCLIENTE:CODCOLCFO :CODCFO

Select * from FCFO where codcolcfo = :CODCOLCFO and codcfo: CODCFO








É fundamental verificar sempre o tipo do parâmetro informado e garantir que ele seja compatível com o relatório dinâmico utilizado.

Além disso, evite utilizar o caractere ponto ( . ) no nome da sentença SQL, pois isso impede que algumas validações internas sejam executadas corretamente.

Exemplo de nomenclatura:

  • Incorreto: SQL.01

  • Correto: SQL_01

Prefira o uso de underscore (_) no lugar de ponto. Isso assegura que todas as validações e processamentos sejam aplicados adequadamente no relatório.


Como fazer (Relatório com Sentença SQL IN e Componente MultiRecord)


Dada as tabelas acima, eu quero que o meu relatório me permita escolher vários contratos de locação que irão fazer parte do resultado dele. Este relatório possui uma sentença SQL com uma clausula IN, então neste caso devemos proceder da seguinte maneira

Para isso então estou dizendo que deve existir o parâmetro MRE_XCONTRATOLOC_IN no relatório como mostra a imagem abaixo:

Na minha cláusula WHERE eu preciso utilizar obrigatoriamente a função string_split. dessa forma, passamos os parâmetros como abaixo:

WHERE 
-
IN
(SELECT value AS parametro FROM STRING_SPLIT(:MRE_XCONTRATOLOC_IN, ','))

Para entender mais sobre essa função, consulte a página abaixo:

Central de Atendimento - Consultas com IN

O resultado da tela do relatório dinâmico será a seguinte, possibilitando a seleção de vários contratos de locação que irão compor a saída do relatório:

Em bases Oracle, há uma diferença, onde devemos primeiro criar uma função que "imite" a string_split diretamente no banco de dados:

 CREATE OR REPLACE FUNCTION split_string (
   p_string    IN VARCHAR2,
   p_delimiter IN VARCHAR2
) RETURN SYS.ODCIVARCHAR2LIST PIPELINED IS
   l_start     PLS_INTEGER := 1;
   l_end       PLS_INTEGER;
BEGIN
   LOOP
      l_end := INSTR(p_string, p_delimiter, l_start);
      EXIT WHEN l_end = 0;
      PIPE ROW(SUBSTR(p_string, l_start, l_end - l_start));
      l_start := l_end + LENGTH(p_delimiter);
   END LOOP;
   PIPE ROW(SUBSTR(p_string, l_start));
   RETURN;
END;

Após a criação da função, a cláusula WHERE da consulta SQL deve obrigatoriamente seguir o padrão:

WHERE 
-
AND
XALGCONTRATOLOC.CODCONTLOC  IN (    SELECT TO_NUMBER(COLUMN_VALUE)     FROM TABLE(split_string(:MRE_XCONTRATOLOC_IN, ','))  )

Como fazer (Relatório com Sentença SQL FILTER e Componente MultiRecord)


Para esse relatório dinâmico ser criado, deve existir o parâmetro MRE_XCONTRATOLOC_FILTER no relatório como mostra a imagem abaixo:

O resultado da exibição no relatório dinâmico será o mesmo da exibição quando temos um componente IN, entretanto o resultado da consulta SQL do relatório será filtrada de acordo com os contratos selecionados. Não é necessário utilizar a função split.

Como fazer (Relatório com Componente Lookup)


Neste exemplo, eu quero que o meu relatório me permita escolher somente um contrato de locação que irão fazer parte do resultado dele através de uma lookup. Então neste caso devemos proceder da seguinte maneira.

Para isso então estou dizendo que deve existir o parâmetro LKP_XCONTRATOLOC no relatório como mostra a imagem abaixo:

Na consulta SQL deste relatório, devemos também passar na cláusula WHERE o parâmetro em questão:

WHERE CODCONTLOC =:CODCONTLOC AND CODCOLCONTLOC=:CODCOLCONTLOC

Dessa forma, ao executar o relatório dinâmico, teremos o seguinte resultado:

Importante

  • Caso seja utilizado algum componente cujo tipo de parâmetro é Multirecord e Filter, os campos devem obrigatoriamente estar na consulta SQL do relatório. Caso não estejam, não será possível gerar o filtro de forma adequada. O sistema irá emitir uma mensagem de alerta nestes casos.
  • Para evitar problemas de compatibilidade do relatório dinâmico e as consultas é imprescindível que o relatório e a consulta sejam confeccionados na mesma Coligada.