|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
valdimari Novato
Registrado: Segunda-Feira, 26 de Fevereiro de 2007 Mensagens: 19
|
Enviada: Qui Mai 23, 2013 4:28 pm Assunto: Buscando Matéria-Prima |
|
|
Pessoal,
Boa Tarde !!!
O cenário que tenho aqui é o seguinte:
Banco de Dados Firebird.
Os produtos de venda da empresa na sua maioria são compostos por outros produtos ou por matéria-prima diretamente.
Quando ele é composto por outros produtos, estes podem ter novos produtos em sua composição ou matéria-prima.
Exemplificando:
Para montagem de um carro temos o chassi, a carroceria e o motor;
O motor posso comprá-lo pronto ou montá-lo, se for montá-lo preciso das matérias-primas dele, pistões, válvulas, motor de arranque, carcaça, etc...
O motor de arranque pode vir inteiro ou montá-lo: rolamento, cobre, etc...
Usando esta linha de raciocínio, existem duas tabelas uma do produto e outra de associação do produto aos seus componentes.
O componentes que tem o seu código iniciado por 4 ou 5 são produtos e devem ter seus componentes.
Eu preciso chegar nos componentes que são matérias-primas puras, ou seja, que não são compostas por outra, e consequentemente não iniciam por 4 ou 5, de uma forma mais direta, ou usando uma view ou usando uma store procedure.
Segue abaixo as query´s simples que usei para chegar no que preciso:
select comp_avda.codest, comp_avda.qtde, comp_avda.unid from arvore_vda
left join comp_avda as comp_avda on arvore_vda.arvore_id = comp_avda.arvore_id
where arvore_vda.codvda = 'B1225001300211';
CODEST QTDE UNID
50202303 2,000 PC
50706105 1,000 PC
select comp_avda.codest, comp_avda.qtde, comp_avda.unid from arvore_vda
left join comp_avda as comp_avda on arvore_vda.arvore_id = comp_avda.arvore_id
where arvore_vda.codest = '50706105';
CODEST QTDE UNID
59500003 0,280 KG
59501400 0,280 KG
select comp_avda.codest, comp_avda.qtde, comp_avda.unid from arvore_vda
left join comp_avda as comp_avda on arvore_vda.arvore_id = comp_avda.arvore_id
where arvore_vda.codest = '59501400';
CODEST QTDE UNID
23222003 0,087 KG
11311468 0,679 KG
11319104 0,264 KG
Se alguém puder ajudar agradeço...
Abraços... |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
|
Voltar ao Topo |
|
|
valdimari Novato
Registrado: Segunda-Feira, 26 de Fevereiro de 2007 Mensagens: 19
|
Enviada: Qui Mai 23, 2013 4:59 pm Assunto: |
|
|
Imex,
Boa Tarde !!!
Utilizo o Firebird versão 2.1. |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mai 23, 2013 5:36 pm Assunto: |
|
|
Tente fazer um teste com a query abaixo através do IBExpert ou outra ferramenta semelhante para ver se é obtido o resultado desejado (talvez seja necessário adicionar um filtro no último Select):
Código: | with recursive CTE_R as
(
select
comp_avda.codest,
comp_avda.qtde,
comp_avda.unid
from arvore_vda
inner join comp_avda as comp_avda
on arvore_vda.arvore_id = comp_avda.arvore_id
where arvore_vda.codvda = 'B1225001300211'
union all
select
comp_avda.codest,
comp_avda.qtde,
comp_avda.unid
from CTE_R as r
inner join arvore_vda
on arvore_vda.codest = r.codest
inner join comp_avda as comp_avda
on arvore_vda.arvore_id = comp_avda.arvore_id
)
select * from CTE_R |
Espero que seja útil. |
|
Voltar ao Topo |
|
|
valdimari Novato
Registrado: Segunda-Feira, 26 de Fevereiro de 2007 Mensagens: 19
|
Enviada: Qui Mai 23, 2013 5:51 pm Assunto: |
|
|
Imex,
colocando o filtro no ultimo select deu certo.
select * from CTE_R where substring(codest from 1 for 1) not in ('4','5')
Mas vou realizar mais testes amanhã para ter certeza e poder fechar o tópico.
Agora o ideal é colocá-la em uma view ou em um store procedure para poder facilitar nos parametros ???
Mas já deixo o meu muito obrigado...
Abraços... |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mai 23, 2013 6:36 pm Assunto: |
|
|
Blz. Sobre a View ou SP, não acho necessário mas também não vejo nenhum problema; fica a seu critério.
Abraço |
|
Voltar ao Topo |
|
|
valdimari Novato
Registrado: Segunda-Feira, 26 de Fevereiro de 2007 Mensagens: 19
|
Enviada: Ter Jun 04, 2013 3:25 pm Assunto: |
|
|
Imex,
Boa Tarde !!!
Naquela query que você me passou testei está funcionando bem, está me dando a quantidade final da matéria-prima, por exemplo:
CODEST QTDE UNID
22291080 1,000 PC
23222003 0,087 KG
11311468 0,679 KG
11319104 0,264 KG
Será que conseguiria fazer a multiplicação por cada camada (formulação), do produto???
Por exemplo:
O produto A vendi 3 unidades
ele é formado pelos produtos B - 2 unids e C - 0,5
o produto B é formado do produto D - 5
e o produto C do E - 0,264 e o F - 1.
Por tanto no query tenho que chegar em:
D - 5 * 2 * 3 = 30 unids para produzir as 3 unidades de A
E - 0,264 * 0,5 * 3 = 0,396 unids
F - 1 * 0,5 * 3 = 1,5 unids
Tentei realizar as multilicações, mas não estou conseguindo chegar... |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Jun 04, 2013 3:57 pm Assunto: |
|
|
Experimente fazer um teste dessa forma:
Código: | with recursive CTE_R as
(
select
comp_avda.codest,
comp_avda.qtde,
comp_avda.unid,
comp_avda.qtde as QtdeTotal
from arvore_vda
inner join comp_avda as comp_avda
on arvore_vda.arvore_id = comp_avda.arvore_id
where arvore_vda.codvda = 'B1225001300211'
union all
select
comp_avda.codest,
comp_avda.qtde,
comp_avda.unid,
comp_avda.qtde * r.QtdeTotal
from CTE_R as r
inner join arvore_vda
on arvore_vda.codest = r.codest
inner join comp_avda as comp_avda
on arvore_vda.arvore_id = comp_avda.arvore_id
)
select * from CTE_R |
Espero que ajude. |
|
Voltar ao Topo |
|
|
valdimari Novato
Registrado: Segunda-Feira, 26 de Fevereiro de 2007 Mensagens: 19
|
Enviada: Ter Jun 04, 2013 4:48 pm Assunto: [RESOLVIDO] |
|
|
Imex,
É isso mesmo.
Valeu.
Valdimari Martins. |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|