Calcular tempo de duração - Firebird 2.515h

05/08/2019

7

Possuo uma tabela que registra todas as ocorrências de cada etapa de processo de expedição.

Esta tabela possui as seguintes colunas conforme a imagem:
https://imgur.com/a/xjm2sO0


Etapas: 0 = Separação, 1 = Embalagem, 2 = Conferência, 3 = Embarque

Status: 0 = Aguardando, 1 = Iniciado, 2 = Finalizado, 3 = Em pausa

E assim, possuo a seguinte tela:
https://imgur.com/a/tUvwdFv


Exemplo:

Tenho a etapa de SEPARAÇÃO que entrou na etapa de Separação e estava com o status aguardando às 15h06, iniciou as 16h04 e finalizou as 16h06. Desse modo o tempo de duração dessa etapa foi de 1h10min.

Preciso calcular o tempo de duração de cada etapa independente do status, mas não sei como. (Ciente de que terei que criar uma view temporária para cada etapa)

Alguma solução para isto?
Responder

Posts

06/08/2019

Eduardo

Resolvido.

with vwEtapas as
(

select    a.idf_processoexp,
          a.etapa,
          a.status,
          a.dataoco ocorrencia,
          b.IDF_IDENT ididentusu,
         sum(
              (CAST(SUBSTRING(a.horaoco FROM 1 FOR 2) AS INTEGER) * 60)  +
              (CAST(SUBSTRING(a.horaoco FROM 4 FOR 2) AS INTEGER))
              )
           HorasEmMinutos

FROM       M3_OCOPROCEXP   A
inner join MTMG_USUA B on B.ID = A.IDF_USUARIO
where   (a.idf_processoexp = 16102)
group by a.idf_processoexp, a.status, a.etapa, b.IDF_IDENT, a.dataoco
order by a.idf_processoexp, a.etapa, a.status

)


, vwEtapasClassifica as (

select wep2.idf_processoexp,
       wep2.ididentusu,
       wep2.ocorrencia data,
       /* Horas Separação */

       case when wep2.etapa = 0 then
            case  when wep2.status = 1 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasInicioSeparacao,

        case when wep2.etapa = 0 then
            case  when wep2.status = 2 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasConcluidoSeparacao,

       case when wep2.etapa = 0 then
            case  when wep2.status = 4 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasPausaSeparacao,


       /* Horas Embalagem */

       case when wep2.etapa = 1 then
            case  when wep2.status = 1 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasInicioEmbalagem,

        case when wep2.etapa = 1 then
            case  when wep2.status = 2 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasConcluidoEmbalagem,

       case when wep2.etapa = 1 then
            case  when wep2.status = 4 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasPausaEmbalagem,

       /* Horas Conferência */

       case when wep2.etapa = 2 then
            case  when wep2.status = 1 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasInicioConferencia,

       case when wep2.etapa = 2 then
            case  when wep2.status = 2 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasConcluidoConferencia,

         case when wep2.etapa = 2 then
            case  when wep2.status = 4 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end HorasPausaConferencia,

       /* Horas Embarque */

        case when wep2.etapa = 3 then
            case  when wep2.status = 1 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end  HorasInicioEmbarque,

        case when wep2.etapa = 3 then
            case  when wep2.status = 2 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end  HorasConcluidoEmbarque,

        case when wep2.etapa = 3 then
            case  when wep2.status = 4 then
                       wep2.HorasEmMinutos
            else 0 end
       else 0 end  HorasPausaEmbarque


FROM    vwEtapas   wep2

)

, vwEtapasSUM as   (

select    wep3.idf_processoexp,
          wep3.ididentusu,
          wep3.data data,

       sum(wep3.HorasInicioSeparacao)    HorasInicioSeparacao,

       sum(wep3.HorasConcluidoSeparacao) HorasConcluidoSeparacao,

       sum(wep3.HorasInicioEmbalagem)   HorasInicioEmbalagem,

       sum(wep3.HorasInicioConferencia) HorasInicioConferencia,

       sum(wep3.HorasInicioEmbarque)    HorasInicioEmbarque,

       sum(wep3.HorasConcluidoEmbalagem) HorasConcluidoEmbalagem,

       sum(wep3.HorasConcluidoConferencia) HorasConcluidoConferencia,

       sum(wep3.HorasConcluidoEmbarque) HorasConcluidoEmbarque,

       sum(wep3.HorasPausaSeparacao)    HorasPausaSeparacao,

       sum(wep3.HorasPausaEmbalagem) HorasPausaEmbalagem,

       sum(wep3.HorasPausaConferencia) HorasPausaConferencia,

       sum(wep3.HorasPausaEmbarque) HorasPausaEmbarque

FROM    vwEtapasClassifica   wep3

group by wep3.idf_processoexp, wep3.ididentusu, wep3.data)

select
       doc.nrodocto,
       idusu.nome,
       vwe.data,
      (vwe.HorasConcluidoSeparacao - vwe.HorasInicioSeparacao ) TempoSeparacao,
      (vwe.HorasConcluidoEmbalagem - vwe.HorasInicioEmbalagem ) TempoEmbalagem,
      (vwe.HorasConcluidoEmbarque - vwe.HorasInicioEmbarque ) TempoEmbarque,
--      (vwe.HorasPausaSeparacao - vwe.HorasPausaEmbalagem - vwe.HorasPausaEmbarque  ) TempoPausa

FROM        m3_procexpedi   d
inner join  m3_integraexp   ite   on ite.id = d.idf_integraexp
inner join  m3_integra      itg   on itg.id = ite.ida
inner join  m3_docto        doc   on doc.id = itg.idf_docto
inner join  vwEtapasSUM     vwe   on vwe.idf_processoexp = d.id
inner join MTMG_IDENT       idusu on idusu.ID = vwe.ididentusu

Responder