Where dinâmico no IReport

3 respostas
W

Olá,

em meu relatório tenho um campo no where que é do tipo Integer.
Ele é preenchido com o valor de um parâmetro, porém, este não é obrigatório. O problema é que quando ele não for preenchido será colocado o valor default no sql, por exemplo, zero, e ocorrerá o filtro pelo valor errado.
Para exemplificar, o sql:

select * from pedidos where id_pedido = $P{ID_PEDIDO}

se o parâmetro não for preenchido quero que todo o trecho “where id_pedido = $P{ID_PEDIDO}” não conste do sql ou que no lugar do parâmetro seja colocado algo que não filtre os pedidos por um número específico de pedido.

Com parâmetros String eu uso o % no valor default e no sql faço o LIKE, mas como fazer isto em campos que não são string?

Alguém sabe?

3 Respostas

bland

Wellidylecom,

Você já pensou em colocar todo o bloco “where” como parâmetro?
Assim, você trataria o bloco e o que esse iria utilizar dentro da sua classe.
Abraço!

D

Você pode colocar assim:

Select * from tabela $P!{filtro}

e passar como parâmetro o filtro que você quiser.

filtro = ‘WHERE campo = 123456’

ou

filtro = ‘WHERE campo1 = 123456 and campo2 = 7890’

Enfim, qualquer coisa que pode ser colocado em uma cláusula Where.

Com $P!{filtro} o SQL ficaria assim:

Select * from tabela WHERE campo = 123456

ou

Select * from tabela WHERE WHERE campo1 = 123456 and campo2 = 7890

Que são dois sqls válidos

A utilização de parâmetros da forma $P!{filtro} faz com que o valor que for passado seja adicionado à instrução SQL do relatório sem ser avaliado, ou seja, a string não fica entre ’ ', diferente do que iria acontecer se fosse passado da forma tradicional $P{filtro} que ao ser avaliado ficaria da sequinte forma:

Select * from tabela ‘WHERE campo1 = 123456 and campo2 = 7890’

O que não é um sql válido.

Espero ter ajudado

[]'s

W

Parte do que falou eu fiz. Vou explicar o que já tenho:
Meu sql:

SELECT NUM_PEDIDO
FROM PEDIDOS
WHERE COD_CLIENTE = ‘1’ $P!{NUM_PEDIDO}

no parâmetro NUM_PEDIDO tenho a seguinte expressão para valor default:

$P{NUM_PEDIDO}!=null && ! $P{NUM_PEDIDO}.equals("")?“and num_pedido =” + $P{NUM_PEDIDO}:""

executando o relatório, qdo não informo valor no parâmetro, funciona, ou seja, nada é colocado no sql, ficando:

SELECT NUM_PEDIDO
FROM PEDIDOS
WHERE COD_CLIENTE = ‘1’

porém, qdo informo um valor, por exemplo, 20, dá erro de execução e o sql fica:

SELECT NUM_PEDIDO
FROM PEDIDOS
WHERE COD_CLIENTE = ‘1’ 20

ou seja, não está colocando o ’ and num_pedido = '.

Já fiz testes e percebi que qdo o valor inicial é:

$P{NUM_PEDIDO}!=null && ! $P{NUM_PEDIDO}.equals("")?“and num_pedido = 20”

o relatório funciona. Então o problema está qdo o parâmetro está na cláusula.

Alguma idéia do que possa ser?

Criado 29 de setembro de 2006
Ultima resposta 29 de set. de 2006
Respostas 3
Participantes 3