[firebase-br] RES: campos do tipo Time calculados.

Daniel / Tecnobyte temp em tecnobyte.com.br
Seg Dez 4 19:23:11 -03 2006


Eu costumo usar campos COMPUTED (calculados no banco de dados) como abaixo 
sempre que estes dados são usados com frequência em consultas e relatórios. 
Isto simplifica muito na implementação da aplicação cliente. Ainda assim há 
casos em que eu coloco campos calculados (calculated) na aplicação quando a 
atualização do cálculo precisa ser feita antes de salvar o registro 
corrente.

ALTER TABLE Pedido
  ADD SubTotal    NUMERIC(18,2) COMPUTED(
    (SELECT SUM(Total) FROM PedidoItem WHERE Pedido_Id = Pedido.Id)),
  ADD ValorIPI    NUMERIC(18,2) COMPUTED(
    (SELECT SUM(ValorIPI) FROM PedidoItem WHERE Pedido_Id = Pedido.Id)),
  ADD Total       NUMERIC(18,2) COMPUTED(SubTotal + ValorIPI);

Às vezes faço algumas coisas mais complexas com campos COMPUTED também, como 
mostrado a seguir. Mesmo assim a escolha para usar ou não campos calculados 
no banco depende de muitos fatores.

SET TERM ^ ;

CREATE PROCEDURE Proc_PedidoItemDescto(PedidoItem_Id INTEGER)
  RETURNS(Descto NUMERIC(9,4)) AS
DECLARE VARIABLE TempDescto NUMERIC(4,2);
BEGIN
  Descto = 100;
  FOR
    SELECT Descto FROM PedidoItemDescto
    WHERE PedidoItem_Id = :PedidoItem_Id
    INTO :TempDescto
  DO
  BEGIN
    Descto = Descto * (1 - :TempDescto / 100.0000);
  END
  Descto = 100 - Descto;
  SUSPEND;
END^

SET TERM ; ^

ALTER TABLE PedidoItem
  ADD SubTotal    NUMERIC(18,2) COMPUTED(Quantidade * PrecoVenda),
  ADD Descto      NUMERIC(9,4)  COMPUTED(
    (SELECT Descto FROM Proc_PedidoItemDescto(PedidoItem.Id))),
  ADD ValorDescto NUMERIC(18,2) COMPUTED(SubTotal * Descto / 100),
  ADD Total       NUMERIC(18,2) COMPUTED(SubTotal - ValorDescto),
  ADD ValorIPI    NUMERIC(18,2) COMPUTED(Total * IPI / 100);

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br


----- Original Message ----- 
From: "Gianclaudio Oliveira" <gianclaudiooliveira em yahoo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, December 04, 2006 12:39 AM
Subject: Re: [firebase-br] RES: campos do tipo Time calculados.


Neste caso, você poderia usar uma trigger mesmo.
Mas ainda assim é bom analisar para verificar se é interessante mesmo 
armazenar esta informação calculada ou fazer o cálculo nas consultas. Pois 
dependendo do caso você pode ter uma ocupação de espaço desnecessária. Por 
exemplo:

Se eu tenho uma tabela com registro de vendas de produtos, eu posso colocar 
um campo para o código do produto, um para a quantidade e outro para o valor 
unitário da venda. Seria COD, QTD e PRECO_UNIT.
O total desta venda, que seria PRECO_UNIT x QTD, eu posso colocar num campo 
PRECO_TOTAL ou então fazer esse cálculo nas consultas mesmo, tipo:

select COD, QTD, PRECO_UNIT, (PRECO_UNIT * QTD) as PRECO_TOTAL from VENDAS 
where xxxxxxxx....

Não tenho certeza se haveria necessidade de dar um Cast em um dos campos 
envolvidos no cálculo mas não importa muito, é só um exemplo bobo.
O que importa é que eu fiz o cálculo direto na consulta.
Se este cálculo for algo mais complexo, pode colocá-lo dentro de uma SELECT 
SP. Ex.:

select COD, QTD, PRECO_UNIT, SP_TOTAL (PRECO_UNIT, QTD) from VENDAS where 
xxxxxxxx....

Se não souber como montar SPs ou TRIGGERS, leia:

http://www.comunidade-firebird.org/cflp/downloads/CFLP_T003.PDF

Existem também diversos artigos que falam sobre o assunto no site da 
Firebase.

Boa sorte :)

Renato Lorandi <renatolorandi em brturbo.com.br> escreveu: --> na verdade 
amigos estes dados além de ser mostrados na aplicação eles
serão sim armazenados em banco inclusive são cálculos na mesma tabela para
prencher um outro campo da tabela..




______________________________________________
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



---------------------------------
 Yahoo! Search
 Música para ver e ouvir: You're Beautiful, do James Blunt
______________________________________________
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