Relatório Ireport[Resolvido]

Boa tarde, eu gostaria de saber, como faço para em uma mesma página de relatório trazer colunas diferentes com resultado da query, alterando um valor dentro da query, pra que fique mais claro é mais ou menos assim

SELECT
     AGENTE."NOME" AS AGENTE_NOME,
     META."VALOR" AS META_VALOR,
     CONTRATO."VALORCOMISSIONADO" AS CONTRATO_VALORCOMISSIONADO
FROM
     "AGENTE" AGENTE INNER JOIN "META" META ON AGENTE."CODIGO" = META."CODAGENTE"
     INNER JOIN "CONTRATO" CONTRATO ON AGENTE."CODIGO" = CONTRATO."AGENTE"
     INNER JOIN "BANCOS" BANCOS ON CONTRATO."BANCO" = BANCOS."CODIGO"
     INNER JOIN "FINANCEIRA" FINANCEIRA ON BANCOS."FINANCEIRA" = FINANCEIRA."CODIGO"
     INNER JOIN "TIPO" TIPO ON BANCOS."TIPO" = TIPO."CODIGO"
WHERE
      AGENTE."ATIVO" LIKE 'S'
      AND AGENTE."TIPOAGENTE" LIKE '5'
      AND FINANCEIRA."CODIGO" LIKE '1'
      AND TIPO."GRUPO" LIKE '4'
      AND CONTRATO."AGENTESECUNDARIO" NOT LIKE '22'
      AND CONTRATO."STATUSAP" LIKE '6'
      AND CONTRATO."MESL" LIKE '10'
      AND CONTRATO."ANOL" LIKE '2009'

Isto traria o resultado na coluna 1

SELECT
     AGENTE."NOME" AS AGENTE_NOME,
     META."VALOR" AS META_VALOR,
     CONTRATO."VALORCOMISSIONADO" AS CONTRATO_VALORCOMISSIONADO
FROM
     "AGENTE" AGENTE INNER JOIN "META" META ON AGENTE."CODIGO" = META."CODAGENTE"
     INNER JOIN "CONTRATO" CONTRATO ON AGENTE."CODIGO" = CONTRATO."AGENTE"
     INNER JOIN "BANCOS" BANCOS ON CONTRATO."BANCO" = BANCOS."CODIGO"
     INNER JOIN "FINANCEIRA" FINANCEIRA ON BANCOS."FINANCEIRA" = FINANCEIRA."CODIGO"
     INNER JOIN "TIPO" TIPO ON BANCOS."TIPO" = TIPO."CODIGO"
WHERE
      AGENTE."ATIVO" LIKE 'S'
      AND AGENTE."TIPOAGENTE" LIKE '5'
      AND FINANCEIRA."CODIGO" LIKE '1'
      AND TIPO."GRUPO" LIKE '4'
      AND CONTRATO."AGENTESECUNDARIO" NOT LIKE '22'
      AND CONTRATO."STATUSAP"/*-->*/ NOT LIKE '6'
      AND CONTRATO."MESL" LIKE '10'
      AND CONTRATO."ANOL" LIKE '2009'

Isto traria o resultado na coluna 2

SELECT
     AGENTE."NOME" AS AGENTE_NOME,
     META."VALOR" AS META_VALOR,
     CONTRATO."VALORCOMISSIONADO" AS CONTRATO_VALORCOMISSIONADO
FROM
     "AGENTE" AGENTE INNER JOIN "META" META ON AGENTE."CODIGO" = META."CODAGENTE"
     INNER JOIN "CONTRATO" CONTRATO ON AGENTE."CODIGO" = CONTRATO."AGENTE"
     INNER JOIN "BANCOS" BANCOS ON CONTRATO."BANCO" = BANCOS."CODIGO"
     INNER JOIN "FINANCEIRA" FINANCEIRA ON BANCOS."FINANCEIRA" = FINANCEIRA."CODIGO"
     INNER JOIN "TIPO" TIPO ON BANCOS."TIPO" = TIPO."CODIGO"
WHERE
      AGENTE."ATIVO" LIKE 'S'
      AND AGENTE."TIPOAGENTE" LIKE '5'
      AND FINANCEIRA."CODIGO" LIKE '1'
      AND TIPO."GRUPO" LIKE '4'
      AND CONTRATO."AGENTESECUNDARIO" "/*-->*/  LIKE '22'
      AND CONTRATO."STATUSAP"  LIKE '6'
      AND CONTRATO."MESL" LIKE '10'
      AND CONTRATO."ANOL" LIKE '2009'

Isto traria o resultado na coluna 3.

eu num sei se consegui explicar direito, mas algúem pode me ajudar?

Amigo,

Dessa forma nao é possivel… Quando vc precisa de mais que 1 SQL para seu relatório
aconselho vc a utilizar de Collections…
Sendo assim:

1º Fazer suas consultas SQL e popular um Objeto
2º Jogar esse seu Objeto em uma Collection
3º Enviar para o iReport uma Collection
4º Finish :slight_smile:

Se tiver duvidas vai encontrar bastante material sobre isso…
JRCollectionDataSource

Entendi o que você quis dizer,mas na prática, não sei como fazer isto, estou procurando no google mas até agora não achei, continuo procurando se puder me dar um exemplo eu agradeço!!!..

Amigo basicamente é isso:

ArrayList<Produtos> listaProdutos;
Certamente vc vai precisar popular o produtos para que o listaProdutos nao seja null

// O datasource
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(listaProdutos);

// Parametros do relatorios
Map parametros = new HashMap();

JasperPrint impressao = new JasperPrint();

try {
impressao = JasperFillManager.fillReport(caminhoRelJasper ,parametros, ds);

JasperViewer viewer = new JasperViewer(impressao, true);
viewer.setVisible(true);
//Nome e diretorio onde vai ser gerado o PDF
// String destFileName ="C:\geraPDF.pdf";
// JasperExportManager.exportReportToPdfFile(impressao,destFileName);
//JasperExportManager.exportReportToHtmlFile(impressao,destFileNameHTML);
} catch (JRException e) {
System.out.println(e.getMessage());
System.out.println("PRINTSTACKTRACE = ");
e.printStackTrace();
} 

Bom a principio consegui resolver com subrelatorios, ou seja estou conseguindio trazer o subrelatorio no mesmo relatório o problema agora é com questão ao comando no firebird

SELECT
     sum(CONTRATO."VALORCOMISSIONADO") AS CONTRATO_VALORCOMISSIONADO,
    AGENTE."NOME" AS AGENTE_NOME
FROM
     "AGENTE" AGENTE INNER JOIN "META" META ON AGENTE."CODIGO" = META."CODAGENTE"
     INNER JOIN "CONTRATO" CONTRATO ON AGENTE."CODIGO" = CONTRATO."AGENTE"
     INNER JOIN "BANCOS" BANCOS ON CONTRATO."BANCO" = BANCOS."CODIGO"
     INNER JOIN "FINANCEIRA" FINANCEIRA ON BANCOS."FINANCEIRA" = FINANCEIRA."CODIGO"
     INNER JOIN "TIPO" TIPO ON BANCOS."TIPO" = TIPO."CODIGO"
WHERE
 AGENTE."NOME" LIKE 'BRADESCO 0052 A SINERGIA ARAPONGAS'
 AND AGENTE."ATIVO" LIKE 'S'
 AND AGENTE."TIPOAGENTE" LIKE '5'
 AND FINANCEIRA."CODIGO" LIKE '1'
 AND TIPO."GRUPO" LIKE '4'
 AND CONTRATO."STATUSAP" LIKE '1'
 OR CONTRATO."STATUSAP" LIKE '2'
 OR CONTRATO."STATUSAP" LIKE '4'
 OR CONTRATO."STATUSAP" LIKE '5'
 OR CONTRATO."STATUSAP" LIKE '7'
 AND CONTRATO."AGENTESECUNDARIO" NOT LIKE '22'

GROUP BY
     AGENTE."NOME"

Esta pesquisa deveria me retornar somente resultados quando o nome do agente fosse ‘0052 A SINERGIA ARAPONGAS’, porém esta trazendo resultado de todos os 'AGENTE.NOME’eu acho que o erro esta nas condições “OR” ja que se eu fizer

AGENTE."NOME" LIKE 'BRADESCO 0052 A SINERGIA ARAPONGAS'
 AND AGENTE."ATIVO" LIKE 'S'
 AND AGENTE."TIPOAGENTE" LIKE '5'
 AND FINANCEIRA."CODIGO" LIKE '1'
 AND TIPO."GRUPO" LIKE '4'
AND CONTRATO."STATUSAP" LIKE '1'
 OR CONTRATO."STATUSAP" LIKE '2'
AND CONTRATO."AGENTESECUNDARIO" NOT LIKE '22'

GROUP BY
     AGENTE."NOME"

ele traz o resultado somente deste “AGENTE.NOME”,agora se colocar os demais "OR"volta a retornar todos os resultados, alguem sabe alguma outra maneira de criar esta condição?

Eu não conheço essa forma que o Thekill disse, porém tem um método que faço que é como eu aprendi.

Usar sub-relatório, você faz as colunas saperadas cada uma com sua query e depois chama no relatório principal

então julio como eu disse, eu consegui trazer o subrelatório o problema agora fugiu um pouco do ireport, o problema é com os comandos firebird, ja que eu tenho testado o comando acima direto no ibexpert e ele não traz os resultados da maneira que eu gostaria

Será que não é por causa do LIKE? O Like vai te retornar qualquer nome que tenha BRADESCO ou 0052 ou A ou SINERGIA ou ARAPONGAS, ele procura palavra por palavra, se vc tirar o LIKE ele ira procurar pelo nome intero e retornará só nome identico a esse

certo e o que vc sugere no lugar , “=” ou tem mais algum que traria o resultado exato, outra coisa, acho que eu não estou sabendo fazer a condição or ja que se eu colocar:

AND CONTRATO."STATUSAP" LIKE '1'   
OR CONTRATO."STATUSAP" LIKE '2'   

da certo , agora se eu colocar:

AND CONTRATO."STATUSAP" LIKE '1'   
OR CONTRATO."STATUSAP" LIKE '2'   
OR CONTRATO."STATUSAP" LIKE '4'   
OR CONTRATO."STATUSAP" LIKE '5'   
OR CONTRATO."STATUSAP" LIKE '7'  

ai ele me retorna todos os resultados

Vamos entender a lógica.

 AND CONTRATO."STATUSAP" LIKE '1'     
 OR CONTRATO."STATUSAP" LIKE '2'  

Aqui ele vai retorna o resultado quando o STATUSAP for 1 OU for 2 certo?

 AND CONTRATO."STATUSAP" LIKE '1'     
 OR CONTRATO."STATUSAP" LIKE '2'     
 OR CONTRATO."STATUSAP" LIKE '4'     
 OR CONTRATO."STATUSAP" LIKE '5'     
 OR CONTRATO."STATUSAP" LIKE '7'

Ja aqui ele vai retorna o resultado quando o STATUSAP for 1 OU for 2 OU for 4 OR for 5 OU for 7
Lógicamente nesse segundo caso ele vai retornar mais resultados.

certo, porém não deveria trazer mais resultados, ja que estou pedindo uma soma dos valores comissionados, quando o nome do agente fosse ‘BRADESCO 0052 A SINERGIA ARAPONGAS’ então deveria trazer somente um resultado.só que ele traz um resultado para o nome
‘BRADESCO 0052 A SINERGIA ARAPONGAS’ e mais um para cada agente.nome ai é que se encontra a dúvida

É… teorioricamente.

É meio dificil saber assim… eu to falando tudo aqui só na imaginação pq não to vendo o resultado.

Mas vc precisa mesmo de todas essas verificações pra chegar no resultado, não tem como simplificar isso?

Bom apesar de não ter terminado o Relatório ainda as questões acima ficaram assim a primeira questão foi resolvida com sub relatórios, um para cada query, ja a questão do firebird ficou resolvida desta maneira:

SELECT
     sum(CONTRATO."VALORCOMISSIONADO") AS CONTRATO_VALORCOMISSIONADO,
     META."VALOR" AS META_VALOR,
     AGENTE."CODIGO" AS AGENTE_CODIGO,
     AGENTE."NOME" AS AGENTE_NOME
FROM
     "AGENTE" AGENTE INNER JOIN "META" META ON AGENTE."CODIGO" = META."CODAGENTE"
     INNER JOIN "CONTRATO" CONTRATO ON AGENTE."CODIGO" = CONTRATO."AGENTE"
     INNER JOIN "BANCOS" BANCOS ON CONTRATO."BANCO" = BANCOS."CODIGO"
     INNER JOIN "FINANCEIRA" FINANCEIRA ON BANCOS."FINANCEIRA" = FINANCEIRA."CODIGO"
     INNER JOIN "TIPO" TIPO ON BANCOS."TIPO" = TIPO."CODIGO"
WHERE
     AGENTE."ATIVO" LIKE 'S'
 AND AGENTE."TIPOAGENTE" LIKE '5'
 AND FINANCEIRA."CODIGO" LIKE '1'
 AND TIPO."GRUPO" LIKE '4'
 AND CONTRATO."AGENTESECUNDARIO" NOT LIKE '22'
AND ((CONTRATO."STATUSAP" LIKE '1') or (CONTRATO."STATUSAP" LIKE '2') or (CONTRATO."STATUSAP" LIKE '4') or (CONTRATO."STATUSAP" LIKE '5') or (CONTRATO."STATUSAP" LIKE '7'))
AND AGENTE."CODIGO" = $P{sub1}
GROUP BY
     META."VALOR",
     AGENTE."NOME",
     AGENTE."CODIGO"

Só mais uma coisa, tem como eu passar uma váriável de um subrelatório para outro subrelatório?