[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