Array
(
)

Generic SQL Error

Lucianoiron
   - 24 nov 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...


Citação:

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


Marcio.theis
   - 25 nov 2005

Tente o seguinte:

#Código

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;



Emerson
   - 25 nov 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:

#Código

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;



Lucianoiron
   - 25 nov 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


Lucianoiron
   - 25 nov 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


Marcio.theis
   - 25 nov 2005

Passando parâmetros tente desta forma:

#Código

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;



Lucianoiron
   - 25 nov 2005

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


Emerson
   - 25 nov 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 /]/]@t 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.