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