[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