Fórum Erro em consulta SQL - Firebird 2.0? #58518
18/07/2007
0
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.
Se eu digitar T no edit por exemplo aparece assim:
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
Curtir tópico
+ 0Posts
18/07/2007
Emerson Nascimento
Gostei + 0
18/07/2007
Adriano_servitec
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.
Gostei + 0
18/07/2007
Emerson Nascimento
Gostei + 0
18/07/2007
Adriano_servitec
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)+´¬´;
Entedeu?
Gostei + 0
18/07/2007
Emerson Nascimento
dê um exemplo prático...
imagine que no edit eu digitei ´ADV SERV´. o que deverá ser trazido?
Gostei + 0
18/07/2007
Adriano_servitec
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;
[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
Gostei + 0
18/07/2007
Emerson Nascimento
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;
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;
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.
Gostei + 0
19/07/2007
Emerson Nascimento
//--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;
Gostei + 0
19/07/2007
Adriano_servitec
Ficou do jeito que eu precisava.
Obrigado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)