Index: VerpakkingsDefinitie/WS/ProductsAgent.pas =================================================================== diff -u -r595 -r596 --- VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 595) +++ VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 596) @@ -26,19 +26,19 @@ function GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; procedure RegistreerZoekResultaten(ProductsContext: TProductsContext; DataSet: string); overload; procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: SelectService.pxStatus); overload; - procedure RegistreerZoekResultaten(ProductVerpakkingenContext: TProductVerpakkingenContext; - pxBoxDataObj: OptiServerService.pxBoxData); overload; procedure RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); overload; - function GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext): TList; + function GetVerpakkingIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; + function GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; public Constructor Create(); procedure LaadUIInstellingen(UserContext: TUserContext; UiInstellingenContext: TUiInstellingenContext); procedure ZoekOp(UserContext: TUserContext; ProductsContext: TProductsContext; Zoekmethode: TZoekMethode; Zoek: string; KLNr: string; LevNr: string; StockType: string; Taal: string); procedure ZoekProductVerpakkingenMetProductNr(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext); + ProductVerpakkingenContext: TProductVerpakkingenContext); end; implementation @@ -340,8 +340,8 @@ ProductsContext.NotifyChanged(); end; -function TProductsAgent.GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext): TList; +function TProductsAgent.GetVerpakkingIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; var ZoekData: OptiServerService.GetBoxDataIDsViaProduct; GetBoxDataIDsViaProductResponseObj: OptiServerService.GetBoxDataIDsViaProductResponse; @@ -366,13 +366,18 @@ if GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult <> nil then begin // Mislukt - RegistreerMislukteOpzoeking(ProductDetailContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); + RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); Result := ResultaatLijst; exit; end; // Gelukt, Bruikbare informatie uit antwoord halen + // Andere velden juist zetten + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; + // Producten inladen LijnenBoxDataID := TStringList.Create; Lijnen := GeefBruikbareLijnenUitXMLDataSet(GetBoxDataIDsViaProductResponseObj.varDataSet); @@ -415,134 +420,158 @@ end; procedure TProductsAgent.ZoekProductVerpakkingenMetProductNr(ProductNr: Integer; UserContext: TUserContext; - ProductDetailContext: TProductVerpakkingenContext); + ProductVerpakkingenContext: TProductVerpakkingenContext); var - ZoekData: OptiServerService.GetBoxDataViaId; - BoxDataIDs: TList; - BoxDataID: string; - GetBoxDataViaIDResponseObj: GetBoxDataViaIDResponse; + VerpakkingIDs: TList; + TempProductVerpakkingen: TList; ProductVerpakking: TProductVerpakking; ProductVerpakkingAndere: TProductVerpakking; begin try - BoxDataIDs := GetBoxDataIDsViaProduct(ProductNr, UserContext, ProductDetailContext); + VerpakkingIDs := GetVerpakkingIDsViaProduct(ProductNr, UserContext, ProductVerpakkingenContext); // Controleren dat er resultaat was - if (BoxDataIDs = nil) or (BoxDataIDs.Count = 0) then + if ProductVerpakkingenContext.IsOK = false then + exit + else if (VerpakkingIDs = nil) or (VerpakkingIDs.Count = 0) then raise Exception.Create('Er zijn geen Box IDs gevonden.'); - // Er was resultaat, data opvragen en toevoegen - ProductDetailContext.ProductVerpakkingen.Clear(); + // Opvragen productverpakkingen + TempProductVerpakkingen := GeefVerpakkingenMetIDs(VerpakkingIDs, UserContext, ProductVerpakkingenContext); + if ProductVerpakkingenContext.IsOK = false then + exit; - for BoxDataID in BoxDataIDs do - begin - // Request - // Met ID, box data opvragen - ZoekData := OptiServerService.GetBoxDataViaId.Create(); - ZoekData.SessionKey := UserContext.SessionKey; - ZoekData.BoxDataID := BoxDataID; - - GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); - - // Response - if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult = nil then - begin - // Gelukt - RegistreerZoekResultaten(ProductDetailContext, GetBoxDataViaIDResponseObj.varBoxData); - end - else - begin - // Mislukt - RegistreerMislukteOpzoeking(ProductDetailContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); - // Stop wanneer error is opgetreden - exit; - end; - end; // Registreer DeelVan, zoekt de verpakking op met het overeenkomstige DeelVanID = ID // Door gebrek aan custom comparators voor zo'n opzoeking moet dit manueel. O(n�) - for ProductVerpakking in ProductDetailContext.ProductVerpakkingen do + for ProductVerpakking in TempProductVerpakkingen do begin if ProductVerpakking.DeelVanID <> '' then - for ProductVerpakkingAndere in ProductDetailContext.ProductVerpakkingen do + for ProductVerpakkingAndere in ProductVerpakkingenContext.ProductVerpakkingen do if ProductVerpakking.DeelVanID = ProductVerpakkingAndere.ID then ProductVerpakking.DeelVan := ProductVerpakkingAndere; end; - ProductDetailContext.NotifyChanged(); + // Toevoegen aan context + ProductVerpakkingenContext.Reset(false); + ProductVerpakkingenContext.SetProductVerpakkingen(TempProductVerpakkingen); + TempProductVerpakkingen.Clear(); finally - FreeAndNil(BoxDataIDs); - FreeAndNil(ZoekData); + FreeAndNil(VerpakkingIDs); + FreeAndNil(TempProductVerpakkingen); end; end; -procedure TProductsAgent.RegistreerZoekResultaten(ProductVerpakkingenContext: TProductVerpakkingenContext; - pxBoxDataObj: OptiServerService.pxBoxData); +function TProductsAgent.GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; var + BoxDataID: string; + ZoekData: OptiServerService.GetBoxDataViaId; + GetBoxDataViaIDResponseObj: GetBoxDataViaIDResponse; + TempProductVerpakkingen: TList; + + pxBoxDataObj: OptiServerService.pxBoxData; Verpakking: TProductVerpakking; I: Integer; NieuweVerpakkingParameter: TProductVerpakkingParameter; begin - // Andere velden juist zetten - ProductVerpakkingenContext.IsOK := True; - ProductVerpakkingenContext.ErrorMessage := ''; - ProductVerpakkingenContext.InternalErrorMessage := ''; + try + TempProductVerpakkingen := TList.Create(); - Verpakking := TProductVerpakking.Create(); - with Verpakking do - begin - RawData := pxBoxDataObj; - VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; - ID := pxBoxDataObj.ID; - CutOrder := pxBoxDataObj.CutOrder; - Breedte := pxBoxDataObj.Breedte; - Diepte := pxBoxDataObj.Diepte; - Hoogte := pxBoxDataObj.Hoogte; - Aantal := pxBoxDataObj.Aantal; - MaxCombinAantal := pxBoxDataObj.MaxCombinAantal; - Plaatsing := pxBoxDataObj.Plaatsing; - OptiType := pxBoxDataObj.OptiType; + for BoxDataID in VerpakkingIDs do + begin + // Request + // Met ID, box data opvragen + ZoekData := OptiServerService.GetBoxDataViaId.Create(); + ZoekData.SessionKey := UserContext.SessionKey; + ZoekData.BoxDataID := BoxDataID; - Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); - Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); - if pxBoxDataObj.DefaultData <> nil then - begin - DefaultBreedte := pxBoxDataObj.DefaultData.Breedte; - DefaultDiepte := pxBoxDataObj.DefaultData.Diepte; - DefaultHoogte := pxBoxDataObj.DefaultData.Hoogte; - DefaultPlaatsing := pxBoxDataObj.DefaultData.Plaatsing; - DefaultOptiType := pxBoxDataObj.DefaultData.OptiType; + // Response + if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult <> nil then + begin + // Mislukt + RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); + // Stop wanneer error is opgetreden + Result := TempProductVerpakkingen; + exit; + end; - DefaultPosities.AddRange(SplitString(pxBoxDataObj.DefaultData.Positie, ';')); - DefaultRichtingen.AddRange(SplitString(pxBoxDataObj.DefaultData.Rotatie, ';')); - end; + // Gelukt - // Verpakking parameters. haal waarden uit gewone data en default data. - Parameters.Clear(); - for I := 0 to High(pxBoxDataObj.Params) do - begin - NieuweVerpakkingParameter := TProductVerpakkingParameter.Create(); - NieuweVerpakkingParameter.ID := pxBoxDataObj.Params[I].ID; - NieuweVerpakkingParameter.ProgLabel := pxBoxDataObj.Params[I].ProgLabel; - NieuweVerpakkingParameter.ToolTip := pxBoxDataObj.Params[I].ToolTip; - NieuweVerpakkingParameter.Waarde := pxBoxDataObj.Params[I].Waarde; - if (pxBoxDataObj.DefaultData <> nil) and (High(pxBoxDataObj.Params) = High(pxBoxDataObj.DefaultData.Params)) then - NieuweVerpakkingParameter.DefaultWaarde := pxBoxDataObj.DefaultData.Params[I].Waarde; - Parameters.Add(NieuweVerpakkingParameter); - end; + // Andere velden juist zetten + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; - DeelVanID := pxBoxDataObj.DeelVanID; - DeelVanCaption := pxBoxDataObj.DeelVanCaption; + pxBoxDataObj := GetBoxDataViaIDResponseObj.varBoxData; - MetaCaption := pxBoxDataObj.MetaCaption; - end; + // Verpakking aanmaken, vullen met data en toevoegen aan temp lijst met productverpakkingen. + Verpakking := TProductVerpakking.Create(); + with Verpakking do + begin + RawData := pxBoxDataObj; + VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; + ID := pxBoxDataObj.ID; + CutOrder := pxBoxDataObj.CutOrder; + Breedte := pxBoxDataObj.Breedte; + Diepte := pxBoxDataObj.Diepte; + Hoogte := pxBoxDataObj.Hoogte; + Aantal := pxBoxDataObj.Aantal; + MaxCombinAantal := pxBoxDataObj.MaxCombinAantal; + Plaatsing := pxBoxDataObj.Plaatsing; + OptiType := pxBoxDataObj.OptiType; - ProductVerpakkingenContext.ProductVerpakkingen.Add(Verpakking); + Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); + Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + + // Default data instellen als deze aanwezig is. + if pxBoxDataObj.DefaultData <> nil then + begin + DefaultBreedte := pxBoxDataObj.DefaultData.Breedte; + DefaultDiepte := pxBoxDataObj.DefaultData.Diepte; + DefaultHoogte := pxBoxDataObj.DefaultData.Hoogte; + DefaultPlaatsing := pxBoxDataObj.DefaultData.Plaatsing; + DefaultOptiType := pxBoxDataObj.DefaultData.OptiType; + + DefaultPosities.AddRange(SplitString(pxBoxDataObj.DefaultData.Positie, ';')); + DefaultRichtingen.AddRange(SplitString(pxBoxDataObj.DefaultData.Rotatie, ';')); + end; + + // Speciale properties + DeelVanID := pxBoxDataObj.DeelVanID; + DeelVanCaption := pxBoxDataObj.DeelVanCaption; + MetaCaption := pxBoxDataObj.MetaCaption; + + // Verpakking parameters. Haal waarden uit gewone data en default data. + Parameters.Clear(); + for I := 0 to High(pxBoxDataObj.Params) do + begin + NieuweVerpakkingParameter := TProductVerpakkingParameter.Create(); + NieuweVerpakkingParameter.ID := pxBoxDataObj.Params[I].ID; + NieuweVerpakkingParameter.ProgLabel := pxBoxDataObj.Params[I].ProgLabel; + NieuweVerpakkingParameter.ToolTip := pxBoxDataObj.Params[I].ToolTip; + NieuweVerpakkingParameter.Waarde := pxBoxDataObj.Params[I].Waarde; + // Kijken of aantal parameters in default data overeenkomt met die in gewone data. + if (pxBoxDataObj.DefaultData <> nil) and (High(pxBoxDataObj.Params) = High(pxBoxDataObj.DefaultData.Params)) then + NieuweVerpakkingParameter.DefaultWaarde := pxBoxDataObj.DefaultData.Params[I].Waarde; + Parameters.Add(NieuweVerpakkingParameter); + end; + end; + + // Toevoegen aan temp lijst met productverpakkingen + TempProductVerpakkingen.Add(Verpakking); + end; + + Result := TempProductVerpakkingen; + finally + FreeAndNil(ZoekData); + end; end; procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); begin - ProductDetailContext.ProductVerpakkingen.Clear(); + ProductDetailContext.Reset(false); ProductDetailContext.IsOK := pxStatusObj.IsOK; ProductDetailContext.ErrorMessage := pxStatusObj.Message_;