Consulta E3 Oracle

Prezados,

Estou com dificuldade para somar horas no formato HH:MM:SS na consulta do E3 utilizando servidor de banco de dados ORACLE. A tabela tem uma coluna de tempo de máquina parada e no final do turno é necessário gerar o acumulado de todas as paradas realizadas.
Alguém já passou por esse desafio que possa compartilhar?

Att,
Daniel Gleison

Você pode dar um exemplo de como estão gravados estes dados no seu banco de dados, e qual resultado você esperaria ver?
Dependendo do formato do dado, talvez na própria consulta você já consiga somar os períodos, senão o jeito é percorrer cada valor e acumular o somatório final. Talvez até mesmo com o relatório do E3 seja possível…

Caro Marcel,

Por exemplo:
CodParada-----TempoParada
1-------------------03:30:00
2-------------------01:15:00
3-------------------00:30:00
4-------------------04:15:00
5-------------------02:00:30

A minha dúvida é na obtenção do somatório dos valores da coluna “TempoParada” com formato DateTime. No caso do exemplo acima, o resultado esperado seria 11:30:30. Tentei utilizar a função SUM (coluna), mas não funciona no Oracle.

Desde já, agradeço,

Bom dia,

Consegui resolver o problema da consulta de somatório de horas no Oracle, conforme script abaixo:

Select
sum ( to_char( to_date( TempoParadaTotal, ‘dd.mm.yyyy hh24:mi:ss’ ), ‘hh24’ ) ) + sum( to_char( to_date( TempoParadaTotal, ‘dd.mm.yyyy hh24:mi:ss’ ), ‘mi’ ) ) / 60 + ( sum(to_char(to_date( TempoParadaTotal, ‘dd.mm.yyyy hh24:mi:ss’ ), ‘ss’ ) ) / 60 ) / 60
as TPT
from T_PARADAS

O resultado total de horas em formato decimal é gerado normalmente tanto no SQLDeveloper quanto no E3Query.

Porém, em modo de execução, ocorre erro no comando GetADORecordset() do script abaixo:

Sub CommandButton1_Click()
dim RS_TPT
Screen.Item(“C_TPT_Acumulado”).Execute(ImmediateExecute)
set RS_TPT = Screen.Item(“C_TPT_Acumulado”).GetADORecordset()
Screen.Item(“Texto1”).Value = RS_TPT.Fields(“TPT”).Value
End Sub

Se a consulta funciona no E3Query, entendo que resultado deveria ser passado normalmente para o GetADORecordset().
Preciso gerar a informação do somatório de horas paradas em tela durante cada turno de produção.
Alguém sabe informar o que pode estar ocorrendo com o E3?
Desde já, agradeço pela atenção.

Att,
Daniel Gleison

Como é a mensagem de erro? Se você fizer:

msgbox "Qtde de Resultados = " & RS_TPT.RecordCount

O Resultado é diferente de 0 (Zero)?
Obs: Aconselho sempre antes de usar os dados de uma consulta fazer um:

If RS.RecordCount <> 0 Then
'usar dados da consulta
Else
'trata o erro
End If

Outra coisa, seria bom você usar o método MoveFirst para mover o ponteiro da consulta para o primeiro resultado antes de tentar usar-lo.
Kb Elipse GetADORecordSet

Tenta usar o seguinte script para tornar a mensagem de erro mais legível:

‘A partir desta linha, os erros são ignorados
On Error Resume Next
‘…
‘…Seu código…
‘…
If Err.Number <> 0 then
MsgBox “Atenção: ocorreu um erro na execução deste script: “ & vbNewLine &_
Err.Number & “-“ & Err.Description & vbNewLine & _
“Entre em contato com o desenvolvedor responsável.”
End If
tratamento de erros kb elipse

obs2: o método Execute(ImmediateExecute) do E3Query não é necessário para fazer consultas, apenas se você quiser usar algum INSERT/UPDATE.

Caro Marcel,

Atualizei o script conforme abaixo.
O RecordCount retorna 1 como esperado.
A mensagem de erro retornada é:
438 - O objeto não dá suporte para a propriedade ou método


Sub CommandButton1_Click()

dim RS_TPT

set RS_TPT = Screen.Item(“C_TPT_Acumulado”).GetADORecordset()
RS_TPT.MoveFirst

If RS_TPT.RecordCount = 1 then
Screen.Item(“Texto1”).Value = RS_TPT.Fields(“TPT”).Value
Else
MsgBox "Qtde de Resultados = " & RS_TPT.RecordCount
End if

If Err.Number <> 0 then
MsgBox “Erro de Script:“ & vbNewLine &_
Err.Number & “-“ & Err.Description
End If

End Sub

O resultado da consulta é um número, e provavelmente você está tentando exibí-lo em um display.
Acho que pode ser incompatibilidade de tipos de dados (numeral vs texto). Faz a conversão do resultado da consulta para texto (CStr = Converte para String) e testa:

Screen.Item(“Texto1”).Value = CStr(RS_TPT.Fields(“TPT”).Value)

Outra coisa, embora funcione do jeito que está, acho que para acessar um item específico em uma coleção de Fields de um ADORecordSet, o indicado seria:

RS.Fields.Item(1) ou RS.Fields.Item(“Name”)

no seu caso:

RS_TPT.Fields.Item(“TPT”).Value

muda aí para ver se faz diferença

Prezado,

O erro de script estava no MoveFirst (estava com grafia errada).
Não obstante, o GETADORecordset está retornando sempre 0 (zero).
Já testei com display, tag de servidor e msgbox. Todos retornam 0 independentemente do resultado da consulta. Tentei também convertendo para String e Int, sem êxito.

Simplifiquei o script.

Sub CommandButton1_Click()

dim RS_TPT

set RS_TPT = Screen.Item(“C_TPT_Acumulado”).GetADORecordset()
RS_TPT.MoveFirst

If RS_TPT.RecordCount = 1 then
MsgBox RS_TPT.Fields.Item(“TPT”).Value
End if

End Sub

Rodei o script acima com BD Access e funcionou normalmente.
No MsgBox foi retornado o resultado da consulta, e não apenas 0 (zero) como no Oracle.
Aguardo qualquer forma de ajuda.

Problema resolvido com o script abaixo:

Select

sum (to_char(to_date(to_char(TempoParadaTotal,'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss' ), 'hh24' ) ) * 60 +  -- HORAS EM MINUTOS
sum (to_char(to_date(to_char(TempoParadaTotal,'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss' ), 'mi' ) )  +  -- MINUTOS
sum (to_char(to_date(to_char(TempoParadaTotal,'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss' ), 'ss' ) ) / 60  -- SEGUNDOS EM MINUTOS
as TPT_MIN -- TEMPO DE PARADA TOTAL EM MINUTOS

from Paradas

where E3TimeStamp >= #<%Data%># and Turno = <%Turno%>

Já testou usando somente SUM(TO_CHAR(TempoParadaTotal, ‘HH24’)) * 60…
Converter data para char, depois para data e depois para char novamente, parece desnecessário.

Essa foi a única forma que funcionou.
De outro jeito, o resultado da soma era sempre zero.
O Oracle exibe o horário gravado pelo histórico sem a parte do horário e por isso não estava sendo usado na formula.Com a parte da data, funcionava normalmente.
Foi necessário colocar mais uma conversão to char para que o Oracle retornasse ao Recordset do E3 o horário gravado no banco.
É o meu primeiro contato com o Oracle, talvez exista uma forma mais fácil de tratar isso, mas estava precisando que funcionasse logo.
Com relação ao display e relatório, você tinha razão: para visualizar no display tive que converter para formato numérico e o relatório calcula de forma fácil o somatório das horas.
Obrigado pela ajuda e até a próxima!