ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Buscando Matéria-Prima

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
valdimari
Novato
Novato


Registrado: Segunda-Feira, 26 de Fevereiro de 2007
Mensagens: 19

MensagemEnviada: Qui Mai 23, 2013 4:28 pm    Assunto: Buscando Matéria-Prima Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mai 23, 2013 4:51 pm    Assunto: Responder com Citação

Boa tarde,

Qual versão do Firebird você está utilizando?

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-venda-são_paulo-residencial-sobrado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
valdimari
Novato
Novato


Registrado: Segunda-Feira, 26 de Fevereiro de 2007
Mensagens: 19

MensagemEnviada: Qui Mai 23, 2013 4:59 pm    Assunto: Responder com Citação

Imex,

Boa Tarde !!!

Utilizo o Firebird versão 2.1.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mai 23, 2013 5:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valdimari
Novato
Novato


Registrado: Segunda-Feira, 26 de Fevereiro de 2007
Mensagens: 19

MensagemEnviada: Qui Mai 23, 2013 5:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mai 23, 2013 6:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valdimari
Novato
Novato


Registrado: Segunda-Feira, 26 de Fevereiro de 2007
Mensagens: 19

MensagemEnviada: Ter Jun 04, 2013 3:25 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jun 04, 2013 3:57 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valdimari
Novato
Novato


Registrado: Segunda-Feira, 26 de Fevereiro de 2007
Mensagens: 19

MensagemEnviada: Ter Jun 04, 2013 4:48 pm    Assunto: [RESOLVIDO] Responder com Citação

Imex,

É isso mesmo.

Valeu.

Valdimari Martins.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB