Inquiridor
Recursão com duas Tabelas

Pergunta
-
Olá Pessoal Bom dia,
Estou com um problema um tanto complicado. Tenho uma sql que calcula o custo de um Produto que tem Matéria Prima. O cálculo é feito da seguinte forma:
1º Inicio com um Ponto de Partida (Produto que desejo saber o Custo)
2º Verico se esse produto tem Matéria Prima
3º Se o Item 2 for verdadeiro, então continuo verificando se o produto tem Matéria Prima até chegar em um que não tem
4º Depois eu Multiplico as quantidade das Matérias prima que a sql encontrou e multiplico pelo custo do produto que não tem materia prima (Item 3)
5º e por ultimo eu somo todos os custo para me retornar o total
No Meu Banco tem a tabela Produtos e a Tabela Filha Matéria Prima, com a sql que fiz ela está limite em apenas 5 Matéria da Matéria Prima
Elas estao Definidas da Seguinte Forma:
-- Produtos
Seqüência do Produto, Descrição, Valor de Custo
-- Matéria Prima
Seqüência do Produto, Seqüência da Matéria Prima, Quantidade
Gostaria de saber se existe uma forma de deixá-la mais reflexivel tipo uma Recursividade.
A SQL que fiz Limitada está a baixo:
SELECT SUM(Total) + SUM(Total) * 0.15 AS Total FROM (
SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], Total AS Total FROM (
SELECT [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5], SUM([Qtde 5] * [Custo 5]) AS Total FROM (
SELECT
P2.[Código Produto] AS [Produto 1],
MP1.[Qtde de Matéria Prima] AS [Qtde 1],
CASE WHEN P2.[Valor Custo] IS Null Then P1.[Valor Custo] ELSE P2.[Valor Custo] END AS [Custo 1],
P3.[Código Produto] AS [Produto 2],
CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 2],
CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END Else P3.[Valor Custo] END AS [Custo 2],
P4.[Código Produto] AS [Produto 3],
CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 3],
CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END Else P3.[Valor Custo] END Else P4.[Valor Custo] END AS [Custo 3],
P5.[Código Produto] AS [Produto 4],
CASE WHEN MP4.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 4],
CASE WHEN P5.[Valor Custo] IS Null Then CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 Else P2.[Valor Custo] END ELSE P3.[Valor Custo] END ELSE P4.[Valor Custo] END ELSE P5.[Valor Custo] END AS [Custo 4],
P6.[Código Produto] AS [Produto 5],
CASE WHEN MP5.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP4.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP3.[Qtde de Matéria Prima] IS Null THEN CASE WHEN MP2.[Qtde de Matéria Prima] IS Null THEN MP1.[Qtde de Matéria Prima] ELSE MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END ELSE MP5.[Qtde de Matéria Prima] * MP4.[Qtde de Matéria Prima] * MP3.[Qtde de Matéria Prima] * MP2.[Qtde de Matéria Prima] * MP1.[Qtde de Matéria Prima] END AS [Qtde 5],
CASE WHEN P6.[Valor Custo] IS Null Then CASE WHEN P5.[Valor Custo] IS Null Then CASE WHEN P4.[Valor Custo] IS Null Then CASE WHEN P3.[Valor Custo] IS Null Then CASE WHEN P2.[Valor Custo] IS Null Then 0 ELSE P2.[Valor Custo] END ELSE P3.[Valor Custo] END ELSE P4.[Valor Custo] END ELSE P5.[Valor Custo] END ELSE P6.[Valor Custo] END AS [Custo 5]
FROM
Produtos P1 INNER JOIN
[Matéria Prima do Produto] MP1 ON P1.[Código Produto] = MP1.[Código do Produto] LEFT JOIN
Produtos P2 ON MP1.[Código da Matéria Prima] = P2.[Código Produto] LEFT JOIN
[Matéria Prima do Produto] MP2 ON P2.[Código Produto] = MP2.[Código do Produto] LEFT JOIN
Produtos P3 ON MP2.[Código da Matéria Prima] = P3.[Código Produto] LEFT JOIN
[Matéria Prima do Produto] MP3 ON P3.[Código Produto] = MP3.[Código do Produto] LEFT JOIN
Produtos P4 ON MP3.[Código da Matéria Prima] = P4.[Código Produto] LEFT JOIN
[Matéria Prima do Produto] MP4 ON P4.[Código Produto] = MP4.[Código do Produto] LEFT JOIN
Produtos P5 ON MP4.[Código da Matéria Prima] = P5.[Código Produto] LEFT JOIN
[Matéria Prima do Produto] MP5 ON P5.[Código Produto] = MP5.[Código do Produto] LEFT JOIN
Produtos P6 ON MP5.[Código da Matéria Prima] = P6.[Código Produto]
WHERE P1.[Código Produto] = 1) T1
GROUP BY [Produto 1], [Produto 2], [Produto 3], [Produto 4], [Produto 5]) T2) T3) T4) T5) T6Armando Correa H Neto
- Movido Gustavo Maia Aguiar sexta-feira, 2 de março de 2012 12:19 (De:Alta Disponibilidade)
Todas as Respostas
-
-
-
Armando,
Me desculpa, mas não entendi a tua lógica para encontrar o custo de um produto...
Será que você teria como montar um exemplo para tentarmos entender melhor o resultado que você espera obter?
Certamente existe uma forma melhor para o que você quer, basta entendermos a tua necessidade.
[]'s