Re: [firebase-br] Sequencial através de store procedure
Kleber Caneva
kdcc em terra.com.br
Sáb Jul 21 12:18:19 -03 2007
Pelo que entendi, nessa tabela a PK será alimentada por Generator, não
correndo o risco de duplicidade. O seu problema encontra-se no campo
controle que vc precisará fazer um sequencial para cada tipo de orçamento.
Acredito que a Solução mais acertada seja criar um GENERATOR para a PK Ex:
GEN_ORCAMENTO
e outro para cada tipo de orçamento. Ex: GEN_ORC_VENDAS, GEN_ORC_COMPRAS,
GEN_ORC_SERVICOS
O Generator da PK você atribui normalmente como faz com outra tabelas.
Os demais generators vc cria um TG before insert na tabela de orçamento.
if (new.TIPO = 'VENDAS')
new.CONTROLE = GEN_ID(GEN_ORC_VENDAS,1);
else if (new.TIPO = 'COMPRAS')
new.CONTROLE = GEN_ID(GEN_ORC_COMPRAS,1);
else if (new.TIPO = 'SERVICOS')
new.CONTROLE = GEN_ID(GEN_ORC_SERVICOS,1);
Precisando de mais controles é só criar os generators e alterar a TG.
Com isso vc garante que não terá duplicidade nem conflito.
[]´s
Kléber Caneva
----- Original Message -----
From: "Arlei Ferreira Farnetani Junior (Farsoft)" <junior em farsoft.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, July 20, 2007 5:53 PM
Subject: [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
Esta mensagem foi verificada pelo E-mail Protegido Terra.
Scan engine: McAfee VirusScan / Atualizado em 20/07/2007 / Versão:
5.1.00/5079
Proteja o seu e-mail Terra: http://mail.terra.com.br/
Mais detalhes sobre a lista de discussão lista