Index: APPS/Verpakking/OrgaluxBonOptimizer.cls.xml =================================================================== diff -u -r72367 -r74784 --- APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (.../OrgaluxBonOptimizer.cls.xml) (revision 72367) +++ APPS/Verpakking/OrgaluxBonOptimizer.cls.xml (.../OrgaluxBonOptimizer.cls.xml) (revision 74784) @@ -5,7 +5,7 @@ %Integer -1170 +1180 @@ -37,6 +37,11 @@ 730 + +%Integer +1165 + + %String @@ -62,10 +67,15 @@ -DOM.PM.ProductAPI +DOM.PM.impl.ProductAPI 1 + +DOM.VKP.impl.DataM.DataMOrderAPI +1 + + %String 1 @@ -116,13 +126,13 @@ 1 - + %ListOfDataTypes 1 -DoosFactory:APPS.Verpakking.DoosFactory="",DoosAanvuller:APPS.Verpakking.DoosAanvuller="",Optimizer:APPS.Verpakking.Optimizer="",CubeIQRequestBuilder:APPS.Verpakking.CubeIQRequestBuilder +DoosFactory:APPS.Verpakking.DoosFactory="",DoosAanvuller:APPS.Verpakking.DoosAanvuller="",Optimizer:APPS.Verpakking.Optimizer="",CubeIQRequestBuilder:APPS.Verpakking.CubeIQRequestBuilder="" 1 1 %Status @@ -131,13 +141,14 @@ Set ..Logger = ##class(vhLib.Logger).%New("Optimaliseer bon orgalux") Set ..BoxDataRepository = ##class(APPS.Verpakking.BoxDataRepository).%New() Set ..SnijDataRepository = ##class(APPS.Verpakking.SnijDataRepository).%New() - Set ..ProductAPI = ##class(DOM.DomeinContext).Instance().GeefProductAPI() + Set ..ProductAPI = ##class(DOM.PM.impl.ProductAPI).%New() + Set ..OrderAPI = ##class(DOM.VKP.impl.DataM.DataMOrderAPI).%New() Set ..DateTimeAPI = ##class(TECH.Context).Instance().GeefDateTimeAPI() Set ..DoosFactory = $$$Inject(DoosFactory, ##class(APPS.Verpakking.DoosFactory).%New()) Set ..DoosAanvuller = $$$Inject(DoosAanvuller, ##class(APPS.Verpakking.DoosAanvuller).%New()) Set ..Optimizer = $$$Inject(Optimizer, ##class(APPS.Verpakking.Optimizer).%New()) Set ..CubeIQRequestBuilder = $$$Inject(CubeIQRequestBuilder, ##class(APPS.Verpakking.CubeIQRequestBuilder).%New()) - Set ..TeGroepoerenVolumes = ##class(TECH.ListUtils).ListbuildToList($ListBuild("TAOR indelingen||Verzameldoos voor losse elastieken||1", "TAOR indelingen||Verzameldoos voor LEDERverdeling||1", "TAOR indelingen||Verzameldoos voor Viltclips||1", "TAOR indelingen||Verzameldoos voor leder siliconen banden||1", "TAOR indelingen||verzameldoos voor ringen||1")) + Set ..TeGroeperenVolumes = ##class(TECH.ListUtils).ListbuildToList($ListBuild("TAOR indelingen||Verzameldoos voor losse elastieken||1", "TAOR indelingen||Verzameldoos voor LEDERverdeling||1", "TAOR indelingen||Verzameldoos voor Viltclips||1", "TAOR indelingen||Verzameldoos voor leder siliconen banden||1", "TAOR indelingen||verzameldoos voor ringen||1")) Quit $$$OK ]]> @@ -168,19 +179,23 @@ #dim BoxDataLijstVanTeStapelenDozenVergrootVoorOrgaluxBasisPaketten As List of DS.Prod.OptiBox.BoxDataMetID = ..VergrootDimensiesVoorOrgaluxBasisPaketten(BoxDataLijstVanTeStapelenDozenVergrootVoorKartonsMetBufferzone) Do ..BepaalGrootsteGrondOppervlak(BoxDataLijstVanTeStapelenDozenVergrootVoorOrgaluxBasisPaketten) - #dim CubeIQResponse As APPS.Verpakking.dto.CubeIQ.Response = ..GeefBesteStapeling(BoxDataLijstVanTeStapelenDozenVergrootVoorOrgaluxBasisPaketten) - Set ..JobId = $Piece(CubeIQResponse.cubeiq.loads.load.GetAt(1).jobid, "-", 1) - - If $$$Not(..ZijnAfbeeldingenGegenereerdVoorBesteStapeling()) { - #dim FoutOmschrijving As %String = "Geen afbeelding gevonden voor optimale stapeling gevonden voor bon "_ ..BonId _" met JobId "_ ..JobId _ ". Indien nodig, probeer manueel de stapeling van de bon opnieuw te optimaliseren via 'Do ##class(BL.PPS.OL.OptiBox).OptimizeBon(BonNr)'." - Do ..Logger.Warning("Ontbrekende afbeelding voor bon", FoutOmschrijving) - } - - Do ..SnijDataRepository.VerwijderViaBonId(..BonId) + If (BoxDataLijstVanTeStapelenDozenVergrootVoorOrgaluxBasisPaketten.Count() > 0) { + #dim CubeIQResponse As APPS.Verpakking.dto.CubeIQ.Response = ..GeefBesteStapeling(BoxDataLijstVanTeStapelenDozenVergrootVoorOrgaluxBasisPaketten) + Set ..JobId = $Piece(CubeIQResponse.cubeiq.loads.load.GetAt(1).jobid, "-", 1) + + If $$$Not(..ZijnAfbeeldingenGegenereerdVoorBesteStapeling()) { + #dim FoutOmschrijving As %String = "Geen afbeelding gevonden voor optimale stapeling gevonden voor bon "_ ..BonId _" met JobId "_ ..JobId _ ". Indien nodig, probeer manueel de stapeling van de bon opnieuw te optimaliseren via 'Do ##class(BL.PPS.OL.OptiBox).OptimizeBon(BonNr)'." + Do ..Logger.Warning("Ontbrekende afbeelding voor bon", FoutOmschrijving) + } + + Do ..SnijDataRepository.VerwijderViaBonId(..BonId) + + Do ..ProcessCubeIQResponse(CubeIQResponse, BoxDataLijstVanTeMakenKartons, OrigineleBoxDataLijst) + Do ..MaakOptiboxQueue() + } Else { + Do ..Logger.Info("Optimaliseer bon orgalux", "Bon " _ BonId _" heeft geen optimalisatie doorlopen gezien er 0 producten in de overdoos zitten. Dit kan komen doordat er slechts 1 product in de bon zit die dan ook groter is dan een pallet.") + } - Do ..ProcessCubeIQResponse(CubeIQResponse, BoxDataLijstVanTeMakenKartons, OrigineleBoxDataLijst) - Do ..MaakOptiboxQueue() - Do ..Logger.Info("Optimaliseer bon orgalux", "Klaar met optimaliseren bon " _ BonId _".") ]]> @@ -215,12 +230,10 @@ While ((Hoogte <= ..#MaximumVerpakkingHoogteVoorEuropallet)) { Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, Breedte, Diepte, Hoogte) Set Response = ..GeefParsedCubeIQResponse(Request) - If (Response.cubeiq.unloadedproducts = "") { - If (Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon) { - #dim Beoordeling As %Decimal = ..GeefBeoordelingScoreVanEenOverdoos(Response.cubeiq.loadedcontainers.loadedcontainer.GetAt(1), MinimumAantalPallettenVoorBon) - Do ArrayVanResultaten.SetAt(Response, Beoordeling) - } - } + If ((Response.cubeiq.unloadedproducts.unloadedproduct.Count() = 0) && (Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon)) { + #dim Beoordeling As %Decimal = ..GeefBeoordelingScoreVanEenOverdoos(Response.cubeiq.loadedcontainers.loadedcontainer.GetAt(1), MinimumAantalPallettenVoorBon) + Do ArrayVanResultaten.SetAt(Response, Beoordeling) + } Set Hoogte = (Hoogte + 130) } Set Diepte = (Diepte + 130) @@ -239,22 +252,20 @@ Set BesteScore = Score } } - //Onderstaand stuk werkt nog niet - //Nog eens Request doen om realistische afbeeldingen te krijgen, anders lijkt het alsof het overdoos veel te groot is - /* + If $$$Not(BesteStapeling = "") { - Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overallwidth, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overalllength, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overallheight) + Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overallwidth, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overalllength, BesteStapeling.cubeiq.loadedcontainers.loadedcontainer.GetAt(1).overallheight,,, $$$True) Set BesteStapeling = ..GeefParsedCubeIQResponse(Request) } - */ + } Else { #dim MaxHoogteDoos As %Decimal = 150 While ((BesteStapeling = "") && (MaxHoogteDoos < ..#MaximumVerpakkingHoogteVoorEuropallet)) { Set Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, ..#MaximumOverdoosBreedteVoorEuropallet, ..#MaximumOverdoosDiepteVoorEuropallet, MaxHoogteDoos, $$$True) Set Response = ..GeefParsedCubeIQResponse(Request) - If ((Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon) && (Response.cubeiq.unloadedproducts = "")) { + If ((Response.cubeiq.loadedcontainers.loadedcontainer.Count() = MinimumAantalPallettenVoorBon) && (Response.cubeiq.unloadedproducts.unloadedproduct.Count() = 0)) { Set BesteStapeling = Response } @@ -287,7 +298,7 @@ #dim RequestVolumeVolledigePallet As APPS.Verpakking.dto.CubeIQ.Request = ..CubeIQRequestBuilder.MaakCubeIQRequest(BoxDataLijstVanTeStapelenDozen, ..#MaximumOverdoosBreedteVoorEuropallet, ..#MaximumOverdoosDiepteVoorEuropallet, ..#MaximumOverdoosHoogteVoorEuropallet) #dim CubeIQResponse As APPS.Verpakking.dto.CubeIQ.Response = ..GeefParsedCubeIQResponse(RequestVolumeVolledigePallet) - If $$$Not(CubeIQResponse.cubeiq.unloadedproducts = "") { + If (CubeIQResponse.cubeiq.unloadedproducts.unloadedproduct.Count() > 0) { #dim FoutOmschrijving As %String = "Er is minstens 1 product van bon " _ ..BonId _ " die niet kon ondergebracht worden in de overdozen ondanks de producten groter dan een pallet al werden uitgefilterd. Dit komt normaal enkel voor als er een lang product is waarbij de langste dimensie + 3*6.7 > dan de toegelaten " _ ..#MaximumOverdoosBreedteVoorEuropallet _ ". Dit dient manueel te worden nagekeken zodat dit kan worden opgelost en dit niet meer voorvalt." Do ..Logger.ErrorMail("Bepaal minimum aantal palletten", FoutOmschrijving) Set Exception = ##class(TECH.Exceptions.InvalidResponseException).%New(FoutOmschrijving) @@ -341,7 +352,7 @@ Set NummerDoos = NummerDoos + 1 } - If ((BoxDataId = "OL||Antislipmat groep||1") || (##class(TECH.ListUtils).Contains(..TeGroepoerenVolumes, BoxDataId))) { + If ((BoxDataId = "OL||Antislipmat groep||1") || (##class(TECH.ListUtils).Contains(..TeGroeperenVolumes, BoxDataId))) { Do ..MaakSnijDataVoorGegroepeerdeProducten(OrigineleBoxDataLijst, SnijDataDoos, OptiDataDoos, BoxDataId) Set NummerDoos = NummerDoos + 1 } @@ -441,7 +452,7 @@ } #dim BoxDataOverdoosAangevuld As DS.Prod.OptiBox.BoxDataMetID = ..CopyBoxData(BoxDataOverdoos) - Set BoxDataOverdoosAangevuld.Breedte = $Select((Overdoos.overallwidth + 10) > ..#MaximumVerpakkingBreedteVoorEuropallet : ..#MaximumVerpakkingBreedteVoorEuropallet, 1: Overdoos.overallwidth) //Indien overdoos toch net groter is dan 1170, waarde naar 1170 zetten, dan spant het maar een beetje ;) //10 Als extra marge zodat het stapelen goed lukt + Set BoxDataOverdoosAangevuld.Breedte = $Select((Overdoos.overallwidth + 10) > ..#MaximumVerpakkingBreedteVoorEuropallet : ..#MaximumVerpakkingBreedteVoorEuropallet, 1: Overdoos.overallwidth) //10 Als extra marge zodat het stapelen goed lukt Set BoxDataOverdoosAangevuld.Diepte = Overdoos.overalllength + 10 //10 Als extra marge zodat het stapelen goed lukt Set BoxDataOverdoosAangevuld.Hoogte = Overdoos.overallheight + 10 //10 Als extra marge zodat het stapelen goed lukt #dim SnijData As DS.Prod.OptiBox.SnijData = ..MaakSnijDataVoorOverdoos(BoxDataOverdoosAangevuld, Overdoos, .OptiData, AfbeeldingCode, SnijDataParent, IsOverdoosNodig) @@ -462,7 +473,7 @@ Set OptiData = ..MaakOptiData(BoxDataMetID, Product, OptiDataParent, OptiDataBoxParent) #dim SnijData As DS.Prod.OptiBox.SnijData = ..MaakSnijData(BoxDataMetID, Sequentie, OptiData, Product, SnijDataParent, SnijDataBoxParent, ProductAantal, AfbeeldingCode) - If ($$$Not(##class(TECH.ListUtils).Contains(..TeGroepoerenVolumes, SnijData.BoxData.%Id()))) { + If ($$$Not(##class(TECH.ListUtils).Contains(..TeGroeperenVolumes, SnijData.BoxData.%Id())) && $$$Not(BoxDataMetID.Meta.OptiType = "VOLUME")) { #dim SnijDef As DS.Prod.OptiBox.sub.emSnijDef = ..MaakSnijDef(BoxDataMetID) Do SnijData.SnijDefs.SetAt(SnijDef, ##class(APPS.Verpakking.enu.MachineID).VH()) @@ -488,7 +499,9 @@ #dim Product As DOM.PM.Product = $Select(..ProductAPI.BestaatProduct(BoxDataMetID.ObjRef)= $$$False: "", 1: ..ProductAPI.GeefProduct(BoxDataMetID.ObjRef)) #dim OptiData As DS.Prod.OptiBox.OptiData = ..MaakOptiData(BoxDataMetID, Product, OptiDataParent) For Index=1:1:BoxDataMetID.Aantal { - #dim SnijDataMat As DS.Prod.OptiBox.SnijData = ..MaakSnijData(BoxDataMetID, "", OptiData, Product, ParentSnijData, ParentSnijData, 1) + If ((Groep = "OL||Antislipmat groep||1") && (BoxDataMetID.Breedte <= (..#MaximumBreedteInlegmat + 5))) { // +5 (zit in snijdefs) + #dim SnijDataMat As DS.Prod.OptiBox.SnijData = ..MaakSnijData(BoxDataMetID, "", OptiData, Product, ParentSnijData, ParentSnijData, 1) + } } } } @@ -628,14 +641,14 @@ Set SnijData.BoxParent = SnijDataParent } - If ((BoxDataMetID.VolumeVan = "") && $$$Not(##class(TECH.ListUtils).Contains(..TeGroepoerenVolumes, SnijData.BoxData.%Id()))) { + If ((BoxDataMetID.VolumeVan = "") && $$$Not(##class(TECH.ListUtils).Contains(..TeGroeperenVolumes, SnijData.BoxData.%Id())) && $$$Not(BoxDataMetID.Meta.OptiType = "VOLUME")) { Set SnijData.BoxSelect = BoxDataMetID.Meta.BoxSelect.GetAt(1).Naam } If $$$Not(BoxDataMetID.DeelVan = "") { Set SnijData.BoxUsage = "SUB" Set SnijData.PPSPrioriteit = 40 - } ElseIf $$$Not(BoxDataMetID.VolumeVan = "") || (##class(TECH.ListUtils).Contains(..TeGroepoerenVolumes, SnijData.BoxData.%Id())) { + } ElseIf ($$$Not(BoxDataMetID.VolumeVan = "") || (##class(TECH.ListUtils).Contains(..TeGroeperenVolumes, SnijData.BoxData.%Id())) || (BoxDataMetID.Meta.OptiType = "VOLUME")) { Set SnijData.BoxUsage = "VOL" Set SnijData.PPSPrioriteit = 1 } Else { @@ -836,10 +849,16 @@ While BoxDataIterator.HasNext() { #dim BoxData As DS.Prod.OptiBox.BoxDataMetID = BoxDataIterator.Next() If (($$$Not(BoxData.VolumeVan = "") && (BoxData.VolumeVan.%Id() = "OL||Antislipmat groep||1"))) { - Set GroeperingdoosHoogte = GroeperingdoosHoogte + (BoxData.Hoogte * BoxData.Aantal) - Set GroeperingdoosBreedte = ##class(TECH.Math).Max(GroeperingdoosBreedte, ##class(TECH.Math).Max(BoxData.Breedte, BoxData.Diepte)) - Set GroeperingdoosDiepte = ##class(TECH.Math).Max(GroeperingdoosDiepte, ##class(TECH.Math).Min(BoxData.Breedte, BoxData.Diepte)) - Set BoxDataGegroepeerdeMatten.Aantal = 1 + Set MaxBreedte = ##class(TECH.Math).Max(GroeperingdoosBreedte, ##class(TECH.Math).Max(BoxData.Breedte, BoxData.Diepte)) + + If (MaxBreedte <= ..#MaximumBreedteInlegmat) { + Set GroeperingdoosHoogte = GroeperingdoosHoogte + (BoxData.Hoogte * BoxData.Aantal) + Set GroeperingdoosBreedte = MaxBreedte + Set GroeperingdoosDiepte = ##class(TECH.Math).Max(GroeperingdoosDiepte, ##class(TECH.Math).Min(BoxData.Breedte, BoxData.Diepte)) + Set BoxDataGegroepeerdeMatten.Aantal = 1 + } Else { + Do ..Logger.Debug("Optimaliseer bon orgalux", "Er is een mat met breedte " + MaxBreedte + " die niet wordt meegerekend in de doos voor de matten. De doos voor deze mat moet manueel aangemaakt worden door de operator. Dit wil ook zeggen dat de overdoos manueel zal moeten worden gemaakt gezien er een extra doos in moet.") + } } } Set BoxDataGegroepeerdeMatten.Hoogte = GroeperingdoosHoogte @@ -966,7 +985,7 @@ #dim BoxData As DS.Prod.OptiBox.BoxDataMetID = BoxDataIterator.Next() Set BoxData = ..CopyBoxData(BoxData) - If $$$Not(BoxData.Meta.ProductGroep = "TAOR indelingen") { //Heeft geen boxselect + If ($$$Not(BoxData.Meta.ProductGroep = "TAOR indelingen") && $$$Not(BoxData.Meta.OptiType = "VOLUME")) { //Hebben geen boxselect If (BoxData.Meta.BoxSelect.GetAt(1).Naam = "OL WRAPAROUND BUFFER") { If (BoxData.Params.GetAt("LT").WaardeExec = 0) { @@ -1012,7 +1031,7 @@ If (IsProductEenOrgaluxBasispakket) { Set BoxData.Breedte = BoxData.Breedte + 10 - Set BoxData.Breedte = BoxData.Diepte + 10 + Set BoxData.Diepte = BoxData.Diepte + 10 } } @@ -1055,7 +1074,7 @@ Do GegroepeerdeBoxDataLijst.Insert(BoxDataVoorGegroepeerdeMatten) } - #dim GroepenIterator As TECH.Iterator = ##class(TECH.ListIterator).%New(..TeGroepoerenVolumes) + #dim GroepenIterator As TECH.Iterator = ##class(TECH.ListIterator).%New(..TeGroeperenVolumes) While GroepenIterator.HasNext() { #dim Groep As %String = GroepenIterator.Next() #dim BoxDataVoorGegroep As DS.Prod.OptiBox.BoxDataMetID = ..GeefBoxDataVoorGroep(BoxDataLijst, Groep) @@ -1069,7 +1088,7 @@ If $$$Not(BoxData.VolumeVan = "") { - If ($$$Not(##class(TECH.StringUtils).Equals(BoxData.VolumeVan.%Id(), "OL||Antislipmat groep||1")) && $$$Not(##class(TECH.ListUtils).Contains(..TeGroepoerenVolumes, BoxData.VolumeVan.%Id()))) { + If ($$$Not(##class(TECH.StringUtils).Equals(BoxData.VolumeVan.%Id(), "OL||Antislipmat groep||1")) && $$$Not(##class(TECH.ListUtils).Contains(..TeGroeperenVolumes, BoxData.VolumeVan.%Id()))) { Do ##class(TECH.ExceptionHandler).Throw(##class(TECH.Exceptions.UnimplementedException).%New("Groepering "_ BoxData.VolumeVan.%Id() _"' is nog niet geïmplementeerd bij de optimalisatie van de verpakking van de orgalux bonnen. Dit zorgt voor problemen bij bon " _..BonId _".")) } } Else { @@ -1097,7 +1116,7 @@ while BoxDataIterator.HasNext() { #dim BoxDataOrig As DS.Prod.OptiBox.BoxData = BoxDataIterator.Next() #dim BoxData As DS.Prod.OptiBox.BoxDataMetID = ..CopyBoxData(BoxDataOrig) - If (Qty > 0) { + If ((Qty > 0) && $$$Not(BoxData.Aantal = -1)) { If ($$$Not(BoxData.MaxCombinAantal = "") && $$$Not(BoxData.MaxCombinAantal = 1) && (Qty > 1)) { //Verdelen in evenredige stapels #dim GelijkVerdeeldeAantallenLijstIterator As TECH.Iterator = ..GeefGelijkVerdeeldeAantallenLijstIterator(Qty, BoxData.MaxCombinAantal) While GelijkVerdeeldeAantallenLijstIterator.HasNext() { @@ -1193,7 +1212,7 @@ #dim KLNr As %String =$P($G(^KU1(BonID,"F")),"\") #dim FakSoort As %String =$S($D(^KUL(KLNr,"F",BonID)):"F",1:"G") - #dim Bon As DOM.VKP.Bon = ##class(DOM.DomeinContext).Instance().GeefOrderAPI().GeefBon(BonID, FakSoort) + #dim Bon As DOM.VKP.Bon = ..OrderAPI.GeefBon(BonID, FakSoort) Quit Bon.GeefTypeBonLijnIterator( ##class(DOM.VKP.enu.BonLijnType).Product() ) ]]> @@ -1267,12 +1286,12 @@ If ($IsObject(HttpRequest.HttpResponse)) { If $$$Not(HttpRequest.HttpResponse.StatusCode = 200) { #dim ErrorInfo as %String = HttpRequest.HttpResponse.Data.Read(HttpRequest.HttpResponse.Data.Size) - Set Exception = ##class(TECH.Exceptions.AbstractOmschrijvingException).%New("Fout bij opvragen optimalisatie stapeling via cubeIQ: HttpRequest to "_HttpRequest.Server_" failed. " _ $$$CRLF _ HttpRequest.HttpResponse.ReasonPhrase _ $$$CRLF _ ErrorInfo) + Set Exception = ##class(TECH.Exceptions.AbstractOmschrijvingException).%New("Fout bij opvragen optimalisatie stapeling via cubeIQ voor bon " _ ..BonId_ " : HttpRequest to "_HttpRequest.Server_" failed. " _ $$$CRLF _ HttpRequest.HttpResponse.ReasonPhrase _ $$$CRLF _ ErrorInfo) Do ##class(TECH.ExceptionHandler).Throw(Exception) } } Else { - Do ##class(TECH.Exceptions.GeneralErrorException).Throw("Fout bij opvragen optimalisatie stapeling via cubeIQ: HttpResponse is onverwacht leeg. HttpRequest to "_HttpRequest.Server_" failed.") + Do ##class(TECH.Exceptions.GeneralErrorException).Throw("Fout bij opvragen optimalisatie stapeling via cubeIQ" _ ..BonId_ " : HttpResponse is onverwacht leeg. HttpRequest to "_HttpRequest.Server_" failed.") } ]]>