Fórum Duvida com SQL count em query do DELPHI #404032
29/06/2011
0
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
Curtir tópico
+ 0Posts
30/06/2011
Eliel 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
30/06/2011
Emerson Nascimento
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
30/06/2011
Carlos Catanduva
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
30/06/2011
Carlos Catanduva
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
30/06/2011
Emerson Nascimento
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
01/07/2011
Carlos Catanduva
Gostei + 0
01/07/2011
Emerson Nascimento
emerson.en@ig.com.br
emerson.en@gmail.com
Gostei + 0
03/07/2011
Carlos Catanduva
Gostei + 0
03/07/2011
Carlos Catanduva
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)