[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