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.
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 | Parâmetro Multirecord IN | Parâmetro Multirecord Filter | Parâmetro Lookup |
|---|---|---|---|
| XCOMPRADOR | MRE_ XCOMPRADOR_IN | MRE_ XCOMPRADOR_FILTER | LKP_ XCOMPRADOR |
XCLIENTE | MRE_ XCLIENTE_IN | MRE_ XCLIENTE_FILTER | LKP_ XCLIENTE |
XLOCADOR | MRE_ XLOCADOR_IN | MRE_ XLOCADOR_FILTER | LKP_XLOCADOR |
XLOCATARIO | MRE_ XLOCATARIO_IN | MRE_ XLOCATARIOFILTER | LKP_ XLOCATARIO |
XIDLAN | MRE_ XIDLAN_IN | MRE_XIDLAN_FILTER | LKP_ XIDLAN |
XIMOVEL | MRE_ XIMOVEL_IN | MRE_ XIMOVEL_FILTER | LKP_ XIMOVEL |
XCONTRATOLOC | MRE_ XCONTRATOLOC_IN | MRE_ XCONTRATOLOC_FILTER | LKP_XCONTRATOLOC |
XEMPREENDIMENTO | MRE_ XEMPREENDIMENTO_IN | MRE_ XEMPREENDIMENTO_FILTER | LKP_ XEMPREENDIMENTO |
XUNIDADE | MRE_ XUNIDADE_IN | MRE_ XUNIDADE_FILTER | LKP_ XUNIDADE |
XSUBUNIDADE | MRE_ XSUBUNIDADE_IN | MRE_ XSUBUNIDADE_FILTER | LKP_ XSUBUNIDADE |
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:
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 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, ',')) ) |
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 a consulta SQL do relatório será filtrada de acordo com os contratos selecionados. Não é necessário utilizar a função split.
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. |