Criar campos texto com valores do banco[RESOLVIDO]

28 respostas
P

Oi,
estou criando um modelo no Ireport e precisaria que aparecesse todos os itens cadastrados em certa tabela do banco até ai tudo bem o problema é que eu pego so o primeiro item cadastrado,queria saber como eu faço para criar um campo texto para cada resultado do banco.

Por exemplo tenho a tabela cores que contem vermelho,amarelo e azul.
Do jeito que estou fazendo mesmo que eu crie 3 campos textos todos vão conter vermelho, pq é o primeiro item da tabela eu acho,o que eu quero é que cada campo texto contenha cada uma destas cores…

Alguém pode me ajudar a resolver este problema?

obrigada

28 Respostas

ramos

Boa noite!

Acho que você está colocando os componentes na área de cabeçalho (header) do relatório.

Basta você colocar um componente para o seu campo, mas precisa ser na área de detalhes (detail).

O que você colocar na área header só vai aparecer uma vez (por página).

E o que você colocar em detail vai ser reimpresso n vezes com o valor de cada registro do banco.

[]s

Gerva

Aconselho procurar um bom tutorial de IReport para aprender bem, também tem umas vídeo aulas muito boas na net :wink:

P

ramos,
coloquei o conteudo na area de detail do relatório mas não funcionou! :frowning:
não sei se expliquei direito o que estou tentando arrumar…é q estou fazendo uma consulta que vai me retornar varios resultados,só que cada campo texto que eu crio e que coloco o valor do resultado desta pesquisa como expressão aparece o mesmo resultado para todos que é o primeiro item desta tabela no banco :frowning:
A pesquisa no database no ireport é esta:SELECT disciplina.`nome` AS disciplina_nome, disciplina.`id_ensino` AS disciplina_id_ensino, ensino.`Id` AS ensino_Id, disciplina.`Id` AS disciplina_Id FROM `disciplina` disciplina, `ensino` ensino

e o que uso na expressão de cada campo texto é este valor $F{disciplina_nome}

Gerva,
tu tens razão estou assistindo algumas videoaulas e tenho aprendido muitas coisas =)

Obrigada pela ajuda!

ramos

Boa noite!

Não sei se você colou o SELECT parcial, mas caso tenha colado o SQL completo que você está usando, senti falta de um JOIN.

Caso você tenha feito o JOIN, porém, não tenha colado na tela, desconsidere o resto da mensagem.

Mas quando você coloca as tabelas no FROM sem fazer join via INNER, LEFT, nem na cláusula WHERE, ocorre algo semelhante a um CROSS JOIN, que gera um produto cartesiano.

Neste caso, a consulta relaciona todos os registros entre as duas (ou mais) tabelas que não tem a ligação especificada.

Por exemplo, se você tiver uma tabela “de disciplina” contendo:

id     nome
01    portugues
02    matematica
03    história

e outra tabela ensino contendo:

id   nome
01    ensino a
02    ensino b
03    ensino c
04    ensino d

o SELECT para nomes das disciplinas e ensinos sem join retornaria algo semelhante com:

disciplina_nome  ensino_nome
portugues        ensino a
portugues        ensino b
portugues        ensino c
portugues        ensino d
matematica       ensino a
matematica       ensino b
...

Portugues apareceria uma vez para cada ensino, mesmo que só possuísse ligação com ensino c. E isto daria a impressão dele estar vindo repetido por um erro da ferramenta.

Como disse no início, não sei se é este o caso. Acredito que você testou a consulta fora do iReport direto na base também, para se certificar do resultado.

Mas com certeza, a dica de estudar um pouco mais do iReport é boa.

P

Oi ramos!
Na verdade eu estou usando join :oops:

SELECT disciplina.`nome` AS disciplina_nome, disciplina.`id_ensino` AS disciplina_id_ensino, ensino.`Id` AS ensino_Id, disciplina.`Id` AS disciplina_Id FROM `ensino` ensino INNER JOIN `disciplina` disciplina ON ensino.`Id` = disciplina.`id_ensino`

mas mesmo assim cada campo texto que crio e que quero utilizar a expressão $F{disciplina_nome}
me traz somente portugues :frowning:
aproveitando o teu exemplo do post anterior gostaria de saber eu estou fazendo a criação do campos textos de maneira errada,visto que o que quero é criar uma campo texto para portugues,outra para matematica e outra para historia?
eu tenho que mudar a expressão para cada campo texto,mesmo que a “pesquisa” seja a mesma para todos?
fora do ireport funciona direitinho :roll:

Obrigada pela ajuda!
Já estou lendo mais sobre o Ireport sim :wink:

Gerva

As únicas formas de isso acontecer que eu consegui imaginar:

  • O valor está em um componente “Text Field”?

  • O seu “Text Field” está na banda “Detail”?

  • O seu select não tem a instrução “LIMIT 1” ao final dele?

  • O baco tem realmente mais de um registro?

Sei que parecem coisas bobas mas acontecem bastante =/

P

oi Gerva!
O banco possui mais de um registro sim…
o textfield esta na banda columnHeader…
O seu select não tem a instrução “LIMIT 1” ao final dele? eu acho que não onde eu vejo isto?
ah não te entendi O valor está em um componente “Text Field”?

obrigada pela ajuda!

Gerva

paty_trind:
oi Gerva!
O banco possui mais de um registro sim…
o textfield esta na banda columnHeader…
O seu select não tem a instrução “LIMIT 1” ao final dele? eu acho que não onde eu vejo isto?
ah não te entendi O valor está em um componente “Text Field”?

obrigada pela ajuda!

o textfield esta na banda columnHeader… Aqui está o problema, coloque ele no Detail :slight_smile:

O seu select não tem a instrução “LIMIT 1” ao final dele? No caso ficaria algo assim:

SELECT
disciplina.nome AS disciplina_nome,
disciplina.id_ensino AS disciplina_id_ensino,
ensino.Id AS ensino_Id,
disciplina.Id AS disciplina_Id
FROM
ensino ensino INNER JOIN disciplina disciplina ON ensino.Id = disciplina.id_ensino
LIMIT 1

Isso faz retornar 1 resultado só

O valor está em um componente “Text Field”? Na “Paleta” tem diversos componentes, o “Text Field” é o que mostra o resultado de uma Expressão

P

Oi Gerva,
Não tenho este limite 1 no fim da pesquisa.
Coloquei na banda detail e verdade aparece mais vezes so que so português.
Segue em anexo um print do problema no relatório e da tela do Ireport.
Obrigada pela ajuda =)




Gerva

Aaaahhhh entendi agora :), você quer que apareça todas as matérias na mesma banda correto?

Nesse caso faça um subRelatório, nele monte apenas o Detail e depois chama ele do seu relatório principal. No subRelatório você pode criar colunas, e lembre-se, você vai colocar apenas 1 text field.

Lembre-se que a banda detail vai repetir para cada resultado do seu select (cada registro que a query retornar), então colocando dentro de um detail e com 2 colunas vai ficar como você fez :smiley:

P

Humm acho que te entendi vou arrumar lá obrigada!
Gerva eu estava tentando fazer o subrelatorio mas ta dando um erro :frowning:
Segue em anexo um print do erro e outro da tela do ireport .
Estou usando no subrelatorio a mesma conexão do relatorio ai na expressão eu coloquei a mesma que eu usava no txtfield…
coloquei o txtfield neste sub relatorio mas…não ta dando muito certo




P
Esta ocorrendo este erro:
Erro ao preencher impressão ... Could not load object from location : portugues
net.sf.jasperreports.engine.JRException: Could not load object from location : portugues      at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:267)      at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:310)      at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:259)      at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:275)      at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:426)      at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1380)      at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:692)      at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:255)      at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:113)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:879)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:782)      at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:234)      at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:947)      at java.lang.Thread.run(Unknown Source)  
Impressão não foi preenchida. Tente utilizar uma Fonte de Dados Vazia ...

Se eu executo o relatorio usando a conexão ativa :(
o q pode ser? :roll:

Gerva

É porque o subrelatório usa a mesma conexão mas não o mesmo select.

Coloque o select no subrelatório, aí ele vai funcionar :slight_smile:

Caso você precise de alguma informação do relatório principal (código do aluno por exemplo) você deve passar do principal para o sub por parametros :slight_smile:

Caso você saiba passar parametros do principal para o sub ignore esta parte:

*Crie o Parametro no subrelatório
*Na chamada do sub (no componente “Sub Report”) do relatório principal, vai ter uma propriedade “Parameters”, clique nela e adicione os parametros do subrelatorio
na coluna da esquerda e o valor que vai passar pra cada parametro na coluna da direita

P

Oi Gerva,
Eu não tenho muita prática com o Ireport :oops: !
Eu entendi tua explicação e fiz uns prints com as coisas que eu estava tentando aplicar para fazer conforme tuas explicações :shock:
Por favor não se apavore…hehe
Obrigada pela ajuda






Gerva

Estou aqui para ajudar mesmo :smiley:

Oque eu notei no seu ultimo print é que você está enviando o nome da disciplina por parâmetro, me explica uma coisa, o select só retorna as diciplinas?

Isso me ocorreu agora, se for você não precisa do Sub…

Tente apenas criar colunas no relatório principal…

P

oi Gerva,
O select so retorna disciplinas…

tu queres dizer criar os campos de texto na banda detail? :roll:
não entendo pq a pesquisa retorna sempre a primeira disciplina armazenada,que no caso é portugues :roll:
Obrigada pela ajuda
=)

Gerva

tenta assim e manda um print:


P

coloquei duas colunas na banda detail e apareceu a mesma disciplina 2 vezes e eu coloquei so um campo texto…
segue em anexo os print’s…
obg plea ajuda :slight_smile:




P

coloquei 6 colunas para testar e apareceu as outras disciplinas,mas esta ocorrendo um problema pois as mesmas estão repetindo duas vezes cada!
segue em anexo os print’s




Gerva

Então é problema no Select…

Tem certeza que a relação “ensino.Id = disciplina.id_ensino” é de “1 para 1”?

Outra coisa que eu notei agora… Esse é o seu select né?

SELECT  
      disciplina.`nome` AS disciplina_nome,  
      disciplina.`id_ensino` AS disciplina_id_ensino,  
      ensino.`Id` AS ensino_Id,  
      disciplina.`Id` AS disciplina_Id  
 FROM  
      `ensino` ensino INNER JOIN `disciplina` disciplina ON ensino.`Id` = disciplina.`id_ensino`

Você esta buscando os campos “disciplina.id_ensino” e “ensino.Id” porém no JOIN você busca quando os dois são iguais…

Não seria mais coerente fazer assim?

SELECT disciplina.`nome` AS disciplina_nome, disciplina.`id_ensino` AS disciplina_id_ensino, disciplina.`Id` AS disciplina_Id FROM `disciplina` disciplina

P

assim cmo?
não entendi a parte do FROM `disciplina` disciplina
é que tem disciplinas com o mesmo nome na tabela mas com o id_ensino diferentes é que umas são do ensino fundamental e outras do medio…mas na verdade eu nem to diferenciando isto na pesquisa :?

Gerva

AAAHHHH esse é o problema, ele tava buscando as matérias do ensino médio e do fundamental \o/ Faltou o WHERE

SELECT disciplina.`nome` AS disciplina_nome, disciplina.`id_ensino` AS disciplina_id_ensino, ensino.`Id` AS ensino_Id, disciplina.`Id` AS disciplina_Id FROM `ensino` ensino INNER JOIN `disciplina` disciplina ON ensino.`Id` = disciplina.`id_ensino` WHERE ensino.`Id` = $P!{id_ensino}

Onde no $P{id_ensino} você informa qual o “ensino” que você quer :slight_smile: acho que agora vai hehe

P

era isso mesmo Gerva agora ta aparecendo as disciplinas sem repetir!
mas te alugando mais um pouquinho…cmo eu faço para aparecer uma disciplina embaixo da outra assim:
portugues
matematica
quimica

e não do lado uma da outra q nem esta agora : portugues matematica…
?
:)brigada!

Gerva

Tira as colunas \o/

P

ai é q esta se eu tiro as colunas so aparece 1 disciplina :frowning:

Gerva

Será que o Detail não está muito grande?

Ele provavelmente criou 1 página pra cada diciplina hehe
Da uma olhadinha nisso, no print que você mando pelo menos o “Detail” estáva enorme :B

P

oi Gerva!
era exatamente isso o tamanho do detail!!!
agora esta funcionando tudo direitinho!!!
bah muito obrigada pela paciencia,ajuda e explicações!
=)

Gerva

Capaz :smiley:

Sempre a disposição

Bons relatórios :slight_smile:

Criado 20 de julho de 2011
Ultima resposta 27 de jul. de 2011
Respostas 28
Participantes 3