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

Registrado: Quarta-Feira, 29 de Outubro de 2014 Mensagens: 9
|
Enviada: Qua Out 29, 2014 2:37 pm Assunto: Query não funciona usando parametros da funcao. |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Out 29, 2014 2:57 pm Assunto: |
|
|
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 |
|
 |
kustela Novato

Registrado: Quarta-Feira, 29 de Outubro de 2014 Mensagens: 9
|
Enviada: Qua Out 29, 2014 3:18 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Out 29, 2014 3:29 pm Assunto: |
|
|
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:
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 |
|
 |
kustela Novato

Registrado: Quarta-Feira, 29 de Outubro de 2014 Mensagens: 9
|
Enviada: Qua Out 29, 2014 3:41 pm Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Out 29, 2014 4:26 pm Assunto: |
|
|
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Out 29, 2014 6:59 pm Assunto: |
|
|
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 |
|
 |
kustela Novato

Registrado: Quarta-Feira, 29 de Outubro de 2014 Mensagens: 9
|
Enviada: Qui Out 30, 2014 7:17 am Assunto: |
|
|
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....  |
|
| Voltar ao Topo |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Out 30, 2014 11:21 am Assunto: |
|
|
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 |
|
 |
kustela Novato

Registrado: Quarta-Feira, 29 de Outubro de 2014 Mensagens: 9
|
Enviada: Qui Out 30, 2014 12:55 pm Assunto: |
|
|
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 |
|
 |
|