[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