Verwerking van de optimisatie van een doos. De metadefinitie definieert de BoxSelect van de Optimizer en geeft defaults voor de BoxData BL.Prod.OptiBox,vhLib.Macro 1 %RegisteredObject %String 192.168.200.6 %Integer 8888 %Boolean 0 WS.Prod.PanOpti.q1.CUTREQ %String 1 %Boolean %String TECH.Process.ProcessAPI 1 %String 1 %Status D ##class(BL.Prod.OptiBox.Optimize).GetStatus() 1 ID %SQLQuery PPSGroep,PPSSubgroep,ObjType,ObjRef,ObjLijnRef,ParentID Select DISTINCT BoxDeelVan from Prod.OptiBox_SnijData where PPSGroep=:PPSGroep and PPSSubgroep=:PPSSubgroep and ObjType=:ObjType and ObjRef=:ObjRef and ((:ObjLijnRef is null) OR ((:ObjLijnRef is not null) and (ObjLijnRef=:ObjLijnRef))) and ((:ParentID is null) OR ((:ParentID is not null) and (Parent=:ParentID))) order by to_number(Sequentie),%ID PPSGroep,PPSSubgroep,ObjType,ObjRef,ObjLijnRef,ParentID %List %SQLQuery ObjType,ObjRef,ObjLijnRef,ParentID Select %ID as ID from Prod.OptiBox_SnijData where ObjType=:ObjType and ObjRef=:ObjRef and ((:ObjLijnRef is null) OR ((:ObjLijnRef is not null) and (ObjLijnRef=:ObjLijnRef))) and ((:ParentID is null) OR ((:ParentID is not null) and (Parent=:ParentID))) order by to_number(Sequentie),%ID Ophalen van de master snijdata, deze wordt steeds gebruikt als referentie voor de ganse blok. SnijID:%Integer DS.Prod.OptiBox.SnijData In sommige dozen worden meerdere producten gestoken bv. verschillende afm. van matjes worden verpakt in één doos Dit geeft de lijst met producten en hun aantallen in een list $LB($LB(Product,Aantal),...) arResult is optioneel voor format zie GetInfo. Indien niet meegegeven dan wordt deze berekend. %List arResult=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, , , 7:QtyRequired) arResult(SnijId)=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, 4:HeeftSnijDef, 5:Usage, 6:PPSPrioriteit, 7:QtyRequired, 8:QtyRequested, 9:QtyFinished) arResult(SnijId,SnijId)=Object SnijData ; Clone ========================================================================================================================== QUERY: QGetAllInfo . ========================================================================================================================== %Query paObjType:%String,paObjRef:%String -------------------------------------------------------------------------------------------------------------------------- 1 0 %Status 1 QGetAllInfoExecute 0 %Status 1 QGetAllInfoExecute 0 %Status ========================================================================================================================== Vertrekken van de master snijdata wordt de ganse sub structuur opgehaald. Param oMasterSnijData is het master object, als het geen object is wordt eerst GetMaster uitgevoerd MaxRecurse : Aantal niveaus dat subdozen mogen opgehaald worden, 0 is geen, 1 is een niveau dieper, 99 is alle nivos ParentQty moet niet ingevuld worden, is nodig voor recursie de arResult moet door de oproepende gekilled worden arResult=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, , , 7:QtyRequired) arResult(SnijId)=$LB(1:PRNr, 2:ProdRef, 3:ProdQty, 4:HeeftSnijDef, 5:Usage, 6:PPSPrioriteit, 7:QtyRequired, 8:QtyRequested, 9:QtyFinished) arResult(SnijId,SnijId)=Object SnijData ; Clone 1 0 If List="" Do . Set $LI(List,$$$snPRNr)=oSnijData.PRNr . Set $LI(List,$$$snProductRef)=oSnijData.ProductRef . Set $LI(List,$$$snProductAantal)=oSnijData.ProductAantal . Set $LI(List,$$$snHasSnijDef)=HasSnijDef . Set $LI(List,$$$snBoxUsage)=$S(HasSnijDef:oSnijData.BoxUsage,1:"") . Set $LI(List,$$$snLabel)=..Label(oSnijData) . Set $LI(List,$$$snPPSPrioriteit)=$S(HasSnijDef:$S(oSnijData.PPSPrioriteit:oSnijData.PPSPrioriteit,1:1),1:"") Set $LI(List,$$$snAantalGevraagd)=$LG(List,$$$snAantalGevraagd)+(oSnijData.Aantal*ParentQty) If HasSnijDef Do . Set arResult(MasterID,oSnijData.%Id())=oSnijData ; onderdelen alleen als er snijdefinities zijn . Set:oSnijData.Status="Q" $LI(List,$$$snAantalQueued)=$LG(List,$$$snAantalQueued)+oSnijData.Aantal . Set:oSnijData.Status="F" $LI(List,$$$snAantalFinished)=$LG(List,$$$snAantalFinished)+oSnijData.Aantal Set arResult(MasterID)=List ]]> Geeft een label - moet nog defitig uitgewerkt worden met opzoek tabellen oSnijData w ##class(BL.Prod.OptiBox.Snijden).GetPathAndFile("70123_L.386400.1236470_default_01_06.JPG","FLEX") 1 File:%String,Type:%String pxSnijRes:BL.Prod.OptiBox.sub.pxSnijResult 1 Do ; Callback . . . Do $zobjclassmethod($LI(CallBack), $LI(CallBack,2) ,ObjType, ObjRef, $LG(CallBack,3), SnijDataID, $$$qtSnijden, SnijStatus, "") ; Finished, no message . . Else . . Set oHist=..OptiBoxHistoriek(pxSnijRes,oQ.SnijData) . . Do ..ProductHistoriek(oHist) . Else Do ; No queue data, zou niet mogen voorkomen maar we gaan wel de voorraad aanpassen. . . Set oHist=..OptiBoxHistoriek(pxSnijRes) . . Do ..ProductHistoriek(oHist) &sql(CLOSE ProcessSnijResult) ]]> SnijDataID,NewStatus,MarkDeelVan,MarkParent D ##class(BL.Prod.OptiBox.Snijden).%New().StatusAllFinished("L",309692) ObjType,ObjRef 1 SnijDataID BL.Sys.Proxy.pxStatus 1 SnijDataID %Boolean Later nodig voor optimalisatie carton breedte pxSnijRes,oSnijData oHist 0 1 Simulate,DebugInfo 1 ObjType,ObjRef SnijMachineID,Prioriteit,CallBack:%List %String wordt opgevangen worden door een errortrap ! . $$$LastLogUpdate("E",,,,,"NO STATUS",,) Quit $G(Status) ]]> SnijID Snijden van alle SnijData opgenomen in de array Opbouw parameter arSnijRefs arSnijRef(VolgNr) = $LB(oSnijData of SnijID, ...) SnijMachineID,Prioriteit,arSnijRefs,CallBack:%List Snijden van alle SnijData opgenomen in de array Opbouw parameter arSnijRefs arSnijRef(VolgNr) = $LB(oSnijData of SnijID, ...) SnijMachineID,Prioriteit,arSnijRefs,CallBack:%List Hersnijden van een of meerdeze SnijData parameter SnijMachineID : VH of HALUX lbSnijIDs : format $LB($LB(SnijID,Qty), ...) waarbij SnijID ook een objectreferentie mag zijn Prioriteit : 1..9 PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst WS.Prod.PanOpti.q1.STATUSRES 1 SnijOpdrachten:%ArrayOfDataTypes,Prioriteit:%String,PPSOutput:%String,MachineID:%String,CallBack:%List BL.Sys.Proxy.pxStatus $lb Set SnijID="" Set lbSnijOpdracht="" For Set Qty=SnijOpdrachten.GetNext(.SnijID) Quit:(SnijID="") Do . Set lbSnijOpdracht=lbSnijOpdracht_$LB($LB(SnijID,Qty)) Set PanStatus=%blProdOptiBoxSnijden.SnijReDo(MachineID,lbSnijOpdracht,Prioriteit,PPSOutput, .CallBack) Quit:(PanStatus.STATUS'=$$$PanOptiStatusOK) $$$pxStatusErrorEx("Fout tijdens snijden.",PanStatus.MESSAGE_$C(13,10)_$$LCVT^vhLib(lbSnijOpdracht)) Quit $$$pxStatusOK ]]> Alle delen van de doos worden onmiddellijk gesneden. Alle aantallen voor een deel worden gesneden en dan pas alle aantallen van het tweede deel, ... SnijMachineID : VH of HALUX SnijID : verwijzing naar een SnijDatao object mag ook een objectreferentie mag zijn Prioriteit : 1..9 lbLimitUsage : optioneel, beperking op welke delen (BoxUsage bv. Bottom, Sub, Lid, Filler, ...) er mogen gesneden worden. PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst WS.Prod.PanOpti.q1.STATUSRES Eerst wordt er 1 doos (met al zijn delen) in hoge prioriteit en daarna steeds per stuk in steeds lagere prioriteit. Dit geeft geeft de machine de mogelijkheid om voor een andere werkpost er werk tussen te nemen. SnijMachineID : VH of HALUX SnijID : verwijzing naar een SnijDatao object mag ook een objectreferentie mag zijn Prioriteit : 1..9 lbLimitUsage : Beperking op welke delen (BoxUsage bv. Bottom, Sub, Lid, Filler, ...) er mogen gesneden worden. PPSOutput : 0 = rechtdoor, 1 = rechts, 2 = links HasSnijDef : returnvalue, is true als er snijopdrachten in de wachtrij zijn geplaatst deel verwerkt, 1 -> alles verwerkt, -1 -> geen enkel te verwerken]]> SnijID:%Integer,lbLimitUsage:%List,PPSOutput,Qty:%Integer=0,MaxRecurse:%Integer=99 1 Ophalen van de snijdefinities en deze groeperen per usage (Bottom, main, filler, ...) Parameter : SnijID startpunt in de SnijData bestand arSnijData : resultaat SnijDefs(PPSPrioriteit,VolgNr)=object SnijDef lbLimitUsage : Welke BoxUsage worden toegelaten ReDo : alleen de openstaande of ook de reeds verwerkte MaxRecurse : Aantal keren dat subdozen mogen opgehaald worden ParentQty : moet niet ingevuld worden (nodig voor recusie). SnijDefs is steeds per stuk daarom moeten sub definities vermenigvuldig worden met het parentqty k ar D ##class(BL.Prod.OptiBox.Snijden).%New().GetSnijDefs(43295,.ar,$lb("LID"),99) zw ar 1 oSnijData,ReqQty,OptiQty,WithReDo 1 1 oSnijData 1 WS.Prod.PanOpti.q1.CUTREQCUT ObjType,ObjRef Do ##class(BL.Prod.OptiBox.Snijden).CleanOld($H) 1 Datum:%Date