Páginas filhas
  • TOTVS Construção Gestão de Imóveis - Shopping - Relatórios - Relatório Dinâmico

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

TabelaParâmetro Multirecord INParâmetro Multirecord FilterParâmetro Lookup INParâmetro Lookup FilterLookup 
XCOMPRADOR MRE_ XCOMPRADOR_INMRE_ XCOMPRADOR_FILTERLKP_ XCOMPRADOR_INLKP_ XCOMPRADOR_FILTER

XCLIENTE

MRE_ XCLIENTE_INMRE_ XCLIENTE_FILTERLKP_ XCLIENTE_INLKP_ XCLIENTE_FILTER

XLOCADOR

MRE_ XLOCADOR_INMRE_ XLOCADOR_FILTERLKP_XLOCADOR_INLKP_XLOCADOR_FILTER

XLOCATARIO

MRE_ XLOCATARIO_INMRE_ XLOCATARIOFILTERLKP_ XLOCATARIO_INLKP_XLOCATARIO_FILTER

XIDLAN

MRE_ XIDLAN_INMRE_XIDLAN_FILTERLKP_ XIDLAN_INLKP_ XIDLAN_FILTER

XIMOVEL

MRE_ XIMOVEL_INMRE_ XIMOVEL_FILTERLKP_ XIMOVEL_INLKP_XIMOVEL_FILTER

XCONTRATOLOC

MRE_ XCONTRATOLOC_INMRE_ XCONTRATOLOC_FILTERLKP_XCONTRATOLOC_INLKP_ XCONTRATOLOC_FILTER

XEMPREENDIMENTO

MRE_ XEMPREENDIMENTO_INMRE_ XEMPREENDIMENTO_FILTERLKP_ XEMPREENDIMENTO_INLKP_ XEMPREENDIMENTO_FILTER

XUNIDADE

MRE_ XUNIDADE_INMRE_ XUNIDADE_FILTERLKP_ XUNIDADE_INLKP_ XUNIDADE_FILTER

XSUBUNIDADE

MRE_ XSUBUNIDADE_INMRE_ XSUBUNIDADE_FILTERLKP_ XSUBUNIDADE_INLKP_ XSUBUNIDADE_FILTER

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 os 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:

Image Modified

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

...

Informações

Central de Atendimento - Consultas com IN

Surgiu a necessidade no cliente VIPASA de uma tela que contenha vários filtros:

  • Seleção por LUC
  • Seleção por contrato
    • filtro por numero de contrato
    • filtro por cliente/fornecedor
  • Seleção por competência ( data inicio e fim )
  • Seleção por data do contrato ( data inicio e fim )
  • Busca por lançamentos ( Texto para buscar no histórico de lançamentos )

A proposta desta demanda está em evolução.

Os componentes são desenhados automaticamente na tela, de acordo com os parâmetros definidos no relatório.
O objetivo, neste momento, é testar apenas os parâmetros visuais — ainda não há o repasse desses parâmetros para a execução do relatório.

Inicialmente, foram criados alguns parâmetros específicos, mas é possível que outros surjam ao longo do desenvolvimento. Os parâmetros definidos até o momento são:
DateTime
Texto
*Int *( até foi implementando para não aceitar texto)
*Lookup *( definir o nome do parametro para que seja exibido o lookup)
*LookupMultiRecord *( definir o nome do parametro para que seja exibido o Lookup multiplo record)

  • XCOMPRADOR
  • XCLIENTE
  • XLOCADOR
  • XLOCATARIO
  • XIDLAN
  • XIMOVEL
  • XCONTRATOLOC
  • XEMPREENDIMENTO
  • XUNIDADE
  • XSUBUNIDADE
  • Definir para lookup:
    LKP_XCONTRATOLOC, deverá apresentar o lookup na tela de contrato de locação. ( precisa ser "LKP_XCONTRATOLOC")

Definir para lookup:
MRE_XCONTRATOLOC, deverá apresentar o lookup multiplo na tela de contrato de locação. ( precisa ser "MRE_XCONTRATOLOC")

...

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:

Image Added

Image Added

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

Bloco de código
languagesql
 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:

Bloco de código
languagesql
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:

Image Added

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.

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:

Bloco de código
languagesql
WHERE CODCONTLOC =:CODCONTLOC AND CODCOLCONTLOC=:CODCOLCONTLOC

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

Image Added

Image Added




Informações

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

4-Aplicação do lookup:
Lookup tem em sua maioria 2 valores como chave, e para que seja passado esse valores para a sentença sql, ela deverá conter o valor definido exemplo:
SELECT * FROM XALGCONTRATOLOC
WHERE CODCONTLOC =:CODCONTLOC AND CODCOLCONTLOC=:CODCOLCONTLOC
Caso existe o parametro LKP_XCONTRATOLOC definido no relatório, não será necessário criar o parametro no relatório, pois internamente é verificado se a setença
tem o parametro que compoem a chave primaria, no caso CODCOLCONTLOC, sendo assim é aplicado a o valor do lookup automaticamente.
(sempre é necessário definir o parametro na sentença sql, para ser aplicado autmaticamente, caso contrario, será aplicado apenas o CODCONTLOC)

5- Aplicação de filter, criação apenas do parametro de relatório, onde é aplicado no resultado do relatório ao filtro.
MRE_XCONTRATOLOC_FILTER.

6-criado validação, para que quando o usuário definir algum _filter, os campos precisam estar na sentença sql, caso contrato não tem filtro,
dessa forma, será exibido mensagem de erro. ( só exibe caso o usuário informe os valores no multi record)

O relatório não pode ser gerado porque a sentença SQL não contém os campos [] definidos no filtro [MRE_XIDLAN_FILTER], informado como parâmetro.

O relatório possui o parâmetro definido [

{0}

...

.