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 

Query não funciona usando parametros da funcao.

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


Registrado: Quarta-Feira, 29 de Outubro de 2014
Mensagens: 9

MensagemEnviada: Qua Out 29, 2014 2:37 pm    Assunto: Query não funciona usando parametros da funcao. Responder com Citação

Fala galera, então, veja essa função que estou usando:

Código:
function FindTurma(Nomenclatura: WideString; Ano: Integer): Integer;
var
  Q: TUniQuery;
begin

  Q := TUniQuery.Create(nil);
  CriarConexao(Q);
  Q.SQL.Add('select codigo from public.turmas where trim(nomenclatura) = ');
  Q.SQL.Add(' :nomenclatura and ano = :ano and (ativo); ');

  Q.ParamByName('nomenclatura').AsWideString := '11B';
  Q.ParamByName('ano').AsInteger := 2014;

  Q.Open;
  if Q.RecordCount > 0 then
    Result := Q.FieldByName('codigo').AsInteger
  else
    Result := 0;
  Q.Close;
  FreeAndNil(Q);

end;


Se vocês notarem os parâmetros, coloquei no braço, mas a intenção da função, não é essa, é usar os parametros recebidos por ela, no caso nomenclatura e ano, mas ao trocar:

Código:
  Q.ParamByName('nomenclatura').AsWideString := '11B';
  Q.ParamByName('ano').AsInteger := 2014;


para:

Código:
  Q.ParamByName('nomenclatura').AsWideString := Nomenclatura;
  Q.ParamByName('ano').AsInteger := Ano;


Eu tenho um erro, o Aplicativo simplesmente para de funcionar... O Que pode ser?

Abcs!
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: Qua Out 29, 2014 2:57 pm    Assunto: Responder com Citação

Aparece alguma mensagem de erro? Qual?

Já debugou a função para saber onde o erro acontece?
_________________
''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
kustela
Novato
Novato


Registrado: Quarta-Feira, 29 de Outubro de 2014
Mensagens: 9

MensagemEnviada: Qua Out 29, 2014 3:18 pm    Assunto: Responder com Citação

A funcao dá erro exatamente no Q.Open;

Por incrivel que pareça, já debuguei de tudo quanto é jeito, mesmo os parametros chegando exatamente iguais a esses, dá erro.

E no try except, o E.Message sai em branco, e estoura a memória, não sei porque :/

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: Qua Out 29, 2014 3:29 pm    Assunto: Responder com Citação

Não conheço este tipo de Query (Uniquery) mas creio que seja da mesma maneira que outros tipos de Query.

Esta linha do seu código:

Código:

CriarConexao(Q);


Está criando a conexão com o SQLConnection (ou equivalente) ?

Veja um exemplo de criação de Query em runtime:

Código:

Procedure ExecuteSql(LocalConnect: TSQLConnection; cSql : String);
var
  Qry : TSQLQuery;
begin
  Qry:=TSQLQuery.Create(nil); //cria uma instância do objeto
  try
    Qry.SQLConnection:=LocalConnect;  //componente de conexão
    Qry.SQL.Add(cSql);
    Qry.ExecSQL;
  finally
    FreeAndNil(Qry);  //tira o objeto da memória
  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
kustela
Novato
Novato


Registrado: Quarta-Feira, 29 de Outubro de 2014
Mensagens: 9

MensagemEnviada: Qua Out 29, 2014 3:41 pm    Assunto: Responder com Citação

Exato, uniquery é o mesmo das querys comuns, funciona da mesma maneira.

E Sim, a função de conexão está ok, tanto que funciona normalmente caso não sejam utilizados os parametros da funcao.

Aí que está... será que há algum impedimento expecifico em usar os parametros na query? Pior que deve ter a ver com algo novo do XE7, pois antes de migrar no XE4 funcionava, mas agora no XE7 não, e no XE4 parou agora também... eita sacola!
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: Qua Out 29, 2014 4:26 pm    Assunto: Responder com Citação

Experimente especificar o tipo do parâmetro antes de alimentá-lo.

Exemplo:

Código:

Q.ParamByName('nomenclatura').DataType:= ftWideString;
Q.ParamByName('nomenclatura').Value := Nomenclatura;

Q.ParamByName('ano').DataType:= ftInteger;
Q.ParamByName('ano').Value := Ano;


Outra coisa, tem um ';' (ponto e vírgula) no final do SQL que não é necessário retire-o para testar.

Nesta linha:

Código:

 Q.SQL.Add(' :nomenclatura and ano = :ano and (ativo); ');

_________________
''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
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Out 29, 2014 6:59 pm    Assunto: Responder com Citação

Tente assim para ver se dá certo, visto que você colocou em um campo a tabela "public":

Código:
function FindTurma(Nomenclatura: WideString; Ano: Integer): Integer;
var
  Q: TUniQuery;
begin

  Q := TUniQuery.Create(nil);
  CriarConexao(Q);
  Q.SQL.Add('select public.codigo from public.turmas where trim(public.nomenclatura) = ');
  Q.SQL.Add(' :nomenclatura and public.ano = :ano and (public.ativo); ');

  Q.ParamByName('nomenclatura').AsWideString := '11B';
  Q.ParamByName('ano').AsInteger := 2014;

  Q.Open;
  if Q.RecordCount > 0 then
    Result := Q.FieldByName('codigo').AsInteger
  else
    Result := 0;
  Q.Close;
  FreeAndNil(Q);

end;




bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
kustela
Novato
Novato


Registrado: Quarta-Feira, 29 de Outubro de 2014
Mensagens: 9

MensagemEnviada: Qui Out 30, 2014 7:17 am    Assunto: Responder com Citação

Galera, nenhuma das opções funcionou.

Tirei o ponto e virgula, mas isso era independente. (Mas não ajudou)

Tentei definir o tipo do parametro antes de alimenta-lo, também não ajudou.

Sobre os publics, não posso fazer aquilo, pois iria estragar minha query, o public é o schema e a tabela turmas pertence a ele, os campos teriam que ser turmas.codigo, não public.codigo senão dá pal.

A busca continua.... Question Surprised Question
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 Out 30, 2014 11:21 am    Assunto: Responder com Citação

Já que com parâmetro não funcionou de jeito nenhum,
Experimente concatenar a string com QuotedStr e alterar o tipo do parametro da função nomenclatura para "String".

Código:

function FindTurma(Nomenclatura: String; Ano: Integer): Integer;
var
  Q: TUniQuery;
begin
  Try
  Begin
  Q := TUniQuery.Create(nil);
  CriarConexao(Q);
  Q.SQL.Add('select codigo from public.turmas ');
  Q.SQL.Add('where nomenclatura = ' + QuotedStr(Nomenclatura));
  Q.SQL.Add(' and ano = ' + QuotedStr(IntToStr(Ano)) + 'and (ativo)');
  Q.Open;

  if Q.RecordCount > 0 then
    Result := Q.FieldByName('codigo').AsInteger
  else
    Result := 0;

  Q.Close;
  End;
  Finally
  FreeAndNil(Q);
  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
kustela
Novato
Novato


Registrado: Quarta-Feira, 29 de Outubro de 2014
Mensagens: 9

MensagemEnviada: Qui Out 30, 2014 12:55 pm    Assunto: Responder com Citação

Bom, desisti no final das contas gente, não descobri o que era, mas resolvi...

Resolução:

Copiei todos os componentes do formulário que continha a função, colei em outro formulário, e tcham, voltou a funcionar, MILAGRE!

Coisas do delphi e dos computadores.
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