Règle de matériel CTE récursive

C'est ma première question alors pardonnez-moi si je ne suis pas assez clair.

Je suis chargé d'get le coût total de tous les composants pour une assemblée (nomenclature). Fondamentalement, je veux interroger la table qui détient l'allocation de command d'achat pour les composants afin que je puisse get des coûts actuellement associés à l'assemblage non embedded.

Cela devient compliqué car un composant d'un assemblage peut être un assemblage lui-même, et dans ce cas, j'ai besoin d'interroger une autre table qui contient des informations sur si d'autres assemblages sont liés à ce principal. (J'ai des vérifications en place pour m'assurer qu'il n'y a pas d'allocation, mais il est possible que rien n'ait encore été alloué). Dans ce cas, interrogez la table de répartition des commands pour les composants de ce numéro d'assemblage et ajoutez ces coûts. total pour l'assemblée des parents.

J'utilise un CTE, la première fois, et je n'ai pas beaucoup de chance. Quelqu'un peut-il aider à déterminer ce que je fais mal ici?

L'ancre tire dans tous les composants, à l'exclusion des sous-sets, et de leurs coûts unitaires et de la quantité de PO pour l'assemblage principal dont j'essaie de déterminer le coût.

La partie récursive doit extraire les composants, le coût et la quantité pour les assemblages qui ont été 'liés' en existant sur la table BM10200_AssemblyQtyDetail. Si l'assembly parent est dans la colonne TRANNUM, le TRX_ID de cette ligne est l'assembly lié qui est un composant de sous-assemblage de l'assembly principal.

USE HT GO WITH BOMCost (Assembly, Component, PriceFromPO, Qty, BOMLevel) AS ( -- Anchor member definition SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY, 0 AS BOMLevel FROM HT.DBO.BM10400 AS asl WHERE asl.TRX_ID = 'ASM0002909' UNION ALL -- Recursive member definition SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY, BOMLevel + 1 FROM HT.DBO.BM10400 AS asl INNER JOIN HT.DBO.BM10200_AssemblyQtyDetail AS bqd ON asl.TRX_ID = bqd.TRANNUM INNER JOIN BOMCost AS bc ON bqd.TRX_ID = bc.Assembly ) -- Statement that executes the CTE SELECT Assembly, Component, PriceFromPO, Qty, BOMLevel FROM BOMCost 

Pour réitérer, le problème ici est que cela renvoie UNIQUEMENT les composants de l'assemblage principal sans aucun coût lié au sous-assemblage. Donc juste des composants du plus haut niveau. J'ai un logging dans la table de binding reliant un assemblage pour le sous-assemblage de ce BM à l'assemblage principal, mais il ne tire pas les composants pour ce numéro d'assemblage. Je pense que cela peut avoir quelque chose à voir avec les sections récursives. Toute aide est appréciée!

Voici le scénario de données. ASM0002909 est un assembly avec un composant qui est lui-même un assembly. ASM0002914 est en cours de construction simultanément pour ASM0002909 et comporte deux composants. Je veux seulement get le coût de ce qui a été réellement reçu de PO donc peu importe si d'autres composants sont nécessaires mais n'ont pas encore été reçus. Voici ce que tout devrait être additionné (SERLTQTY * UNITCOST) Pour get le coût total de l'assemblage principal.

Table de lot série d'assemblage

Pourtant, voici le résultat que je reçois actuellement de ma requête. Il doit exécuter l'étape de recursion une fois et renvoyer les résultats ASM0002914. Résultats de mon CTE

J'ai mis en place un sqlfiddle avec les deux tables principales, data, et avec la requête sql que j'utilise actuellement qui ne capte toujours pas les composants des sous-assemblages et qui returnne une erreur de limite de récursivité dépassée. http://sqlfiddle.com/#!3/bd1b98/6

Il se peut que je manque quelque chose, mais il semble que vos critères JOIN excluent la récursivité:

INNER JOIN BOMCost AS bc ON bqd.TRX_ID = bc.Assembly

ASM0002909 n'est pas égal à ASM0002914 , donc aucun résultat de la partie inférieure.

Mettre à jour:

 WITH BOMCost (Assembly, Component, PriceFromPO, Qty, BOMLevel) AS ( -- Anchor member definition SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY, 0 AS BOMLevel FROM DBO.BM10400 AS asl WHERE asl.TRX_ID = 'ASM0002909' UNION ALL -- Recursive member definition SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY, BOMLevel + 1 FROM DBO.BM10400 AS asl INNER JOIN DBO.BM10200_AssemblyQtyDetail AS bqd ON asl.TRX_ID = bqd.TRX_ID INNER JOIN BOMCost AS bc ON bqd.TRANNUM = bc.Assembly ) -- Statement that executes the CTE SELECT DISTINCT Assembly, Component, PriceFromPO, Qty, BOMLevel FROM BOMCost 

Démo: SQL Fiddle