quinta-feira, março 20, 2008

 

Mensagens obscuras - User Abort

No dia a dia da programação, muitas vezes nos deparamos com mensagens de erro que, se por um lado não nos informam o que está ocorrendo, por outro nos ajudam a ficar mais confusos do que já somos.

Uma destas mensagens ocorreu conosco aqui na empresa um dia desses. A mensagem é "User Abort" quando tentávamos gravar os dados de uma determinada tabela em um banco de dados Firebird (1.5) acessado através de uma TIBQuery ligada a um TIBUpdateSQL. Para quem não conhece, o TIBUpdateSQL é um componente utilizado para "transformar" uma query normal em uma tabela, dando a esta funcionalidades do tipo Append/Insert, Edit, Delete etc. O TIBUpdateSQL permite a criação de querys de Insert, Edit e Delete, facilitando bastante o trabalho com bancos de dados SQL (Existe um componente que une esta funcionalidade, chamado IBDataSet que, na minha opinião é bem superior ao conjunto TIBQuery + TIBUpdateSQL).

Como falei acima, o erro ocorria sempre que tentávamos gravar um registro. Um simples Edit seguido por um ApplyUpdates levantava a excessão. Depois de muito sofrimento, encontramos o causador da nossa dor de cabeça: Na SQL original do IBQuery, havia um join com outras tabelas. O problema é que estes campos estvam sendo atualizados no IBUpdateSQL. A dica, então fica a seguir:

Sempre que precisar utilizar um IBUpdateSQL, certifique-se de que os campos que serão atualizados não incluam campos vindos de outras tabelas. Se você estiver utilizando o TIBDataSet a mensagem retornada é bem mais explícita.

sexta-feira, março 14, 2008

 

Non-blob column in table required to perform operation

Depois de quase um ano, estou de volta para começar a escrever uma espécie de "diário" do que vem acontecendo comigo no meu dia-a-dia como desenvolvedor.

Hoje perdi aproximadamente umas duas horas tentando resolver um problema que, do nada, passou a acontecer em nosso sistema de frente de loja. Como o sistema é mantido por várias pessoas, nem sempre sabemos com exatidão tudo o que foi modificado, e um erro desses pode tirar a paciência de um cristão (tirou a minha...)

Bom... O sistema ainda utiliza o BDE em seus acessos aos dados no banco de dados Firebird e, de alguns dias para cá, passou a dar um erro no momento em que incluíamos um ítem do cupom de venda, com a mensagem "non-blob column in table required to perform operation". Este erro passou a acontecer da noite para o dia e não foi feita nenhuma modificação nos fontes que justificasse este acontecimento. Resolví então tentar o banco de dados. Peguei um banco de dados antigo e fiz os testes. Nenhum erro. Rodei um comparador de bases de dados e deixei a base antiga com a mesma estrutura do banco atualizado. Erro!

Após uma longa caminhada, atualizando o banco parte por parte, descobri onde estava o problema: um campo foi criado com a cláusula Default preenchida. Um simples campo flag, Varchar(1), com um default para 'N'. Não sei por que, o BDE estranhou o novo campo e simplesmente não permitia gravar nada na tabela. Após retirar o 'N', problema resolvido.

Espero que esta postagem possa lhe ajudar (isso se não ajudar a mim mesmo, vai que algum dia eu me esqueça...)

This page is powered by Blogger. Isn't yours?

Assinar Postagens [Atom]