[firebase-br] Gostaria da opinião de vocês sobre esta SP

Andrei Luís compuvale.software em gmail.com
Seg Nov 7 22:11:11 -03 2005


Boa noite a todos,

Estou engatinhando no mundo das SPs e gostaria da opnião dos colegas
sobre a SP ae abaixo.

O objetivo é o seguinte: esta SP será disparada junto ao Select de
produtos, sendo que a mesma retornará o custo do produto. Tenho duas
situações no cad de produtos, que é diferenciado pelo campo montado:
se for 'F' (false) é produto "simples" se for 'T' (true) é produto
montado. Ex.: um HD seria 'F', já um computador completo seria 'T'.
Quando o produto é montado, ele tem em uma outra tabela (romaneios)
uma lista de produtos que ele contém. Aí eu montei o monstrinho ae
abaixo, que acaba fazendo uma chamada recursiva a ela mesma...

E quanto a essa questão de chamada recursiva? Hoje os produtos que
estão cadastrados (dados reais) requerem no máximo três chamadas
recursivas. Li quer o limite do FB seriam de 1000 chamadas. Isto está
correto ou terei algum problema? Até agora os testes que fiz estão OK.

Eis a dita cuja:

CREATE PROCEDURE CALC_CUSTO_PRODUTOS (
    WPRODUTO_ID INTEGER,
    WMONTADO CHAR(1),
    WFORNECEDOR_ID INTEGER)
RETURNS (WCUSTO NUMERIC(9,2))
AS
DECLARE VARIABLE WICMS NUMERIC(9,2);
DECLARE VARIABLE WPRODUTO_ID2 INTEGER;
DECLARE VARIABLE WCUSTOPARCIAL NUMERIC(9,2);
begin
  wCusto=0;
  if (wMontado='F') then  /* Se **** NÃO **** FOR UM PRODUTO MONTADO */
     begin
        select icms from agenda where
agenda.registro_id=:wFornecedor_id into :wICMS;
        select (valor_compra *
(1-(:wICMS/100)))+(valor_Compra*(IPI/100)) from produtos
             where registro_id=:wproduto_id into wcusto;
     end
  if (wMontado='T') then   /* Se **** FOR **** UM PRODUTO MONTADO */
     begin
        for Select produto_id, (qtde * (Select wCusto
                            from Calc_Custo_Produtos(romaneios.produto_id,
                                                     (Select montado
from produtos where produtos.registro_id=romaneios.produto_id),
                                                     (Select
fornecedor_id from produtos where
produtos.registro_id=romaneios.produto_id)))) as custo
        from romaneios where montagem_id=:wproduto_id
        into :wproduto_id2, :wcustoparcial
        do
           wcusto=:wcusto+:wcustoparcial;
     end
  suspend;
end

--
[]s
Andrei

W2K + D4 Pro + FB 1.5.2 + IBO 4.5B




Mais detalhes sobre a lista de discussão lista