BL.Prod.OptiBox.SnijHistoriek 1 %RegisteredObject 139 CalcOptimizedCardBoardBreedte : Op basis van Historiek 2 berekeningen uitvoeren : 1) De actuele hoeveelheid verbruikt karton, en de hoeveelheid Afval 2) Op basis van diezelfde gegevens berekenen wat een meer optimale indeling van kartonbreedtes zou zijn 3) Op basis van opgegeven Kartonbreedtes het verbruik inschatten Inputparameters : pDikte : Dikte van het karton pLogoPrint : LogoPrint op karton (samen met Dikte bepaalt dit het soort karton - cf : DS.Prod.OptiBox.sub.btCardboard) pDatumVan/pDatumTot : bepalen de periode (Format : YYYY-MM-DD) - Beide inclusief (volgende parameters zijn in functie van optimalisatieberekening) pMinimumAfval : de reserve die je sowieso nodig hebt om slechte randen weg te snijden pAfronding : de stapgrootte pAantalBreedtes : Aantal breedtes die je eventueel wil gebruiken om de beste optimalisatie te bekomen Result : Array 1 pDikte:%Float,pLogoPrint:%String,pDatumVan:%String,pDatumTot:%String,pMinimumAfval:%Float=40,pAfronding:%Float=100,pAantalBreedtes:%Integer,pStdBreedte1:%Integer,pStdBreedte2:%Integer,pStdBreedte3:%Integer,pStdBreedte4:%Integer,pStdBreedte5:%Integer 1 Optimum,CurrentCalc,CumulData,Trial Optimum(4) waarbij 0 = Huidige, Reeële statistiek en 1,2,3 de optimalsatieberekeningen en 4 is de gevraagde standaard maten // Hierin telkens : // Optimum(n, kartonBreedte) = $LB(BrutoTotaal, NettoTotaal, WasteTotaal) // Optimum(n) = Total Waste voor betreffend optimum (=hulp variable tijdens berekenen, enkel voor n=1-->3) // // Als tussenberekening // CurrentCalc(1) --> CurrentCalc(pAantalBreedtes) // Waarin telkens: // CurrentCalc(n) = $LB(Breedte, BrutoTotaal, NettoTotaal, WasteTotaal) // // CumulData // Hierin worden de detal gegevens gecumuleerd per 'staafbreedte' van pAfronding // Waarin telkens : // CumulData(Breedte) = $LB(Lengte, Oppervalkte) // // Trial : // zie commentaar bij CalcSimulaties /* *********************** * Deel 1 : Berekenen huidig verbruik/Waste en verzamelen gegevens; ook berekening standaard breedtes ************************* */ Do ..CalcCumulHuidig(pDikte, pLogoPrint, pDatumVan, pDatumTot, pMinimumAfval, pAfronding, pAantalBreedtes, .pMaxBreedte, pStdBreedte1, pStdBreedte2, pStdBreedte3, pStdBreedte4, pStdBreedte5) /* *********************** * Deel 2 : Optimalisatie berekening ************************* */ Do ..CalcSimulaties(pAfronding, pAantalBreedtes, pMaxBreedte) ]]> 1 pDikte:%Float,pLogoPrint:%String,pDatumVan:%String,pDatumTot:%String,pMinimumAfval:%Float=40,pAfronding:%Float=100,pAantalBreedtes:%Integer,*pMaxBreedte:%Integer,pStdBreedte1:%Integer,pStdBreedte2:%Integer,pStdBreedte3:%Integer,pStdBreedte4:%Integer,pStdBreedte5:%Integer 1 Optimum,CurrentCalc,CumulData,Trial :DatumVan and StartTijdStip<:DatumTot ) &sql(OPEN SelectHistoriek) Set pMaxBreedte = 0 For &sql(FETCH SelectHistoriek) Quit:SQLCODE Do . quit:Breedte=0 . //Do WLIP^vhDBG(..#DbgIP,StartTijdStip_"-"_CardboardBreedte) . // 1) Huidige Gegevens cumuleren in Optimum(Huidig) . Set Bruto = $Normalize(Aantal*Lengte*CardboardBreedte,0) . Set Netto = $Normalize(Aantal*Lengte*Breedte,0) . Set Waste = Bruto-Netto . //Do WLIP^vhDBG(..#DbgIP,Bruto_"-"_Netto_"-"_Waste) . Set lbBruto = $$$GetOptimumBruto(0,CardboardBreedte) + Bruto . Set lbNetto = $$$GetOptimumNetto(0,CardboardBreedte) + Netto . Set lbWaste = $$$GetOptimumWaste(0,CardboardBreedte) + Waste . Set Optimum(0,CardboardBreedte) = $LB(lbBruto,lbNetto,lbWaste) . //Do WLIP^vhDBG(..#DbgIP,"Cumul Huidig: "_$$$GetOptimumBruto(0,CardboardBreedte)_" "_$$$GetOptimumNetto(0,CardboardBreedte)_" "_$$$GetOptimumWaste(0,CardboardBreedte)_" ") . ; . // 2) Gegevens groeperen per Stapgrootte . // Om de optimalisatieberekening ook wat te optimaliseren ronden we de Breedte af op de Stapgroote (na er eerst de Minimale Afval te hebben bijgeteld) . // De totale lengte en oppervlakte per Berekeningsbreedte slaan we op in een tijdelijke Array (CumulData) . Set BerekeningsBreedte = (((Breedte + pMinimumAfval) \ pAfronding) * pAfronding) + pAfronding . //Do WLIP^vhDBG(..#DbgIP,Breedte_"->"_BerekeningsBreedte) . Set lbLengte = $$$GetCumulDataLengte(BerekeningsBreedte) + Lengte . Set lbOpp = $$$GetCumulDataOpp(BerekeningsBreedte) + (Lengte*Breedte) . Set lbMinCardboardBreedte = $$$GetCumulDataMinCardboardBreedte(BerekeningsBreedte) . Set:((lbMinCardboardBreedte<0)||(lbMinCardboardBreedte>CardboardBreedte)) lbMinCardboardBreedte=CardboardBreedte . Set lbMaxCardboardBreedte = $$$GetCumulDataMaxCardboardBreedte(BerekeningsBreedte) . Set:((lbMaxCardboardBreedte<0)||(lbMaxCardboardBreedtepMaxBreedte pMaxBreedte = BerekeningsBreedte . write Breedte, $c(9), CardboardBreedte, $c(9), BerekeningsBreedte, ! . // . // 3) Verbruik berekenen ifv de Standaardbreedtes . Set MatchFound = 0 . Set BreedteStd = Breedte + pMinimumAfval . for i=1:1:pAantalBreedtes+1 do quit:MatchFound . . if BreedteStd <= StdBreedte(i) do . . . Set BrutoStd = Aantal*Lengte*StdBreedte(i) . . . Set NettoStd = $Normalize(Aantal*Lengte*Breedte,0) . . . Set lbBruto = $$$GetOptimumBruto(4,StdBreedte(i)) + BrutoStd . . . Set lbNetto = $$$GetOptimumNetto(4,StdBreedte(i)) + NettoStd . . . Set lbWaste = $$$GetOptimumWaste(4,StdBreedte(i)) + (BrutoStd-NettoStd) . . . Set Optimum(4,StdBreedte(i)) = $LB(lbBruto,lbNetto,lbWaste) . . . Set MatchFound=1 &sql(CLOSE SelectHistoriek) // enkel voor debug : een overzicht van de CumulData array /* Set key=0 For Set key=$Order(CumulData(key)) Q:key="" Do . Do WLIP^vhDBG(..#DbgIP,key_"->"_$$$GetCumulDataLengte(key)_" - "_$$$GetCumulDataOpp(key)) /* */ ]]> 1 pAfronding:%Float,pAantalBreedtes:%Integer,pMaxBreedte:%Integer 1 Optimum,CurrentCalc,CumulData,Trial 1 do . . Set ActionDone=0 . . for do quit:idx<1||ActionDone . . . //If idx = 1 do WLIP^vhDBG(..#DbgIP, idx_":"_$$$GetTrialBreedte(idx)) . . . if ($$$GetTrialBreedte(idx) + pAfronding) < $$$GetTrialBreedte(idx+1) do . . . . Set Trial(idx) = $$$GetTrialBreedte(idx) + pAfronding . . . . For j=idx+1:1:pAantalBreedtes-1 Set Trial(j) = $$$GetTrialBreedte(j-1) + pAfronding . . . . Set ActionDone=1 . . . else do . . . . Set idx = idx -1 //Do WLIP^vhDBG(..#DbgIP,"Rupturen: "_dbgRuptCnt) ]]> 1 pAantalBreedtes:%Integer,pAfrondingStep:%Integer 1 Optimum,CurrentCalc,CumulData,Trial replacing Optimum "_idx_ "with:"_TotalWaste) ]]> returneert het slechtste van de tot nu toe weerhouden resultaten 1 1 Optimum,CurrentCalc,CumulData,Trial %Integer 0 . Set:($$$GetOptimumTotalWaste(i)<0) Retval = i // tussenresultaat bestaat nog niet, mag dus overschreven worden quit:Retval>0 Retval if $$$GetOptimumTotalWaste(1) > $$$GetOptimumTotalWaste(2) do . Set Retval = $s($$$GetOptimumTotalWaste(3) > $$$GetOptimumTotalWaste(1):3,1:1) else do . Set Retval = $s($$$GetOptimumTotalWaste(3) > $$$GetOptimumTotalWaste(2):3,1:2) Quit Retval ]]> CardBoardBreedteQuery : Geeft voor een gekozen selectie de huidige waarden en drie simulaties voor betere kartonbreedtes %Query pDikte:%Float,pLogoPrint:%String,pDatumVan:%String,pDatumTot:%String,pMinimumAfval:%Float=40,pAfronding:%Float=100,pAantalBreedtes:%Integer,pStdBreedte1:%Integer,pStdBreedte2:%Integer,pStdBreedte3:%Integer,pStdBreedte4:%Integer,pStdBreedte5:%Integer 1 Optimum,CurrentCalc,CumulData,Trial,CardBoardBreedteQueryRows,CardBoardBreedteQueryKey %Status "_($NORMALIZE($ZH-t,2))_" s") // Optimum is nu opgevuld Set CntID = 0 for i=0:1:4 do . set brd="0" . Set Name = $s(i=0:"Huidig",i=4:"Standaard",1:"Simulatie "_i) . for set brd=$order(Optimum(i,brd)) q:brd="" do . . quit:'+brd . . Set CntID = CntID+1 . . Set Perc = $s($$$GetOptimumBruto(i,brd)=0:0,1:$Normalize($$$GetOptimumWaste(i,brd)* 100 / $$$GetOptimumBruto(i,brd), 2)) . . Set CardBoardBreedteQueryRows(CntID)=$LB(CntID,Name,brd,$Normalize(($$$GetOptimumBruto(i,brd)/1000000),0),$Normalize(($$$GetOptimumNetto(i,brd)/1000000),0),$Normalize(($$$GetOptimumWaste(i,brd)/1000000),0),Perc) Kill Optimum, CurrentCalc, CumulData, Trial Set CardBoardBreedteQueryKey="" Quit $$$OK ]]> 1 CardBoardBreedteQueryExecute CardBoardBreedteQueryRows,CardBoardBreedteQueryKey %Status 1 CardBoardBreedteQueryExecute CardBoardBreedteQueryRows,CardBoardBreedteQueryKey %Status DumpQuery : Geeft voor een gekozen selectie de huidige waarden gegroepeerd per stapbreedte %Query pDikte:%Float,pLogoPrint:%String,pDatumVan:%String,pDatumTot:%String,pMinimumAfval:%Float,pAfronding:%Float 1 Optimum,CurrentCalc,CumulData,Trial,DumpQueryRows,DumpQueryKey %Status 1 DumpQueryExecute DumpQueryRows,DumpQueryKey %Status %SQLQuery pDikte:%Float,pLogoPrint:%String,pDatumVan:%String,pDatumTot:%String ObjType||' '||BoxData->ObjRef As BoxData , BoxSelect, Breedte, CardboardBreedte, IsReDo, Lengte, Round(((Breedte * Lengte * Aantal)/1000000),4) as NettoOpp, Round(((CardboardBreedte * Lengte * Aantal)/1000000),4) As BrutoOpp, EindProduct->KortTekst, SubStr(StartTijdStip,1,10), SubStr(EindeTijdStip,1,10), SnijMachineID, MatKost, TijdKost FROM Prod.OptiBox_SnijHistoriek Where Breedte>0 and Dikte=:pDikte and LogoPrint=:pLogoPrint and StartTijdStip>:pDatumVan and StartTijdStip<:pDatumTot||' 23:59:59' Order by ID]]> 1 DumpQueryExecute DumpQueryRows,DumpQueryKey %Status do ##class(BL.Prod.OptiBox.SnijHistoriek).TestCalc() 1 do ##class(BL.Prod.OptiBox.SnijHistoriek).TestDumpCumulData() 1 do ##class(BL.Prod.OptiBox.SnijHistoriek).TestDumpBareData() 1 Tijdelijke method, omdat de datums eerst als string werden opgeslagen (dd/mm/yyy hh:mm:ss) Deze method coonverteerd ze naar Timestamp formaat Belangrijk : na het uivoeren van deze routine moet ook 1) DS.Prod.OptiBox.SnijHistoriek aangepast worden (datums %TimeStamp ipv String) 2) BL.Prod.OptiBox.Snijden aanpassen om de datums als TimeStamp weg te schrijven (daarna mag deze method weggegooid worden) do ##class(BL.Prod.OptiBox.SnijHistoriek).ConvertDatesToTimeStamp() 1