Cadastros de produtos e Serviços

Reorganizar a numeração de produtos com faixas livres de código

PROD.FAQ-126416
Em casos onde os códigos de produtos precisam ser ajustados e/ou deseja-se aproveitar faixas de sequências que não foram utilizadas, podem ser utilizados alguns recursos como os apresentados a seguir.

Este documento não é um roteiro "pronto". Ele deve ser utilizado apenas como referência;

Criar uma tabela numérica indexada

O código do produto pode ser alfanumérico. Este roteiro permite trabalhar apenas com os produtos que tem um código numérico.
Por isso, a primeira coisa a ser feita é criar uma tabela temporária com os códigos dos produtos que são numéricos:

create table tmp_produtos as
select produto::int8
from produtos
where produto ~ '^[0-9]+$';

create index ak_tmppr on tmp_produtos (produto);

Descobrir as maiores faixas "livres"

Para descobrir onde existem faixas de numeração que não foram utilizadas, execute o SQL abaixo:

select p1 + 1 as inicio
, p2 - 1 as fim
, (p2 - p1) - 1 as tamanho
from (
select a.produto p1
, (select b.produto
   from tmp_produtos b
   where b.produto > a.produto
   order by b.produto
   limit 1) as p2
from tmp_produtos a
) q
where (p2 - p1) > 100
order by 3 desc
limit 100;

Revisar ranges disponíveis nas sequencias dos slaves

Alguns dos ranges indicados serão justamente os ranges disponibilizados nos SLAVES. Estes ranges já estão "programados" e não devem ser utilizados.
O que pode ser feito, é configurar manualmente o range secundário de um slave para utilizar um dos ranges identificados acima.

Resequenciar os códigos de produtos

Uma vez que as sequences estiverem organizadas, podemos ajustar e executar o script (Groovy) abaixo para substituir o código do produto por um novo valor de sequencia.

import br.com.telescope.util.Db;
import br.com.eligo.ent.EntProdutos;

String sql = "select p.*" +
         " from tmp_produtos t" +
         " join produtos p on p.produto = t.produto::text" +
         " where t.produto >= 800000" +
         " limit 50";

List<EntProdutos> list = Db.getList(EntProdutos.class, sql);
for (RecordMap rec : list) {
    ctx.p(rec.valueOfProduto() + " para ");
    rec.setProduto(ctx.getNextVal("SEQ_PRODUTO"));
    rec.upd();
    ctx.p(rec.valueOfProduto() + "<br>");
}