Parâmetro em Querry DELPHI [como usar paramentros do tipo string?] [HELP]
Tenho tentado criar uma procedimento para busca dentro de um tabela de um banco;
E adotei o seguinte código para o procedimento;
QUERRY MENCIONADA NO METODO BUSCA
O problema é que, quando executo o método tudo ocorre certo até o ponto da onde a tabela exibirá as informações da busca;
Acontece que o teste feito no sql(where) acaba dando falso. (Pelo fato de que eu entendi o paramentro :campo esta vazio)
testando o codigo percebi que, ao passar somente o valor de comparação (no caso o paramentro :valor), a tabela exibe corretamente a busca
e pesquisando descobri q parametros podem ser tipados;
Tenho que estipular algum tipo pra o meu parametro campo ?
existe outro método mais eficiente que esse, para busca em tabela ?
Desde ja agracedo!
E adotei o seguinte código para o procedimento;
procedure Busca(campo:string);
begin
DM.qtester.Active :=false ;
DM.qtester.ParamByName('campo').AsString := campo;// PARAMETRO CAMPO , RECEBE A INFORMAÇÃO DE QUAL COLUNA SERA SELECIONADA
DM.qtester.ParamByName('valor').Value := frmTabelaFuncionario.Edit1.Text;// PARAMENTRO VALOR, RECEBE A INFORMAÇÃO DO VALOR DE COMPARAÇÃO
DM.qtester.Active := true ;
frmTabelaFuncionario.gridExibeFuncionario.DataSource := DM.dsTester;// TABELA RECEBE A NOVA QUERY ADOTADA PARA EXIBIÇÃO
end;
QUERRY MENCIONADA NO METODO BUSCA
select codFuncionario, nome, idade, cpf, endereco, numero, cep, telefone, codSetor from projetoestacionamento.funcionario where :campo = :valor and excluido <> 'e' order by (codFuncionario)
O problema é que, quando executo o método tudo ocorre certo até o ponto da onde a tabela exibirá as informações da busca;
Acontece que o teste feito no sql(where) acaba dando falso. (Pelo fato de que eu entendi o paramentro :campo esta vazio)
testando o codigo percebi que, ao passar somente o valor de comparação (no caso o paramentro :valor), a tabela exibe corretamente a busca
e pesquisando descobri q parametros podem ser tipados;
Tenho que estipular algum tipo pra o meu parametro campo ?
existe outro método mais eficiente que esse, para busca em tabela ?
Desde ja agracedo!
Doni
Curtidas 0
Melhor post
Doni
05/09/2018
Só que no meu caso eu precisaria que essa querry efetuasse a busca em outros campos que não fossse somente o "nome", por isso eu acabei passando dois paramentros.
Pelo oque vc disse então, n teria como eu passar dois paramentros ?
Pelo oque vc disse então, n teria como eu passar dois paramentros ?
GOSTEI 1
Mais Respostas
Fabricio Kawata
04/09/2018
Fala Doni! Veja, da forma que está, você está passando dois valores string para a query. No final das contas, está havendo uma comparação entre strings ('nome' = 'doni'), o que sempre será avaliado como falso. O esperado é que você passe um valor para ser comparado com determinado campo da tabela (ex: nome = 'doni'). Para isso, o parâmetro "campo" não deve existir. A determinação do campo a ser usado no Where da SQL deve estar definido na própria instrução SQL. Segue um exemplo abaixo:
procedure Busca(campo:string);
begin
DM.qtester.Active :=false ;
DM.qtester.ParamByName('valor').Value := frmTabelaFuncionario.Edit1.Text;
DM.qtester.Active := true ;
frmTabelaFuncionario.gridExibeFuncionario.DataSource := DM.dsTester;
end;
select
codFuncionario,
nome,
idade,
cpf,
endereco,
numero,
cep,
telefone,
codSetor
from projetoestacionamento.funcionario
where
nome = :valor and
excluido <> 'e' order by (codFuncionario)
Espero que te ajude.
Forte abraço!
procedure Busca(campo:string);
begin
DM.qtester.Active :=false ;
DM.qtester.ParamByName('valor').Value := frmTabelaFuncionario.Edit1.Text;
DM.qtester.Active := true ;
frmTabelaFuncionario.gridExibeFuncionario.DataSource := DM.dsTester;
end;
select
codFuncionario,
nome,
idade,
cpf,
endereco,
numero,
cep,
telefone,
codSetor
from projetoestacionamento.funcionario
where
nome = :valor and
excluido <> 'e' order by (codFuncionario)
Espero que te ajude.
Forte abraço!
GOSTEI 0
Emerson Nascimento
04/09/2018
É isso mesmo que o Fabricio explicou. O campo precisa ser um literal; não pode ser uma string.
Para funcionar como você precisa, a instrução SQL deve ser montada em tempo de execução.
Algo assim:
Para funcionar como você precisa, a instrução SQL deve ser montada em tempo de execução.
Algo assim:
procedure Busca(campo:string);
begin
DM.qtester.Close;
// monta a instrução em tempo de execução
DM.qtester.SQL.Text :=
'select '+
'codFuncionario, nome, idade, '+
'cpf, endereco, numero, '+
'cep, telefone, codSetor '+
'from projetoestacionamento.funcionario '+
'where ' + campo + ' = :valor '+
'and excluido <> '''e''' '+
'order by (codFuncionario) ';
DM.qtester.ParamByName('valor').AsString := frmTabelaFuncionario.Edit1.Text;// RECEBE A INFORMAÇÃO DO VALOR DE COMPARAÇÃO
DM.qtester.Open;
frmTabelaFuncionario.gridExibeFuncionario.DataSource := DM.dsTester;// TABELA RECEBE A NOVA QUERY ADOTADA PARA EXIBIÇÃO
end;
GOSTEI 0
Doni
04/09/2018
Resolvi criando um meto, que contem um case, direcionado a cada itemIndex selecionado;
procedure Busca();
var
nn, valor:string;
begin
nn := 'n' ;
with dm.qPesqFuncionario do
begin
Close;
SQL.Clear;
// SQL.Add('select * from funcionario') ;
SQL.Add('select f.codFuncionario, f.nome, f.idade,f.cpf, f.endereco, f.numero, f.cep, f.telefone, f.codSetor, f.codcargo, f.excluido, c.descricao, s.descricao from funcionario f' );
SQL.Add('inner join setor s on f.codSetor = s.codSetor' );
SQL.Add('inner join cargo c on f.codCargo = c.codCargo' ) ;
case frmTabelaFuncionario.cbbTipoPesquisa.ItemIndex of
0:
begin
SQL.Add('where codFuncionario = :codigo' ) ;
ParamByName('codigo').Value := frmTabelaFuncionario.edtBuscaMask.Text;
end;
1:
begin
SQL.Add('where nome like :nome' ) ;
ParamByName('nome').Value := '%' + frmTabelaFuncionario.edtBuscaMask.Text + '%';
end;
2:
begin
SQL.Add('where idade = :idade' ) ;
ParamByName('idade').Value := frmTabelaFuncionario.edtBuscaMask.Text;
end;
3:
begin
SQL.Add('where cpf like :cpf' ) ;
ParamByName('cpf').Value := '%' + frmTabelaFuncionario.edtBuscaMask.Text + '%';
end;
4:
begin
SQL.Add('where endereco like :endereco' ) ;
ParamByName('endereco').Value := '%' + frmTabelaFuncionario.edtBuscaMask .Text + '%';
end;
5:
begin
SQL.Add('where cep like :cep' ) ;
ParamByName('cep').Value := '%' + frmTabelaFuncionario.edtBuscaMask .Text + '%';
end;
6:
begin
SQL.Add('where telefone like :telefone' ) ;
ParamByName('telefone').Value := '%' + frmTabelaFuncionario.edtBuscaMask.Text + '%';
end ;
7:
begin
SQL.Add('where c.descricao like :cargo' ) ;
ParamByName('cargo').Value := '%' + frmTabelaFuncionario.edtBuscaMask.Text + '%';
end;
8:
begin
SQL.Add('where s.descricao like :setor' ) ;
ParamByName('setor').Value := '%' + frmTabelaFuncionario.edtBuscaMask.Text + '%';
end;
end;
SQL.Add('and f.excluido = :n ') ;
ParamByName('n').Value := nn;
Open;
end;
frmTabelaFuncionario.gridExibeFuncionario.DataSource := DM.dsPesqFuncionario;
end;
GOSTEI 0