Campo Char e Firebird, Mistério? Por acontece isso?
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
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
Curtidas 0
Respostas
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.
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
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
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
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...
O campo é CHAR(1)... e a propriedade citada tanto como true ou false, ocorre o mesmo problema... :cry:
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
02/02/2007
Ninguém sabe???????????? :shock: :( :cry:
GOSTEI 0
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..
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
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
02/02/2007
Vai no evento OnREconcileError e digita isso:
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
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
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:
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
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
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?
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
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
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]
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
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