Login Registre-se
Problema com relatorio TIBCO Jaspersoft  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
spinal

JavaC Membro

Membro desde: 12/07/2015 19:18:33
Mensagens: 5
Offline

Bom dia amigos. Vou tentar explicar a situação.
Estou usando o TIBCO Jaspersoft para criar os relatórios.
Porém estou tendo o problema da chave estrangeira na minha tabela.
Pego os dados da tabela os_servico sem problemas.
Pego os dados da os_equipamento sem problema também.
O problema começa quando vou inserir a os_sublocal e a os_colaborador.
A tabela os_colaborador possui duas referências na tabela os_servico, que no caso seria o solicitado e o solicitante.
O relatório não dá erro, mas aparece a mensagem no preview "Document is empty".
Gostaria que no meu relatório de impressão tivesse:
- os_servico.id
- os_servico.descricao_problema
- os_servico.data_inicio
- os_equipamento.sku
- os_equipamento.descricao
- os_colaborador.nome_colaborador (solicitado)
- os_colaborador.nome_colaborador (solicitante)
- os_sublocal.descricao

Segue código criado pelo jaspersoft:
SELECT os_servico.solicitante_id,
os_servico.id,
os_servico.causa_defeito,
os_servico.data_inicio,
os_servico.descricao_problema,
os_servico.numeroserie,
os_servico.prioridade,
os_servico.qtde_peca,
os_servico.status,
os_servico.tipo_manutencao,
os_servico.solicitado_id,
os_servico.equipamento_id,
os_servico.local_id,
os_servico.peca_id,
os_servico.sublocal_id,
os_colaborador.nome_colaborador,
os_sublocal.descricao,
os_equipamento.descricao,
os_equipamento.sku
FROM os_servico
INNER JOIN os_equipamento ON
os_servico.equipamento_id = os_equipamento.id
INNER JOIN os_colaborador ON
os_servico.solicitante_id = os_colaborador.id
AND os_servico.solicitado_id = os_colaborador.id
INNER JOIN os_sublocal ON
os_servico.sublocal_id = os_sublocal.id
AND os_equipamento.sublocal_id = os_sublocal.id

Gostaria da ajuda dos amigos.

Att.
robertop

JavaC Membro

Membro desde: 10/07/2013 20:08:36
Mensagens: 162
Offline

Bom dia!

Geralmente esta mensagem ocorre quando não há dados para impressão.
No seu sql, os join são inner. Então para que apresente dados, a os_serviço obrigatoriamente terá que ter os_equipamento, os_colaborador, os_sublocal.

Primeiro, para fazermos um teste, altere tudo que for INNER por LEFT.
Parece que o join com colaborador esta duplicado, não entendi esta parte.

spinal

JavaC Membro

Membro desde: 12/07/2015 19:18:33
Mensagens: 5
Offline

Bom dia. Farei essa alteração. O join com colaborador está duplicado sim, pois na tabela os_servico tenho 2 chaves referente ao os_colaborador, que no caso seria o solicitado e o solicitante.
anderson scherrer

JavaC Membro

Membro desde: 20/02/2016 16:27:20
Mensagens: 16
Offline

Neste trecho:

INNER JOIN os_colaborador ON
os_servico.solicitante_id = os_colaborador.id
AND os_servico.solicitado_id = os_colaborador.id

Creio que vc irá precisar duplicar o join pois o caso acima só funcionaria caso o solicitante e o solicitado fossem o mesmo id.

Provavelmente vc terá que fazer isso:

INNER JOIN os_colaborador os_colab_solicitante ON
os_servico.solicitante_id = os_colab_solicitante.id

INNER JOIN os_colaborador os_colab_solicitado ON
os_servico.solicitado_id = os_colab_solicitado.id

E caso algum dos seus joins possam ser null vc precisa trocar de inner para left como o robertop citou acima.
spinal

JavaC Membro

Membro desde: 12/07/2015 19:18:33
Mensagens: 5
Offline

anderson scherrer wrote:Neste trecho:

INNER JOIN os_colaborador ON
os_servico.solicitante_id = os_colaborador.id
AND os_servico.solicitado_id = os_colaborador.id

Creio que vc irá precisar duplicar o join pois o caso acima só funcionaria caso o solicitante e o solicitado fossem o mesmo id.

Provavelmente vc terá que fazer isso:

INNER JOIN os_colaborador os_colab_solicitante ON
os_servico.solicitante_id = os_colab_solicitante.id

INNER JOIN os_colaborador os_colab_solicitado ON
os_servico.solicitado_id = os_colab_solicitado.id

E caso algum dos seus joins possam ser null vc precisa trocar de inner para left como o robertop citou acima.


Obrigado pela ajuda amigo, consegui resolver parcialmente meu problema.
Vou postar o código pra você entender.

SELECT os_servico.id,
os_servico.causa_defeito,
os_servico.data_inicio,
os_servico.descricao_problema,
os_servico.numeroserie,
os_servico.prioridade,
os_servico.status,
os_servico.tipo_manutencao,
os_equipamento.sku,
os_equipamento.descricao,
os_sublocal.descricao,
os_colaborador.nome_colaborador
FROM os_servico
LEFT JOIN os_equipamento ON
os_servico.equipamento_id = os_equipamento.id
LEFT JOIN os_colaborador ON
os_servico.solicitante_id = os_colaborador.id
AND
os_servico.solicitado_id = os_colaborador.id
LEFT JOIN os_sublocal ON
os_equipamento.sublocal_id = os_sublocal.id

A linha do meu select onde coloco "os_colaborador.nome_colaborador" teria que ser chamada 2 vezes no meu relatório.
Caso eu remova a linha "AND os_servico.solicitado_id = os_colaborador.id" o relatório funciona normalmente.
Mas, preciso colocar no relatório os 2 colaboradores, no caso quem solicitou a chamada e quem foi o solicitante.
A tabela "os_colaborador" tem uma chave estrangeira chamada "cargo_id" que serve para distinguir um funcionário do outro por cargo, sendo assim, um segundo combo será preenchido com a condição selecionada.
Em resumo, precisaria de uma outra coluna de nome_colaborador onde faria a condição do AND.

Desde já grato pela ajuda.
robertop

JavaC Membro

Membro desde: 10/07/2013 20:08:36
Mensagens: 162
Offline

Bom dia!

Você poderia postar todos os campos da tabela OS_SERVICO?
spinal

JavaC Membro

Membro desde: 12/07/2015 19:18:33
Mensagens: 5
Offline

robertop wrote:Bom dia!

Você poderia postar todos os campos da tabela OS_SERVICO?


Opa, aí está!

*** OS_SERVICO
SELECT id, causa_defeito, data_fim, data_inicio, data_duracao_tempo,
descricao_observacao, descricao_problema, falha_defeito, info_adicional,
data_intervencao_fim, data_intervencao_inicio, data_intervencao_tempo,
numeroserie, prioridade, qtde_peca, status, tipo_manutencao,
solicitante_id, solicitado_id, local_id, peca_id, equipamento_id
FROM os_servico;

*** OS_COLABORADOR
SELECT id, nome_colaborador, cargo_id
FROM os_colaborador;

*** OS_CARGO
SELECT id, descricao
FROM os_cargo;

Enviei as outras 2, para entender melhor.

Obrigado mais uma vez.
robertop

JavaC Membro

Membro desde: 10/07/2013 20:08:36
Mensagens: 162
Offline

Certo, tenta com este sql abaixo.



Se não funcionar, acho melhor você criar o campo id_solicitado e nome solicitado na tabela os_servico assim ira funcionar.
Então para o solicitado, você não faria o JOIN, e gravaria o mesmo direto na tabela.
spinal

JavaC Membro

Membro desde: 12/07/2015 19:18:33
Mensagens: 5
Offline

robertop wrote:Certo, tenta com este sql abaixo.



Se não funcionar, acho melhor você criar o campo id_solicitado e nome solicitado na tabela os_servico assim ira funcionar.
Então para o solicitado, você não faria o JOIN, e gravaria o mesmo direto na tabela.


Maravilha!!! Farei os testes e te aviso, muitíssimo obrigado!
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.9 © JForum Team