Fórum DBMemo Vazio - Erro de Gravação - ApplyUpdates #377595
14/05/2010
0
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
Curtir tópico
+ 0Posts
14/05/2010
Wesley Yamazack
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
20/05/2010
Wesley Yamazack
Conseguiu isolar o problema ?
Att,
Wesley Y
Gostei + 0
20/05/2010
Francisco Rodrigues
Gostei + 0
20/05/2010
Wesley Yamazack
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
20/05/2010
Francisco Rodrigues
Gostei + 0
20/05/2010
Wesley Yamazack
Preciso do link para baixo o programa, me envie o link do arquivo para download.
Um abraço
Wesley Y
Gostei + 0
20/05/2010
Francisco Rodrigues
Gostei + 0
20/05/2010
Devmedia
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
20/05/2010
Francisco Rodrigues
Gostei + 0
21/05/2010
Francisco Rodrigues
Gostei + 0
21/05/2010
Devmedia
Gostei + 0
21/05/2010
Francisco Rodrigues
Gostei + 0
21/05/2010
Wesley Yamazack
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
21/05/2010
Francisco Rodrigues
Francisco Rodrigues coisvaes@uol.com.br
Gostei + 0
21/05/2010
Wesley Yamazack
Obrigado pela hospitalidade.
Precisar estamos aqui.
Um abraço
Wesley Y
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)