DBMemo Vazio - Erro de Gravação - ApplyUpdates
Olá,
Meu aplicativo está apresentando a mensagem de erro "Project xxxx raised exception class 'EAccessViolation' with message 'Access violation at address 004023d2 in module xxxx. Read of address FFFFFFFC.
Isto ocorre sempre que, depois de um Edit ou Insert, tento gravar o registro (ApplyUpdates) e o campo DBMemo (ligado a um campo Blob sub_type 1, Firebird 1.5, DBExpress, Delphi7) está vazio. Isto não ocorre quando o DBMemo contém algum texto.
O erro ocorre em if DM.ClientDataSet1.ApplyUpdates(0) <> 0 then
procedure TfrmForm.BtnGravarClick(Sender: TObject);
begin
if DM.ClientDataSet1.State in [dsEdit, dsInsert] then
begin
DM.ClientDataSet1.Post;
if DM.ClientDataSet1.ApplyUpdates(0) <> 0 then
DM.ClientDataSet1.CancelUpdates;
end;
end;
Meu aplicativo está apresentando a mensagem de erro "Project xxxx raised exception class 'EAccessViolation' with message 'Access violation at address 004023d2 in module xxxx. Read of address FFFFFFFC.
Isto ocorre sempre que, depois de um Edit ou Insert, tento gravar o registro (ApplyUpdates) e o campo DBMemo (ligado a um campo Blob sub_type 1, Firebird 1.5, DBExpress, Delphi7) está vazio. Isto não ocorre quando o DBMemo contém algum texto.
O erro ocorre em if DM.ClientDataSet1.ApplyUpdates(0) <> 0 then
procedure TfrmForm.BtnGravarClick(Sender: TObject);
begin
if DM.ClientDataSet1.State in [dsEdit, dsInsert] then
begin
DM.ClientDataSet1.Post;
if DM.ClientDataSet1.ApplyUpdates(0) <> 0 then
DM.ClientDataSet1.CancelUpdates;
end;
end;
Francisco Rodrigues
Curtidas 0
Respostas
Wesley Yamazack
14/05/2010
Olá amigo,
Recomendo primeiramente você isolar o problema, crie uma nova aplicação logo em seguida coloque o datamodule e seus componentes que serão utilizado para esta tela, depois faça um formulário e simule este erro novamente. Pois o Access Violation, só ocorre quando você quer acessar um objeto que não esta criado, ou que ja foi destruído. Faça o exemplo sumule o erro, e se possível me mande para poder baixar e analisar achando assim uma solução.
Att,
Wesley Y
Recomendo primeiramente você isolar o problema, crie uma nova aplicação logo em seguida coloque o datamodule e seus componentes que serão utilizado para esta tela, depois faça um formulário e simule este erro novamente. Pois o Access Violation, só ocorre quando você quer acessar um objeto que não esta criado, ou que ja foi destruído. Faça o exemplo sumule o erro, e se possível me mande para poder baixar e analisar achando assim uma solução.
Att,
Wesley Y
GOSTEI 0
Wesley Yamazack
14/05/2010
Olá amigo,
Conseguiu isolar o problema ?
Att,
Wesley Y
Conseguiu isolar o problema ?
Att,
Wesley Y
GOSTEI 0
Francisco Rodrigues
14/05/2010
Olá, Wesley Yamazack.
Obrigado pela atenção e, desculpe-me pela demora em responder.
Refiz a o formulário na tentativa de isolar o erro, conforme sua orientação, e descobri o seguinte:
1) O erro ocorre somente quando o DBMemo está vazio, sem nenhum texto. Se eu digitar pelo menos um espaço, o erro não ocorre;
2) Troquei o DBMemo por um DBRichText - O erro não ocorre;
3) Retirei o DBMemo do formulário - O erro não ocorre;
Mas, preciso usar o DBMemo (texto simples) para observações que, nem sempre existirão. Sei que eu poderia incluir, por exemplo, um espaço entes de gravar, mas, não queria adotar este tipo de solução.
Wesley, apesar de eu ter alguma experiência em programação (já fiz muita coisa em clipper) este é o primeiro programa que estou fazendo em Delphi - uma espécie de estudo de um modelo - e confesso que estou apanhando muito, principalmente, quando aparecem erros assim, que parecem não terem solução, talvez pela minha falta de experiência.
Estou enviando o programa, se é que se pode chamar assim, para você olhar e, ficarei muitíssimo grato se você fizer comentários a respeito da forma como estou fazendo-no. Estou no caminho certo? Você faria determinada rotina do jeito que foi feita? Fique a vontade para criticar. Suas críticas serão de grande ajuda.
Um abraço,
Francisco Rodrigues
Macapá-Amapá
GOSTEI 0
Wesley Yamazack
14/05/2010
Olá amigo,
Me diga uma coisa, qual é o tipo do campo no Firebird ? Você colocou como varchar ? Senão mude ele para Varchar com o tamanho desejado 400 por exemplo. Depois de mudar no banco você deve atualizar os Fields do ClientDataSet e do SQLDataSet, veja o procedimento :
1 - Desconectar o SQLConnection ou a conexão que você tenha.
2 - Excluir o campo observacao do SQL
3 - Ativar o SQL
4 - Adicionar o campo observacao
5 - Remover o campo de observacao o ClientDataSet
6 - Adicionar o campo de Observacao no ClientDataSet.
Quanto ao programa me mande o local onde esta o mesmo, pois você não enviou :D. Faço os comentários com maior prazer.
Um abraço
Wesley Y
Me diga uma coisa, qual é o tipo do campo no Firebird ? Você colocou como varchar ? Senão mude ele para Varchar com o tamanho desejado 400 por exemplo. Depois de mudar no banco você deve atualizar os Fields do ClientDataSet e do SQLDataSet, veja o procedimento :
1 - Desconectar o SQLConnection ou a conexão que você tenha.
2 - Excluir o campo observacao do SQL
3 - Ativar o SQL
4 - Adicionar o campo observacao
5 - Remover o campo de observacao o ClientDataSet
6 - Adicionar o campo de Observacao no ClientDataSet.
Quanto ao programa me mande o local onde esta o mesmo, pois você não enviou :D. Faço os comentários com maior prazer.
Um abraço
Wesley Y
GOSTEI 0
Francisco Rodrigues
14/05/2010
Oi, Wesley.
O campo: observacao Blob Sub_Type 1. Qunto a aplicação, utilizei File Upload. Tem outra forma de enviar?
Grato,
GOSTEI 0
Wesley Yamazack
14/05/2010
O campo observação, se você botar varchar, que é como eu uso, funciona perfeitamente, faça esta alteração.
Preciso do link para baixo o programa, me envie o link do arquivo para download.
Um abraço
Wesley Y
Preciso do link para baixo o programa, me envie o link do arquivo para download.
Um abraço
Wesley Y
GOSTEI 0
Francisco Rodrigues
14/05/2010
Wesley,
Estou tentando enviar o programa através FILE UPLOAD mas dá o seguinte erro: Arquivo de imagem invalido. Seu IP e login foram salvos no log do servidor. Tem outra forma de enviar o arquivo?
GOSTEI 0
Devmedia
14/05/2010
Francisco,
para enviar um arquivo para o consultor, vc deve utilizar a opção "meu disco virtual", localizado na home do suporte. Lá você pode enviar arquivos, desde que os mesmos estejam com a extensão .rar ou .zip.
Caso tenha dúvidas de como funciona o disco virtual, ao lado da opção existe um link para o video explicativo.
para enviar um arquivo para o consultor, vc deve utilizar a opção "meu disco virtual", localizado na home do suporte. Lá você pode enviar arquivos, desde que os mesmos estejam com a extensão .rar ou .zip.
Caso tenha dúvidas de como funciona o disco virtual, ao lado da opção existe um link para o video explicativo.
GOSTEI 0
Francisco Rodrigues
14/05/2010
Oi, Wesley...
Estou fazendo as alterações que você sugeriu. Acredito que vai dar tudo certo. Obrigado.
Eu não consegui enviar o arquivo aqui pelo sitio, então, coloquei em
http://www.4shared.com/file/2qlm1qkj/TA001.html. A senha para descompactar o arquivo é r4ip70. Desde já, muitíssimo obrigado.
Um forte abraço,
Francisco Rodrigues
GOSTEI 0
Francisco Rodrigues
14/05/2010
Olá, Wesley Y,
Mudei o tipo do campo de Blob Sub_Type 1 para Varchar(n), conforme você sugeriu e o problema foi resolvido. Muitíssimo obrigado. Quanto ao envio do programa para você fazer os comentários, não consegui enviar através do link Meu Disco Virtual, que apresenta a mensagem de erro “Microsoft VBScript runtime error '800a000d' Type mismatch: 'CLng' D:\WEB\DEVMEDIA.COM.BR\HTTPDOCS\DISCOVIRTUAL\../suporte/header.asp, line 12”. Entrei em contato com o pessoal do atendimento e estou aguardando resposta. Entretanto, disponibilizei o arquivo em http://www.4shared.com/file/2qlm1qkj/TA001.html , Senha: r4ip70. Eu ainda não respondi aos posts para dar feedback porque, quando tento faze-lo, aparece a mensagem “erro no formulário de feedback”, fato que também foi comunicado ao pessoal do atendimento. Muito obrigado, amigo, pela ajuda. Você tem sido muito atencioso e serei sempre grato.
Francisco Rodrigues
GOSTEI 0
Devmedia
14/05/2010
Francisco,
estamos procedendo com o retorno do disco virtual. Em alguns instantes o mesmo estará normalizado.
com relação a resposta ao feedback, fizemos um teste e nao encontramos nenhum problema. Isso pode ter acontecido caso tenha esquecido de responder a 1 dos itens do feedback.
GOSTEI 0
Francisco Rodrigues
14/05/2010
Oi, Wesley,
Enviei o arquivo para o disco virtual,
http://video.devmedia.com.br/discovirtual/198119/TesteAplicacao/TesteAplicacao.rar
Um abraço,
Francisco
GOSTEI 0
Wesley Yamazack
14/05/2010
Olá amigo, Vamos lá.
Primeiramente gostaria de dizer que não gostei muito dos botões, procure ícones mais interessantes isso enriquece a aplicação, ok ?
Segundo : Pelo que entendi da seguinte linha :
NovoNumero := dmNascimento.ClientDataSetNascimento.FieldValues['numero'] + 1;
Você pega o novo ID, certo ? Se for isso, por que você não usa Generetor ja que esta usando Firebird ? Veja no Firebird que ao criar um field chave primária vc pode definir um generetor do mesmo.
Com relação aos relatórios infelizmente não consegui abrir nenhum, pois você esta usando Quick Reports, e sinceramente eu prefiro o Rave Reports, pois seus relatórios ficam isolados da sua aplicação, para qualquer alteração de relatório você não precisa atualizar o executável, mas sim o arquivo do Rave Reports.
Outra dica, este sistema tem 1 tela de cadastro, se surgirem mais telas, você terá que fazer toda a parte de gravar, incluir, excluir, novamente certo? Já pensou em utilizar Herança Visual?
Outra dica, ao inves de botar o applyupdates, no código por que você não coloca ele no evento , afterdelete, e afterpost, do seu clientdataset? Poderia criar um método genérico , e todo clientdataset seu apontar este dois eventos que lhe falei para este método, veja como eu faço.
procedure TDM.CDSClienteAfterDelete(DataSet: TDataSet);
begin
TClientDataSet(DataSet).ApplyUpdates(0);
end;
Todos os meus ClientDataSet aprontam para este CDSClienteAfterDelete;
Acho que já da pra você "brincar", um pouco, rsrs, gostei da uFuncoes,:D vou usar, posso ? rsrs
Um abraço, espero ter ajudado. Qualquer coisa estamos a disposição.
Wesley Y
Primeiramente gostaria de dizer que não gostei muito dos botões, procure ícones mais interessantes isso enriquece a aplicação, ok ?
Segundo : Pelo que entendi da seguinte linha :
NovoNumero := dmNascimento.ClientDataSetNascimento.FieldValues['numero'] + 1;
Você pega o novo ID, certo ? Se for isso, por que você não usa Generetor ja que esta usando Firebird ? Veja no Firebird que ao criar um field chave primária vc pode definir um generetor do mesmo.
Com relação aos relatórios infelizmente não consegui abrir nenhum, pois você esta usando Quick Reports, e sinceramente eu prefiro o Rave Reports, pois seus relatórios ficam isolados da sua aplicação, para qualquer alteração de relatório você não precisa atualizar o executável, mas sim o arquivo do Rave Reports.
Outra dica, este sistema tem 1 tela de cadastro, se surgirem mais telas, você terá que fazer toda a parte de gravar, incluir, excluir, novamente certo? Já pensou em utilizar Herança Visual?
Outra dica, ao inves de botar o applyupdates, no código por que você não coloca ele no evento , afterdelete, e afterpost, do seu clientdataset? Poderia criar um método genérico , e todo clientdataset seu apontar este dois eventos que lhe falei para este método, veja como eu faço.
procedure TDM.CDSClienteAfterDelete(DataSet: TDataSet);
begin
TClientDataSet(DataSet).ApplyUpdates(0);
end;
Todos os meus ClientDataSet aprontam para este CDSClienteAfterDelete;
Acho que já da pra você "brincar", um pouco, rsrs, gostei da uFuncoes,:D vou usar, posso ? rsrs
Um abraço, espero ter ajudado. Qualquer coisa estamos a disposição.
Wesley Y
GOSTEI 0
Francisco Rodrigues
14/05/2010
Oi, amigo Wesley Y,
Fiquei lisonjeado quanto a uFuncoes e, você pode usá-la a
vontade - Garimpei a maioria das idéias aqui
na rede. Quanto às sugestões para melhorar o sistema (Botões, Generetor, Reve Report,
ApplyUpadates) são de muito valor e vou acolhê-las todas. Valeu, amigo Wesley
Y. Se você vier ao Amapá ou precisar de algo daqui, mande um e-mail. Terei o
maior prazer em atendê-lo.
Um forte abraço e, obrigado!
Francisco Rodrigues coisvaes@uol.com.br
Francisco Rodrigues coisvaes@uol.com.br
GOSTEI 0
Wesley Yamazack
14/05/2010
Ok Francisco,
Obrigado pela hospitalidade.
Precisar estamos aqui.
Um abraço
Wesley Y
Obrigado pela hospitalidade.
Precisar estamos aqui.
Um abraço
Wesley Y
GOSTEI 0