Campo Char e Firebird, Mistério? Por acontece isso?

Delphi

02/02/2007

Alô a todos!

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

Microbios

Curtidas 0

Respostas

Lab

Lab

02/02/2007

Dê uma olha no editor de campos e veja se a propriedade ReadOnly dos campos está como false.
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
Macario

Macario

02/02/2007

Olá.

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
Microbios

Microbios

02/02/2007

Lab.... está tudo correto com as propriedades Read Only.. Senão não alteraria outros Registros de outras pessoas... só ocorre isso quanto altero mesmo um campo char colocando-o como ´ ´ espaço vazio...
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...


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.


O campo é CHAR(1)... e a propriedade citada tanto como true ou false, ocorre o mesmo problema... :cry:


GOSTEI 0
Microbios

Microbios

02/02/2007

Ninguém sabe???????????? :shock: :( :cry:


GOSTEI 0
Cabelo

Cabelo

02/02/2007

Colega..

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
Microbios

Microbios

02/02/2007

Colega.. 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..


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
Titanius

Titanius

02/02/2007

Vai no evento OnREconcileError e digita isso:

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
Microbios

Microbios

02/02/2007

REALMENTE [b:1cbd84985f]TITANIUS[/b:1cbd84985f], você deu uma grande ajuda...

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
Lab

Lab

02/02/2007

Verifique se na instrução sql dos componentes de acesso vc especificou para o registro ser localizado através da chave primária


GOSTEI 0
Microbios

Microbios

02/02/2007

[b:c073ace763]LAB[/b:c073ace763]

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
Brasidata

Brasidata

02/02/2007

RECORD NOT FOUND OU CHANGED BY ANOTHER USER


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
Microbios

Microbios

02/02/2007

[b:c4c27faf61]Brasidata[/b:c4c27faf61]

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
Brasidata

Brasidata

02/02/2007

UNABLE TO FIND RECORD. NO KEY ESPECIFIED


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
POSTAR