Generic SQL Error

24/11/2005

Olá pessoal tudo bem com vcs?...
eu estou com um probleminha aqui e não estou conseguindo resolver...é o seguinte...eu tenho uma consulta onde eu utilizo um dbgrid, uma edit, uma query e um dtsource...eu criei uma procedure que é a seguinte...

with Query do begin close; sql.clear; sql.add(´select * from itens ´); if edit1.text <> ´´ then begin sql.add(´ where (upper(itensdesc) like :param)´); Params[0].asstring:=´¬´+uppercase(edit1.text)+´¬´; end; open; end;


...o tamanho do campo itensdesc na tabela itens é definido como 60...e qdo eu executo este comando e o lenght do edit1 é 59 a aplicação me retorna o seguinte erro :

´Generic SQL Error´
´arithmetic exception, numeric overflow, or string truncation´

como eu posso resolver este problema

PS : estou usando Interbase e bde para conectá-lo

Desde já agradeço


Lucianoiron

Respostas

25/11/2005

Marcio.theis

Tente o seguinte:

with Query do
    begin
    close;
    sql.clear; sql.add(´select * from itens´);
    if edit1.text <> ´´ then
        sql.add(´where (upper(itensdesc) like ´´¬´ + uppercase(edit1.text) + ´¬´´´);
    open;
    end;



Responder Citar

25/11/2005

Emerson

esse erro acontece se você preencher pelo menos 59 posições do edit.
porque?
porque o edit tem 59 posições... mais os 2 caracteres ´¬´ que você colocou na passagem do parâmetro: total de 61 caracteres, estourando a capacidade do campo, que é de 60.
sugiro que você faça uma pequena alteração na passagem do parâmetro:

with Query do
begin 
  close;
  sql.clear;
  sql.add(´select * from itens ´);
  if edit1.text <> ´´ then
  begin
    sql.add(´ where upper(itensdesc) like :param´);
    localizar := uppercase(edit1.text)+´¬´;
    if length(localizar) < 60 then
      localizar := ´¬´+localizar;
    Params[0&93;.asstring := copy(localizar,1,60);
  end; 
  open; 
end;



Responder Citar

25/11/2005

Lucianoiron

/]/]@t e emerson.en valeu pelas respostas....eu modifiquei o código a partir da dica do /]/]@t e funcionou perfeitamente...valeu ae moçada


Responder Citar

25/11/2005

Lucianoiron

depois de ter alterado o código eu estive pensando...tem lógica isso?...funcionar sem problemas não usando o parametro e dar pau quando uso o parametro...depois da aleteração eu posso digitar mais que 60 caracteres na edit que ele não da pau se algumar santa alma puder me explicar isso eu agradeço ou sera que existe alguma forma de aumentar a a capacidade do parametro eu tentei setar a propriedade size do param com 70 por exemplo e não funcionou...isso está me entrigando hehehehehehe :roll: :roll: :? :? :P :P


Responder Citar

25/11/2005

Marcio.theis

Passando parâmetros tente desta forma:

with Query do
    begin
    close;
    sql.clear; sql.add(´select * from itens´);
    if edit1.text <> ´´ then
        begin
        sql.add(´where (upper(itensdesc) like :Param´);
        Parameters.ParamByName(´Descricao´).Value:=´¬´+uppercase(edit1.text)+´¬´;
        end;
    open;
    end;



Responder Citar

25/11/2005

Lucianoiron

cara infelizmente não funcionou...mas eu agradeço mesmo assim...valeu


Responder Citar

25/11/2005

Emerson

tentando explicar sua intriga...

quando você cria parâmetros, o dataset deve varrer sua lista de TFields ou o seu banco de dados à procura do campo referenciado no parâmetro, para poder saber o tipo do campo, o tamanho, etc, afim de poder montar a instrução correta para o banco de dados (a instrução é ´montada´ pelo dataset e só depois enviada ao banco da dados). aí está o problema: nesse caso, ele encontrou um campo com tamanho 60 e percebeu que você está passando um valor maior que 60...
mas essa é uma característica do dataset, não do SGBD (como você mesmo pôde perceber).

quando você passa a intrução como o [b:fa8795f570]/]/]@t[/b:fa8795f570] sugeriu, não há parâmetros. a instrução não precisa ser ´montada´ pelo dataset. ela será passada da forma que foi digitada e, como o banco de dados não possui aquela, digamos, limitação, a instrução é executada sem problema.


Responder Citar