Melhorando código OpenEdge progress através do CASE

Olá,  vou apresentar um caso de melhorias de if/else alterado recentemente, neste caso para melhorar a sintaxe usamos o CASE.

Veja como estava antes da alteração:

 

    for each tt-movto
        where tt-movto.estabel = tt-mecanico.estabel
        and   tt-movto.codigo    = tt-mecanico.codigo
        and   tt-movto.dt-fim <> ?:
        if tt-movto.evento = "TREINAMENTO" then do:
            assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                   datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00"))
                   ttRecurso.Indisp_Treinamento = ttRecurso.Indisp_Treinamento + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "ASSISTENCE" then do:
            assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                   datFim = datetime(acerta-hora24(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00")))
                   ttRecurso.Indis__Assistence = ttRecurso.Indis__Assistence + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "COMPENSAÇÃO DE HORAS" then do:
            assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                   datFim = datetime(acerta-hora24(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00")))
                   ttRecurso.Indisp_Compensacao_de_Horas = ttRecurso.Indisp_Compensacao_de_Horas + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "SERVIÇOS EXTERNOS" then do:
            assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                   datFim = datetime(acerta-hora24(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00")))
                   ttRecurso.Indisp_Servicos_Externos = ttRecurso.Indisp_Servicos_Externos + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "FÉRIAS" then do:
            assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                   datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00"))
                   ttRecurso.Indisp_Ferias = ttRecurso.Indisp_Ferias + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "AFASTAMENTO" then do:
           assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                  datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00"))
                  ttRecurso.Indisp_Afastamento = ttRecurso.Indisp_Afastamento + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "DEMISSÃO" then do:
           assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                  datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00"))
                  ttRecurso.Indisp_Demissao = ttRecurso.Indisp_Demissao + interval(datFim, datIni, "minutes").
        end.
        if tt-movto.evento = "OUTROS" then do:
           assign datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
                  datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00"))
                  ttRecurso.Indisp_Outros = ttRecurso.Indisp_Outros + interval(datFim, datIni, "minutes").
        end.
    end. /* each tt-movto */

Vamos fazer as seguintes alterações, já que o datIni e datFim sempre pegam o mesmo conteúdo vamos popular essas variáveis uma vez só, e em vez de tanto IFs vamos usar o CASE.

Veja o resultado:

    for each tt-movto
        where tt-movto.estabel = tt-mecanico.estabel
        and   tt-movto.codigo    = tt-mecanico.codigo
        and   tt-movto.dt-fim <> ?:
        assign
            datIni = datetime(String(tt-movto.dt-inicio, "99/99/9999") + " " + String(tt-movto.hr-inicio, "99:99:00"))
            datFim = datetime(String(tt-movto.dt-fim, "99/99/9999") + " " + String(tt-movto.hr-fim, "99:99:00")).

        case tt-movto.evento:
            when "TREINAMENTO" then do:
                assign ttRecurso.Indisp_Treinamento = ttRecurso.Indisp_Treinamento + interval(datFim, datIni, "minutes").
            end.
            when "ASSISTENCE" then do:
                assign ttRecurso.Indis__Assistence = ttRecurso.Indis__Assistence + interval(datFim, datIni, "minutes").
            end.
            when "COMPENSAÇÃO DE HORAS" then do:
                assign ttRecurso.Indisp_Compensacao_de_Horas = ttRecurso.Indisp_Compensacao_de_Horas + interval(datFim, datIni, "minutes").
            end.
            when "SERVIÇOS EXTERNOS" then do:
                assign ttRecurso.Indisp_Servicos_Externos = ttRecurso.Indisp_Servicos_Externos + interval(datFim, datIni, "minutes").
            end.
            when "FÉRIAS" then do:
                assign ttRecurso.Indisp_Ferias = ttRecurso.Indisp_Ferias + interval(datFim, datIni, "minutes").
            end.
            when "AFASTAMENTO" then do:
                assign ttRecurso.Indisp_Afastamento = ttRecurso.Indisp_Afastamento + interval(datFim, datIni, "minutes").
            end.
            when "DEMISSÃO" then do:
               assign ttRecurso.Indisp_Demissao = ttRecurso.Indisp_Demissao + interval(datFim, datIni, "minutes").
            end.
            when "OUTROS" then do:
               assign ttRecurso.Indisp_Outros = ttRecurso.Indisp_Outros + interval(datFim, datIni, "minutes").
            end.
        end case.

Um pouco mais elegante né.

Manual progress sobre o case: CASE

Algumas dicas para melhorar performance aqui

Quando me deparar com mais casos assim vou documentando por aqui.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.