Fórum Parâmetro em Querry DELPHI [como usar paramentros do tipo string?] [HELP] #596935

04/09/2018

0

Tenho tentado criar uma procedimento para busca dentro de um tabela de um banco;
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

Doni

Responder

Post mais votado

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 ?

Doni

Doni
Responder

Gostei + 1

Mais Posts

05/09/2018

Fabricio Kawata

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

Gostei + 0

05/09/2018

Emerson Nascimento

É 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:
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;
Responder

Gostei + 0

05/09/2018

Doni

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;
Responder

Gostei + 0

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

Aceitar