[firebase-br] RES: campos do tipo Time calculados.
Eduardo Jedliczka (TeamFB)
jedyfb em gmail.com
Ter Dez 5 12:40:52 -03 2006
Muito interessante esta abordagem, mas quando envolve muitas vezes a mesma
tabela (como o SubTotal e ValorIPI) pode ficar um pouquinho lento.
Nestes casos, eu faria uma SP que retornasse todos os dados necessários
(totalizando tudo numa única passada).
Mas Já experimentei esta abordagem (computed by) quando precisava exibir
apenas uma parte de um Blob do tipo TEXTO, e neste caso o ganho de
desempenho foi absurdo.
======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================
"Posso não concordar com nada do que dizes.
Mas defenderei até a morte o seu direito de dizê-lo"
(Voltaire 1694-1778)
----- Original Message -----
From: "Daniel / Tecnobyte" <temp em tecnobyte.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, December 04, 2006 7:23 PM
Subject: Re: [firebase-br] RES: campos do tipo Time calculados.
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
______________________________________________
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