Generic SQL Error
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...
...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
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
Curtidas 0
Respostas
Marcio.theis
24/11/2005
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;
GOSTEI 0
Emerson Nascimento
24/11/2005
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:
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].asstring := copy(localizar,1,60); end; open; end;
GOSTEI 0
Lucianoiron
24/11/2005
/]/]@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
GOSTEI 0
Lucianoiron
24/11/2005
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
GOSTEI 0
Marcio.theis
24/11/2005
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;
GOSTEI 0
Lucianoiron
24/11/2005
cara infelizmente não funcionou...mas eu agradeço mesmo assim...valeu
GOSTEI 0
Emerson Nascimento
24/11/2005
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.
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.
GOSTEI 0