Sincronismo do Recordset

Prezados,
Na sequencia de scripts abaixo, a escrita no tag “ProducaoAnterior” é realizada somente após a execução da consulta “C_ProducaoAnterior”?
Se essa consultar demorar em razão da quantidade de registros, existe a possibilidade desse tag não ser atualizado com o valor do Recordset?
Seria interessante utilizar o evento OnAsyncQueryFinish para garantir que o valor do tag seja atualizado somente após a execução da consulta?

Parent.Item(“C_ProducaoAnterior”).Execute(ImmediateExecute)
Set RS_ProducaoAnterior = Parent.Item(“C_ProducaoAnterior”).GetADORecordset()

Parent.Item(“ProducaoAnterior”).Value = RS_ProducaoAnterior.fields.Item(0).Value

Parent.Item(“ProducaoHora”).Value = Parent.Item(“QuantidadeProduzida”).Value - Parent.Item(“ProducaoAnterior”).Value

Application.GetObject(“Historicos.Hist_OEE1”).WriteRecord()
Parent.Item(“ProducaoHora”).Value = 0

Segue o script SQL da consulta:

select Producao, ProducaoHora
from TB_OEE
where E3TimeStamp = (Select Max(E3TimeStamp) from TB_OEE)

Set RS_ProducaoAnterior = Parent.Item(“C_ProducaoAnterior”).GetADORecordset()

Seu script vai parar neste ponto até conseguir a resposta do BD ou desistir por timeout. Então o tag Parent.Item(“ProducaoAnterior”).Value conterá o valor da consulta ou um valor Nulo / valor anterior do tag dependendo do sucesso da consulta, o que pode ocasionar um comportamento inesperado no seu script.

Por estes 2 motivos : Travamento do sistema enquanto espera o resultado da consulta (em casos de consultas demoradas), e ausência de tratamento de erro, passei a utilizar somente o GetAsyncADORecordSet()

Eu alteraria e criaria o script no método OnAsyncQueryFinish(Recordset, Error), testaria se houve erro usando o parâmetro Error e continuaria o script do ponto onde parou.

1 Like

Nesse script eu coloquei o tratamento de erro abaixo e o valor do tag “Parent.Item(“ProducaoHora”).Value” está sempre o mesmo do tag “Parent.Item(“QuantidadeProduzida”).Value”. Ou seja, o valor do tag “Parent.Item(“ProducaoAnterior”).Value” não está sendo considerado.
Vou solicitar log do servidor gerado pelo Application.Trace.

On Error Resume Next

If Err.Number <> 0 then
Application.Trace(“Erro no GRAVAR HISTORICO [MAQ”&Parent.Item(“CodMaquina”).Value&"|Cod:" &Err.Number&"|Descricao:"&Err.Description&"|Fonte:"&Err.Source&"]")
End If

Não consta nenhum erro no log para esse script.
No caso de timeout da consulta, deveria ser retornado algum erro no log do Trace?

O método GetADORecordSet retorna um Recordset do tipo ADO (ActiveX Data Object) (retirado do manual). Logo ele não retorna nenhum parâmetro de erro diferente do retorno do método GetAsyncADORecordset. (O parâmetro Recordset é o ADO Recordset gerado pela Consulta, e o parâmetro Error é um Booleano que, quando verdadeiro, mostra que o objeto não conseguiu ser gerado) (retirado do manual). Erro de timeout na consulta não aparecerá como erro no script logo não é pego pelo:

On Error Resume Next
If Err.Number <> 0 then

Acredito que este erro será pego somente se você tentar usar o valor do resultado da consulta e este for inválido/diferente do esperado (tipo Nulo por ex.) e tentar fazer alguma operação com ele, tipo uma soma. Porém como o tag já deve ter um valor salvo, fica difícil ver a situação toda. Opinião pessoal apenas, não considere certeza absoluta.

Novamente recomendo o OnAsyncQueryFinish e o tratamento de erro por ex:

Sub qryTeste_OnAsyncQueryFinish(Recordset, Error)
If Error Then
Application.Trace(“Erro na consulta”)
Exit Sub
End If

Set rs = RecordSet
If rs.RecordCount <> 0 Then
Call execFuncao(rs)
Else
Application.Trace(“Consulta sem resultados”)
End If
End Sub

Sub execFuncao(rs)
msgbox "Sucesso na consulta. Qtde de dados retornados = "& rs.RecordCount
End Sub

1 Like