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

Andrei Luís compuvale.software em gmail.com
Sex Nov 11 14:47:54 -03 2005


Kleber,

Lendo sua msg fiquei confuso, e talvez eu não esteja entendo o
conceito de recursividade, ou não entendi a sua msg :-).

A tabela de produtos está hoje com 2004 registros.
194 registros estão com montado='T'

Levando em conta os seguintes dados:

Tabela Produtos
Registro_id  Montado  Descricao
1                   F             PRODUTO A
2                   F             PRODUTO B
3                   F             PRODUTO C
4                   T             PRODUTO D
5                   T             PRODUTO E
6                   F             PRODUTO F

Romaneios
Registro_id   Montagem_id   Produto_id
1                      4                     2
2                      4                     6
3                      5                     1
4                      5                     4


Ou seja:
O PRODUTO D contem o PRODUTO B e o Produto F
O PRODUTO E contem o PRODUTO A e o PRODUTO D (que contem os PRODUTOS B e F)

O select abaixo está funcionando 100% junto com a procedure da minha
primeira msg:

Select registro_id, montado, CALC_CUSTO_PRODUTOS (registro_id) as Custo
from produtos

Agora a minha dúvida: a recursividade é a nível de registro ou a nível
de select?

Por que se for a nível de registro, OK, não terei problemas pois o
PRODUTO E, vai chamar a procedure no máximo 3 vezes, correto?

Se for a nível de select aí o bicho vai pegar com certeza.

Se for da segunda forma, acredito que seria uma limitação muito grande
do FB e aposto as minhas fichas que essa recursividade seja a nível de
registro...

Você ou + alguém sabe como é que isso acontece?

[]
Andrei



Em 11/11/05, Kléber Caneva<kdcc em terra.com.br> escreveu:
> Andrei,
>
> Acredito que o limite de chamadas recusivas, esteja considerando 1000 Niveis de recusividade.
>
> Não tenho certeza disso, mas eu utilizei SP com recusividade em um projeto de Maquinas Agricolas. Existiam muitos niveis, mas com certeza menos que 1000.
> Agora se considerar a quantidade de produtos (todos com estrutura abaixo) e esse varios niveis, com certeza ela era chamada muito mais de 1000 vezes.
>
> Talvez seja interessante realizar um teste, infelismente não tenho mais a base que possui esta SP. Então se você resolve fazer o teste, por favor publique os resultados na lista.
>
> []´s
>
> Kléber Canena
>
>
> ----- Original Message -----
> From: "Andrei Luís" <compuvale.software em gmail.com>
> To: "Firebase" <lista em firebase.com.br>
> Sent: Friday, November 11, 2005 1:34 PM
> Subject: [firebase-br] Gostaria da opinião de vocês sobre esta SP
>
>
> 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