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 😉 ).

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)

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply