Index: VerpakkingsDefinitie/UI/ProductDetailScherm.dfm =================================================================== diff -u -r598 -r599 --- VerpakkingsDefinitie/UI/ProductDetailScherm.dfm (.../ProductDetailScherm.dfm) (revision 598) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.dfm (.../ProductDetailScherm.dfm) (revision 599) @@ -54,7 +54,7 @@ Caption = 'Product' end object LabelProductNaam: TLabel - Left = 51 + Left = 134 Top = 64 Width = 106 Height = 13 @@ -67,30 +67,34 @@ ParentFont = False end object LabelProductNummer: TLabel - Left = 746 + Left = 57 Top = 64 - Width = 122 + Width = 54 Height = 13 - Anchors = [akTop, akRight] BiDiMode = bdLeftToRight - Caption = 'LabelProductNummer' + Caption = 'LabelPrNr' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [fsBold] ParentBiDiMode = False ParentFont = False - ExplicitLeft = 730 end - object Label17: TLabel - Left = 686 + object Label2: TLabel + Left = 117 Top = 64 - Width = 54 + Width = 11 Height = 13 - Anchors = [akTop, akRight] - Caption = 'Product nr.' - ExplicitLeft = 676 + BiDiMode = bdLeftToRight + Caption = ' - ' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [fsBold] + ParentBiDiMode = False + ParentFont = False end object GroupBox1: TGroupBox Left = 8 @@ -117,7 +121,7 @@ -1) end item - Caption = 'BoxSelect' + Caption = 'Meta name' Width = -1 WidthType = ( -1) @@ -154,23 +158,34 @@ ViewStyle = vsReport OnSelectItem = ListViewVerpakkingenSelectItem end - object ButtonNieuw: TButton + object ButtonNieuweVerpakking: TButton Left = 698 Top = 31 Width = 101 Height = 25 Anchors = [akTop, akRight] Caption = 'Nieuw' TabOrder = 1 + OnClick = ButtonNieuweVerpakkingClick end - object ButtonVerwijder: TButton + object ButtonVerwijderVerpakking: TButton Left = 698 - Top = 70 + Top = 110 Width = 101 Height = 25 Anchors = [akTop, akRight] Caption = 'Verwijder' TabOrder = 2 end + object ButtonDupliceerVerpakking: TButton + Left = 698 + Top = 62 + Width = 101 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'Dupliceer' + TabOrder = 3 + OnClick = ButtonDupliceerVerpakkingClick + end end end Index: VerpakkingsDefinitie/ApplicationContext.pas =================================================================== diff -u -r598 -r599 --- VerpakkingsDefinitie/ApplicationContext.pas (.../ApplicationContext.pas) (revision 598) +++ VerpakkingsDefinitie/ApplicationContext.pas (.../ApplicationContext.pas) (revision 599) @@ -129,81 +129,91 @@ TProductVerpakking = class private - FRawData: TObject; + FDefaultRawData: TObject; FID: string; + FObjType: string; + FObjRef: string; FCutOrder: Integer; - + FDeelVan: TProductVerpakking; + FDeelVanCaption: string; + FDeelVanID: string; { TODO : Setter die ID en caption instelt + notify } FVolumeVanCaption: string; + FVolumeVanID: string; + FMetaCaption: string; + FMetaID: string; + FPosities: TList; + FDefaultPosities: TList; + FOptiType: string; + FDefaultOptiType: string; + FRichtingen: TList; + FDefaultRichtingen: TList; + FPlaatsing: string; + FDefaultPlaatsing: string; + FHoogte: string; + FDefaultHoogte: string; FBreedte: string; FDefaultBreedte: string; FDiepte: string; FDefaultDiepte: string; - FHoogte: string; - FDefaultHoogte: string; FAantal: string; FMaxCombinAantal: string; - FPlaatsing: string; - FDefaultPlaatsing: string; - FOptiType: string; - FDefaultOptiType: string; - - FPosities: TList; - FDefaultPosities: TList; - FRichtingen: TList; - FDefaultRichtingen: TList; - FParameters: TList; - FDeelVanID: string; - FDeelVanCaption: string; - FDeelVan: TProductVerpakking; - - FMetaCaption: string; - function GetMetaCaptionDisplay(): string; function GetBreedteDisplay: string; function GetDiepteDisplay: string; function GetHoogteDisplay: string; function GetParametersLijst: TReadOnlyList; public - property RawData: TObject read FRawData write FRawData; + property RawDefaultData: TObject read FDefaultRawData write FDefaultRawData; property ID: string read FID write FID; + property ObjType: string read FObjType write FObjType; + property ObjRef: string read FObjRef write FObjRef; property CutOrder: Integer read FCutOrder write FCutOrder; + property DeelVanID: string read FDeelVanID write FDeelVanID; + property DeelVanCaption: string read FDeelVanCaption write FDeelVanCaption; + property DeelVan: TProductVerpakking read FDeelVan write FDeelVan; + property VolumeVanCaption: string read FVolumeVanCaption write FVolumeVanCaption; + property VolumeVanID: string read FVolumeVanID write FVolumeVanID; + + property MetaCaptionDisplay: string read GetMetaCaptionDisplay; + property MetaCaption: string read FMetaCaption write FMetaCaption; + property MetaID: string read FMetaID write FMetaID; + + property Posities: TList read FPosities; + property DefaultPosities: TList read FDefaultPosities; + + property OptiType: string read FOptiType write FOptiType; + property DefaultOptiType: string read FDefaultOptiType write FDefaultOptiType; + + property Richtingen: TList read FRichtingen; + property DefaultRichtingen: TList read FDefaultRichtingen; + + property Plaatsing: string read FPlaatsing write FPlaatsing; + property DefaultPlaatsing: string read FDefaultPlaatsing write FDefaultPlaatsing; + + property HoogteDisplay: string read GetHoogteDisplay; + property Hoogte: string read FHoogte write FHoogte; + property DefaultHoogte: string read FDefaultHoogte write FDefaultHoogte; + property BreedteDisplay: string read GetBreedteDisplay; property Breedte: string read FBreedte write FBreedte; property DefaultBreedte: string read FDefaultBreedte write FDefaultBreedte; + property DiepteDisplay: string read GetDiepteDisplay; property Diepte: string read FDiepte write FDiepte; property DefaultDiepte: string read FDefaultDiepte write FDefaultDiepte; - property HoogteDisplay: string read GetHoogteDisplay; - property Hoogte: string read FHoogte write FHoogte; - property DefaultHoogte: string read FDefaultHoogte write FDefaultHoogte; + property Aantal: string read FAantal write FAantal; property MaxCombinAantal: string read FMaxCombinAantal write FMaxCombinAantal; - property Plaatsing: string read FPlaatsing write FPlaatsing; - property DefaultPlaatsing: string read FDefaultPlaatsing write FDefaultPlaatsing; - property OptiType: string read FOptiType write FOptiType; - property DefaultOptiType: string read FDefaultOptiType write FDefaultOptiType; - property Posities: TList read FPosities; - property DefaultPosities: TList read FDefaultPosities; - property Richtingen: TList read FRichtingen; - property DefaultRichtingen: TList read FDefaultRichtingen; - property Parameters: TReadOnlyList read GetParametersLijst; procedure SetParameters(Collection: TEnumerable); - property DeelVanID: string read FDeelVanID write FDeelVanID; - property DeelVanCaption: string read FDeelVanCaption write FDeelVanCaption; - property DeelVan: TProductVerpakking read FDeelVan write FDeelVan; - - property MetaCaption: string write FMetaCaption; - property MetaCaptionDisplay: string read GetMetaCaptionDisplay; - function Equals(Obj: TObject): Boolean; override; constructor Create(); end; Index: VerpakkingsDefinitie/WS/ProductsAgent.pas =================================================================== diff -u -r598 -r599 --- VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 598) +++ VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 599) @@ -4,7 +4,8 @@ uses SysUtils, System.Classes, System.Generics.Collections, ObserverPattern, ApplicationContext, - SelectService, OptiServerService, UI_Data; + SelectService, OptiServerService, UI_Data, + Vcl.Dialogs, Soap.InvokeRegistry; // Resource strings are stored as resources and linked into the executable or // library so that they can be modified without recompiling the program. @@ -19,26 +20,46 @@ private FSelectServerSoap: SelectService.ProdSelectServerSoap; FOptiBoxServerSoap: OptiServerService.OptiBoxServerSoap; + + // Helper functie + function JoinStrings(const s: array of string; Delimiter: Char): string; + + function GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; + // Config function GeefUiConfigLink(UserContext: TUserContext; UiInstellingenContext: TUiInstellingenContext): string; + procedure RegistreerLoadResultaten(UiInstellingenContext: TUiInstellingenContext; Instellingen: UI_Data.IXMLOptiBoxType); procedure RegistreerMislukteOpzoeking(UiInstellingenContext: TUiInstellingenContext; pxStatusObj: OptiServerService.pxStatus); overload; - procedure RegistreerLoadResultaten(UiInstellingenContext: TUiInstellingenContext; Instellingen: UI_Data.IXMLOptiBoxType); - function GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; + // Producten procedure RegistreerZoekResultaten(ProductsContext: TProductsContext; DataSet: string); overload; procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: SelectService.pxStatus); overload; - procedure RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; + // Verpakkingen + procedure MapPxBoxDataNaarProductVerpakking(pxBoxDataObj: OptiServerService.pxBoxData; ProductVerpakking: TProductVerpakking); + procedure MapProductVerpakkingNaarPxBoxData(ProductVerpakking: TProductVerpakking; pxBoxDataObj: OptiServerService.pxBoxData); + procedure RegistreerMislukteVerpakkingQuery(ProductVerpakkingenContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); overload; function GetVerpakkingIDsViaProduct(ProductNr: Integer; UserContext: TUserContext; ProductVerpakkingenContext: TProductVerpakkingenContext): TList; + function GeefVerpakkingMetID(VerpakkingID: string; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TProductVerpakking; function GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; ProductVerpakkingenContext: TProductVerpakkingenContext): TList; public Constructor Create(); + // UI procedure LaadUIInstellingen(UserContext: TUserContext; UiInstellingenContext: TUiInstellingenContext); + // Product procedure ZoekOp(UserContext: TUserContext; ProductsContext: TProductsContext; Zoekmethode: TZoekMethode; Zoek: string; KLNr: string; LevNr: string; StockType: string; Taal: string); + // Verpakkingen procedure ZoekProductVerpakkingenMetProductNr(ProductNr: Integer; UserContext: TUserContext; ProductVerpakkingenContext: TProductVerpakkingenContext); + procedure NieuweVerpakking(CutOrder: Integer; Product: TProductInformatie; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext); + procedure DupliceerVerpakking(ProductVerpakking: TProductVerpakking; NieuweCutOrder: Integer; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext); + procedure OpslaanProductVerpakking(ProductVerpakking: TProductVerpakking; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext); end; implementation @@ -52,6 +73,29 @@ FOptiBoxServerSoap := OptiServerService.GetOptiBoxServerSoap(false, OPTI_SERVER_URL, nil); end; +// https://stackoverflow.com/questions/30156172/how-to-concatenate-array-of-string-elements-into-a-string/46523477 +function TProductsAgent.JoinStrings(const s: array of string; Delimiter: Char): string; +var + i, c: Integer; + p: PChar; +begin + c := 0; + for i := 0 to High(s) do + Inc(c, Length(s[i])); + SetLength(Result, c + High(s)); + p := PChar(Result); + for i := 0 to High(s) do + begin + if i > 0 then + begin + p^ := Delimiter; + Inc(p); + end; + Move(PChar(s[i])^, p^, SizeOf(Char) * Length(s[i])); + Inc(p, Length(s[i])); + end; +end; + function TProductsAgent.GeefUiConfigLink(UserContext: TUserContext; UiInstellingenContext: TUiInstellingenContext): string; var ZoekData: OptiServerService.GetUIResource; @@ -115,7 +159,7 @@ Instellingen: UI_Data.IXMLOptiBoxType); var Node: IXMLNode; - I: Integer; + i: Integer; KeyStr: string; begin // Ander velden leegmaken @@ -127,9 +171,9 @@ UiInstellingenContext.PositiesByValue.Clear(); if Instellingen.Positie <> nil then begin - for I := 0 to Instellingen.Positie.Count - 1 do + for i := 0 to Instellingen.Positie.Count - 1 do begin - Node := Instellingen.Positie[I]; + Node := Instellingen.Positie[i]; KeyStr := Node.GetAttributeNS('Key', ''); UiInstellingenContext.Posities.Add(KeyStr, Node.Text); UiInstellingenContext.PositiesByValue.Add(Node.Text, KeyStr); @@ -140,9 +184,9 @@ UiInstellingenContext.PlaatsingByValue.Clear(); if Instellingen.Plaatsing <> nil then begin - for I := 0 to Instellingen.Plaatsing.Count - 1 do + for i := 0 to Instellingen.Plaatsing.Count - 1 do begin - Node := Instellingen.Plaatsing[I]; + Node := Instellingen.Plaatsing[i]; KeyStr := Node.GetAttributeNS('Key', ''); UiInstellingenContext.Plaatsing.Add(KeyStr, Node.Text); UiInstellingenContext.PlaatsingByValue.Add(Node.Text, KeyStr); @@ -153,9 +197,9 @@ UiInstellingenContext.RichtingenByValue.Clear(); if Instellingen.Richting <> nil then begin - for I := 0 to Instellingen.Richting.Count - 1 do + for i := 0 to Instellingen.Richting.Count - 1 do begin - Node := Instellingen.Richting[I]; + Node := Instellingen.Richting[i]; KeyStr := Node.GetAttributeNS('Key', ''); UiInstellingenContext.Richtingen.Add(KeyStr, Node.Text); UiInstellingenContext.RichtingenByValue.Add(Node.Text, KeyStr); @@ -166,9 +210,9 @@ UiInstellingenContext.OptiTypesByValue.Clear(); if Instellingen.Richting <> nil then begin - for I := 0 to Instellingen.OptiType.Count - 1 do + for i := 0 to Instellingen.OptiType.Count - 1 do begin - Node := Instellingen.OptiType[I]; + Node := Instellingen.OptiType[i]; KeyStr := Node.GetAttributeNS('Key', ''); UiInstellingenContext.OptiTypes.Add(KeyStr, Node.Text); UiInstellingenContext.OptiTypesByValue.Add(Node.Text, KeyStr); @@ -366,7 +410,8 @@ if GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult <> nil then begin // Mislukt - RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); + RegistreerMislukteVerpakkingQuery(ProductVerpakkingenContext, + GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); Result := ResultaatLijst; exit; end; @@ -433,7 +478,11 @@ if ProductVerpakkingenContext.IsOK = false then exit else if (VerpakkingIDs = nil) or (VerpakkingIDs.Count = 0) then - raise Exception.Create('Er zijn geen Box IDs gevonden.'); + begin + ProductVerpakkingenContext.IsOK := false; + ProductVerpakkingenContext.ErrorMessage := 'Er zijn geen Box IDs gevonden.'; + exit; + end; // Opvragen productverpakkingen TempProductVerpakkingen := GeefVerpakkingenMetIDs(VerpakkingIDs, UserContext, ProductVerpakkingenContext); @@ -460,128 +509,327 @@ end; end; -function TProductsAgent.GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; - ProductVerpakkingenContext: TProductVerpakkingenContext): TList; +function TProductsAgent.GeefVerpakkingMetID(VerpakkingID: string; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TProductVerpakking; var - BoxDataID: string; ZoekData: OptiServerService.GetBoxDataViaId; GetBoxDataViaIDResponseObj: GetBoxDataViaIDResponse; - TempProductVerpakkingen: TList; - TempNieuweVerpakkingParameters: TList; - pxBoxDataObj: OptiServerService.pxBoxData; - Verpakking: TProductVerpakking; - I: Integer; - NieuweVerpakkingParameter: TProductVerpakkingParameter; + NieuweVerpakking: TProductVerpakking; begin try - TempProductVerpakkingen := TList.Create(); - TempNieuweVerpakkingParameters := TList.Create(); + NieuweVerpakking := TProductVerpakking.Create(); - for BoxDataID in VerpakkingIDs do + // Request + // Met ID, box data opvragen + ZoekData := OptiServerService.GetBoxDataViaId.Create(); + ZoekData.SessionKey := UserContext.SessionKey; + ZoekData.BoxDataID := VerpakkingID; + + GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); + + // Response + if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult <> nil then begin - // Request - // Met ID, box data opvragen - ZoekData := OptiServerService.GetBoxDataViaId.Create(); - ZoekData.SessionKey := UserContext.SessionKey; - ZoekData.BoxDataID := BoxDataID; + // Mislukt + RegistreerMislukteVerpakkingQuery(ProductVerpakkingenContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); + // Stop wanneer error is opgetreden + Result := NieuweVerpakking; + exit; + end; - GetBoxDataViaIDResponseObj := FOptiBoxServerSoap.GetBoxDataViaId(ZoekData); + // Gelukt - // Response - if GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult <> nil then - begin - // Mislukt - RegistreerMislukteOpzoeking(ProductVerpakkingenContext, GetBoxDataViaIDResponseObj.GetBoxDataViaIDResult); - // Stop wanneer error is opgetreden - Result := TempProductVerpakkingen; - exit; - end; + // Andere velden juist zetten + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; - // Gelukt + MapPxBoxDataNaarProductVerpakking(GetBoxDataViaIDResponseObj.varBoxData, NieuweVerpakking); - // Andere velden juist zetten - ProductVerpakkingenContext.IsOK := True; - ProductVerpakkingenContext.ErrorMessage := ''; - ProductVerpakkingenContext.InternalErrorMessage := ''; + Result := NieuweVerpakking; + finally + FreeAndNil(ZoekData); + end; +end; - pxBoxDataObj := GetBoxDataViaIDResponseObj.varBoxData; +function TProductsAgent.GeefVerpakkingenMetIDs(VerpakkingIDs: TList; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext): TList; +var + VerpakkingID: string; + TempProductVerpakkingen: TList; + NieuweVerpakking: TProductVerpakking; +begin + TempProductVerpakkingen := TList.Create(); - // 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; + for VerpakkingID in VerpakkingIDs do + begin + NieuweVerpakking := GeefVerpakkingMetID(VerpakkingID, UserContext, ProductVerpakkingenContext); - Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); - Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + if ProductVerpakkingenContext.IsOK = false then + begin + // Mislukt + // Stop wanneer error is opgetreden + Result := TempProductVerpakkingen; + exit; + end; - // 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; + // Gelukt, voeg toe aan lijst. + TempProductVerpakkingen.Add(NieuweVerpakking); + end; - DefaultPosities.AddRange(SplitString(pxBoxDataObj.DefaultData.Positie, ';')); - DefaultRichtingen.AddRange(SplitString(pxBoxDataObj.DefaultData.Rotatie, ';')); - end; + Result := TempProductVerpakkingen; +end; - // Speciale properties - DeelVanID := pxBoxDataObj.DeelVanID; - DeelVanCaption := pxBoxDataObj.DeelVanCaption; - MetaCaption := pxBoxDataObj.MetaCaption; +procedure TProductsAgent.NieuweVerpakking(CutOrder: Integer; Product: TProductInformatie; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext); +var + NieuweProductVerpakking: TProductVerpakking; +begin + // Een nieuwe verpakking kan worden opgevraagd met een lege request naar GetBoxDataViaID + // Hier gaan we gewoon voor de constructor call van de klasse, maar zijn transparant naar de callende klasse + // De nieuwe instantie bevat nog te weinig informatie om te worden opgeslagen - // Verpakking parameters. Haal waarden uit gewone data en default data. - 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; - TempNieuweVerpakkingParameters.Add(NieuweVerpakkingParameter); - end; - SetParameters(TempNieuweVerpakkingParameters); - TempNieuweVerpakkingParameters.Clear(); - end; + if (Product = nil) or (CutOrder < 0) then + exit; - // Toevoegen aan temp lijst met productverpakkingen - TempProductVerpakkingen.Add(Verpakking); + ProductVerpakkingenContext.IsOK := True; + ProductVerpakkingenContext.ErrorMessage := ''; + ProductVerpakkingenContext.InternalErrorMessage := ''; + + // Nieuwe productverpakking aanmaken + NieuweProductVerpakking := TProductVerpakking.Create(); + NieuweProductVerpakking.CutOrder := CutOrder; { TODO : Zelf nummer bepalen, max nummer nemen en daarbij optellen } + NieuweProductVerpakking.ObjType := 'PR'; + NieuweProductVerpakking.objref := IntToStr(Product.ProductNr); + + ProductVerpakkingenContext.AddProductVerpakking(NieuweProductVerpakking); +end; + +procedure TProductsAgent.DupliceerVerpakking(ProductVerpakking: TProductVerpakking; NieuweCutOrder: Integer; + UserContext: TUserContext; ProductVerpakkingenContext: TProductVerpakkingenContext); +var + NieuweVerpakking: TProductVerpakking; +begin + // Verpakking dupliceren door verpakking opnieuw op te vragen (ander zouden we de originele verpakking aanpassen) + // velden die door de server worden ingevuld te wissen en andere velden te updaten. + // Nadien slaan we deze verpakking meteen op de server. + if (ProductVerpakking = nil) or (NieuweCutOrder < 0) then + exit; + + NieuweVerpakking := GeefVerpakkingMetID(ProductVerpakking.ID, UserContext, ProductVerpakkingenContext); + + if ProductVerpakkingenContext.IsOK = false then + begin + // Mislukt, stop meteen; + exit; + end; + + // Gelukt, data aanpassen. + NieuweVerpakking.ID := ''; + NieuweVerpakking.CutOrder := NieuweCutOrder; { TODO : Zelf nummer bepalen, max nummer nemen en daarbij optellen } + + // Opslaan + ProductVerpakkingenContext.AddProductVerpakking(NieuweVerpakking); + OpslaanProductVerpakking(NieuweVerpakking, UserContext, ProductVerpakkingenContext); +end; + +procedure TProductsAgent.OpslaanProductVerpakking(ProductVerpakking: TProductVerpakking; UserContext: TUserContext; + ProductVerpakkingenContext: TProductVerpakkingenContext); +var + RequestData: OptiServerService.SaveBoxData; + VerpakkingData: OptiServerService.pxBoxData; + SaveBoxDataResponseObj: SaveBoxDataResponse; +begin + RequestData := nil; + try + // Request + RequestData := OptiServerService.SaveBoxData.Create(); + RequestData.SessionKey := UserContext.SessionKey; + + VerpakkingData := OptiServerService.pxBoxData.Create(); + MapProductVerpakkingNaarPxBoxData(ProductVerpakking, VerpakkingData); + RequestData.pxBoxData := VerpakkingData; + + // Verpakking opslaan + + SaveBoxDataResponseObj := FOptiBoxServerSoap.SaveBoxData(RequestData); + + // Response + if SaveBoxDataResponseObj.SaveBoxDataResult.IsOK then + begin + // Gelukt, ID juist zetten + ProductVerpakking.ID := SaveBoxDataResponseObj.SaveBoxDataResult.Data; + ProductVerpakkingenContext.NotifyChanged(); + end + else + begin + // Mislukt + ProductVerpakkingenContext.IsOK := SaveBoxDataResponseObj.SaveBoxDataResult.IsOK; + ProductVerpakkingenContext.ErrorMessage := SaveBoxDataResponseObj.SaveBoxDataResult.Message_; + ProductVerpakkingenContext.InternalErrorMessage := SaveBoxDataResponseObj.SaveBoxDataResult.InternalMessage; end; + finally + FreeAndNil(RequestData); + end; +end; - Result := TempProductVerpakkingen; +procedure TProductsAgent.MapPxBoxDataNaarProductVerpakking(pxBoxDataObj: OptiServerService.pxBoxData; + ProductVerpakking: TProductVerpakking); +var + i: Integer; + TempNieuweVerpakkingParameters: TList; + NieuweVerpakkingParameter: TProductVerpakkingParameter; +begin + // Verpakking aanmaken, vullen met data, parameters toevoegen + TempNieuweVerpakkingParameters := TList.Create(); + + try + with ProductVerpakking do + begin + RawDefaultData := pxBoxDataObj.DefaultData; + VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; + + ID := pxBoxDataObj.ID; + ObjType := pxBoxDataObj.ObjType; + objref := pxBoxDataObj.objref; + CutOrder := pxBoxDataObj.CutOrder; + + // Speciale properties + DeelVanCaption := pxBoxDataObj.DeelVanCaption; + DeelVanID := pxBoxDataObj.DeelVanID; + VolumeVanCaption := pxBoxDataObj.VolumeVanCaption; + VolumeVanID := pxBoxDataObj.VolumeVanID; + MetaCaption := pxBoxDataObj.MetaCaption; + MetaID := pxBoxDataObj.MetaID; + + // Normale properties + OptiType := pxBoxDataObj.OptiType; + Plaatsing := pxBoxDataObj.Plaatsing; + Hoogte := pxBoxDataObj.Hoogte; + Breedte := pxBoxDataObj.Breedte; + Diepte := pxBoxDataObj.Diepte; + Aantal := pxBoxDataObj.Aantal; + MaxCombinAantal := pxBoxDataObj.MaxCombinAantal; + + Posities.AddRange(SplitString(pxBoxDataObj.Positie, '')); + Richtingen.AddRange(SplitString(pxBoxDataObj.Rotatie, '')); + + // Default data instellen als deze aanwezig is. + if pxBoxDataObj.DefaultData <> nil then + begin + DefaultOptiType := pxBoxDataObj.DefaultData.OptiType; + DefaultPlaatsing := pxBoxDataObj.DefaultData.Plaatsing; + DefaultHoogte := pxBoxDataObj.DefaultData.Hoogte; + DefaultBreedte := pxBoxDataObj.DefaultData.Breedte; + DefaultDiepte := pxBoxDataObj.DefaultData.Diepte; + { TODO : aantal en Max comb aantal default waarden } + + 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. + 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; + TempNieuweVerpakkingParameters.Add(NieuweVerpakkingParameter); + end; + SetParameters(TempNieuweVerpakkingParameters); + end; finally - FreeAndNil(ZoekData); + TempNieuweVerpakkingParameters.Clear(); FreeAndNil(TempNieuweVerpakkingParameters); end; end; -procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductDetailContext: TProductVerpakkingenContext; +procedure TProductsAgent.MapProductVerpakkingNaarPxBoxData(ProductVerpakking: TProductVerpakking; + pxBoxDataObj: OptiServerService.pxBoxData); +var + i: Integer; + DefaultDataObj: OptiServerService.pxBoxData; +begin + // Default data object casten. Dit uit klasse halen bespaart extra call. + if ProductVerpakking.RawDefaultData = nil then + raise Exception.Create('Default data raw object mag niet leeg zijn') + else + DefaultDataObj := pxBoxData(ProductVerpakking.RawDefaultData); + + with pxBoxDataObj do + begin + ID := ProductVerpakking.ID; + ObjType := ProductVerpakking.ObjType; + objref := ProductVerpakking.objref; + CutOrder := ProductVerpakking.CutOrder; + + // Speciale properties + DeelVanCaption := ProductVerpakking.DeelVanCaption; + DeelVanID := ProductVerpakking.DeelVanID; + VolumeVanCaption := ProductVerpakking.VolumeVanCaption; + VolumeVanID := ProductVerpakking.VolumeVanID; + MetaCaption := ProductVerpakking.MetaCaption; + MetaID := ProductVerpakking.MetaID; + + DefaultData := DefaultDataObj; + + // Normale properties + Positie := JoinStrings(ProductVerpakking.Posities.ToArray(), #0); // Positie + OptiType := ProductVerpakking.OptiType; + Rotatie := JoinStrings(ProductVerpakking.Richtingen.ToArray(), #0); // Richting + Plaatsing := ProductVerpakking.Plaatsing; + Hoogte := ProductVerpakking.Hoogte; + Breedte := ProductVerpakking.Breedte; + Diepte := ProductVerpakking.Diepte; + Aantal := ProductVerpakking.Aantal; + MaxCombinAantal := ProductVerpakking.MaxCombinAantal; + + // PPS informatie uit default data kopi�ren + PPSPrioriteit := DefaultDataObj.PPSPrioriteit; + PPSGroep := DefaultDataObj.PPSGroep; + PPSSubgroep := DefaultDataObj.PPSSubgroep; + PPSOutput := DefaultDataObj.PPSOutput; + + // Verpakking parameters kopi�ren uit default data en enkel de waarde aanpassen indien nodig + // We gaan er van uit dat de volgorde dezelfde is. + if ProductVerpakking.Parameters.Count - 1 = High(Params) then + // Aantal parameters komt overeen + for i := 0 to High(Params) do + begin + // Andere velden overnemen + Params[i].ID := ProductVerpakking.Parameters[i].ID; + Params[i].ProgLabel := ProductVerpakking.Parameters[i].ProgLabel; + Params[i].ToolTip := ProductVerpakking.Parameters[i].ToolTip; + + // Enkel waarde invullen als deze aanwezig is en verschilt van default waarde. + if (ProductVerpakking.Parameters[i].Waarde <> '') and + (ProductVerpakking.Parameters[i].Waarde <> ProductVerpakking.Parameters[i].DefaultWaarde) then + Params[i].Waarde := ProductVerpakking.Parameters[i].Waarde; + end; + end; +end; + +procedure TProductsAgent.RegistreerMislukteVerpakkingQuery(ProductVerpakkingenContext: TProductVerpakkingenContext; pxStatusObj: OptiServerService.pxStatus); begin - ProductDetailContext.Reset(false); + ProductVerpakkingenContext.Reset(false); - ProductDetailContext.IsOK := pxStatusObj.IsOK; - ProductDetailContext.ErrorMessage := pxStatusObj.Message_; - ProductDetailContext.InternalErrorMessage := pxStatusObj.InternalMessage; + ProductVerpakkingenContext.IsOK := pxStatusObj.IsOK; + ProductVerpakkingenContext.ErrorMessage := pxStatusObj.Message_; + ProductVerpakkingenContext.InternalErrorMessage := pxStatusObj.InternalMessage; - ProductDetailContext.NotifyChanged(); + ProductVerpakkingenContext.NotifyChanged(); end; end. Index: VerpakkingsDefinitie/UI/ProductDetailScherm.pas =================================================================== diff -u -r598 -r599 --- VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 598) +++ VerpakkingsDefinitie/UI/ProductDetailScherm.pas (.../ProductDetailScherm.pas) (revision 599) @@ -21,14 +21,17 @@ LabelProductNaam: TLabel; ListViewVerpakkingen: TListView; GroupBox1: TGroupBox; - ButtonNieuw: TButton; - ButtonVerwijder: TButton; + ButtonNieuweVerpakking: TButton; + ButtonVerwijderVerpakking: TButton; LabelProductNummer: TLabel; - Label17: TLabel; + ButtonDupliceerVerpakking: TButton; + Label2: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); + procedure ButtonNieuweVerpakkingClick(Sender: TObject); + procedure ButtonDupliceerVerpakkingClick(Sender: TObject); private FProductsContextSubject: TSubject; FProductsContextSubjectObserver: TSubjectObserver; @@ -39,6 +42,7 @@ LabelGeenData: TLabel; + procedure VerwerkAgentVerpakkingCall(); procedure UpdateGuiProduct(Sender: TObject); procedure UpdateGuiVerpakkingen(Sender: TObject); procedure LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); @@ -82,14 +86,47 @@ FVerpakkingenContextSubject.UnregisterObserver(FVerpakkingenContextSubjectObserver); end; +procedure TFormProductDetail.ButtonNieuweVerpakkingClick(Sender: TObject); +begin + FProductsAgent.NieuweVerpakking(ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count + 1, + ApplicationContext.ProductsContext.GeselecteerdProduct, ApplicationContext.UserContext, + ApplicationContext.ProductVerpakkingContext); + + VerwerkAgentVerpakkingCall(); +end; + +procedure TFormProductDetail.ButtonDupliceerVerpakkingClick(Sender: TObject); +begin + FProductsAgent.DupliceerVerpakking(ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking, + ApplicationContext.ProductVerpakkingContext.ProductVerpakkingen.Count + 1, ApplicationContext.UserContext, + ApplicationContext.ProductVerpakkingContext); + + VerwerkAgentVerpakkingCall(); +end; + +procedure TFormProductDetail.VerwerkAgentVerpakkingCall(); +var + ErrorMessage: string; +begin + if self.ApplicationContext.ProductVerpakkingContext.IsOK = false then + begin + // Opzoeking gefaald + ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; + if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then + ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; + + MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); + end; +end; + procedure TFormProductDetail.UpdateGuiProduct(Sender: TObject); var GeselecteerdProduct: TProductInformatie; begin GeselecteerdProduct := ApplicationContext.ProductsContext.GeselecteerdProduct; if GeselecteerdProduct = nil then begin - TUtil.ToonLabelOverScherm(self, LabelGeenData, GEEN_DATA_CAPTION, False); + TUtil.ToonLabelOverScherm(self, LabelGeenData, GEEN_DATA_CAPTION, false); exit; end; @@ -108,24 +145,12 @@ end; procedure TFormProductDetail.LaadProductVerpakkingen(GeselecteerdProduct: TProductInformatie); -var - ErrorMessage: string; begin // Product informatie ophalen FProductsAgent.ZoekProductVerpakkingenMetProductNr(GeselecteerdProduct.ProductNr, self.ApplicationContext.UserContext, self.ApplicationContext.ProductVerpakkingContext); - if self.ApplicationContext.ProductVerpakkingContext.IsOK then - // Gelukt - else - begin - // Opzoeking gefaald - ErrorMessage := self.ApplicationContext.ProductVerpakkingContext.ErrorMessage; - if self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage <> '' then - ErrorMessage := ErrorMessage + sLineBreak + self.ApplicationContext.ProductVerpakkingContext.InternalErrorMessage; - - MessageDlg(ErrorMessage, TMsgDlgType.mtInformation, [mbOK], 0, mbCancel); - end; + VerwerkAgentVerpakkingCall(); end; procedure TFormProductDetail.ListViewVerpakkingenSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); @@ -136,7 +161,7 @@ TProductVerpakking(ListViewVerpakkingen.Selected.Data) then begin // Product selecteren. Wij doen de selectie en willen dus niet opnieuw worden opgeroepen. - FVerpakkingenContextSubjectObserver.Enabled := False; + FVerpakkingenContextSubjectObserver.Enabled := false; ApplicationContext.ProductVerpakkingContext.GeselecteerdeVerpakking := TProductVerpakking(ListViewVerpakkingen.Selected.Data); FVerpakkingenContextSubjectObserver.Enabled := true; @@ -196,7 +221,8 @@ begin // Details controls enable status aanpassen naargelang er een verpakking geselecteerd is. VerpakkingAanwezigEnGeselecteerd := (ListViewVerpakkingen.Items.Count > 0) and (ListViewVerpakkingen.ItemIndex >= 0); - ButtonVerwijder.Enabled := VerpakkingAanwezigEnGeselecteerd; + ButtonDupliceerVerpakking.Enabled := VerpakkingAanwezigEnGeselecteerd; + ButtonVerwijderVerpakking.Enabled := VerpakkingAanwezigEnGeselecteerd; end; end.