Ola pessoal,
Faz um bom tempo que pesquiso recursividade em SQL (uns 2 anos), e sempre encontro exemplos simples, que trás o código do pai/filho, mestre/detalhe, mas nada que contenha valores multiplicando níveis inferiores na recursividade.
Hoje li um post em inglês aqui no fórum que solicitava novamente recursividade, responderam o mesmo que vi em vários outros posts, sempre repetindo "join" várias vezes no OITT (Estrutura de produto cabeçalho) e ITT1 (Estrutura de produtos - itens) para ler dados com no máximo 3 a 5 níveis, só que finalmente, depois de muito tempo, encontrei alguém que conseguiu fazer a multiplicação que tanto queria, encontrei um post em janeiro/2014 do
Christophe fazendo a multiplicação na recursividade.
Recursive query for BOM exploration
Aproveitando algumas ideias da query do
Christophe, consegui terminar a minha query onde faltava somente a quantidade.
Segue a query recursiva para todos, que mostra a estrutura do produto em todos os níveis possíveis (ou até onde o computador aguentar :wink: ).
DECLARE @ITEMCODE VARCHAR(30);
DECLARE @QTDE INT;
SET @ITEMCODE = '<<coloque o código do item aqui>>'; -- Código do Item.
SET @QTDE = 1; -- Quantidade do Item.
-- Recursividade
WITH CTEestrutura (Nivel, Father, Ratio, QtyTop, Code, QuantityX, ItemName)
AS
(
-- Select ancora --
SELECT 0 AS Level, T0.Father, convert(numeric(19,6),@Qtde), T1.Qauntity, T0.Code, T0.Quantity, T2.ItemName
FROM ITT1 T0
INNER JOIN OITT T1 ON T1.Code = T0.Father
INNER JOIN OITM T2 ON T2.Itemcode = T0.Code
WHERE T0.Father = @ITEMCODE
UNION ALL
-- Definição recursiva
SELECT Nivel + 1, T0.Father, convert(numeric(19,6),B0.QuantityX * B0.Ratio / B0.QtyTop), T3.Qauntity, T0.Code, T0.Quantity, T2.ItemName
FROM ITT1 T0
INNER JOIN CTEestrutura as B0 on B0.Code = T0.Father
INNER JOIN OITM T2 ON T2.Itemcode = T0.Code
INNER JOIN OITT T3 ON T3.Code = T0.Father
)
-- Executação da recursividade --
SELECT
B0.*,
(B0.QuantityX * B0.Ratio) / B0.QtyTop as 'Quantity' -- thanks Christophe
FROM CTEestrutura B0;
Um grande abraço a todos e obrigado christophe.averous pela ajuda.
Se alguém quiser melhorar o código esteja a vontade,
Fabio
SAP 8.82 PL14 / SAP 9.0 PL11 (test)