Histórico pára de gravar dados

Olá. Estou enfrentando um problema em um E3 em um cliente.

O sistema eu mesmo desenvolvi, e existem muitos desses parecidos no mesmo cliente, porém nenhum nunca deu esse tipo de erro.

O que acontece é que de repente o Histórico para de gravar dados no DB (Access MDB), sem motivo aparente. Ás vezes após alguns dias rodando, o sistema para de gravar dados e não volta até que reinicializemos o domínio.

Consultei o LOG do Elipse e verifiquei que quando o sistema para de gravar, o erro “Couldn’t retrieve value to INSERT command (80020005)” é mostrado no LOG.

Já apaguei o Servidor de Dados e criei um novo, já recriei um novo banco de dados, já apaguei e recriei um novo histórico. Nada surtiu efeito.

Por favor, preciso de uma solução urgente para o caso. O cliente está muito nervoso com o erro.

Boa tarde!

O erro ‘80020005’ indica tipo incompatível. Por acaso você está utilizando a mesma tabela para gravar dados de diferentes Históricos com estruturas diferentes?

Para que possamos investigar a causa do problema, precisamos ver o log do E3 do dia em que o sintoma começou a ocorrer.

Boa noite Paulo. Obrigado pela resposta.

No programa, apenas um histórico grava dados em uma única tabela. E a estrutura é a mesma. A própria estrutura do BD foi criado pelo Elipse, por sinal.

Não tenho o Log no momento para te enviar. Posso te enviar futuramente.

Você tem alguma desconfiança do que poderia ser o problema?

Obrigado.

Talvez algum script que esteja tentando gravar dados no banco. Só o log pode nos dizer exatamente o que aconteceu.

@Alltec_Sistemas, alguma novidade sobre este assunto?

Boa noite Paulo! Obrigado pela preocupação.

Sim, recebi o feedback que o sistema continua a parar de gravar.

Marquei com o cliente uma visita. Vou extrair o LOG ainda essa semana e trarei para a empresa. Farei um upload aqui do arquivo do dia exato do problema.

Em breve volto com o LOG.

Abraços,

Thiago

Boa tarde @pgustavo! Consegui baixar o LOG do meu cliente.

Joguei pra nuvem nesse link: [One Drive - LogE3][1]

O programa grava a cada 30 minutos, em horários múltiplos de 30min (10:00, 10:30, 11:00, etc…).
Observe que o sistema gravou certo até às 11:00. Ás 11:30 ele não gravou mais e deu o erro referido.

Obrigado,

Thiago Coracini - Alltec Sistemas
[1]: http://1drv.ms/1MdcGsk

Thiago,

Infelizmente o log do E3 não dá mais nenhuma pista. O certo é que o erro 80020005 significa “Type mismatch”, ou seja, por algum motivo o E3 não está conseguindo converter o valor que está chegando para o tipo esperado.

Que tipos de dados estão sendo gravados? Da onde estão vindo os valores? Tem algum script envolvido?

@pgustavo, abaixo está a configuração do histórico:

A gravação é chamada por um script. Ao iniciar o domínio, eu paro a gravação automática do histórico e o script abaixo realiza a gravação através do “Application.GetObject(“HistoricoDados”).WriteRecord()”

Sub Grava_Grava()
'ROTINA PARA GRAVAÇÃO NO BANCO DE DADOS E ATUALIZAÇÃO DE VARIAVEIS
'FASES DE PROCESSO:
'0=ESPERA
'1=AQUECIMENTO 1 
'2=AQUECIMENTO 2
'3=AQUECIMENTO 3 
'4=VACUO
'5=FLUTUAÇÃO
'6=ENCERRADO        
'7=MANUAL  


'Carrega o vetor de fases do processo
aFase = Array("EM ESPERA ","AQUECIMENTO 1 ","AQUECIMENTO 2","AQUECIMENTO 3 ","VACUO","FLUTUAÇÃO","ENCERRADO","MANUAL")
'Carrega a tabela "BASE"
Set RS         = Parent.Item("Base").Item("RS").Value    

'Carrega minutos e segundos do horário atual
nSegundo = Parent.Parent.Item("Crono").Item("Second").Value
nMinuto = Parent.Parent.Item("Crono").Item("Minute").Value

IF RS.RecordCount > 0 THEN

    RS.MoveLast()
    
    'ATUALIZA DADOS DO ÚLTIMO PROCESSO
    Parent.Parent.Item("Processo").Item("nCodigo").Value             = RS.Fields("Codigo").Value
    Parent.Parent.Item("Processo").Item("bProcesso").Value             = RS.Fields("bProcesso").Value
    Parent.Parent.Item("Processo").Item("cPA1").Value                 = RS.Fields("cPa1").Value
    Parent.Parent.Item("Processo").Item("cCliente").Value            = RS.Fields("cCliente1").Value
    Parent.Parent.Item("Processo").Item("dDataInicio").Value         = RS.Fields("dDataInicio").Value

    'Se o processo iniciado
    If RS.Fields("bProcesso").Value = true THEN
        
        nIntervalo = Parent.Item("Intervalo").Value 'intervalo em minutos selecionado pelo usuário
        IF     nMinuto MOD nIntervalo = 0 AND nSegundo = 0 THEN
        'Grava na tabela Dados
            Application.GetObject("HistoricoDados").WriteRecord()
        END IF
    
        'ATUALIZA DADOS PROCESSO
        Parent.Parent.Item("Processo").Item("dDataFim").Value         = ""
        Parent.Parent.Item("Processo").Item("dDuracaoProcesso").Value     = Now() - RS.Fields("dDataInicio").Value        
    
    ELSE    'SE PROCESSO ENCERRADO
        'ATUALIZA DADOS PROCESSO
        Parent.Parent.Item("Processo").Item("dDataFim").Value             = RS.Fields("dDataFim").Value
        Parent.Parent.Item("Processo").Item("dDuracaoProcesso").Value     = RS.Fields("dDataFim") - RS.Fields("dDataInicio").Value
    End If
End if

End Sub

Sugiro conferir o valor e o tipo de dado dos tags associados ao Histórico no momento em que o problema acontece.

Você pode fazer isso através do WatchWindow, se tiver o Studio instalado, ou acrescentando um “Application.Trace” no script antes do “WriteRecord”.

Artigos relacionados:
http://kb.elipse.com.br/pt-br/questions/4824
http://kb.elipse.com.br/pt-br/questions/2680

Entendo…o problema é intermitente e não consigo isolá-lo, nem causá-lo.
Existe alguma possibilidade de ser relacionado ao Windows? Vale a pena formatar o PC e reinstalar tudo ou você acha que o problema está realmente relacionado ao programa?
Pergunto isso pois na minha máquina o problema não ocorreu nenhuma vez. Apenas na máquina do cliente.

Obrigado,

Thiago

Recomendo fazer o teste sugerido antes.

Ok, farei o trace.

No caso eu faço dessa maneira?

Application.Trace Application.GetObject("HistoricoDados").WriteRecord()

Não, a ideia é logar o valor dos tags. Por exemplo:

set ncodigo = Application.GetObject(“Dado.Processo.nCodigo”)
Application.Trace ncodigo.Value & " - " & TypeName(ncodigo.Value)

Repetir isso para todos os tags do Histórico.

O ‘TypeName’ vai retornar o tipo de dado.

Ok, farei dessa maneira.

Obrigado

Olá Thiago!

Chegou a usar o Application.Trace?

Sim @pgustavo! Inseri conforme você disse. O processo está rodando e na semana que vem vou até lá coletar os dados. Provavelmente o problema deve ter voltado e então mostro aqui pra você o Trace.

Obrigado!

Alguma novidade sobre este assunto, Thiago?

Bom dia Gustavo!

O cliente me informou que o sistema não mais apresentou defeitos. Achei esquisito pois não fiz modificações relevantes.
De qualquer maneira, vamos fechar esse tópico por aqui e caso eu volte a ter problemas, entro em contato.
Agradeço muito a ajuda prestada.

Um abraço.