GARANTIR DESCONTO

Fórum Erro em consulta SQL - Firebird 2.0? #58518

18/07/2007

0

Pessoal, tenho uma grid que esta mostrando duas tabelas num select, e preciso fazer consultas por ela, entao eu preciso fazer exatamente a SQL como abaixo:
//--procedure para consultar mais de uma palavra no SQL procedure TFConEmpr.ConsultaSQL; var sql, texto: string; begin //--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços //-serve para filtrar tipo assim ADR SERV, JOS DE S.... if Trim(edtConsulta.text) = ´´ then exit; texto := edtConsulta.text; [b:0974595eac][color=darkblue:0974595eac]//sql := ´SELECT * FROM EMPRESA WHERE UPPER(EMPRESA) LIKE ´+´´´´;[/color:0974595eac][/b:0974595eac] [color=blue:0974595eac][i:0974595eac]{Tem que ser assim a montagem do SQL}[/i:0974595eac][/color:0974595eac] [color=green:0974595eac]sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+ ´left join salario_m F on F.id_empresa = E.id_empresa WHERE UPPER(E.empresa) LIKE ´+´´´´+ ´group by 1,2 order by E.id_empresa ´;[/color:0974595eac] while pos(´ ´,texto) > 0 do begin sql := sql + (copy(texto,1,pos(´ ´,texto)-1)+´¬´); Delete(texto,1,pos(´ ´,texto)); end; sql := sql+texto+´¬´´´; sql := UpperCase(sql); //--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY) //dsEmpresa.DataSet:=DM.qEmpresa2; DM.qEmpresa.Close; DM.qEmpresa.SQL.Clear; DM.qEmpresa.SQL.Add(sql); DM.qEmpresa.Open; end;


O que esta em destaque em negrito e azul escuro funciona certo, sem problemas, agora o que esta em verde nao aceita o SQL de forma alguma.

Mais como a o SQL tem que ter as duas tabelas juntas(JOIN) entao nao tem como usar apenas um select simples pois vai acurar erro de falta de Fields de alguns campos.

Agora o problema eh que nao consegui montar certo a segunda select juntando os campos para filtra a pesquisa e mostrar no dbgrid.

Bom o porque que eu preciso que o select seja daquela forma, eh pq esse select serve pra consultar por nome, sobrenome, terceiro nome, etc...

Alguem pode me ajudar

Estou usando D7 Firebird 2.0

Grato Adriano

Nem quebrando a SQL consigo fazer funcionar :(

sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+
´left join salario_m F on F.id_empresa = E.id_empresa´;
sql := ´WHERE UPPER(E.empresa) LIKE ´+´´´´;
sql := ´group by E.id_empresa, E.empresa order by E.id_empresa´;


Aparece sempre a seguinte mensagem de erro tipico de SQL errado

Invalid token SQL group by E.id_empresa, e.empresa order by e.id_empresaA¬´;´

Estou usando esta SQL
sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+
´left join salario_m F on F.id_empresa = E.id_empresa´;
sql := ´WHERE UPPER(E.empresa) LIKE ´+´´´´;
sql := ´group by E.id_empresa, E.empresa order by E.id_empresa´;


Este A em maiusculo aparece sempre no final aonde esta em destaque em negrito se eu digitar por exemplo A no edit.
Invalid token SQL group by E.id_empresa, e.empresa order by [b:0974595eac]e.id_empresaA¬[/b:0974595eac]´;´


Se eu digitar T no edit por exemplo aparece assim:
Invalid token SQL group by E.id_empresa, e.empresa order by [b:0974595eac]e.id_empresaT¬[/b:0974595eac]´;´


Assim funciona
procedure TFConEmpr.ConsultaSQL;
var sql, texto: string;
begin
//--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços
//-serve para filtrar tipo assim ADR SERV, JOS DE S....
if Trim(edtConsulta.text) = ´´ then
exit;
texto := edtConsulta.text;
sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+
´left join salario_m F on F.id_empresa = E.id_empresa WHERE UPPER(E.empresa) LIKE :pEdit ´+
´group by 1,2 order by E.id_empresa ´;
sql := UpperCase(sql);
//--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY)
//dsEmpresa.DataSet:=DM.qEmpresa2;
DM.qEmpresa.Close;
DM.qEmpresa.SQL.Clear;
DM.qEmpresa.SQL.Add(sql);
dm.qEmpresa.ParamByName(´pEdit´).AsString := ´¬´+AnsiUpperCase(EdtConsulta.Text)+´¬´;
DM.qEmpresa.Open;
end;


Mais nao eh do jeito que eu quero a consulta. :(


Adriano_servitec

Adriano_servitec

Responder

Posts

18/07/2007

Emerson Nascimento

e como você quer a consulta?


Responder

Gostei + 0

18/07/2007

Adriano_servitec

Olah amigo,

Quero do jeito que esta assim
procedure TFConEmpr.ConsultaSQL;
var sql, texto: string;
begin
//--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços
//-serve para filtrar tipo assim ADR SERV, JOS DE S....
if Trim(edtConsulta.text) = ´´ then
exit;
texto := edtConsulta.text;
//sql := ´SELECT * FROM EMPRESA WHERE UPPER(EMPRESA) LIKE ´+´´´´;
{Tem que ser assim a montagem do SQL}
sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+
´left join salario_m F on F.id_empresa = E.id_empresa WHERE UPPER(E.empresa) LIKE ´+´´´´+
´group by 1,2 order by E.id_empresa ´;
while pos(´ ´,texto) > 0 do begin
sql := sql + (copy(texto,1,pos(´ ´,texto)-1)+´¬´);
Delete(texto,1,pos(´ ´,texto));
end;
sql := sql+texto+´¬´´´;
sql := UpperCase(sql);
//--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY)
//dsEmpresa.DataSet:=DM.qEmpresa2;
DM.qEmpresa.Close;
DM.qEmpresa.SQL.Clear;
DM.qEmpresa.SQL.Add(sql);
DM.qEmpresa.Open;
end;


Pois neste caso posso filtrar no edit apenas a primeira letra e ir mostrando na grid, agora se utilizar o curinga antes e depois do etid fica filtrando por todas as letras.


Responder

Gostei + 0

18/07/2007

Emerson Nascimento

deixe-me ver se eu entendi... vocÊ quer digitar algo como ´ADR SERV, JOS DE S´ e que como resultado todos os registros que começem com ´ADR´, ´SERV,´, ´JOS´, ´DE´ ou ´S´. é isso?


Responder

Gostei + 0

18/07/2007

Adriano_servitec

Eh o mesmo que fazer assim

dm.qEmpresa.ParamByName(´pEdit´).AsString := AnsiUpperCase(EdtConsulta.Text)+´¬´;


Mais soh que se eu der um espaço no edit busca pelo sobrenome, entendeu?

Se eu fizer assim

dm.qEmpresa.ParamByName(´pEdit´).AsString := ´¬´+AnsiUpperCase(EdtConsulta.Text)+´¬´;
Pesquisa no edit apos o espaco no edit para buscar pelo sobrenome soh que no começo do edit pesquisa toda tabela em busca da letra.

Entedeu?


Responder

Gostei + 0

18/07/2007

Emerson Nascimento

tá difícil...

dê um exemplo prático...

imagine que no edit eu digitei ´ADV SERV´. o que deverá ser trazido?


Responder

Gostei + 0

18/07/2007

Adriano_servitec

tá difícil... dê um exemplo prático... imagine que no edit eu digitei ´ADV SERV´. o que deverá ser trazido?


Eh o seguinte

Supondo que tenho gravado assim na tabela

ADRIANO SERVITEC
SERVITEC ADRIANO
PEDRO SANTOS

entao
no edit o cursor bem no começo se eu digitar apenas ´A´

vai mostrar no grid assim
[b:4cb4cf434e]A[/b:4cb4cf434e]DRIANO SERVITEC

se
no edit o cursor bem no começo se eu digitar apenas ´S´

vai mostrar no grid assim
[b:4cb4cf434e]S[/b:4cb4cf434e]ERVITEC ADRIANO

se
no edit o cursor tiver com um espaço no começo do edit, e eu digitar apenas ´S´

vai mostrar no grid assim
ADRIANO [b:4cb4cf434e]S[/b:4cb4cf434e]ERVITEC
[b:4cb4cf434e]S[/b:4cb4cf434e]ERVITEC ADRIANO
PEDRO [b:4cb4cf434e]S[/b:4cb4cf434e]ANTOS

se
no edit o cursor tiver com um espaço no começo do edit, e eu digitar apenas ´SE´

vai mostrar no grid assim
ADRIANO [b:4cb4cf434e]SE[/b:4cb4cf434e]RVITEC
[b:4cb4cf434e]SE[/b:4cb4cf434e]RVITEC ADRIANO

Se eu fizer assim a SQL
procedure TFConEmpr.ConsultaSQL;
var sql, texto: string;
begin
//--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços
//-serve para filtrar tipo assim ADR SERV, JOS DE S....
if Trim(edtConsulta.text) = ´´ then
exit;
texto := edtConsulta.text;
sql := ´SELECT * FROM EMPRESA WHERE UPPER(EMPRESA) LIKE ´+´´´´;
while pos(´ ´,texto) > 0 do begin
sql := sql + (copy(texto,1,pos(´ ´,texto)-1)+´¬´);
Delete(texto,1,pos(´ ´,texto));
end;
sql := sql+texto+´¬´´´;
sql := UpperCase(sql);
//--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY)
//dsEmpresa.DataSet:=DM.qEmpresa2;
DM.qEmpresa.Close;
DM.qEmpresa.SQL.Clear;
DM.qEmpresa.SQL.Add(sql);
DM.qEmpresa.Open;
end;
Filtra que uma beleza, mais preciso que o SQL fique assim
[b:4cb4cf434e]{Tem que ser assim a montagem do SQL}
sql := ´select E.id_empresa, E.empresa, count(F.id_func)as ID_Func, count(F.id_func)as figura from empresa E ´+
´left join salario_m F on F.id_empresa = E.id_empresa WHERE UPPER(E.empresa) LIKE ´+´´´´+
´group by 1,2 order by E.id_empresa ´;[/b:4cb4cf434e]
E estou vendo que tem erro no SQL, soh nao consegui arrumar :D


Responder

Gostei + 0

18/07/2007

Emerson Nascimento

teste este código:
procedure TFConEmpr.ConsultaSQL;
var
  sql, texto: string;
begin
  //--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços
  //-serve para filtrar tipo assim ADR SERV, JOS DE S....
  if Trim(edtConsulta.text) = ´´ then
    exit;

  texto := edtConsulta.text;

  sql := ´select E.id_empresa, E.empresa, count(F.id_func) as ID_Func, ´+
         ´count(F.id_func) as figura ´+
         ´from empresa E ´+
         ´left join salario_m F on F.id_empresa = E.id_empresa ´+
         ´WHERE UPPER(E.empresa) LIKE :Nome ´+
         ´group by E.id_empresa, E.empresa ´+
         ´order by E.id_empresa ´;

  sql := UpperCase(sql);

  //--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY)
  //dsEmpresa.DataSet:=DM.qEmpresa2;
  DM.qEmpresa.Close;
  DM.qEmpresa.Clear;
  DM.qEmpresa.SQL.Add(sql);
  DM.qEmpresa.ParamByName(´Nome´).AsString := StringReplace(texto,´ ´,´¬´,[])+´¬´;
  DM.qEmpresa.Open;
end;



Responder

Gostei + 0

18/07/2007

Adriano_servitec

//--procedure para consultar mais de uma palavra no SQL
procedure TFConEmpr.ConsultaSQL;
var 
  sql, texto: string; 
begin 
  //--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços 
  //-serve para filtrar tipo assim ADR SERV, JOS DE S.... 
  if Trim(edtConsulta.text) = ´´ then 
    exit; 

  texto := edtConsulta.text; 

  sql := ´select E.id_empresa, E.empresa, count(F.id_func) as ID_Func, ´+ 
         ´count(F.id_func) as figura ´+ 
         ´from empresa E ´+ 
         ´left join salario_m F on F.id_empresa = E.id_empresa ´+ 
         ´WHERE UPPER(E.empresa) LIKE :Nome ´+ 
         ´group by E.id_empresa, E.empresa ´+ 
         ´order by E.id_empresa ´; 

  sql := UpperCase(sql); 

  //--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY) 
  //dsEmpresa.DataSet:=DM.qEmpresa2; 
  DM.qEmpresa.Close; 
  DM.qEmpresa.SQL.Clear;
  DM.qEmpresa.SQL.Add(sql); 
  DM.qEmpresa.ParamByName(´Nome´).AsString := AnsiUpperCase(StringReplace(texto,´ ´,´¬´,[]))+´¬´;
  DM.qEmpresa.Open; 

end;
Olah amigo, obrigado por me ajudar.

Bom, testei o codigo e funcionou sim, mais se eu precisar pesquisar uma palavra com mais de dois espaços tipo ANTONIO CARLOS SILVA se eu digitar no edit depois do espaço C S ele nao acha o nome.

Mais ja ficou de bom tamanho assim amigo.

Mais uma vez obrigado pela ajuda.


Responder

Gostei + 0

19/07/2007

Emerson Nascimento

faça uma pequena alteração na atribuição da variável [i:218d0e72e9]texto[/i:218d0e72e9]:
//--procedure para consultar mais de uma palavra no SQL
procedure TFConEmpr.ConsultaSQL;
var 
  sql, texto: string; 
begin 
  //--primeiro passo os dados para serem filtrados no edit com mais de um nome e com espaços 
  //-serve para filtrar tipo assim ADR SERV, JOS DE S.... 
  if Trim(edtConsulta.text) = ´´ then 
    exit; 

  texto := AnsiUpperCase(StringReplace(TrimRight(edtConsulta.text),´ ´,´¬ ´,[rfReplaceAll]))+´¬´;

  sql := ´select E.id_empresa, E.empresa, count(F.id_func) as ID_Func, ´+ 
         ´count(F.id_func) as figura ´+ 
         ´from empresa E ´+ 
         ´left join salario_m F on F.id_empresa = E.id_empresa ´+ 
         ´WHERE UPPER(E.empresa) LIKE :Nome ´+ 
         ´group by E.id_empresa, E.empresa ´+ 
         ´order by E.id_empresa ´; 

  sql := UpperCase(sql); 

  //--CHAMANDO A QUERY PARA FILTAR (DEPOIS QUE CHAMO O FILTRO ABRO A QUERY) 
  //dsEmpresa.DataSet:=DM.qEmpresa2; 
  DM.qEmpresa.Close; 
  DM.qEmpresa.SQL.Clear;
  DM.qEmpresa.SQL.Add(sql); 
  DM.qEmpresa.ParamByName(´Nome´).AsString := texto;
  DM.qEmpresa.Open; 

end;



Responder

Gostei + 0

19/07/2007

Adriano_servitec

Agora sim amigo.

Ficou do jeito que eu precisava.

Obrigado.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar