Fórum Campo Char e Firebird, Mistério? Por acontece isso? #337201
02/02/2007
0
Em uma tabela no firebird (charset collat win1252) com alguns campos do tipo CHAR de tamanhos indo de 1 até 20 no máximo ocorre o seguinte problema:
A aplicação grava um valor ´S´ num campo char de tamanho 1 aplica-se o applyuptades(0) e tudo está perfeito. Temina-se a aplicação, retorna-se vai ao mesmo registro e no lugar do ´S´ grava-se um valor em branco, ex: ´ ´. aplica-se o applyupdades e termina a aplicação. Aí ocorre, que quando de tenta gravar no mesmo registro novamente nada é gravado mais na tabela. Como se o firebird ou o Delphi, bloqueasse esse registro como read only... Nem um campo, seja char ou varchar, integer ou outro tipo é mantida as alterações após tentar gravar o campo como ´ ´.
Por que isso acontece? Preciso resolver essa questão para continuar meu projeto. Alguém poderia explicar ou dar uma dica? Não posso gravar outro valor, por exemplo, no campo onde deveria ter um ´S´. Seria fácil assim. Mas os outros campos não aceitam alterações também. E AÍ? O QUE FAZER?
Uso DELPHI7, ZEOS 6.1.5 e Clientdataset
Um detalhe curioso:
A mesma aplicação acessando o MYSQL com uma tabela de mesma estrutra não ocorre este problema. O problema está só com o FIREBIRD!
Agradeço aos que me derem uma luz... tá bravo!!! :D
Microbios
Curtir tópico
+ 0Posts
02/02/2007
Lab
Tente iniciar uma transação manualmente fazer as alterações e usar o commit também manualmente.
Eu utilizo Firebird com MDO e ClientDataSet e não tenho problemas desse tipo, talvez, seria bom fazer outros testes para saber se os componentes Zeos estão funcionamendo perfeitamente.
Gostei + 0
02/02/2007
Macario
Este campo onde voce quer gravar ´S´ e ´ ´(espaço ou vazio) é Char(?) de quanto?
Verifique a propriedade DisableStringTrim do ClientDataSet está como false, tem por true.
[]´s
Gostei + 0
02/02/2007
Microbios
E sim. .os componentes estão funcionando ok.. Tanto que eu os estou utilizando com o MYSQL com mudança só no componente de CONEXÃO e tá funcionando 150¬ pra ser preciso.. o problema é o CHAR e o FIREBIRD! Vale Citar que é QUALQUER TAMANHO DE CAMPO CHAR... eu notei isso. Por der tamanho 1 a 20.. gravou ele como ´ ´ tá feito o problema... muito estranho, não acha? com o MYSQL não ocorre nem sombra disso...
O campo é CHAR(1)... e a propriedade citada tanto como true ou false, ocorre o mesmo problema... :cry:
Gostei + 0
05/02/2007
Microbios
Gostei + 0
05/02/2007
Cabelo
O campo na base de dados está setado para NOT NULL ???????
se tiver não vai gravar mesmo...
Senão, coloque o sql que você usa pra fazer a alteração..
Gostei + 0
05/02/2007
Microbios
Cabelo, meu chapa.. valeu mas [b:11bf6b6885]AINDA[/b:11bf6b6885] não é isso.. só há um campo setado como not null na tabela que é a chave primária que não é o campo que eu estou alterando... E, eu não tô usando SQL para alterar. Como disse, uso o clientdatset com ZeosDBO diretamente. As tabelas são de poucos registros e o programa é monousuário, então eu não vi razão para usar SQL. Valeu pela dica MAS AINDA CONTINUA O PROBLEMA. A propósito...
Se eu eliminar o CLIENTDATASET e usar diretamente na tabela, tudo fica jóia... não dá problema. Então, deduz-se que o Clientdataset ou o Datasetprovider estão gerando esse erro.. Já desabilitei as propriedade como o colega Macario disse e nada mudou.
Chiunfssssss..... :cry: :cry:
Gostei + 0
06/02/2007
Titanius
ShowMessage(E.Message);
e tenta novamente, o ClientDataSet, tem por padrão ´esconder´ seus erros, assim você exibirá caso esteja ocorrendo... o que me leva nesta conclusão, já que tudo está correto.
[]s
Gostei + 0
06/02/2007
Microbios
A mensagem que ocorreu foi:
[b:1cbd84985f]RECORD NOT FOUND OU CHANGED BY ANOTHER USER[/b:1cbd84985f]
Pelo menos agora eu tenho algum retorno do que ocorre, o problema é que não sei como RESOLVER ISSO... no meu modo de ver... está tudo correto com a aplicação... tanto, que usada com o MYSQL não tem esse problema... E agora? O QUE EU FAÇO? :roll:
Gostei + 0
07/02/2007
Lab
Gostei + 0
07/02/2007
Microbios
Como eu já havia dito.. não há instrução SQL neste projeto por terem muito poucos registros... é tudo feito diretamente no banco. Só usei o clientdataset para utilizar alguns recursos do mesmo. E em tempo.... a APLICAÇÂO RODANDO SOB [b:c073ace763][color=red:c073ace763]MYSQL[/color:c073ace763][/b:c073ace763] não DÀ ESSE PROBLEMA... a estrutra é igualzinha a do FIREBIRD, índices, nomes e tamanhos e campos.. tipos, inclusive!!!
Obrigado pela ajuda amigo, mas ainda persiste o erro.
P.S: Engraçado é que este campo faz parte de uma chave de índice.. .teria algo haver???? Deixá-lo em branco?
Gostei + 0
07/02/2007
Brasidata
Baseado na mensagem de erro acima, gostaria de fazer uma pequena sugestão somente a título de teste, sem pretensão de solucionar o problema ainda:
Vá até o seu ClientDataSet (duplo clique) selecione TODOS os campos que estão causando o erro e vá ao object Inspector. Acesse a propriedade ProviderFlags e mude a opção ´pfInWhere´ para [b:89c169a0ff]FALSE[/b:89c169a0ff].
Agora selecione o campo chave da tabela (desde que ele não seja do tipo char, que está dando problema) e na mesma propriedade (ProviderFlags) mude para [b:89c169a0ff]TRUE[/b:89c169a0ff] a opção ´[b:89c169a0ff]pfInKey[/b:89c169a0ff]´.
Depois, vá ao [b:89c169a0ff]DataSetProvider[/b:89c169a0ff] e mude a propriedade ´UpdateMode´para ´[b:89c169a0ff]UpWhereKeyOnly[/b:89c169a0ff]´.
Teste novamente a inclusão do registro.
Abraços e bom trabalho.
Gostei + 0
08/02/2007
Microbios
Feito sua sugestão.. as opções no clientdataset estavam como você sugeriu, apenas mudei a do DataSetProvider.. e... gerou um novo erro, como segue:
[b:c4c27faf61]UNABLE TO FIND RECORD. NO KEY ESPECIFIED[/b:c4c27faf61]
Já que é assim.. [b:c4c27faf61]eu ofereço o BANCO DE DADOS + a aplicação do jeito que está pra quem quiser olhar e testar.... [/b:c4c27faf61] Não tá dando pra entender... Se no MySQL funciona perfeitamente com os mesmíssimos componentes. Só foi mudado no componente de acesso ao BD as propriedades necessárias para acessar o MySQL... de resto.. tudo igual.
Valeu pela sugestão... o dilema persiste... parece até novela mexicana! :cry: [/b]
Gostei + 0
09/02/2007
Brasidata
Este erro acontece quando não é determinado o campo chave no Provider Flags. Confira se o [b:ab9b91c295]pfInKey[/b:ab9b91c295] do ProviderFlags de TODOS os campos CHAVE está marcado como [b:ab9b91c295]TRUE[/b:ab9b91c295].
Só não vou me oferecer para analizar o seu código por absoluta falta de tempo, por usar o BDS2006 e por não trabalhar com o ZEOS. Mas se eu lembrar de qualquer outra dica que possa ajudar volto a postar aqui.
Abraço e boa sorte.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)