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

Andrei Luís compuvale.software em gmail.com
Sex Nov 11 13:34:04 -03 2005


Bem, passado a febre do Curso Delphi/Firebird vou repetir minha msg:


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 de dentro da aplicação
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 dependendo do parâmetro de entrada 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)
RETURNS (
    WCUSTO NUMERIC(9,2))
AS
DECLARE VARIABLE WPRODUTO_ID2 INTEGER;
DECLARE VARIABLE WCUSTOPARCIAL NUMERIC(9,2);
DECLARE VARIABLE WICMS NUMERIC(9,2);
DECLARE VARIABLE WMONTADO CHAR(1);
DECLARE VARIABLE WFORNECEDOR_ID INTEGER;
begin
  wCusto=0;
  Select montado, fornecedor_id from produtos where
produtos.registro_id=:wproduto_id into :wmontado, :wfornecedor_id;
--  Select fornecedor_id from produtos where
produtos.registro_id=:wproduto_id into :wfornecedor_id;
  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 Coalesce((valor_compra *
(1-(:wICMS/100)))+(valor_Compra*(IPI/100)),0) from produtos
             where registro_id=:wproduto_id into wcusto;
     end
  if (wMontado='T') then   /* Se **** FOR **** UM PRODUTO MONTADO */
     begin
        for Select produto_id, Coalesce((qtde * (Select wCusto
                            from Calc_Custo_Produtos(romaneios.produto_id))),0)
        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