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.
Não é não, segue a documentação do JasperSoft dizendo como é utilizada a cláusula IN:
A
Alexandre.cg
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 ?
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
Daniel95
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
Alexandre.cg
passo assim, inclusive funciona daquela outra forma q te falei
‘24400195’,‘33200037’
A
Alexandre.cg
agora dessa maneira q vc me disse ai , desconheço , nao faço a minima ideia
A
Alexandre.cg
o que devo fazer ?
D
Daniel95
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
Alexandre.cg
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)
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
Alexandre.cg
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
Daniel95
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
Alexandre.cg
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
Alexandre.cg
tela da query no ireport, lembrando q nao trabalho nada em codigo antes de chamar o relatorio.
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
Alexandre.cg
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
Daniel95
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
Alexandre.cg
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
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()
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
Andrauss
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
Alexandre.cg
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
Alexandre.cg
andrauss corrigi os erros de sintaxe que avia no seu codigo, mas mesmo assim nao deu certo, deu o mesmo erro.
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
muito estranho nao to usando mais parametro nenhum, nem na query, e esta dando esse erro, e outros relatorios nao dao erro.
A
Andrauss
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
Andrauss
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
Alexandre.cg
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?
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.
pessoal, ninguem sabe dizer agora o que é ? alguem pode me ajudar ai ?
A
Alexandre.cg
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} + ") "