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>");
}