Pesquisar neste blog

quinta-feira, 19 de julho de 2012

iReport 4.5.1 - Efetuando consulta em multiplos bancos de dados com connection expression

INTRODUÇÃO


Não é muito comum, mas as vezes pode ser necessário emitir um relatório com base em informações em duas ou mais bases de dados. Para resolver esse problema pode ser usado um subreport no iReport. Nesse exemplo será usado a base de dados do sistema Sisaih01 do Datasus que usa o Firebird como SGDB. Esse sistema possui três bases de dados, sendo a sisaih00.gdb, sisaih01.gdb e a sisaih99.gdb. A sisaih00.gdb armasena tabelas que podem ser alimentadas e alteradas pelo Datasus mensalmente como por exemplo de procedimentos, cid10, clinicas entre outras. A sisaih01.gdb armazena informações inseridas pelos hospitais como dados do paciente, procedimentos realizados, internações entre outros. A sisaih99.gdb armazena tabelas que são alteradas raramente como de cep, nacionalidade entre outros.




O PROBLEMA


O problema que levou a pesquisa sobre como usar o iReport para emitir um relatório usando multiplas bases foi a necessidade de um relatório com nome de pacientes, código e descrição do procedimento, valor do procedimento, número da Autorização de Internação Hospitalar (AIH), mês de apresentação e de competência da internação entre outros dados. Como a tabela de procedimentos que contem o valor e a descrição não fica na mesma base onde são armazenados os dados da internação do paciente, foi necessário buscar a solução.


CRIANDO CONSULTA DO BANCO SISAIH01.GDB PARA RELATÓRIO PRINCIPAL DO IREPORT


Antes de criar a consulta sql, lembre-se de adicionar o jar do drive jaybird no classpath do iReport e configurar a conexão. Abaixo segue uma cópia da tela de configuração como exemplo:


Configurando conexão


Deverá ser criada uma configuração para cada base que será usada para que seja possível usar em tempo de desenvolvimento. Para gerar o relatório principal será usado o comando sql abaixo. Clique com o botão direito do mouse sobre o relatório na janela do Report Inspector e escolha a opção Edit Query  e cole a consulta abaixo em Report Query:


select serv.sp_apres,serv.sp_cmpt_uti_acomp,serv.sp_num_aih,
serv.sp_dt_int,aih.aih_pac_nome,serv.sp_ato_prof,vlr.va_linha,aih.aih_car_int
from tb_serv_prof serv
inner join  tb_valor_aih vlr on serv.sp_num_aih=vlr.va_num_aih
inner join tb_aih aih on vlr.va_num_aih= aih.aih_num_aih

where
(
/*Procedimentos componente II - competência 07/2012*/
(serv.sp_ato_prof in (0404010016,0404010024,0404010032,0404010105,0404010210,0404010229,
                      0404010237,0404010350,0405020015,0405020023,0405030134,0405030142,
                      0406020566,0406020574,0408040076,0408040084,0408040092,0408050055,
                      0408050063,0408050160,0408050888,0408050896,0409010235,0409010561,
                      0409030040) and serv.sp_cmpt_uti_acomp=201207
)
)
and vlr.va_linha=1 and vlr.va_tipo_valor=1 and serv.sp_linha=1
and aih.aih_car_int=01 and (serv.sp_apres=$P{P_APRES})
order by serv.sp_apres





Com isso já é possível montar o relatório principal com a estrutura da figura abaixo:

Relatório Principal


Após desenhar o relatório principal, salve o mesmo como o nome Eletivas.
 



CRIANDO CONSULTA DO BANCO SISAIH00.GDB PARA SUBREPORT DO IREPORT


Agora que já foi criado o relatório principal, é hora de criar o subreport. Lembre-se de mudar na caixa de seleção a conexão para o banco sisaih00.gdb. Feito isso, crie um novo relatório com o nome Eletivas_subreport, adicione dois parâmetros no sub-relatório (P_COMP e P_CODPROC) e cole a seguinte consulta:


select pr.proc_cod,pr.proc_descr,pr.proc_vl_sh,pr.proc_vl_sp,pr.proc_cmpt_ini,pr.proc_cmpt_fim
from tb_proc pr where pr.proc_cod=$P{P_CODPROC} and pr.proc_cmpt_ini=$P{P_COMP}



Feito isso basta estruturar o subreport com os campos conforme imagem abaixo e adicionar uma váriavel com expressão para receber o total dos campos do serviço médico e hospitalar:


Componentes subreport e expressão da váriavel total

Dica: Usa a propriedade pattern  dos campos para formatar como moeda.

Neste exemplo o subreport deve ficar o mais estreito possível pois ele vai ficar abaixo das linhas do relatório principal conforme pode ser visto na figura abaixo:


Relatório principal com subreport
Na figura acima já foi adicionado um componente subreport da palheta do iReport no relatório principal. Esse componente tem por função fazer a ligação entre os dois relatórios. Nesse exemplo o componente foi colocado dentro da banda detalhes, logo abaixo das informações que serão exibidas pelo relatório principal, dessa forma, a cada linha do principal, logo abaixo será exibido as linhas do sub-relatório.




ADICIONANDO O SUBREPORT NO RELATÓRIO PRINCIPAL DO IREPORT


Ao adicionar o componente subreport o iReport iniciará um assistente para auxiliar nas configurações do componente. Na primeira tela marque para usar um relatório existente e selecione o Eletivas_subreport conforme figura abaixo:


Adicionando relatório do componente subreport
Na tela seguinte marque para não usar conexão pois iremos configurar manualmente:

Configurando conexão

Na tela seguinte é feita a vinculação dos dois parâmetros (P_COMP e P_CODPROC) criados no subreport com valores do relatório principal. Esses dois parâmetros foram usados na consulta sql, lembra? Dessa forma, vamos especificar quais valores devem ser buscados no outro banco a cada nova linha gerada no relatório principal. Se isso não fosse aplicado, para cada linha da tabela mestre seria exibido todos os registros da tabela detalhe. Nesse caso o critério de busca é o procedimento e a competência do mesmo, sendo que dessa forma sempre será retornado apenas um registro. A configuração ficará conforme tela abaixo:

Vinculando parâmetros do subreport com fields no principal
Como pode ser visto na figura acima, foi vinculado os parâmetros do detalhe aos fields do principal. Dessa forma será usado o valor desses fields na busca da tabela detalhe. Na tela seguinte defina que o caminho do subreport será armazenado em um parâmetro, conforme abaixo:

Configurando armazenamento do diretório do subreport

Feito isso o subreport está quase pronto. Agora vamos definir como será feita a conexão dos dados. Selecione o componente subreport e na janela de propriedades altere connection type para Use a connection Expression. Com isso, logo abaixo essa propriedade será ativada, clique no botão ao lado dela e adicione o seguinte valor:


java.sql.DriverManager.getConnection("jdbc:firebirdsql:192.168.0.1/3050:c:/Arquivos de Programas/Datasus/sisaih01/sisaih00.gdb","SYSDBA","masterkey")

O endereço obviamente deve ser o de seu banco caso vá fazer um teste. Feito isso, o relatório principal já pode ser visualizado, dessa forma ele irá pedir a apresentação. Se ao executar o relatório você receber um erro conforme abaixo não se assuste:

...
Caused by: java.sql.SQLException: No suitable driver found for jdbc:firebirdsql:192...
...

Isso pode ser corrigido mudando a propriedade language no relatório principal de Grovy para Java como pode ser visto na figura abaixo. Para isso, basta clicar com o botão direito sobre o relatório na janela Report Inspector e escolher a opção Propriedades. Feito isso, o relatório deve funcionar.

Alterando propriedade language do relatório de grovy para Java


Seria isso, caso tenha alguma sugestão ou dúvida é só postar nos comentários.


Claudir Pereira dos Santos


Matelândia/PR, 19 de julho de 2012.







Um comentário: