DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 29/6/2011 10:48:48 PM

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
 
Eliel Martins
 

País: Brasil
Estado: GO
Cidade: Goiânia
Mensagens: 101
 Postado em: 30/6/2011 8:35:02 AM
  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 :

#Código


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 Thumbs Up

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 30/6/2011 12:28:44 PM
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;


 
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 30/6/2011 1:06:02 PM

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.

#Código

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;

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:

#Código

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!!!!!

 
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 30/6/2011 2:05:44 PM
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: 
 
#Código
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;
 
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:
 
#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;
 
tbm executa normalmente, porem quando a ésquisa é feita a pesquisa ele retorna esse erro abaixo:
 
 
 
O erro está na virgula do primeiro SELECT escrito
 
 
 
 

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 30/6/2011 4:51:38 PM

Citação:
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: 
 
#Código
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;
 
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:
 
#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;
 
tbm executa normalmente, porem quando a ésquisa é feita a pesquisa ele retorna esse erro abaixo:
 

 
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');


 
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 1/7/2011 2:35:46 PM
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á.....

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 1/7/2011 4:38:01 PM
está no meu perfil.

emerson.en@ig.com.br
emerson.en@gmail.com

 
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 3/7/2011 5:14:31 PM

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.....
 
 

 
Carlos Catanduva
 

País: Brasil
Estado: SP
Cidade: Catanduva
Mensagens: 22
 Postado em: 3/7/2011 5:15:32 PM

Galera errei o link no post acima, o correto é esse link abaixo blz: 

 

 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03