Res: [firebase-br] Sequencial através de store procedure
Arlei Ferreira Farnetani Junior (Farsoft)
junior em farsoft.com.br
Sex Jul 20 18:16:31 -03 2007
mudei um pouco a store procedure para obter mais
recursos...segue as alterações:
CREATE PROCEDURE INCLUIR_ORCAMENTO (
vfilial integer,
vis_cfopoperacao integer,
vcfop varchar(5),
vis_setor integer,
vis_setordestino integer)
returns (
ok integer
)
as
declare variable nomeCampo varchar(32);
declare variable id double precision;
declare variable idOrcamento double precision;
begin
/* NOME + FILIAL + TIPO */
nomeCampo='ID_ORC_'||vfilial||'_'||vis_cfopoperacao;
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=:nomeCampo
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 (:nomeCampo, 1);
id=1;
end
else
begin
/* Atualiza a variavél valor para o determinado campo */
update CONTROLE
set
VALOR=:id
where campo=:nomeCampo;
end
/* Inclui um registro na tabela orcamentos */
if (vis_setordestino>0) then
begin
INSERT INTO ORCAMENTOS (ID_ORCAMENTO, CONTROLE, IS_FILIAL, DATA, STATUS,
FATURADO, IS_CFOPOPERACAO, CFOP, IS_SETORESTOQUE, IS_SETORESTOQUE_DESTINO)
VALUES (:idOrcamento, :id, :vfilial, (SELECT current_date FROM RDB$DATABASE)
'A','N', :vis_cfopoperacao, :vcfop, :vis_setor,:vis_setordestino);
end
else
begin
INSERT INTO ORCAMENTOS (ID_ORCAMENTO, CONTROLE, IS_FILIAL, DATA, STATUS,
FATURADO, IS_CFOPOPERACAO, CFOP, IS_SETORESTOQUE, IS_SETORESTOQUE_DESTINO)
VALUES (:idOrcamento, :id, :vfilial, (SELECT current_date FROM RDB$DATABASE)
'A','N', :vis_cfopoperacao, :vcfop, :vis_setor,null);
end
/* retorna o valor do id da PK para jogar como parametro para editar a
tabela */
ok = idOrcamento;
suspend;
end
-------Mensagem original-------
De: Arlei Ferreira Farnetani Junior (Farsoft)
Data: 07/20/07 17:56:31
Para: FireBase
Assunto: [firebase-br] Sequencial através de store procedure
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)...
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço http://mail.firebase
com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista