Administração do sistema

Modelo de rotinas custom pesadas para serem executadas com feedback

RT.FAQ-136921
Algumas vezes é necessário executar rotinas pesadas e consequentemente lentas para ajustar algum legado que podem levar muito tempo (até mesmo dias) para serem executadas. Nestes casos pode-se optar por algum artifício que "quebre" a quantidade de registros em vários lotes pequenos separados por um pequeno intervalo de tempo para não "derrubar" o servidor.

Veja o exemplo Groovy abaixo:

import br.com.eligo.ent.*;
import br.com.telescope.adsrt.lib.RecordNotFoundException;
import br.com.telescope.util.Db;

// pequena pausa
Thread.sleep(2000);

// Criar/consultar preferência que retorna a data de início
EntPreferencias pref = new EntPreferencias(ctx);
try {
   pref.findByPreferencia("000_FIFO");
} catch (RecordNotFoundException ex) {
   pref.setPreferencia("000_FIFO");
   pref.setValor("2000-01-01");
   pref.ins();
}

// Busca a próxima data a ser processada
Date d = Db.getFirst(Date.class,
    "select min(data_movimento)"
    + " from movimentos_estoques"
    + " where data_movimento > '"
    + pref.valueOfValor() + "'", );

// Se não tem mais nada, terminou!
if (d == null) {
   return;
}

// Processa o que tem para processar na data
int i = 0;
mov = new EntMovimentosEstoques(ctx);
mov.filterBy().equal(mov.getDataMovimento(), d);
while (mov.next()) {
   mov.criarConsumosFifo();
   i++;
}

// Informa o que foi feito
ctx.p(d.toString() + " - " + i + " consumos realizados!");

// Salva a preferência indicando a data do que já foi feito
pref.setValor(d.toString());
pref.upd();

// Repete a própria rotina (até não encontrar mais o que fazer)
// IMPORTANTE: TROCAR O ID ABAIXO PELO ID DESTA ROTINA CUSTOM
ctx.p("<" + "script>window.open('?Z_ACTION=EXECUTAR&A_ID=8428892','_self');<" + "/script>");

Atenção
Observar o ID da ultima linha do script que deve ser substituído pelo ID da respectiva rotina custom