Relatorio com 4 tabelas
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:
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
Curtidas 0
Respostas
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.
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
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
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
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
18/01/2006
Qual o banco que vc utiliza, e o delphi??
GOSTEI 0
Tchucky
18/01/2006
estou usando o interbase com comandos em sql
GOSTEI 0
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
tabelas
Urina campo U_data
Fezes campo F_data
Hemograma campo H_data
Sangue campo S_data
GOSTEI 0
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
entao vc pode puxar os campos e montar seu relatorio no qreport!
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
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
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
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
select ´urina´, count(*) as total from urina where u_data between :EdData1 and :F_DATA union
ele é referente a q
GOSTEI 0
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!
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
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:
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
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
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
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
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.
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
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
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
ok
deu para entender e como eu nunca mexi com isso por isso q estou com essas duvidas danada
GOSTEI 0
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?
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
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
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
Dynamic SQL erro
SQL erro =- 104
Invalid command
dat type unknown
ele para ai
GOSTEI 0