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.