DBMemo Vazio - Erro de Gravação - ApplyUpdates

14/05/2010

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;
Francisco Rodrigues

Francisco Rodrigues

Curtidas 0

Respostas

Wesley Yamazack

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
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

14/05/2010

Olá amigo,
  Conseguiu isolar o problema ?

Att,

Wesley Y
GOSTEI 0
Francisco Rodrigues

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

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
GOSTEI 0
Francisco Rodrigues

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

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
GOSTEI 0
Francisco Rodrigues

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

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.
GOSTEI 0
Francisco Rodrigues

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

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

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

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

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
GOSTEI 0
Francisco Rodrigues

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
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

14/05/2010

Ok Francisco,
  Obrigado pela hospitalidade.

  Precisar estamos aqui.

Um abraço

Wesley Y
GOSTEI 0
POSTAR