ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Duvida em função delphi

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
iammedeiros
Novato
Novato


Registrado: Segunda-Feira, 10 de Abril de 2017
Mensagens: 31

MensagemEnviada: Qui Abr 13, 2017 12:06 pm    Assunto: Duvida em função delphi Responder com Citação

Bom pessoal gostaria de implementar uma função para pesquisar no db e fiz o seguinte código, porém não está funcionando, gostaria de saber como fazer funcionar e retornar a consulta, segue o código:
Código:

function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
    var query : TSQLQuery;
    var cdsConsulta : TClientDataSet;
  begin
    query := TSQlQuery.Create(nil);
    try
      query.SQLConnection := dmDados.ConexaoDB;
      query.SQL.Add('SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%'));
      query.Params[0].Value := valor;
      query.Open;
      cdsConsulta := result;
    finally
      query.Close;
      query.Free;
    end;
  end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Abr 13, 2017 1:48 pm    Assunto: Responder com Citação

Tente assim:

Código:
function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
  var
   query : TSQLQuery;
   cdsConsulta : TClientDataSet;
begin
  query := TSQlQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.SQL.Add('SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%'));
    query.Params[0].Value := valor;
    query.Open;
    result := cdsConsulta;
  finally
    query.Close;
    query.Free;
  end;
end;


no resultado, você estava invertendo a linha e atribuindo o resultado ao cdsConsulta ao invés de atribuir o cdsConsulta ao resultado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
iammedeiros
Novato
Novato


Registrado: Segunda-Feira, 10 de Abril de 2017
Mensagens: 31

MensagemEnviada: Qui Abr 13, 2017 3:01 pm    Assunto: Responder com Citação

leo_cj escreveu:
Tente assim:

Código:
function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
  var
   query : TSQLQuery;
   cdsConsulta : TClientDataSet;
begin
  query := TSQlQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.SQL.Add('SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%'));
    query.Params[0].Value := valor;
    query.Open;
    result := cdsConsulta;
  finally
    query.Close;
    query.Free;
  end;
end;


no resultado, você estava invertendo a linha e atribuindo o resultado ao cdsConsulta ao invés de atribuir o cdsConsulta ao resultado



Hmm, entendi cara, mas eu fiz como vc falou mas continua dando o mesmo erro: argument out of range.

Estou usando o seguinte código para chama-la:
Código:

dsTabela.DataSet := GetConsulta('usuarios', 'login', edtPesquisar.Text);


dsTabela é o datasource que alimenta meu DBGrid.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Abr 13, 2017 3:22 pm    Assunto: Responder com Citação

Não sei se o TSQLQuery cria automaticamente o parâmetro quando você cria o sql da query em tempo de execução, verifique se o parâmetro está sendo criado na query
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Abr 13, 2017 4:02 pm    Assunto: Responder com Citação

Pelo que vi seu SQL não utiliza parâmetros, ou seja, você já está passando o valor direto para o SQL.

Faça um teste removendo a linha que alimenta o parâmetro:
Código:
query.Params[0].Value := valor;

Teste assim:

Código:
function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
  var
   query : TSQLQuery;
   cdsConsulta : TClientDataSet;
begin
  query := TSQlQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.Close;   
    query.SQL.Text:= 'SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%');   
    query.Open;
    result := cdsConsulta;
  finally
    query.Close;
    query.Free;
  end;
end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
iammedeiros
Novato
Novato


Registrado: Segunda-Feira, 10 de Abril de 2017
Mensagens: 31

MensagemEnviada: Qui Abr 13, 2017 4:26 pm    Assunto: Responder com Citação

natanbh1 escreveu:
Pelo que vi seu SQL não utiliza parâmetros, ou seja, você já está passando o valor direto para o SQL.

Faça um teste removendo a linha que alimenta o parâmetro:
Código:
query.Params[0].Value := valor;

Teste assim:

Código:
function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
  var
   query : TSQLQuery;
   cdsConsulta : TClientDataSet;
begin
  query := TSQlQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.Close;   
    query.SQL.Text:= 'SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%');   
    query.Open;
    result := cdsConsulta;
  finally
    query.Close;
    query.Free;
  end;
end;


Ola Natan, fiz exatamente como vc postou, mas agora ta dando outro erro: Access violation at andress 0066A5BF in module 'Sistema_Financas.exe'. Read of at andress 000F051E.

Ta complicado por que ja tentei fazer está pesquisa de duas maneiras e todas dão erro e não consegui resolver, antes eu tava tentando fazer direto no evento click do botão filtrar do meu form com o código:
Código:

dmDados.cdsUsuarios.Close;
  case cbFiltros.ItemIndex of
    0 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE NOME LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
    1 : dmDados.cdsUsuarios.CommandText := 'SELECT * FROM USUARIOS WHERE LOGIN LIKE ' + QuotedStr('%' + edtPesquisar.Text + '%');
  end;
  dmDados.cdsUsuarios.Open


Mas assim dava erro dizendo que não podia realizar a operação em um dataset aberto, mas reparem no close e open antes e depois de executar o comando, fiz até um topico aqui pra resolver, mas não obtive exito, daí então tentei fazer desse outro jeito ai, mas tbm ñ funcionou, tô pesado msm kkk.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Abr 13, 2017 4:39 pm    Assunto: Responder com Citação

Código:
function GetConsulta(tabela, campo, valor : string) : TClientDataSet;
  var
   query : TSQLQuery;
   cdsConsulta : TClientDataSet; //<-- seu cdsConsulta não foi instanciado
begin
  query := TSQlQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.Close;   
    query.SQL.Text:= 'SELECT * FROM '+tabela+' WHERE '+campo+' LIKE '+QuotedStr('%'+valor+'%');   
    query.Open;
    result := cdsConsulta; // <-- passando referencia nula para result da function GetConsulta
  finally
    query.Close;
    query.Free;
  end;
end;



cdsConsulta : TClientDataSet; --> para que precisa de um cds e não vai fazer absolutamente nada com ele

acredito que você precise passar algo da query para este cds, claro antes vai precisar instanciar-lo primeiro isso se o TClientDataSet for uma classe.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Abr 13, 2017 4:41 pm    Assunto: Responder com Citação

O Access Violation acontece quando você tenta acessar algo que ainda não foi criado/instanciado, ou seja, ainda não está na memória.

Suspeito que aconteça nesta linha:

Código:
result := cdsConsulta;


O cdsConsulta não foi criado/instanciado e você tentou acessá-lo.

Faça um teste alterando sua função removendo o cdsConsulta e retornando uma Query ao invés de ClientDataSet.

Código:
function GetConsulta(tabela, campo, valor: string): TSQLQuery;
var
  query: TSQLQuery;
begin
  query := TSQLQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.Close;
    query.SQL.Text := 'SELECT * FROM ' + tabela + ' WHERE ' + campo + ' LIKE ' +
      QuotedStr('%' + valor + '%');
    query.Open;

    result := query;
  finally
    query.Close;
    query.Free;
  end;
end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
iammedeiros
Novato
Novato


Registrado: Segunda-Feira, 10 de Abril de 2017
Mensagens: 31

MensagemEnviada: Qui Abr 13, 2017 5:23 pm    Assunto: Responder com Citação

natanbh1 escreveu:
O Access Violation acontece quando você tenta acessar algo que ainda não foi criado/instanciado, ou seja, ainda não está na memória.

Suspeito que aconteça nesta linha:

Código:
result := cdsConsulta;


O cdsConsulta não foi criado/instanciado e você tentou acessá-lo.

Faça um teste alterando sua função removendo o cdsConsulta e retornando uma Query ao invés de ClientDataSet.

Código:
function GetConsulta(tabela, campo, valor: string): TSQLQuery;
var
  query: TSQLQuery;
begin
  query := TSQLQuery.Create(nil);
  try
    query.SQLConnection := dmDados.ConexaoDB;
    query.Close;
    query.SQL.Text := 'SELECT * FROM ' + tabela + ' WHERE ' + campo + ' LIKE ' +
      QuotedStr('%' + valor + '%');
    query.Open;

    result := query;
  finally
    query.Close;
    query.Free;
  end;
end;


Deu Access violation novamente. Será que estou chamando a função corretamente no meu form com o código abaixo:
Código:
dsTabela.DataSet := GetConsulta('usuarios', 'nome', edtPesquisar.Text);


dsTabela é o DataSource que está ligado ao meu DBGrid.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Abr 13, 2017 5:42 pm    Assunto: Responder com Citação

já tentou debugar para descobrir qual linha está disparando o access violation?

pelo que vi não é nada na função
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
iammedeiros
Novato
Novato


Registrado: Segunda-Feira, 10 de Abril de 2017
Mensagens: 31

MensagemEnviada: Sex Abr 14, 2017 9:41 am    Assunto: Responder com Citação

leo_cj escreveu:
já tentou debugar para descobrir qual linha está disparando o access violation?

pelo que vi não é nada na função


Depurei aqui, e o access violation é disparado quando chega na linha do end da função, depois marca a linha do end do evento do meu botão que está chamando a função.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Abr 17, 2017 8:50 am    Assunto: Responder com Citação

logo após sair do end, o sistema deve estar passando por algum outro procedimento que está ocasionando o erro, experimente ir debugando utilizando o F7 ao invés do F8, ele faz com que o debug entre em outros métodos quando os mesmos são chamados
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB