Deze spec specificeert voor een maatwerkproduct welke halffabrikaten relevant zijn, maw alle mogelijke halffabrikaten. De spec bepaalt welke rollen er zijn (zoals bodem, rub, rughouder, etc voor TBX, of profiel lengte, profiel breedte, vulling, etc voor KAD) en welke halffabrikaten per rol mogelijk zijn. De spec bevat via de builders ook de logica om per rol een specifiek Halffab te selecteren, op basis van ingegeven kenmerken. Halffabrikaten kunnen as is geselecteerd worden en dat levert dan een HalffabItem op. Het is echter ook mogelijk dat een Halffab op zijn beurt moet gemaakt worden. In dat geval wordt een MaatwerkHalffabItem gemaakt. De spec heeft bv. ook de kennis om een V1 voor de zijkanten correct te verdelen over de rollen ZijkantL en ZijkantR. De spec constructor maakt voor alle rollen de builders aan. Als er in de context sub-contexten zitten, wordt een maatwerk builder aangemaakt en de context eraan doorgegeven, anders wordt een gewone builder gebruikt. De specifieke productkennis zit in de concrete builder implementaties. persistent TECH.Error 1 %Persistent 0 DOM.PM.enu.Familie 1 1 DOM.PM.enu.Variant 1 1 DOM.PM.Maatwerk.Calc.HF.ISamengesteldHalffabItemBuilder 1 1 De volgorde is bepaald op basis van de Afhankelijkheden tussen de verschillende Builders. DOM.PM.Maatwerk.Calc.HF.IHalffabItemBuilder list 1 1 1 %Status Bouwt de volgorde op waarin de (HFItem)Builders zullen uitgevoerd worden, rekening houdend met de Dependencies tussen Builders. Bijvoorbeeld: TBXBodem is afhankelijk van TBX LadeZijkant, dus LadeZijkant zal vóór Bodem moeten berekend worden. 1 1 0 { Set Builder = TraverserList.GetAt(1) If (Builder.%Extends("DOM.PM.Maatwerk.Calc.HF.ISamengesteldHalffabItemBuilder")) { Set Iterator = Builder.GeefHalffabItemBuildersIterator() While (Iterator.HasNext()) { Do TraverserList.Insert(Iterator.Next()) } } Else { Set Rol=Builder.GeefRol() Do ItemBuilders.SetAt(Builder,Rol) Do DependencyGraph.AddNode(##class(TECH.Algo.Graph.Node).%New(Rol,Builder)) } Do TraverserList.RemoveAt(1) } // Dependencies van de Nodes toevoegen Set Iterator=##class(TECH.ListIterator).%New(ItemBuilders) While (Iterator.HasNext()) { Set Builder=Iterator.Next() Set IteratorDependencies=Builder.GeefAfhankelijkhedenIterator() While (IteratorDependencies.HasNext()) { Set Dependency = IteratorDependencies.Next() Set AfhankelijkVanBuilder=ItemBuilders.GetAt(Dependency) If '$IsObject(AfhankelijkVanBuilder) Do ##class(TECH.ExceptionHandler).Throw(##class(DOM.PM.Maatwerk.Calc.HF.impl.FrameworkException).%New("Geen Builder voor de Rol AfhankelijkVan "_$LI(lbDependencies,i))) Do DependencyGraph.AddDependencyByNodeName(Builder.GeefRol(),AfhankelijkVanBuilder.GeefRol()) } } Set ..HalffabItemBuilderSequence=DependencyGraph.ConvertToDataQueue(DependencyGraph.GetDependencyQueue()) ]]> DOM.PM.enu.Familie DOM.PM.enu.Variant 1 %Integer 1 TECH.ListIterator Berekent voor iedere Builder het HalffabItem en voegt dit toe aan de HalffabItemsBoom (in de Context) De Boom is toegankelijk via Context.HalffabItemsBoom.Wortel Context:HalffabContext,IngegevenKenmerken:DOM.PM.Maatwerk.Calc.Common.IngegevenKenmerken %Library.CacheStorage ^DOM.PM.Maatwerk772.HalffabSpecD HalffabSpecDefaultData ^DOM.PM.Maatwerk772.HalffabSpecD ^DOM.PM.Maatwerk772.HalffabSpecI ^DOM.PM.Maatwerk772.HalffabSpecS listnode %%CLASSNAME Builder HalffabItemBuilderSequence MateriaalBewerkingsinfoTabel ProductType Familie Variant