Administração das informações enviadas ao BD, para DbChart

Delphi

23/07/2009

Boooom essa Duvida é sobre um BD que meu programa de Delphi envias as informações...

Seguinte....meu soft administra ligações telefonicas, eu mando pro BD inicio, final, tempo de ligação, data....só que esou fazendo um Grafico DBChart, e precisava dele mostrando o tempo de ligação por dia...

Então eu não sei como somar todos os tempo de ligação de cada dia....

Alguem consegue me dar uma luz ai?!

Obrigadoo!!

Abrass...


Nino Marques

Nino Marques

Curtidas 0

Respostas

Vmlima

Vmlima

23/07/2009

Faça algo assim

select data, sum(tempo)
from tabelas
group by data


nada demais... e depois jogue no chart


att.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Cara tem como você explicar um pouco melhor..
To começando a mexer em BD agora, então não conheço tão bem as funções....

Se puder vai ser um favorzãoo!

Abrass


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

informe o banco de dados e a estrutura da tabela pra podermos ajudar da melhor forma possível...


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

O banco de dados foi feitos em Access, a tabela tem os seguintes campos:
-Inicio, final e tempo de ligação do tipo Data/hora
-canal, caminho da gravação e nome do arquivo do tipo texto

o envio dos dados está seno feito assim..

DM.ADOQuery_chamadas1.Close;
DM.ADOQuery_chamadas1.SQL.Clear;
DM.ADOQuery_chamadas1.SQL.Add(´UPDATE chamadas SET final = :final1, dtmf = :dtmf1,Tempo_de_Ligação=:Tempo_de_Ligação1 WHERE Canal = :canal1 AND inicio = :inicio1´);
DM.ADOQuery_chamadas1.Parameters.ParamByName(´canal1´).Value := nome_linha1;
DM.ADOQuery_chamadas1.Parameters.ParamByName(´inicio1´).Value := inicio_linha1;
DM.ADOQuery_chamadas1.Parameters.ParamByName(´final1´).Value := FormatDateTime(´dd/mm/yyyy hh:mm:ss´,now);
DM.ADOQuery_chamadas1.Parameters.ParamByName(´dtmf1´).Value := Label_placa1_dtmf.Caption;
DM.ADOQuery_chamadas1.Parameters.ParamByName(´Tempo_de_Ligação1´).Value := FormatDateTime(´hh:mm:ss´,(finalt - iniciot));
DM.ADOQuery_chamadas1.ExecSQL;


GOSTEI 0
Vmlima

Vmlima

23/07/2009

Caro...

Por favor, mostre-nos a estrutura da tabela, pode ser a SQL de criação mesmo, que da pra importar pelo IBExpert
Create table chamadas(
...
)

só pra gente ver certo seus campos e mandar uma resposta mais distinta...

Att.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Meuu....

Sei que to dando trabalho...
Mas como q faz isso???


GOSTEI 0
Facc

Facc

23/07/2009

[quote:8c4b679c5e=´Nino Marques´]Meuu....

Sei que to dando trabalho...
Mas como q faz isso???[/quote:8c4b679c5e]

é facil. abre o Access e copia o nome dos campos

Quem montou a estrutura do banco?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

não uso access (na verdade nunca usei), mas fiz uns testes aqui com essa instrução e, aparentemente, retorna o que você precisa:
select
  left(inicio, 10) as data,
  int(sum(tempo_de_ligacao)) as dias,
  right(cdate(sum(tempo_de_ligacao)), 8) as horas,

  right(´0000´+cstr(int(sum(tempo_de_ligacao))),4)+´d:´+
  right(cdate(sum(tempo_de_ligacao)), 8) as duracaototal,

  right(´0000´+cstr( (24*int(sum(tempo_de_ligacao)))  + datepart(´h´, cdate(sum(tempo_de_ligacao)))), 4)+´:´+
  right(cdate(sum(tempo_de_ligacao)), 5) as horastotais
from
  chamadas
group by
  left(inicio, 10)



GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

A estrutura eu peguei pronta já, um amigo que estava no projeto que fez...
Eu não entendo muito de Access então aprendi a enviar os dados, essas coisas.....

O nome dos CAmpos

Códigocanal inicio finaldtmftipocaminhoarquivoemailTempo_de_Ligação

Seria isso?! hahuHUaa...

E Emerson...esse Codigo q vc fez....qual a variavel de saida???
E qual será o melhor caminho p fazer o grafico?? eu crio uma nova tabela no access com dia e tempo de ligação e faço a ligação com o DbChart???


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Eu não ainda não conhecia essa função Select, então não sei muito bem us-la.....mas assim, está dando Undeclared Identifier, oque preciso fazer?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

você precisa colocar a instrução SQL dentro de um ADOQuery, assim como aquele UPDATE que você apresentou.

algo assim:
ADOQuery1.Close;
ADOQuery1.SQL.Text :=
  ´  select ´+
  ´  left(inicio, 10) as data, ´+
  ´  int(sum(tempo_de_ligacao)) as dias, ´+
  ´  right(cdate(sum(tempo_de_ligacao)), 8) as horas, ´+
  ´  right(´´0000´´+cstr(int(sum(tempo_de_ligacao))),4)+´´d:´´+ ´+
  ´  right(cdate(sum(tempo_de_ligacao)), 8) as duracaototal, ´+
  ´  right(´´0000´´+cstr( (24*int(sum(tempo_de_ligacao)))  + datepart(´´h´´, cdate(sum(tempo_de_ligacao)))), 4)+´´:´´+ ´+
  ´  right(cdate(sum(tempo_de_ligacao)), 5) as horastotais ´+
  ´from ´+
  ´  chamadas ´+
  ´group by ´+
  ´  left(inicio, 10) ´;
ADOQuery1.Open;


dependendo da sua necessidade, você poderá ligar esse ADOQuery à uma grade, para visualizar o resultado e analisar se está correto.

ou ainda fazer uma consulta pelo próprio Excel, utilizando essa mesma instrução.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Olha só...
estou usando a rotina q foi passada....mas está dando erro parece q de tempo de execução (Runtime error)...o codigo ficou assim...
Estou puxando as informações de uma tabela (chamadas) e depois jogando em outra (grafico)...


DM.ADOQuery_grafico.Close;
DM.ADOQuery_chamadas.open;
DM.ADOQuery_chamadas.sql.Text :=
´ select ´+
´ left(inicio, 10) as data, ´+
´ int(sum(Tempo_de_Ligação)) as dias, ´+
´ right(cdate(sum(Tempo_de_Ligacão)), 8) as horas, ´+
´ right(´´0000´´+cstr(int(sum(Tempo_de_Ligação))),4)+´´d:´´+ ´+
´ right(cdate(sum(Tempo_de_Ligação)), 8) as duracaototal, ´+
´ right(´´0000´´+cstr( (24*int(sum(Tempo_de_Ligação))) + datepart(´´h´´, cdate(sum(Tempo_de_Ligação)))), 4)+´´:´´+ ´+
´ right(cdate(sum(Tempo_de_Ligação)), 5) as horastotais ´+
´from ´+
´ chamadas ´+
´group by ´+
´ left(inicio, 10) ´;
DM.ADOQuery_chamadas.Close;
DM.ADOQuery_grafico.SQL.Add(´Select * from grafico where data = :data AND horastotais= :horastotais´);
DM.ADOQuery_grafico.SQL.Add(´Insert Into grafico(data, horastotais) Values (data, horastotais)´);
DM.ADOQuery_grafico.Parameters.ParamByName(´horastotais´).Value := horastotais;
DM.ADOQuery_grafico.Parameters.ParamByName(´data´).Value := FormatDateTime(´dd/mm/yyyy´,now);
DM.ADOQuery_grafico.Open;


Tem algo errado ai?!


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Algo errada tirando esses emotionq sairam!!
hehehehe...

na vdd eh um ´8 )´...

Abraço!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

tente somente:
DM.ADOQuery_grafico.Close;
DM.ADOQuery_grafico.sql.Text :=
´ select ´+
´ left(inicio, 10) as data, ´+
´ right(´´0000´´+cstr( (24*int(sum(Tempo_de_Ligação))) + datepart(´´h´´, cdate(sum(Tempo_de_Ligação)))), 4)+´´:´´+ ´+
´ right(cdate(sum(Tempo_de_Ligação)), 5) as horastotais ´+
´from ´+
´ chamadas ´+
´group by ´+
´ left(inicio, 10) ´;
DM.ADOQuery_grafico.Open;



GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Deu o mesmo erro Denovo...
Compila sem erros..mas na execução...Runtime error..


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

precisamos eliminar algumas possibilidades, pois o erro pode não ter nada a ver com essas queries.

você executou a instrução SQL a partir de uma consulta do Access?


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Não...eu executei o programa todo...
Mas assim antes de adicionar essas queries não dava erro algum...
Está dando depois disso....mas deve ser pq ela não está batendo com algo no resto do codigo...

Pelo q parece não tem erros ai neh?!


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Coloquei um botão q chama a função q envia as informações para o banco de dados...mas agora está dando o seguinte erro:
Tempo de ligação não tem valor padrão!

Oque Seria isso?!


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Eu tentei já de varias formas, mas ainda nada...
o Codigo q acho q está mais proximo do q eu preciso realizar é esse..

______________________________________________
procedure infograficos;
Begin
DM.ADOQuery_grafico.Close;
DM.ADOQuery_grafico.sql.Text :=
´ select ´+
´ left(inicio, 10) as data, ´+
´ right(´´0000´´+cstr( (24*int(sum(Tempo_de_Ligação))) + datepart(´´h´´, cdate(sum(Tempo_de_Ligação)))), 4)+´´:´´+ ´+
´ right(cdate(sum(Tempo_de_Ligação)), 5) as horastotais ´+
´from ´+
´ chamadas ´+
´group by ´+
´ left(inicio, 10) ´;


DM.ADOQuery_grafico.SQL.Add(´Select * from grafico where data :=data AND horastotais:=horastotais´);
DM.ADOQuery_grafico.SQL.Add(´UPDATE chamadas SET data = :data, horastotais = :horastotais WHERE data = :data AND horastotais = :horastotais´);
DM.ADOQuery_grafico.SQL.Add(´Insert Into grafico(data, horastotais) Values (data, horastotais)´);
DM.ADOQuery_grafico.Parameters.ParamByName(´horastotais´).Value := horastotais;
DM.ADOQuery_grafico.Parameters.ParamByName(´data´).Value := FormatdateTime(´dd/mm/yyyy´,now);
DM.ADOQuery_grafico.ExecSQL;
DM.ADOQuery_grafico.Open;
end;
________________________________________________

Mas está dando um erro flando q os dados são inconsistentes.....

A primeira parte faz a soma de todos valores de hora do banco de dados chamadas...e a segunda parte envia essas informações para o Bd grafico....

Alguma ideia?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

o código é somente este:
DM.ADOQuery_grafico.Close;
DM.ADOQuery_grafico.sql.Text :=
  ´ select ´+
  ´ left(inicio, 10) as data, ´+
  ´ right(´´0000´´+cstr( (24*int(sum(Tempo_de_Ligação))) + datepart(´´h´´, cdate(sum(Tempo_de_Ligação)))), 4)+´´:´´+ ´+
  ´ right(cdate(sum(Tempo_de_Ligação)), 5) as horastotais ´+
  ´from ´+
  ´ chamadas ´+
  ´group by ´+
  ´ left(inicio, 10) ´;
DM.ADOQuery_grafico.Open;


não tem nada de ADOQuery_grafico.SQL.Add nem ADOQuery_grafico.Paramenters nem ADOQuery_grafico.ExecSQL. é somente o que está publicado acima.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Eu coloquei só isso no codigo....mas assim...
Quando eu executo o programa....fla q ´data´ é ´Is Not A Valid Floating Point Value´...

Eu então mudei de ´DM.ADOQuery_grafico.Close; ´ para ´DM.ADOQuery_chamadas.Close;´ .....em todas os comando com as querys...
Já q tempo de ligação está no Bd chamadas..e criei mais um campo Horastotais.....ele compila certinho....vc chama a função..ela não dá erro mas tbm não imprime nada na tabela ´horastotais´...

Oque será q posso fazeer?


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Tentei mudar o codigo diversas vezes e até agora não tive sucesso..
Pelo que me parece o erro é devido a estar tentando fazer operações matematica com datas...

No codigo onde estava ´inicio´ eu troquei por data, porque esse é o nome da coluna que guarda as datas..dessa forma compilou o programa, e ao chamar a função não da nenhum erro...mas tambem não faz nada, as tabelas não apresentam alteração nenhuma e nem recebem valores...

oque será q posso fazer?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

se o seu relatório está esperando os dados da tabela DM.ADOQuery_grafico, não adianta você abrir a tabela DM.ADOQuery_chamadas.
você precisa abrir a tabela correta, como foi mostrado mais acima. se deu algum problema, veja se o dataset está com algum campo persistente (dê um duplo-clique no dataset). se tiver, veja quais são e quais os tipos esperados.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Achu q encontrei o motivo daquele erro...
olha sóóó.....

´right(´´0000´´+cstr( (24:*int(sum(Tempo_de_Ligação)) ´

Ali não pode multiplicar 24 por um tempo hh:mm:ss......por isso estava dando aquele erro.....

Eu troquei por 24:00:00 mas ainda não deu certo..dá um erro flando q as informações sõa inconsitentes algo assim!!!

Abraço..


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

23/07/2009

[quote:18c8bcca10=´Nino Marques´]A estrutura eu peguei pronta já, um amigo que estava no projeto que fez...
Eu não entendo muito de Access então aprendi a enviar os dados, essas coisas.....

O nome dos CAmpos

Códigocanal inicio finaldtmftipocaminhoarquivoemailTempo_de_Ligação
[/quote:18c8bcca10]

o nome do campo é realmente [b:18c8bcca10]Tempo_de_Ligação[/b:18c8bcca10], com acentuação e tudo o mais ??? qual o tipo desse campo ? se for um campo do tipo data não dá erro, não. testei aqui e funcionou.


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

É realmente escrito daquela forma...e é do tipo DAta/Hora e formato Hora Completa...

O que será q acontece entãoo?

Me fla uma coisa na tabela grafico os campos q vão receber as informações devem chamar horastotais e data certo?!

De q tipo estes????


GOSTEI 0
Nino Marques

Nino Marques

23/07/2009

Booom.....

Eu testei já por uma consulta do Access, e deu certo...retornou exatamento os valores da forma q eu preciso....porém...tenho um problema...

Como é uma consulta eu não consigo jogar as informações num DBChart...só um dos campos aparece no dataset....e seu eu transformo em tabela a consulta, ela não se atualiza...apenas tenho uma tabela estatica, com os resultados de quando ela foi feita....

então diante disso..oque posso fazer?


GOSTEI 0
POSTAR