[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