[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