Parametros no ireport usando IN e OR

42 respostas
A

Pessoal estou com o seguinte problema, dentro do ireport tenho uma query que tem um parametro que se chama produto, posso colocar varios codigos de produtos nele, mas se eu nao colocar nem um codigo ,ele tem que me trazer todos os produtos, ou seja, desconsiderar esse parametro, quando uso o sinal de igualdade da certo dessa maneira.

and (b8_produto = $P{iest001-01} or $P{iest001-01} is null)

mas, quando uso o IN , nao funciona da erro,

and (b8_produto in ($P!{iest001-01} ) or $P{iest001-01} is null)

se eu usar o IN sozinho e colocar conteudo no parametro funciona.

42 Respostas

C

a lógica do in não é assim…

A Sintaxe é
IN(CAMPO,CAMPO2,CAMPO3)

A

isso mesmo, mas no ireport é desse jeito ai

D

Não é não, segue a documentação do JasperSoft dizendo como é utilizada a cláusula IN:

A

dessa maneira q uso funciona daniel, ele so nao funciona quando coloco o OR junto, igual passei no exemplo, esse exemplo q vc me passou ai no manual eu ja tentei fazer ele, mas nao consegui fazer fucnionar nao, vc sabe como funciona ?

D

Sim, é só colocar os 3 parâmetros:

WHERE $X{IN, nome_do_campo_na_tabela, nome_do_parametro}

Lembrando que é passado o nome do parâmetro somente, sem nenhum $P nem nada.

A

Daniel ele da erro, veja como esta meu select.

select * from (

select b8_produto codpro,b1_desc despro,b8_lotectl lote,sum(b8_saldo) saldo,to_date(b8_dtvalid,yyyymmdd) validade from TOTVS.sb8010 a, TOTVS.sb1010 b

where

a.d_e_l_e_t_= 

and b.d_e_l_e_t_=  

and a.b8_produto=b.b1_cod

and a.b8_dtvalid <=  $P{iest001-02}

and $X{IN, b8_produto, iest001-01}

group by b8_produto,b1_desc,b8_lotectl,to_date(b8_dtvalid,yyyymmdd))

where saldo > 0 order by despro,validade
D

Que erro ele da? Será que não seria a falta de um alias?

A

tentei passar o parametro com as chaves sem as chaves, com $P sem ele, de todo jeito nao funciona. da erro

A

A

quando coloco o parametro sem nada so o nome dele ai da esse erro

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRRuntimeException: Invalid type java.lang.String for parameter iest001-01 used in an IN clause; the value must be an array or a collection.
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:511)

D

Ué aí está explicado, como é que você vai passar uma série de valores para um parâmetro sendo que ele é uma String e não uma Collection ou um Array?

A

passo assim, inclusive funciona daquela outra forma q te falei

‘24400195’,‘33200037’

A

agora dessa maneira q vc me disse ai , desconheço , nao faço a minima ideia

A

o que devo fazer ?

D

Você não sabe o que é um array ou uma Collection em java?
Você tem que alterar o tipo de dado do seu parâmetro iest001-01 de String para o que ele é realmente correspondente… É uma List de valores que você passa pro parâmetro? Se for então o iest001-01 precisa ser do tipo Collection e não uma String.
Concorda comigo que String é um objeto só e não uma Lista de Objetos?

A

logico que sei amigo, sou formado em analise de sistema a 20 anos, vc quer me ajudar ou vc quer me sacanear ? eu nao conheço java , estou fazendo um relatorio no ireport, os relatorio no ireport aqui sao usados na plataforma totvs (advpl)

coloquei ele como collection, mas deu erro tambem

A

da o seguinte erro

D

Foi uma pergunta genuína, já que o atributo estava como String e quando perguntei como os dados eram guardados você não me respondeu, não estou sacaneando ninguém.
E se você quer pedir ajuda no fórum ou em qualquer lugar aconselho você a tratar as pessoas com respeito.
Neste print que você mandou o terceiro argumento continua sendo o parâmetro com a sintaxe $P, a sintaxe correta é somente o nome do parâmetro.

A

bem, daniel, nao vou discutir isso com vc nao, mas, quem faltou com respeito foi vc comigo, mas deixa isso pra la, talvez eu tenho entendido errado ai mesmo ta bom, obrigado.

eu consegui fazer a collection, mas nao pode fucnionar assim, pq eu trabalho com advpl protheus preciso que seja passado um parametro string, para ser usado com IN, (‘123456’,‘654321’) entendeu ? na collection eu adiciono la os elementos, mas mesmo assim ele nao traz a consulta, da erro, se alguem puder me ajudar ai pessoal, so falta isso pra terminar aqui meuprojeto, obrigado a todos.

D

Então está correto, afinal é assim que o IN funciona. Quando você fala me de todos os registros que um atributo consta nesta lista vazia é igual a não me retorne nada… O contrário seria utilizar um NOT IN. Este é o comportamento esperado.
Agora, já que você está passando tudo já concatenado em uma String só separado por vírgula, você pode mudar a String deste parâmetro no código antes de enviar para o Report?
Você poderia verificar se não tem nenhum código para ir dentro do IN e então enviar um parâmetro vazio, e se tiver algum código pra enviar você envia a cláusula IN inteira e utiliza o texto puro do parâmetro, com a sintaxe que você já utilizou anteriormente $P!{parametro} com o sinal !.
Então se tiver códigos para a lista você manda o parâmetro:
" and b8_produto in (seus_codigos_separados_por_virgula) "
E se não tiver você manda uma String vazia.

A

daniel eu nao tenho codigo que chama o relatorio, a chamada dele é so configurada no configurador do prohteus, so a chamada no menu, e mais nada, quando faço da maneira q vc me passou ai, da certo, ele só nao da certo quando eu deixo o parametro vazio, nao estou achando uma maneira de conseguir evitar esse erro… te colocar os exemplos aqui pra vc entender melhor.

quando coloco assim and (b8_produto in ($P!{iest001-01}) or $P{iest001-01} is null)
e informo os produtos funciona perfeito. mas se eu deixar vazio o parametro ele da erro.

quando coloco assim and $P{iest001-01} is null e deixo sem informacao no parametro ele funciona normal. nao da erro nenhum

quando coloco assim and b8_produto in ($P!{iest001-01}) e informo parametro tb funciona normal, mas se eu nao coloco parametro ja da erro tambem.

ok, obrigado

A

tela da query no ireport, lembrando q nao trabalho nada em codigo antes de chamar o relatorio.

D

Não seria pelo retorno quando não tem códigos?
O que ele retorna quando não tem códigos, null ou uma string vazia?

A

nulo ou vazio, de toda maneira da o erro , mas aparentemente é nulo, pq quando uso so ele com nulo traz certo

$P{iest001-01} is null , ele traz todos os produtos, usando so ele.

D

Então você poderia criar outro parâmetro que referencia o primeiro verificando se é null no seu Default Value Expression, e colocar esse novo parâmetro criado com o texto puro substituindo a cláusula IN diretamente na query.
Por exemplo, no novo parâmetro o defaultValueExpression seria:
$P{iest001-01} != null ? " and b8_produto in (" + $P{iest001-01} + ") " : ""

E então na Query colocar o Texto do novo parâmetro:
substituindo isto:
(b8_produto in ($P!{iest001-01}) or $P{iest001-01} is null)
por isso:
$P!{CLAUSULA_IN}

A

DANIEL estamos quase la, rsss, aqui quando faço no ireport da certo, quando chamo pelo protheus da esse erro, mesmo passando o parametro sem nada

A

como é a tela do prohteus os parametros

D

Estranho esse erro aí… Pode ser algum campo faltando aspas, um printWhenExpression que não retorna um boolean ou até a versão que você está utilizando…
Tenta colocar um toString no parâmetro ou algo que vc tenha alterado:
$P{param}.toString()

A

aceitou nao, deu erro ai em baixo, viu ai ?

A

colocando parametro no produto, olha como ele traz os dados.

D

Cara, teria que pesquisar o que é este erro aí e ir tentando resolver, pode ser pela versão que você está usando ou algo do tipo… Já que você disse que está compilando normal pelo JasperSoft Studio.

A

Ja fiz muitos relatórios dessa forma. Seguinte, cria um parâmetro (com o nome Where por exemplo), desmarque a opção is for prompting e põe no default Value Expression assim:

$P{iest001-01} == null || $P{iest001-01}.trim().length == 0? "": " AND b8_produto IN ("+$P{iest001-01}") "

E na sql coloque assim:
… $P!{Where} …

A

Andrauss bom dia, do jeito q vc passou nao deu certo nao, tem algum erro de sintaxe ai, mas ate ja deu certo da maneira que o daniel me passou ai, o problema agora é na hora de executar do protheus, hora que chama da os erros q passei ai acima, se puder me ajudar agradeço, obrigado. a maneira q deu certo que o daniel passou foi essa.

$P{iest001-01} != null ? " and b8_produto in (" + $P{iest001-01} + ") " : “”

A

andrauss corrigi os erros de sintaxe que avia no seu codigo, mas mesmo assim nao deu certo, deu o mesmo erro.

A

pessoal descobri uma coisa, nao tem nada haver esse erro ai, tirei todos os parametros do relatorio, e continua o mesmo erro. nem usando parametro eu to mais, vejam ai

A

muito estranho nao to usando mais parametro nenhum, nem na query, e esta dando esse erro, e outros relatorios nao dao erro.

A

Me parece que deve haver algum parâmetro do tipo: com.jaspersoft.jasperserver.api.metadata.user.domain.client.UserImpl, remova esse parâmetro e tente novamente

A

O sistema lê o aqrquivo em que formato? .jasper ou .jrxml? Se você tiver que compilar (.jasper) o .jar do Jasper com a clesse com.jaspersoft.jasperserver.api.metadata.user.domain.client.UserImpl deve estar presente no seu classpath. Caso o sistema leia o arquivo no formato .jrxml você provavelmente está usando uma versão do jasper incompatível com a do sistema.

A

bom dia Andrauss, entao , nao tenho nem um parametro com esse tipo,
a respeito dessa classe q vc me passou acima, onde eu coloco nesse classpath ? onde fica isso?

A

pessoal consegui achar o q estava dando problema, fui criar um paraemtro um dia e cliquei em create parameter set, e ele criou um monte de parametros la , mas nunca usei eles, so ficaram la, eles q tavam provocando aquele erro, agora deu tudo certo, só que nao, rssss, quando deixo em branco o campo produto, ele da erro, quando coloco os produtos separados por virgula da certim, se puderem me ajudar em mais essa ai agradeço, obrigado pessoal, vou passar o erro ai. e a formula que esta no parametro pIN.


A

pessoal, ninguem sabe dizer agora o que é ? alguem pode me ajudar ai ?

A

pessoal funcionou como eu queria, vou postar a resposta aqui para quem tiver com essa dificuldade ok. obrigado a todos que ajudaram ai, consegui resolver, valew…

$P{iest001-01}.isEmpty() ? “” : " AND b8_produto IN (" + $P{iest001-01} + ") "

Criado 12 de março de 2019
Ultima resposta 20 de mar. de 2019
Respostas 42
Participantes 4