Duvida com SQL count em query do DELPHI
Ola galera blz? Me desculpem se por acaso eu não crieo o topico em lugar certo, mais é pq ainda não tenho muita experiencei em postar aqui no forum.
Bom galera vou relatar um pouco sobre o sistema antes de fazer minha pergunta.....
Eu tenho uma tabela de endereços em firebird 2.0 (com o nome de ENDERECO) e com os seguintes campos descritos abaixo:
BAIRRO_CODIGO (INTEGER ) FK
ENDERECO_CODIGO (INTEGER ) PK
ENDERECO_CEP (VARCHAR)
ENDERECO_LOGRADOURO (VARCHAR)
ENDERECO_COMPLEMENTEO (VARCHAR)
Essa tabela contem quase 700.000 registros, para pesquisar esses registros eu uso essa SQL abaixo que está funcionando corretamente:
Query_ceps.SQL.Clear;
Query_ceps.Close;
Query_ceps.SQL.Add('select * from ENDERECO');
Query_ceps.SQL.Add('where upper(ENDERECO_LOGRADOURO) like' + quotedstr(Edit_buscar_por.Text + '%') + 'order by ENDERECO_LOGRADOURO');
Query_ceps.Open; Boa agora vamos a minha pergunta..... Quando eu efetuo essa pesquisa acima, por exemplo, eu quero todos os LOGRADOUROS que comecem com a letra "S", blz ele me retorna certinho todos esses registros, mais ai eu queria q ele me desse o NÚMERO TOTAL DOS REGISTROS ENCONTRADOS NA PESQUISA, porem não com um laço FOR ou WHILE, e nem com a função RecordCount da QUERY, eu até sei fazer assim, mais como disse eu tenho quase 700.000 registros, ai até fazer essa contagem ele demora muito. Eu query fazer isso por comando SQL e depois mostrar em um Label como no exemplo abaixo: Lbl_registros.Caption:=Query.FieldByName('Total').AsString; Assim eu consegui retornar corretamente, porem só me mostra o total dos registros encontrados, não me mostra na DBGrid as linhas encontradas na tabela para a pesquisa efetuada. Eu nem sei se é possivel isso q eu quero fazer em SQL (RETORNAR OS REGISTROS DA PESQUISA EFETUADA E MOSTRAR O TOTAL DE REGISTROS ENCONTRADO), e se der eu nem sei por onde começar, pesquisei muito mais não encontrei nada q sirva para o meu caso, se alguem puder me ajudar colocando mostrando no exemplo como eu escrevo isso em uma QUERY, eu ficaria muito grato. Abixo uma duas imagem do meu form de pesquisa para quem puder me ajudar entender melhor: ONDE O valor "3962" é os registros encontrados q comecem com a letra "S" que estão sendo msotrados no DBGrid acima Bom muito obrigado e espero q alguem posso me ajudar, desde já agradeço e fiquem todos com DEUS!!!!! Abraços
Query_ceps.Close;
Query_ceps.SQL.Add('select * from ENDERECO');
Query_ceps.SQL.Add('where upper(ENDERECO_LOGRADOURO) like' + quotedstr(Edit_buscar_por.Text + '%') + 'order by ENDERECO_LOGRADOURO');
Query_ceps.Open; Boa agora vamos a minha pergunta..... Quando eu efetuo essa pesquisa acima, por exemplo, eu quero todos os LOGRADOUROS que comecem com a letra "S", blz ele me retorna certinho todos esses registros, mais ai eu queria q ele me desse o NÚMERO TOTAL DOS REGISTROS ENCONTRADOS NA PESQUISA, porem não com um laço FOR ou WHILE, e nem com a função RecordCount da QUERY, eu até sei fazer assim, mais como disse eu tenho quase 700.000 registros, ai até fazer essa contagem ele demora muito. Eu query fazer isso por comando SQL e depois mostrar em um Label como no exemplo abaixo: Lbl_registros.Caption:=Query.FieldByName('Total').AsString; Assim eu consegui retornar corretamente, porem só me mostra o total dos registros encontrados, não me mostra na DBGrid as linhas encontradas na tabela para a pesquisa efetuada. Eu nem sei se é possivel isso q eu quero fazer em SQL (RETORNAR OS REGISTROS DA PESQUISA EFETUADA E MOSTRAR O TOTAL DE REGISTROS ENCONTRADO), e se der eu nem sei por onde começar, pesquisei muito mais não encontrei nada q sirva para o meu caso, se alguem puder me ajudar colocando mostrando no exemplo como eu escrevo isso em uma QUERY, eu ficaria muito grato. Abixo uma duas imagem do meu form de pesquisa para quem puder me ajudar entender melhor: ONDE O valor "3962" é os registros encontrados q comecem com a letra "S" que estão sendo msotrados no DBGrid acima Bom muito obrigado e espero q alguem posso me ajudar, desde já agradeço e fiquem todos com DEUS!!!!! Abraços
Carlos Catanduva
Curtidas 0
Respostas
Eliel Martins
29/06/2011
Olá Carlos !
Bom Carlos, o que pode ser feito é da seguinte forma, o que não acho que é uma forma muito legal, mas acho que irá resolver seu problema :
Esse sql acima, vai retorna uma coluna com o logradouro e outra coluna com o total de registros, mas na minha opinião usaria o RecordCount da Query.
Espero ter ajudado.
Eliel G. Martins
Bom Carlos, o que pode ser feito é da seguinte forma, o que não acho que é uma forma muito legal, mas acho que irá resolver seu problema :
SELECT A.LOGRADOURO , B.TOTAL FROM(SELECT E.ENDERECO_LOGRADOURO AS LOGRADOURO FROM ENDERECO E WHERE E.ENDERECO_LOGRADOURO LIKE '%S%') A, (SELECT COUNT(*) AS TOTAL FROM ENDERECO N WHERE N.ENDERECO_LOGRADOURO LIKE '%S%') B
Esse sql acima, vai retorna uma coluna com o logradouro e outra coluna com o total de registros, mas na minha opinião usaria o RecordCount da Query.
Espero ter ajudado.
Eliel G. Martins
GOSTEI 0
Emerson Nascimento
29/06/2011
Você pode fazer em dois passos, criando uma outra query somente para essas pesquisas auxiliares:
cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
if Query_Aux.Active then Query_Aux.Close;
Query_Aux.SQL.Clear;
Query_Aux.SQL.Add('select count(*) Total '+cWhere);
Query_Aux.Open;
Lbl_registros.Caption := Query_Aux.FieldByName('Total').AsString;
Query_Aux.Close;
Query_ceps.Close; // fecha
Query_ceps.SQL.Clear; // depois limpa a isntrução
Query_ceps.SQL.Add('select *, (select count(*) '+cWhere+') QTDREG');
Query_ceps.SQL.Add(cWhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
ou pode alterar sua instrução de modo a ter uma subselect (nesse caso o campo TOTAL não deve ser exibido na grade):
cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) TOTAL '+cWhere+') TOTAL');
Query_ceps.SQL.Add(cWhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
Lbl_registros.Caption := Query_ceps.FieldByName('TOTAL').AsString;
cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
if Query_Aux.Active then Query_Aux.Close;
Query_Aux.SQL.Clear;
Query_Aux.SQL.Add('select count(*) Total '+cWhere);
Query_Aux.Open;
Lbl_registros.Caption := Query_Aux.FieldByName('Total').AsString;
Query_Aux.Close;
Query_ceps.Close; // fecha
Query_ceps.SQL.Clear; // depois limpa a isntrução
Query_ceps.SQL.Add('select *, (select count(*) '+cWhere+') QTDREG');
Query_ceps.SQL.Add(cWhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
ou pode alterar sua instrução de modo a ter uma subselect (nesse caso o campo TOTAL não deve ser exibido na grade):
cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) TOTAL '+cWhere+') TOTAL');
Query_ceps.SQL.Add(cWhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
Lbl_registros.Caption := Query_ceps.FieldByName('TOTAL').AsString;
GOSTEI 0
Carlos Catanduva
29/06/2011
Obrigado aos amigo Eliel Martins e Emerson por responder o meu topico me ajudando.
Bom Eliel Martins eu usei o seu exemplo na minha query (exemplo abaixo), ele não da erro nada, porem ele só me retorna a quantidade dos registros pesquisados, mais não me mostra no DBGrid os endereços pesquisados.
Eu até usava o RecordCount mais como eu disse por a tabela ter muitos registros (quase 700.000) ele chega a travar até concluir a pesquisa.
Eu usava esse comando abaixo tbm além do RecordCount, não sei se vcs já virão, ele da certo em tabelas com poucos registros mais em tabelas grandes ele tbm trava até finalizar a pesquisa:
OBS: A variavel "registros_encontrados" é do tipo INTEGER Emerson muito obrigado pelo seu exemplo mais eu não entendi o e é essa linha: cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr O "cWhere" é uma variavel? E se for de q tipo ela é? Muito obrigado meus amigos por estarem me ajudando, já aprendi muito aqui pelo forum, muito obrigado mesmo galera!!!!!
Query_ceps.SQL.Clear;
Query_ceps.Close;
Query_ceps.SQL.Add('SELECT A.LOGRADOURO , B.TOTAL FROM(SELECT E.ENDERECO_LOGRADOURO AS LOGRADOURO');
Query_ceps.SQL.Add('FROM ENDERECO E');
Query_ceps.SQL.Add('WHERE E.ENDERECO_LOGRADOURO LIKE ' + quotedstr('%' + Edit_buscar_por.Text + '%') + ') A, (SELECT COUNT(*) AS TOTAL');
Query_ceps.SQL.Add('FROM ENDERECO N WHERE N.ENDERECO_LOGRADOURO LIKE ' + quotedstr('%' + Edit_buscar_por.Text + '%') + ') B');
Query_ceps.Open;
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString;
Query_ceps.SQL.Clear;
Query_ceps.Close;
Query_ceps.SQL.Add('select * from ENDERECO');
Query_ceps.SQL.Add('where upper(ENDERECO_LOGRADOURO) like' + quotedstr('%' + Edit_buscar_por.Text + '%') + 'order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
registros_encontrados:=0;
Query_ceps.DisableControls;
try
while not Query_ceps.Eof do
begin
registros_encontrados:=registros_encontrados + 1;
Query_ceps.Next;
end;
finally
Query_ceps.EnableControls;
Lbl_registros.Caption:='';
Lbl_registros.Caption:=IntToStr(registros_encontrados);
end;
OBS: A variavel "registros_encontrados" é do tipo INTEGER Emerson muito obrigado pelo seu exemplo mais eu não entendi o e é essa linha: cWhere := 'from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr O "cWhere" é uma variavel? E se for de q tipo ela é? Muito obrigado meus amigos por estarem me ajudando, já aprendi muito aqui pelo forum, muito obrigado mesmo galera!!!!!
GOSTEI 0
Carlos Catanduva
29/06/2011
Desculpa minha ignorancia Emereson, o "cwhere" é uma variaval String.
Bom no seu primeiro exemplo me passado (abaixo) ficou assim na linha de código do Delhi:
Executa normalmente mais quando pesquiso me retorna a mensagem de erro abaixo:
-------------------------------------------------------------------------------------------------------------------------------------------
O segundo exemplo q vc me deu (abaixo) ficou assim na linha de código:
tbm executa normalmente, porem quando a ésquisa é feita a pesquisa ele retorna esse erro abaixo:
O erro está na virgula do primeiro SELECT escrito
cwhere:='from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
if Query_aux.Active then
Query_aux.Close;
Query_aux.SQL.Clear;
Query_aux.SQL.Add('select count(*) Total ' + cwhere);
Query_aux.Open;
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString; // << Debugando o erro está aqui
Query_aux.Close;
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) ' + cwhere + ') QTDREG');
Query_ceps.SQL.Add(cwhere + 'order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
cwhere:='from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) Total ' + cwhere + ') Total');
Query_ceps.SQL.Add(cwhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString;GOSTEI 0
Emerson Nascimento
29/06/2011
Desculpa minha ignorancia Emereson, o "cwhere" é uma variaval String.
Bom no seu primeiro exemplo me passado (abaixo) ficou assim na linha de código do Delhi:
Executa normalmente mais quando pesquiso me retorna a mensagem de erro abaixo:
----------------------------------------------------------------
O segundo exemplo q vc me deu (abaixo) ficou assim na linha de código:
tbm executa normalmente, porem quando a ésquisa é feita a pesquisa ele retorna esse erro abaixo:
O erro está na virgula do primeiro SELECT escrito
cwhere:='from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
if Query_aux.Active then
Query_aux.Close;
Query_aux.SQL.Clear;
Query_aux.SQL.Add('select count(*) Total ' + cwhere);
Query_aux.Open;
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString; // << Debugando o erro está aqui
Query_aux.Close;
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) ' + cwhere + ') TOTAL');
Query_ceps.SQL.Add(cwhere + 'order by ENDERECO_LOGRADOURO');
Query_ceps.Open;----------------------------------------------------------------
O segundo exemplo q vc me deu (abaixo) ficou assim na linha de código:
cwhere:='from ENDERECO where upper(ENDERECO_LOGRADOURO) like ' + quotedstr(Edit_buscar_por.Text + '%');
Query_ceps.Close;
Query_ceps.SQL.Clear;
Query_ceps.SQL.Add('select *, (select count(*) Total ' + cwhere + ') Total');
Query_ceps.SQL.Add(cwhere + ' order by ENDERECO_LOGRADOURO');
Query_ceps.Open;
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString;O erro está na virgula do primeiro SELECT escrito
preste bastante atenção no primeiro exemplo:
Lbl_registros.Caption:=Query_ceps.FieldByName('Total').AsString; // << Debugando o erro está aqui
você calcula o total em Query_aux, porém quer exibir a partir de Query_ceps. não vai dar certo mesmo.
essa linha deve ser:
Lbl_registros.Caption:=Query_aux.FieldByName('Total').AsString; // << Debugando o erro está aqui
já no segundo exemplo, altere a linha para:
Query_ceps.SQL.Add('select endereco.*, (select count(*) Total ' + cwhere + ') Total');
GOSTEI 0
Carlos Catanduva
29/06/2011
Emerson será q daria pra vc me passar o seu email pra mim fazendo um favor?
Caso de eu já agradeço aqui desde já.....
GOSTEI 0
Emerson Nascimento
29/06/2011
está no meu perfil.
emerson.en@ig.com.br
emerson.en@gmail.com
emerson.en@ig.com.br
emerson.en@gmail.com
GOSTEI 0
Carlos Catanduva
29/06/2011
Bom galera o meu problema foi resolvido graças a ajuda do Emerson, e eu estou deixando o link do programa para q outras pessoas q tenhão duvidas iguais possa estar baixando e vendo o funcionamento da SQL.....
Abraço a todos e obrigado pela ajuda.....
https://www.devmedia.com.br/forum/delphi/404032-Duvida-com-SQL-count-em-query-do-DELPHI.html
GOSTEI 0
Carlos Catanduva
29/06/2011
Galera errei o link no post acima, o correto é esse link abaixo blz:
http://www.4shared.com/file/02QLG8m-/Ceps.html
GOSTEI 0