Relatorio com 4 tabelas

Delphi

18/01/2006

Ai pessoal estou cada dia mais enrolado é os eguinte tenho q fazer um relatorio por data q vai pegar de perioto 1 as pereiodo 2 so q é em 4 tabelas no mesmo qreport todas as tabelas tem cadastro data e eu estou enrolado nisso fiquei perdido... e tenho q fazer a somatorio de de cada tabela para saber quantos exames foi feito nesse periodo... tem como fazer isse relatorio com 4 tabelas assim... ai no caso ficaria assim

as tabelas são essas abaixo: e elas vão m dar o total d exames por periodo

no caso da data tal a data tal foi feito tantos exames

Urtina...: 20 exames total mes
Fezes ...: 25 exames total mes
Hemograma: 10 exames total mes
Sangue..: 4 exames total mes

ela vai m dar esse valor no relatorio...

ja estou a 3 dias rodando foruns e foruns para m ajudar e nada ainda.. :cry:


Tchucky

Tchucky

Curtidas 0

Respostas

Xtreme

Xtreme

18/01/2006

Bom em relatorios que ja fiz utilizando o QReport, utilizei sudbetails alem do detail, mas me informe o que vc usa pra fazer seus relatorios?
E outra a estruturas dessas tabelas sao iguais ou extremamente diferentes, pois caso os campos a serem listados no teu relatorio forem iguais vc pode atraves do sql fazer um union nas mesmas trazendo somente os campos que precisa.


GOSTEI 0
Xtreme

Xtreme

18/01/2006

Lendo melhor tua pergunta se teu relatorio tem que listar apenas o ´tipo de exame´ e a quatidade acho que vc pode fazer assim via sql,

select ´urina´, count(*) from urina where data between :dtinicial and :dtfinal
union
select ´fezes´, count(*) from fezes where data between :dtinicial and :dtfinal
union
select ´hemog´, count(*) from hemograma where data between :dtinicial and :dtfinal
union
select ´sangu´, count(*) from sangue where data between :dtinicial and :dtfinal



GOSTEI 0
Edilcimar

Edilcimar

18/01/2006

xtreme, isto eu já respondi para o tchuck, no outro site mas ele respondeu-me que não serve


GOSTEI 0
Tchucky

Tchucky

18/01/2006

o q eu naum entendi como vai ficar no qreport no caso um componente qrlabel receberá o valor mas como eu termino o codigo eu nunca usei sql e estou tomando uam surra


GOSTEI 0
Xtreme

Xtreme

18/01/2006

Qual o banco que vc utiliza, e o delphi??


GOSTEI 0
Tchucky

Tchucky

18/01/2006

estou usando o interbase com comandos em sql


GOSTEI 0
Tchucky

Tchucky

18/01/2006

uam coisa q naum coloquei os campos datas naum tem os nomes iguais isso atraplha em alguma coisa por exemplo

tabelas

Urina campo U_data
Fezes campo F_data
Hemograma campo H_data
Sangue campo S_data


GOSTEI 0
Xtreme

Xtreme

18/01/2006

nem cara os nomes dos campos nao tem problema, o que importa sao o tipo serem iguais assim como o tamanho, por exemplo se vc tem um campo descricao de tamanho 10 vc nao pode combina-lo com um de tamanho 20, os dois devem ter o tamanho 10, e tambem serem informados na mesma ordem, bom para seu relatorio vc pode fazer da seguinte maneira, use uma IBQuery e no sql dela jogue seu comando sql, como por exemplo este

select ´urina´, count(*) as total from urina where u_data between :dtinicial and :dtfinal
union
select ´fezes´, count(*) as total from fezes where f_data between :dtinicial and :dtfinal
union
select ´hemog´, count(*) as total from hemograma where h_data between :dtinicial and :dtfinal
union
select ´sangu´, count(*) as total from sangue where s_data between :dtinicial and :dtfinal


entao vc pode puxar os campos e montar seu relatorio no qreport!


GOSTEI 0
Tchucky

Tchucky

18/01/2006

Colega extreme eu entendi o seu codigo mas eu terei q uma params tipo

ai q estou com duvidas qual data colocar


With DM1.ConExames Do
Begin
Close;
SQL.Clear;
SQL.Add( ´select ´urina´, count(*) as total from urina where u_data between :EdData1 and :F_DATA union

SQL.Add( ´ select sum(HEM_CODHEMOGRAMA) as HEMOGRAMA from HEMOGRAMA where (HEM_DATA >= EdData1 and HEM_DATA <= EdData2)´);
SQL.Add( ´ select sum(UR_CODURINA) as URINA from URINA where (UR_DATA >= EdData1 and UR_DATA <= EdData2)´);
SQL.Add( ´ select sum(S_CODIGO) as SANGUE from SANGUE where (S_DATA >= EdData1 and S_DATA <= EdData2)´);

aqui em baixo esta minha duvidas quanto as Params

SQL.Add( ´ And xxx informar a data >= :P00 ´ );
SQL.Add( ´ And xxx informar a data <= :P01 ´ );

Params[00].AsDate := strtodate(EdData1.Text);
Params[01].AsDate := strtodate(EdData2.Text);
Open;


eu estou usando a IBQuery


GOSTEI 0
Tchucky

Tchucky

18/01/2006

naum entdi deste campo Total

select ´urina´, count(*) as total from urina where u_data between :EdData1 and :F_DATA union


ele é referente a q


GOSTEI 0
Xtreme

Xtreme

18/01/2006

Bom se vc for informar o mesmo periodo a todas as tabelas faz assim

ibquery.close;
ibquery.sql.clear;
ibquery.sql.text:=´select ´+quotedstr(´urina´)+´, count(*) as total from urina where u_data between :d1 and :d2 ´+
´ union ´+
´ select ´+quotedstr(´fezes´)+´, count(*) as total from fezes where f_data between :d1 and :d2 ´+
´ union ´+
´ select ´+quotedstr(´hemog´)+´, count(*) as total from hemograma where h_data between :d1 and :d2 ´+
´ union ´+
´ select ´+quotedstr(´sangu´)+´, count(*) as total from sangue where s_data between :d1 and :d2 ´;
ibquery.parambyname(´d1´).asdatetime:=DATAINICIAL;
ibquery.parambyname(´d2´).asdatetime:=DATAFINAL;
ibquery.open;

Onde DATAINICIAL e DATAFINAL correspondem ao periodo desejado
e a questao do ´as total´ é como se fosse um apelido para a coluna que é formada com a quantidade de registros encontrada.

Obs: Se vc ainda continuar com duvida me manda a estrutura em sql de suas tabelas que eu faço um programinha exemplo pra ti!


GOSTEI 0
Tchucky

Tchucky

18/01/2006

eu naum consegui copilar ele parou aqui

ibquery.parambyname(´d1´).asdatetime:=DATAINICIAL;
ibquery.parambyname(´d2´).asdatetime:=DATAFINAL;


o d1 e o d2 é referente ao maskedit q uso e o DATAINICIAL e DATAFINAL é refrente aque

pow o eu estou cada dia mais burro ou uam coisa esta acontecendo comigo :shock:


GOSTEI 0
Tchucky

Tchucky

18/01/2006

assim ele rodou legal


With IBQuery1 Do
Begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text :=´select ´+quotedstr(´urina´)+´, count(*) as total from urina where UR_DATA between :D1 and :D2 ´+
´ union ´+
´ select ´+quotedstr(´fezes´)+´, count(*) as total from fezes where F_DATA between :D1 and :D2 ´+
´ union ´+
´ select ´+quotedstr(´hemograma´)+´, count(*) as total from hemograma where HEM_DATA between :D1 and :D2 ´+
´ union ´+
´ select ´+quotedstr(´sangue´)+´, count(*) as total from sangue where S_DATA between :D1 and :D2 ´;
IBQuery1.ParamByName(´D1´).asdatetime:= StrTodate(EdData1.Text);
IBQuery1.ParamByName(´D2´).asdatetime:= StrTodate(EdData2.Text);
IBQuery1.Open;




mas eu ainda num entendi como vai somar os campos no relatorio eu tenho q um QRDBText para quais campos :( isso m tirando do serio mexer com sql ta dificil


GOSTEI 0
Tchucky

Tchucky

18/01/2006

assim ele rodou legal With IBQuery1 Do Begin IBQuery1.Close; IBQuery1.SQL.Clear; IBQuery1.SQL.Text :=´select ´+quotedstr(´urina´)+´, count(*) as total from urina where UR_DATA between :D1 and :D2 ´+ ´ union ´+ ´ select ´+quotedstr(´fezes´)+´, count(*) as total from fezes where F_DATA between :D1 and :D2 ´+ ´ union ´+ ´ select ´+quotedstr(´hemograma´)+´, count(*) as total from hemograma where HEM_DATA between :D1 and :D2 ´+ ´ union ´+ ´ select ´+quotedstr(´sangue´)+´, count(*) as total from sangue where S_DATA between :D1 and :D2 ´; IBQuery1.ParamByName(´D1´).asdatetime:= StrTodate(EdData1.Text); IBQuery1.ParamByName(´D2´).asdatetime:= StrTodate(EdData2.Text); IBQuery1.Open; aonde vai o campo q ele vai somar neste exemplo acima e eu ainda num entendi como vai somar os campos no relatorio eu tenho q um QRDBText para quais campos :( isso m tirando do serio mexer com sql ta dificil



GOSTEI 0
Aerreira

Aerreira

18/01/2006

Tchucky... acho que está chegando onde quer com seu relatório, mas tenho uma pergunta a te fazer: esse sistema é seu? você quem o criou ou está gerando um relatório sobre dados de um sistema de terceiros?

Não pude deixar de observar o tópico, pois lido com isso no meu dia-a-dia há muitos anos e, infelizmente, há erros estruturais sérios em suas tabelas, pois um laboratório não é feito apenas de exames ´urina´, ´fezes´, ´hemograma´ e ´sangue´. Laboratórios de análises clínicas trabalham com uma infinidade de exames e amostras diversas, o que tornaria o resultado desse seu relatório algo incompleto se comparado à rotina do laboratório. Existem tabelas individuais para cada tipo de exame? Se sim... meu Deus, isso não está correto. Fale mais sobre este sistema, talvez eu possa ajudar.


GOSTEI 0
Aerreira

Aerreira

18/01/2006

aonde vai o campo q ele vai somar neste exemplo acima e eu ainda num entendi como vai somar os campos no relatorio eu tenho q um QRDBText para quais campos :( isso m tirando do serio mexer com sql ta dificil

Acho que pode fazer assim, depois de abrir a query e antes de abrir seu relatório:

qrlabel1.caption := IBQuery1.FieldbyName(´total1´).asString;
qrlabel2.caption := IBQuery1.FieldbyName(´total2´).asString;
qrlabel3.caption := IBQuery1.FieldbyName(´total3´).asString;
qrlabel4.caption := IBQuery1.FieldbyName(´total4´).asString;

Coloca os qrLabels na sua banda rbSummary onde vão os dados de totalização do relatório.

Só que no seu SQL precisa substituir os vários ´as total´ por totais com nomes diferentes, como usei acima total1, total2, etc.


GOSTEI 0
Tchucky

Tchucky

18/01/2006

Olá aerreira o sistema é meu pq ele naum especificamente para uma clinica é para um posto d saude de uma prefeitura aqui perto e eles me passaram esses dados para afez eles precizam imprimir esses 4 exames pq ele era batido na maquina e essa somatorio é para eles terem o controle de quantas pessoas fizeram os exames por periodo pq eles trabalhão com o SUS e tem uam cota a ser cumprida

ok

deu para entender e como eu nunca mexi com isso por isso q estou com essas duvidas danada


GOSTEI 0
Aerreira

Aerreira

18/01/2006

Certo, entendi, mas observe que existem muito outros exames que podem vir a ser realizados. Tanto que sangue, urina e fezes não são exames e sim materiais coletados. Já hemograma é um exame e não um material. Em cada um desses materiais podem ser realizados diversos exames distintos... Mas acho que no seu caso o que é necessário é apenas uma visão aproximada do que está sendo realizado em cada material, exceto o hemograma que estão querendo uma visão individualizada.

Se você depois precisar totalizar os valores envolvidos em cada exame, separar por convênios distintos, identificar materiais separadamente, etc, etc, precisará rever os conceitos fundamentais da estrutura de seu banco de dados para que um sistema desse tipo possa ser implementado, senão vai ficar dando voltas e não chega a lugar algum.

E quando ao relatório: conseguiu?


GOSTEI 0
Tchucky

Tchucky

18/01/2006

Olá aerreira o sistema é meu pq ele naum especificamente para uma clinica é para um posto d saude de uma prefeitura aqui perto e eles me passaram esses dados para afez eles precizam imprimir esses 4 exames pq ele era batido na maquina e essa somatorio é para eles terem o controle de quantas pessoas fizeram os exames por periodo pq eles trabalhão com o SUS e tem uam cota a ser cumprida e realmente estou usando tabelas separadas deu para entender e como eu nunca mexi com isso por isso q estou com essas duvidas danada



GOSTEI 0
Tchucky

Tchucky

18/01/2006

ai da naum esta dando um erro quando kiko em visualizar o erro é o seguinte

Dynamic SQL erro
SQL erro =- 104
Invalid command
dat type unknown

ele para ai


GOSTEI 0
POSTAR