[firebase-br] RES: RES: Composição de produtos, select recursivos e afins...

lazaro lazaro em usinaalvorada.com.br
Ter Abr 28 15:00:02 -03 2009


Fiz augo mais ou menos recursivo, pega o exemplo e implemente no seu caso.

/*seleciona em uma tabela tando codigo do produto ou codigo original*/


for SELECT catalogo.cod_produto, catalogo.cod_original
 FROM CATALOGO
  WHERE ((COD_PRODUTO = :cod)or (COD_ORIGINAL = :cod))
  into :vprod1, :vprod2
do
 begin
    for SELECT catalogo.marca "Marca", catalogo.cod_original "Codigo
Original",
           catalogo.cod_produto "Chave"
     FROM CATALOGO
      WHERE ((COD_PRODUTO = :vprod1)or (COD_ORIGINAL = :vprod2))
      into :marca, :cod_origianl, :chave
    do
    SUSPEND;

 end
end

_________________________________________________


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Lucas Zampar
Enviada em: terça-feira, 28 de abril de 2009 14:19
Para: FireBase
Assunto: Re: [firebase-br] RES: Composição de produtos, select recursivos e
afins...

Olá Lázaro, Creio que não é possível adotar essa abordagem, pois no meu 
caso,
o sistema terá de permitir a inclusão de quantos níveis eu precisar, 
sendo que em
cada nível podem haver produtos comerciais, como compostos vindos de 
outros níveis.

Estou escrevendo dois triggers que aparentemente resolveram o problema 
da soma
final dos ítens, porém quando altero o custo de algum componente da 
composição, a
atualização não é propagada (é claro). Existe algum meio de chamar uma 
espécie de
"trigger recursivo" afim de atualizar todas as dependências?

Segue anexo o trigger que roda sempre que altero a composição do produto:
CREATE OR ALTER trigger produtocomposicao_up_custofinal for 
produtocomposicao
active after insert or update or delete position 0
AS
begin
   /* Atualiza o custo_final ao alterar estrutura do produto */
   /* Roda após update com sucesso */
   /* new.codigoproduto => Key a ser utilizada nos updates   */

   update produto
     set produto.custofinal =
         (
             select
                 SUM(B.quantidade * A.custofinal)

                 from produtocomposicao B left join produto A on 
(B.codigoprodutoadicionado = A.codigo)
                 where B.codigoproduto = new.codigoproduto
          )

     where produto.codigo = new.codigoproduto;

end

Alguém sabe me dizer como pode ser utilizado o select with recursive? 
Ele resolveria o meu problema?


Muito obrigado,


Lucas Zampar
> Amigo simplifica sua vida...
> Faz um tabela mestre produtos com uma chave primaria e tudo
> Coloca um atributo Tipo_produto 'P','k','s'
> Sendo p=produto, K=kit, S= serviço
> Quando for kit vc vende os itens da tabela kit (PRODUTOCOMPOSICAO), se for
p
> então vende normalmente e assim sucessivamente.
>
> Foi assim que fiz a 2 anos atrás, em um sistema para bicicletaria.
>
>
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
Em
> nome de Lucas Zampar
> Enviada em: terça-feira, 28 de abril de 2009 12:43
> Para: lista em firebase.com.br
> Assunto: [firebase-br] Composição de produtos, select recursivos e
afins...
>
> Bom dia senhores,
>
>
> Estou tentando resolver um problema há vários tinhas porém sem sucesso.
> Na empresa em que trabalho, vendemos produtos que podem ser compostos
> ou  simplesmente comerciais.
> O problema está sendo eu criar a árvore de relacionamento de produtos
> compostos.
>
> Por exemplo:
> Um HD é um produto tipo = "C", pois é comercial e não tem estrutura de
> composição.
> Uma MEM RAM é um produto tipo = "C", pois é comercial e não tem
> estrutura de composição.
> Um GABINETE é um produto tipo = "C", pois é comercial e não tem
> estrutura de composição.
>
> Os produtos manufaturados são do tipo = "M", exemplo:
>
> Já um COMPUTADOR MOD1 tem em sua composição:
> 1 HD
> 2 MEM RAM
> 1 GABINETE
>
> Um COMPUTADOR MOD2 tem em sua composição:
> 2 HD
> 1 MEM RAM
> 1 GABINETE
>
> Já um SERVIDOR tem sua composição:
> 1 COMPUDATOR MOD1
> 2 HD
> 2 MEM RAM
>
> Observem que tenho de ter n níveis e adicionar vários produtos tanto
> comerciais, como compostos.
> Sabendo que todos produtos compostos são feitos de comerciais...
>
> Segue em anexo as DDL das minhas duas tabelas:
>
> CREATE TABLE PRODUTO (
>       CODIGO                INTEGER NOT NULL,
>       TIPO                  VARCHAR(1),
>       CODPRODUTO            VARCHAR(16),
>       DESCRICAO             VARCHAR(255),
>       QUANTIDADEATUAL       NUMERIC(6,2),
>       QUANTIDADEMINIMA      NUMERIC(6,2),
>       PESO                  NUMERIC(3,2),
>       CUSTOCOMPRA           NUMERIC(9,3),
>       CUSTOFINAL            NUMERIC(9,3),
>       PRECOVENDA            NUMERIC(9,3),
>       IPI                   NUMERIC(5,2),
>       MARKUP                NUMERIC(5,2),
>       MEDIDAS               VARCHAR(15),
>       LOCALIZACAO           VARCHAR(4),
>       OBS                   VARCHAR(255),
>       DETALHAMENTOPROPOSTA  BLOB SUB_TYPE 1 SEGMENT SIZE 16384,
>       FOTOS                 BLOB SUB_TYPE 1 SEGMENT SIZE 16384,
>       UNIDADE               SMALLINT,
>       GRUPO                 SMALLINT
> );
>
>
> Minha tabela de relacionamentos:
>
> CREATE TABLE PRODUTOCOMPOSICAO (
>       CODIGO                   INTEGER NOT NULL,
>       CODIGOPRODUTO            INTEGER NOT NULL,
>       CODIGOPRODUTOADICIONADO  INTEGER NOT NULL,
>       QUANTIDADE               NUMERIC(9,3) NOT NULL
> );
>
>
> 1) Aí pergunto a vocês, estão estruturadas corretamente as minhas tabelas?
>
> 2) Como fazer para que o custo final de um produto composto sempre se
> mantenha atualizado através dos custos dos componentes comerciais?
>
> 3) Como realizar um select que me mostre a raiz de todos os componentes
> que compõem um produto composto?
> Ex:
>
> Composição do Servidor
> - 1 Computador MOD 1
> -- 1 HD
> -- 2 MEM RAM
> -- GABINENTE
> - 2 HD
> - MEM HD
>
> Atualmente tenho uma tabela que mantém o cadastro de produtos e outra
> que mantém o relacionamento entre eles.
> O preço de venda dos produtos compostos são calculados toda vez que é
> alterada a estrutura da tabela de relacionamento através de um trigger.
>
> Agradeceria muito quem pudesse me dar uma ajuda!
>
> E desculpem pelo longo e-mail!
>
>
> Atenciosamente,
>
>
> Lucas Zampar Bernardi
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>    

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista