[firebase-br] Sequencial através de store procedure

Arlei Ferreira Farnetani Junior (Farsoft) junior em farsoft.com.br
Sex Jul 20 17:53:13 -03 2007


APLICAÇÃO N-TIER 

 

Pessoal, tenho a seguinte situação. Uma tabela ORCAMENTOS que pode 

se referir a VENDAS, COMPRAS, SERVIÇOS, etc... 

 

Nesta tabela terei uma PK id_orcamento e uma coluna CONTROLE (DOUBLE
PRECISION) 

que terá um sequencial para cada caso: 

 

VENDAS: 

00000001 

00000002 

00000003 

....e ai vai 

 

COMPRAS: 

00000001 

00000002 

....etc... 

 

Então eu poderei ter o seguinte resultado: 



ID_ORCAMENTO:     TIPO:             CONTROLE: 

1                                    VENDAS               1 

2                                    VENDAS               2 

3                                    COMPRAS            1 

4                                    DEVOLUÇOES    1 

 

No sistema não terá opçao para o usuário excluir a movimentação, apenas
cancela-la. Portanto o controle será feito por esta variável denominada
CONTROLE ok. 

 

Como todos sabemos, podemos adquirir o sequencial de várias maneiras, desde
a generators como através de outras funções (como por exemplo o do sistema
do Bruno da codegear = retornaId). 

 

Porém, preciso fazer um negócio que nao tem como por exemplo o sistema estar
num certo momento no numero 000100 e de repente já pular para o 000102,
faltando assim o numero 000101. 

 

Acredito eu ser a melhor maneira através de store procedure. Gostaria da
opinião de vcs a respeito. 

 

Abaixo segue a minha store procedure que será disparada no momento que o
usuário clique em INCLUIR. 

Onde assim que eu executá-la já darei um applyupdates e depois logo em
seguinda um tabelaorcamento.edit...para 

que o usuário continue com as possíveis implementações. 



CREATE PROCEDURE INCLUIR_ORCAMENTO ( 

vcampo varchar(32)) 

returns ( 

ok integer 

) 

as 

declare variable id double precision; 

declare variable idOrcamento double precision; 

begin 

ok=-1; 

 

/* Trata o campo ID_ORCAMENTO (PK) */ 

select coalesce(max(c.valor),-2)+1 from controle c 

where c.campo='ID_ORCAMENTO' 

into:idOrcamento; 

 

if (idOrcamento<=-1) then 

begin 

/* Inclui um registro para o campo ID_ORCAMENTO */ 

INSERT INTO CONTROLE (CAMPO, VALOR) 

VALUES ('ID_ORCAMENTO', 1); 

 

idOrcamento=1; 

end 

else 

begin 

/* Atualiza a variavél valor para o determinado campo */ 

update CONTROLE 

set 

VALOR=:idOrcamento 

where campo='ID_ORCAMENTO'; 

end 

 

/* Rotina para o campo CONTROLE */ 

select coalesce(max(c.valor),-2)+1 from controle c 

where c.campo=:vcampo 

into:id; 

 

ok=-1; 

 

if (id<=-1) then 

begin 

/* Inclui um registro para o determinado campo com id = 1 */ 

INSERT INTO CONTROLE (CAMPO, VALOR) 

VALUES (:vcampo, 1); 

 

id=1; 

end 

else 

begin 

/* Atualiza a variavél valor para o determinado campo */ 

update CONTROLE 

set 

VALOR=:id 

where campo=:vcampo; 

end 

 

/* Inclui um registro na tabela orcamentos */ 

INSERT INTO ORCAMENTOS (ID_ORCAMENTO, CONTROLE, DATA, STATUS, FATURADO) 

VALUES (:idOrcamento, :id, (SELECT current_date FROM RDB$DATABASE),'A','N');


 

/* retorna o valor do id da PK para jogar como parametro para editar a
tabela */ 

ok = idOrcamento; 

 

suspend; 

end









Para disparar a mesma utilizarei por exemplo:

select * from incluir_orcamento('ORC_1_2') 



onde o 1 é o código da filial e o 2 o código do tipo (VENDAS, COMPRAS, SERVIÇOS, etc)...




Mais detalhes sobre a lista de discussão lista