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