| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 12:06 pm Assunto: Duvida em função delphi |
|
|
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 |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Abr 13, 2017 1:48 pm Assunto: |
|
|
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 |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 3:01 pm Assunto: |
|
|
| 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 |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Abr 13, 2017 3:22 pm Assunto: |
|
|
| 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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Abr 13, 2017 4:02 pm Assunto: |
|
|
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 |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 4:26 pm Assunto: |
|
|
| 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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Abr 13, 2017 4:39 pm Assunto: |
|
|
| 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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Abr 13, 2017 4:41 pm Assunto: |
|
|
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 |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Qui Abr 13, 2017 5:23 pm Assunto: |
|
|
| 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 |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Abr 13, 2017 5:42 pm Assunto: |
|
|
já tentou debugar para descobrir qual linha está disparando o access violation?
pelo que vi não é nada na função |
|
| Voltar ao Topo |
|
 |
iammedeiros Novato

Registrado: Segunda-Feira, 10 de Abril de 2017 Mensagens: 31
|
Enviada: Sex Abr 14, 2017 9:41 am Assunto: |
|
|
| 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 |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Seg Abr 17, 2017 8:50 am Assunto: |
|
|
| 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 |
|
 |
|