[firebase-br] Idéia para montagem de prefixos para códigos

Sandro Souza escovadordebits em gmail.com
Qua Maio 20 10:33:26 -03 2009


Bom dia/tarde Marcelo.

Vamos fazer um exemplo.

Primeiro, vamos criar uma tabela de grupos de produtos (apenas ilustrativa):

CREATE TABLE GRUPOS(
  CODIGO INTEGER NOT NULL,
  DESCRICAO VARCHAR(100) NOT NULL,
  PREFIXO VARCHAR(2) NOT NULL,
  CONSTRAINT PK_GRUPOS PRIMARY KEY(CODIGO),
  CONSTRAINT UK_GRUPOS_DESCRICAO UNIQUE(DESCRICAO),
  CONSTRAINT UK_GRUPOS_PREFIXO UNIQUE(PREFIXO));

Agora vamos criar uma tabela de produtos (ilustrativa):

CREATE TABLE PRODUTOS(
  CODIGO INTEGER NOT NULL,
  GRUPO INTEGER NOT NULL,
  DESCRICAO VARCHAR(100) NOT NULL,
  CODIGO_ALFA VARCHAR(5) DEFAULT '' NOT NULL,
  CONSTRAINT PK_PRODUTOS PRIMARY KEY(CODIGO),
  CONSTRAINT UK_PRODUTOS_DESCRICAO UNIQUE(DESCRICAO),
  CONSTRAINT UK_PRODUTOS_CODIGO_ALFA UNIQUE(CODIGO_ALFA),
  CONSTRAINT FK_PRODUTOS_GRUPOS FOREIGN KEY (GRUPO) REFERENCES GRUPOS);

Agora uma trigger para essa tabela de produtos:

Coloquei os comentários sem acentuação porque o FlameRobin de linux não está
exibindo o código fonte das stored procedures nem das triggers que tem
alguma acentuação em seu código.

SET TERM ^ ;

CREATE OR ALTER TRIGGER TR_PRODUTOS_BI0
FOR PRODUTOS ACTIVE BEFORE INSERT POSITION 0 AS
DECLARE VARIABLE ULTIMO_CODIGO VARCHAR(5);
DECLARE VARIABLE VALOR INTEGER;
BEGIN
  -- Obtem o maior codigo utilizado pelos produtos do mesmo grupo de
produtos.
  SELECT MAX(CODIGO_ALFA) FROM PRODUTOS WHERE GRUPO = NEW.GRUPO INTO
:ULTIMO_CODIGO;
  -- Esse eh o primeiro produto nesse grupo de produtos?
  IF (ULTIMO_CODIGO IS NULL) THEN
  BEGIN
    -- Obtem o prefixo do respectivo grupo de produtos.
    SELECT PREFIXO FROM GRUPOS WHERE CODIGO = NEW.GRUPO INTO :ULTIMO_CODIGO;
    -- Utiliza o primeiro codigo disponivel dentro desse grupo de produtos.
    ULTIMO_CODIGO = ULTIMO_CODIGO || '001';
  END -- IF
  ELSE
  BEGIN
    -- Obtem o valor do maior codigo utilizado e calcula o proximo codigo a
ser utilizado.
    VALOR = CAST(SUBSTRING(ULTIMO_CODIGO FROM 3 FOR 3) AS INTEGER) + 1;
    -- Gera o codigo do novo produto dentro desse grupo de produtos.
    ULTIMO_CODIGO = SUBSTRING(ULTIMO_CODIGO FROM 1 FOR 2) || (CASE WHEN
VALOR < 10 THEN '00' WHEN VALOR < 100 THEN '0' ELSE '' END) || VALOR;
  END -- ELSE
  -- Atribui o novo codigo do novo produto dentro desse grupo de produtos.
  NEW.CODIGO_ALFA = ULTIMO_CODIGO;
END^

SET TERM ; ^

Agora é só testar.

INSERT INTO GRUPOS(CODIGO,DESCRICAO,PREFIXO)VALUES(1,'Roupeiros','RP');
INSERT INTO GRUPOS(CODIGO,DESCRICAO,PREFIXO)VALUES(2,'Camas','CM');

COMMIT;

INSERT INTO PRODUTOS(CODIGO,GRUPO,DESCRICAO)VALUES(1,1,'Pijama');
INSERT INTO PRODUTOS(CODIGO,GRUPO,DESCRICAO)VALUES(2,1,'Roupão');
INSERT INTO PRODUTOS(CODIGO,GRUPO,DESCRICAO)VALUES(3,2,'Cama de casal');
INSERT INTO PRODUTOS(CODIGO,GRUPO,DESCRICAO)VALUES(4,2,'Cama de solteiro');

COMMIT;

SELECT * FROM GRUPOS;

SELECT * FROM PRODUTOS;

Espero ter ajudado mais que atrapalhado. :D

2009/5/19 Marcelo Geyer <estanisgeyer em gmail.com>

> Boa noite,
>
> Preciso trocar uma idéia com os colegas para verificar a melhor forma de
> fazer o que desejo sem prejudicar o banco de dados.
> Tenho em minha aplicação grupos de produtos e a possibilidade de incluir
> prefixos para formar código de produtos, baseado no grupo em que ele se
> encontra. Por exemplo, o grupo Roupeiros tem o prefixo "RP", o grupo Camas
> tem o prefixo "CM" e assim vai. Ao cadastrar um novo produto, o código é
> montado, por exemplo RP001, RP002, CM001...
>
> Hoje, para conseguir montar isso, ao incluir um novo grupo de produtos e
> definido um um prefixo, automaticamente é criado um novo generator, por
> exemplo (GRUPOPRODUTO_PREFIX_1) para que ele faça esse papel de montar o
> código do produto. Esse "1" no final do nome do generator associo ao ID do
> grupo de produtos para saber que este generator pertence ao referido grupo
> de produtos.
>
> Então imaginem, se tenho 20 grupos de produtos, terei 20 generators, não
> estou achando muito elegante isso. Pensei em criar um campo inteiro na
> tabela de grupos de produtos e ir incrementando para conseguir montar o
> código do produto, mas com isso não se tem muita consistência. Alguém tem
> alguma sugestão ou o que eu estou fazendo já é o melhor a se fazer neste
> caso?
>
> Abraços e obrigado pela ajuda.
>
> --
> Marcelo E. Geyer
> Standard Net Tecnologia e Informação
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista