Consulta esdrúxula. Tem como simplificar?
Tem como fazer essa consulta mais simples, mais enxuta?
agradeço a quem possa ajudar-me.
qOSnull.Close;
qOSnull.SQL.Clear;
qSomanull.Close;
qSomanull.SQL.Clear;
qOSnull.SQL.Add(´Select OS,Codigo,Aparelho,Marca,Entrada,Orcamento,Saida,DtaExe,Tecnico,Maodeobra,Comissao,Totalpecas,TotalGeral From tlbOrdemServ´);
qOSnull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qSomanull.SQL.Add(´Select Sum(tlbOrdemServ.Maodeobra) As Servico, Sum(tlbOrdemServ.Comissao) As Cota, Sum(tlbOrdemServ.Totalpecas) As Pecas, Sum(tlbOrdemServ.TotalGeral) As Total From tlbOrdemServ´);
qSomanull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qOSnull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qOSnull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qOSnull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qSomanull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qSomanull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qSomanull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qOSnull.Open;
qSomanull.Open;
speedbutton1.Flat:=true;
qOSNull.First;
Contar := 0;
While not qOSNull.Eof do
Begin
qOSNull.Next;
Contar := Contar + 1; // pode usar também Inc(Count)
end;
Edit2.Text:= IntToStr(Contar);
FmtStr(s, ´¬.5d´, [StrToInt(edit2.text)]);
edit2.text := s;
end;
agradeço a quem possa ajudar-me.
qOSnull.Close;
qOSnull.SQL.Clear;
qSomanull.Close;
qSomanull.SQL.Clear;
qOSnull.SQL.Add(´Select OS,Codigo,Aparelho,Marca,Entrada,Orcamento,Saida,DtaExe,Tecnico,Maodeobra,Comissao,Totalpecas,TotalGeral From tlbOrdemServ´);
qOSnull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qSomanull.SQL.Add(´Select Sum(tlbOrdemServ.Maodeobra) As Servico, Sum(tlbOrdemServ.Comissao) As Cota, Sum(tlbOrdemServ.Totalpecas) As Pecas, Sum(tlbOrdemServ.TotalGeral) As Total From tlbOrdemServ´);
qSomanull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qOSnull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qOSnull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qOSnull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qSomanull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qSomanull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qSomanull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qOSnull.Open;
qSomanull.Open;
speedbutton1.Flat:=true;
qOSNull.First;
Contar := 0;
While not qOSNull.Eof do
Begin
qOSNull.Next;
Contar := Contar + 1; // pode usar também Inc(Count)
end;
Edit2.Text:= IntToStr(Contar);
FmtStr(s, ´¬.5d´, [StrToInt(edit2.text)]);
edit2.text := s;
end;
Jose
Curtidas 0
Respostas
Maicongabriel
18/01/2004
Cara, sua consulta, com certeza deve estar pesada!
Você esta abusando do ´Like´, e ainda mais com ´¬´ no inicio o no fim da string, o que faz com que qualquer indice que você tenha em sua tabela seja ignorado!
Sendo assim, a tabela ira ser percorrida por inteiro para executar este SQL e quanto maior a sua tabela for, maior será o tempo levado para executar este SQL.
Tente comparar a igualdade ! Troque o ´like´ por ´=´, afinal de contas você te que testar as peças que realmente existem.
Você esta abusando do ´Like´, e ainda mais com ´¬´ no inicio o no fim da string, o que faz com que qualquer indice que você tenha em sua tabela seja ignorado!
Sendo assim, a tabela ira ser percorrida por inteiro para executar este SQL e quanto maior a sua tabela for, maior será o tempo levado para executar este SQL.
Tente comparar a igualdade ! Troque o ´like´ por ´=´, afinal de contas você te que testar as peças que realmente existem.
GOSTEI 0
Jose
18/01/2004
Resolvi o problema e esqueci de avisar, desculpem-me.
O que estava emperrando a consulta era a contagem de registros da maneira que eu estava fazendo. Alterei e ficou boa. Sai de 18 segundos para consultar 1000 registros e fui para 5 segundos para os mesmos 1000 registros. Ficou assim:
qOSnull.Close;
qOSnull.SQL.Clear;
qSomanull.Close;
qSomanull.SQL.Clear;
qOSnull.SQL.Add(´Select OS,Codigo,Aparelho,Marca,Modelo,Entrada,Orcamento,Saida,DtaExe,Tecnico,Maodeobra,Comissao,Totalpecas,TotalGeral From tlbOrdemServ´);
qOSnull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qSomanull.SQL.Add(´Select Sum(tlbOrdemServ.Maodeobra) As Servico, Sum(tlbOrdemServ.Comissao) As Cota, Sum(tlbOrdemServ.Totalpecas) As Pecas, Sum(tlbOrdemServ.TotalGeral) As Total, Count(tlbOrdemServ.Aparelho) As From tlbOrdemServ´);
qSomanull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qOSnull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qOSnull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qOSnull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qSomanull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qSomanull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qSomanull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qOSNull.Open;
qSomanull.Open;
Acressentei a linha: ´Count(tlbOrdemServ.Aparelho) As Contar ´ à consulta qSomaNull.[/u]
O que estava emperrando a consulta era a contagem de registros da maneira que eu estava fazendo. Alterei e ficou boa. Sai de 18 segundos para consultar 1000 registros e fui para 5 segundos para os mesmos 1000 registros. Ficou assim:
qOSnull.Close;
qOSnull.SQL.Clear;
qSomanull.Close;
qSomanull.SQL.Clear;
qOSnull.SQL.Add(´Select OS,Codigo,Aparelho,Marca,Modelo,Entrada,Orcamento,Saida,DtaExe,Tecnico,Maodeobra,Comissao,Totalpecas,TotalGeral From tlbOrdemServ´);
qOSnull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qSomanull.SQL.Add(´Select Sum(tlbOrdemServ.Maodeobra) As Servico, Sum(tlbOrdemServ.Comissao) As Cota, Sum(tlbOrdemServ.Totalpecas) As Pecas, Sum(tlbOrdemServ.TotalGeral) As Total, Count(tlbOrdemServ.Aparelho) As From tlbOrdemServ´);
qSomanull.SQL.Add(´Where (Aparelho Like :Apa) And (Marca Like :Mrc) And (Modelo Like :Mod) And Entrada Between :Data1 And :Data2´);
qOSnull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qOSnull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qOSnull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qOSnull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qSomanull.Parameters.ParamByName(´Apa´).Value:=´¬´+Edit1.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mrc´).Value:=´¬´+Edit3.Text+´¬´;
qSomanull.Parameters.ParamByName(´Mod´).Value:=´¬´+Edit4.Text+´¬´;
qSomanull.Parameters.ParamByName(´Data1´).Value:=MaskEdit1.Text;
qSomanull.Parameters.ParamByName(´Data2´).Value:=Maskedit2.Text;
qOSNull.Open;
qSomanull.Open;
Acressentei a linha: ´Count(tlbOrdemServ.Aparelho) As Contar ´ à consulta qSomaNull.[/u]
GOSTEI 0