Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Horas paradas

Boa tarde! Preciso desenvolver um aplicativo que apresente a informação de horas em que as maquinas da produção ficaram paradas por motivo de manutenção. A principio utilizei a função Interval entre a data de parada e a data de retorno, porém preciso levar em consideração que essas maquinas trabalham de segunda-feira até sexta-feira e apenas 17 horas por dia, além de descontar os feriados. Alguém teria uma solução para esse caso? Grato desde já.

1 Solution

Accepted Solutions
mario_sergio_ti
Partner - Specialist
Partner - Specialist

Amigo, segue script com os dados de exemplo:

TAB_DATA:

Load

  MAQUINA,

    Date(Floor(Date#(PARADA,'YYYYMMDDhhmm'))) As 'DATA_PARADA',

    Time(Frac(Date#(PARADA,'YYYYMMDDhhmm')),'hh:mm') As 'TEMPO_PARADA' , 

    Date(Floor(Date#(RETORNO,'YYYYMMDDhhmm'))) As 'DATA_RETORNO',

    Time(Frac(Date#(RETORNO,'YYYYMMDDhhmm')),'hh:mm') As 'TEMPO_RETORNO'; 

LOAD * INLINE [

  MAQUINA|PARADA|RETORNO

  MAQ1|201703211020|201703241130

  MAQ2|201704020830|201704031520

  MAQ3|201704120830|201704130830

  MAQ4|201704130600|201704170600

  MAQ5|201704130800|201704180800

  MAQ6|201704131200|201704171200

  MAQ7|201704131330|201704171330

  MAQ8|201704131430|201704171430

  MAQ9|201704131900|201704171900 

  MAQ10|201703130600|201703130600

  MAQ11|201703130600|201703130800

  MAQ12|201703130600|201703131200

  MAQ13|201703130600|201703131500

  MAQ14|201703130600|201703132000

  MAQ15|201703130600|201703130600

  MAQ16|201703130800|201703130800

  MAQ17|201703131200|201703131330

  MAQ18|201703131200|201703131430

  MAQ19|201703132000|201703132300

  MAQ20|201703132000|201705132300   

](delimiter is '|');

TAB_FERIADOS:

Mapping LOAD

  Num(DATA) As DATA,

    FERIADO;

Load * INLINE [

DATA|DIA DA SEMANA|FERIADO

01/01/2017|domingo|Confraternização Universal

27/02/2017|segunda-feira|Carnaval

28/02/2017|terça-feira|Carnaval

14/04/2017|sexta-feira|Paixão de Cristo

21/04/2017|sexta-feira|Tiradentes

01/05/2017|segunda-feira|Dia do Trabalho

15/06/2017|quinta-feira|Corpus Christi

07/09/2017|quinta-feira|Independência do Brasil

12/10/2017|quinta-feira|Nossa Sr.a Aparecida - Padroeira do Brasil

02/11/2017|quinta-feira|Finados

15/11/2017|quarta-feira|Proclamação da República

25/12/2017|segunda-feira|Natal

](delimiter is '|');

Let vJORNADA_INI = Time#('07:30','hh:mm');

Let vJORNADA_FIM = Time#('17:48','hh:mm');

Let vJORNADA_ALM_INI = Time#('12:00','hh:mm');

Let vJORNADA_ALM_FIM = Time#('13:30','hh:mm');

Let vJORNADA_ALM = Time('$(vJORNADA_ALM_FIM)'-'$(vJORNADA_ALM_INI)','hh:mm');

Let vJORNADA_TOTAL = Time('$(vJORNADA_FIM)'-'$(vJORNADA_INI)'-'$(vJORNADA_ALM)','hh:mm') ;

TAB_TEMPO_MANUT:

Load

  MAQUINA,

    Sum(HORAS_PARADA) As 'TOTAL_HORAS_PARADA',

    Count(DIAS_PARADA) As 'QTD_DIAS_OCORRÊNCIA'

Group By MAQUINA;

Load

  MAQUINA,

    (WeekDay(DATA_PARADA + IterNo() -1)) as 'DIASEMANA?',

    ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null()) As 'FERIADO?',

    TEMPO_PARADA As 'TEMPO_PARADA?',

    TEMPO_RETORNO As 'TEMPO_RETORNO?',

    IF(Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),6), 'SÁBADO',

    IF(Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),0), 'DOMINGO',

        IF(Not IsNull(ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null())), 'FERIADO',

    IF(DATA_PARADA=DATA_RETORNO,'MESMO DIA',IF(IterNo()=1,'PRIMEIRO DIA',IF(DATA_RETORNO = Date(DATA_PARADA + IterNo() -1),'ÚLTIMO DIA','DIA CORRENTE')))

  ))) As 'STATUS',

 

    Time(

    IF( Not Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),0,6) and //not sab e dom?

    Not Len(ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null())) //not feriado?

     

        ,IF(DATA_PARADA=DATA_RETORNO, //mesmo dia?

            IF(TEMPO_RETORNO<'$(vJORNADA_INI)','$(vJORNADA_INI)', //antes do período de trabalho?

              IF(TEMPO_RETORNO>'$(vJORNADA_FIM)','$(vJORNADA_FIM)', //depois do período de trabalho?

                    IF(TEMPO_RETORNO>='$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_FIM)', //período de almoço?

                          TEMPO_RETORNO

                      )

              )

          )     

          -

  IF(TEMPO_PARADA<'$(vJORNADA_INI)','$(vJORNADA_INI)', //antes do período de trabalho?

  IF(TEMPO_PARADA>'$(vJORNADA_FIM)','$(vJORNADA_FIM)', //depois do período de trabalho?

                    IF(TEMPO_PARADA>='$(vJORNADA_ALM_INI)' AND TEMPO_PARADA<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_FIM)', //período de almoço?

                          TEMPO_PARADA

                      )

                )

            )

            -

            IF(TEMPO_PARADA<'$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO>='$(vJORNADA_ALM_INI)', '$(vJORNADA_ALM)',0)     

          ,IF(IterNo()=1, //primeiro dia?

  IF(TEMPO_PARADA<'$(vJORNADA_INI)','$(vJORNADA_TOTAL)', //antes do período de trabalho?

  IF(TEMPO_PARADA>'$(vJORNADA_FIM)',NULL(), //depois do período de trabalho?

                  IF(TEMPO_PARADA<'$(vJORNADA_ALM_INI)', '$(vJORNADA_FIM)'-TEMPO_PARADA-'$(vJORNADA_ALM)', //antes de meio dia?

                      IF(TEMPO_PARADA>='$(vJORNADA_ALM_INI)' AND TEMPO_PARADA<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_FIM)'-'$(vJORNADA_ALM_FIM)', //período de almoço?

                          '$(vJORNADA_FIM)'-TEMPO_PARADA

                        )

                    )

                )

            )

         

            ,IF(DATA_RETORNO = Date(DATA_PARADA + IterNo() -1), //último dia?

              IF(TEMPO_RETORNO<'$(vJORNADA_INI)',Null(), //antes do período de trabalho?

              IF(TEMPO_RETORNO>'$(vJORNADA_FIM)','$(vJORNADA_TOTAL)', //depois do período de trabalho?

                  IF(TEMPO_RETORNO<'$(vJORNADA_ALM_INI)', TEMPO_RETORNO-'$(vJORNADA_INI)', //antes de meio dia?

                    IF(TEMPO_RETORNO>='$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_INI)'-'$(vJORNADA_INI)', //período de almoço?

                          TEMPO_RETORNO-'$(vJORNADA_INI)'-'$(vJORNADA_ALM)'

                      )

                  )

              )

          )

          ,'$(vJORNADA_TOTAL)'

          )

        )

      )

    ),'hh:mm') As 'HORAS_PARADA',   

    Date(DATA_PARADA + IterNo() -1)  As 'DIAS_PARADA',

    DATA_RETORNO As 'DIAS_RETORNO'

Resident TAB_DATA

While DATA_PARADA + IterNo() -1 <= DATA_RETORNO;

No frond-end:

Para aparecer a duração, segue:

Capturar.JPG

Fiz vários testes, e aparentemente ok, caso encontre alguma contabilização errada, poderá documentar o primeiro load da TAB_TEMPO_MANUT e carregar, assim poderá depurar com os atributos que deixei esquematizado para te ajudar a realizar ajustes nos IF() caso necessário.

Boa sorte.

Sou consultor independente, precisando de apoio avançado... Adicione meu perfil mario.sergio.ti e entre em contato comigo.

Abraço.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti

View solution in original post

6 Replies
Not applicable
Author

Ola Marcos,

Tem como mostrar como são esses números com uma tabela de exemplo e a expressão que esta tentando usar?

Not applicable
Author

Bom dia! Segue em anexo um aplicativo de exemplo do que estou precisando fazer, nesse estou trazendo o intervalo entre a data de parada e a de retorno, o que falta é descontar os sábados, domingo, feriados e levar em consideração que as maquinas trabalham apenas 17 horas por dia. Qualquer duvida estou a disposição.

mario_sergio_ti
Partner - Specialist
Partner - Specialist

Já te retorno com a solução...

Favor, me passa o horário de funcionamento da máquina do dia.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
Not applicable
Author

Boa tarde Mario!

1º turno: Inicio: 7:30, parada: 12:00 para almoço, retorno do almoço 13:30, termino: 17:48. O outro turno não iremos utilizar por enquanto.

mario_sergio_ti
Partner - Specialist
Partner - Specialist

Amigo, segue script com os dados de exemplo:

TAB_DATA:

Load

  MAQUINA,

    Date(Floor(Date#(PARADA,'YYYYMMDDhhmm'))) As 'DATA_PARADA',

    Time(Frac(Date#(PARADA,'YYYYMMDDhhmm')),'hh:mm') As 'TEMPO_PARADA' , 

    Date(Floor(Date#(RETORNO,'YYYYMMDDhhmm'))) As 'DATA_RETORNO',

    Time(Frac(Date#(RETORNO,'YYYYMMDDhhmm')),'hh:mm') As 'TEMPO_RETORNO'; 

LOAD * INLINE [

  MAQUINA|PARADA|RETORNO

  MAQ1|201703211020|201703241130

  MAQ2|201704020830|201704031520

  MAQ3|201704120830|201704130830

  MAQ4|201704130600|201704170600

  MAQ5|201704130800|201704180800

  MAQ6|201704131200|201704171200

  MAQ7|201704131330|201704171330

  MAQ8|201704131430|201704171430

  MAQ9|201704131900|201704171900 

  MAQ10|201703130600|201703130600

  MAQ11|201703130600|201703130800

  MAQ12|201703130600|201703131200

  MAQ13|201703130600|201703131500

  MAQ14|201703130600|201703132000

  MAQ15|201703130600|201703130600

  MAQ16|201703130800|201703130800

  MAQ17|201703131200|201703131330

  MAQ18|201703131200|201703131430

  MAQ19|201703132000|201703132300

  MAQ20|201703132000|201705132300   

](delimiter is '|');

TAB_FERIADOS:

Mapping LOAD

  Num(DATA) As DATA,

    FERIADO;

Load * INLINE [

DATA|DIA DA SEMANA|FERIADO

01/01/2017|domingo|Confraternização Universal

27/02/2017|segunda-feira|Carnaval

28/02/2017|terça-feira|Carnaval

14/04/2017|sexta-feira|Paixão de Cristo

21/04/2017|sexta-feira|Tiradentes

01/05/2017|segunda-feira|Dia do Trabalho

15/06/2017|quinta-feira|Corpus Christi

07/09/2017|quinta-feira|Independência do Brasil

12/10/2017|quinta-feira|Nossa Sr.a Aparecida - Padroeira do Brasil

02/11/2017|quinta-feira|Finados

15/11/2017|quarta-feira|Proclamação da República

25/12/2017|segunda-feira|Natal

](delimiter is '|');

Let vJORNADA_INI = Time#('07:30','hh:mm');

Let vJORNADA_FIM = Time#('17:48','hh:mm');

Let vJORNADA_ALM_INI = Time#('12:00','hh:mm');

Let vJORNADA_ALM_FIM = Time#('13:30','hh:mm');

Let vJORNADA_ALM = Time('$(vJORNADA_ALM_FIM)'-'$(vJORNADA_ALM_INI)','hh:mm');

Let vJORNADA_TOTAL = Time('$(vJORNADA_FIM)'-'$(vJORNADA_INI)'-'$(vJORNADA_ALM)','hh:mm') ;

TAB_TEMPO_MANUT:

Load

  MAQUINA,

    Sum(HORAS_PARADA) As 'TOTAL_HORAS_PARADA',

    Count(DIAS_PARADA) As 'QTD_DIAS_OCORRÊNCIA'

Group By MAQUINA;

Load

  MAQUINA,

    (WeekDay(DATA_PARADA + IterNo() -1)) as 'DIASEMANA?',

    ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null()) As 'FERIADO?',

    TEMPO_PARADA As 'TEMPO_PARADA?',

    TEMPO_RETORNO As 'TEMPO_RETORNO?',

    IF(Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),6), 'SÁBADO',

    IF(Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),0), 'DOMINGO',

        IF(Not IsNull(ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null())), 'FERIADO',

    IF(DATA_PARADA=DATA_RETORNO,'MESMO DIA',IF(IterNo()=1,'PRIMEIRO DIA',IF(DATA_RETORNO = Date(DATA_PARADA + IterNo() -1),'ÚLTIMO DIA','DIA CORRENTE')))

  ))) As 'STATUS',

 

    Time(

    IF( Not Match(Num(WeekDay(DATA_PARADA + IterNo() -1)),0,6) and //not sab e dom?

    Not Len(ApplyMap('TAB_FERIADOS',(DATA_PARADA + IterNo() -1),null())) //not feriado?

     

        ,IF(DATA_PARADA=DATA_RETORNO, //mesmo dia?

            IF(TEMPO_RETORNO<'$(vJORNADA_INI)','$(vJORNADA_INI)', //antes do período de trabalho?

              IF(TEMPO_RETORNO>'$(vJORNADA_FIM)','$(vJORNADA_FIM)', //depois do período de trabalho?

                    IF(TEMPO_RETORNO>='$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_FIM)', //período de almoço?

                          TEMPO_RETORNO

                      )

              )

          )     

          -

  IF(TEMPO_PARADA<'$(vJORNADA_INI)','$(vJORNADA_INI)', //antes do período de trabalho?

  IF(TEMPO_PARADA>'$(vJORNADA_FIM)','$(vJORNADA_FIM)', //depois do período de trabalho?

                    IF(TEMPO_PARADA>='$(vJORNADA_ALM_INI)' AND TEMPO_PARADA<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_FIM)', //período de almoço?

                          TEMPO_PARADA

                      )

                )

            )

            -

            IF(TEMPO_PARADA<'$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO>='$(vJORNADA_ALM_INI)', '$(vJORNADA_ALM)',0)     

          ,IF(IterNo()=1, //primeiro dia?

  IF(TEMPO_PARADA<'$(vJORNADA_INI)','$(vJORNADA_TOTAL)', //antes do período de trabalho?

  IF(TEMPO_PARADA>'$(vJORNADA_FIM)',NULL(), //depois do período de trabalho?

                  IF(TEMPO_PARADA<'$(vJORNADA_ALM_INI)', '$(vJORNADA_FIM)'-TEMPO_PARADA-'$(vJORNADA_ALM)', //antes de meio dia?

                      IF(TEMPO_PARADA>='$(vJORNADA_ALM_INI)' AND TEMPO_PARADA<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_FIM)'-'$(vJORNADA_ALM_FIM)', //período de almoço?

                          '$(vJORNADA_FIM)'-TEMPO_PARADA

                        )

                    )

                )

            )

         

            ,IF(DATA_RETORNO = Date(DATA_PARADA + IterNo() -1), //último dia?

              IF(TEMPO_RETORNO<'$(vJORNADA_INI)',Null(), //antes do período de trabalho?

              IF(TEMPO_RETORNO>'$(vJORNADA_FIM)','$(vJORNADA_TOTAL)', //depois do período de trabalho?

                  IF(TEMPO_RETORNO<'$(vJORNADA_ALM_INI)', TEMPO_RETORNO-'$(vJORNADA_INI)', //antes de meio dia?

                    IF(TEMPO_RETORNO>='$(vJORNADA_ALM_INI)' AND TEMPO_RETORNO<='$(vJORNADA_ALM_FIM)', '$(vJORNADA_ALM_INI)'-'$(vJORNADA_INI)', //período de almoço?

                          TEMPO_RETORNO-'$(vJORNADA_INI)'-'$(vJORNADA_ALM)'

                      )

                  )

              )

          )

          ,'$(vJORNADA_TOTAL)'

          )

        )

      )

    ),'hh:mm') As 'HORAS_PARADA',   

    Date(DATA_PARADA + IterNo() -1)  As 'DIAS_PARADA',

    DATA_RETORNO As 'DIAS_RETORNO'

Resident TAB_DATA

While DATA_PARADA + IterNo() -1 <= DATA_RETORNO;

No frond-end:

Para aparecer a duração, segue:

Capturar.JPG

Fiz vários testes, e aparentemente ok, caso encontre alguma contabilização errada, poderá documentar o primeiro load da TAB_TEMPO_MANUT e carregar, assim poderá depurar com os atributos que deixei esquematizado para te ajudar a realizar ajustes nos IF() caso necessário.

Boa sorte.

Sou consultor independente, precisando de apoio avançado... Adicione meu perfil mario.sergio.ti e entre em contato comigo.

Abraço.

Consultor certificado | Quem compartilha, aprende!
https://www.linkedin.com/in/mariosergioti
Not applicable
Author

Obrigado Mario! Era isso mesmo