Index: VerpakkingsDefinitie/WS/ProductsAgent.pas =================================================================== diff -u -r560 -r562 --- VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 560) +++ VerpakkingsDefinitie/WS/ProductsAgent.pas (.../ProductsAgent.pas) (revision 562) @@ -2,36 +2,42 @@ interface -uses SysUtils, - ObserverPattern, ApplicationContext, SelectService; +uses SysUtils, System.Classes, + ObserverPattern, ApplicationContext, + SelectService, OptiServerService; // Resource strings are stored as resources and linked into the executable or // library so that they can be modified without recompiling the program. resourcestring - PROD_SERVER_URL = 'http://cacheaccept2010:57772/csp/dev1/WS.Prod.Select.CLS'; - KORTTEKST_FORMAT_COMPACT = 'KortTekst;IdentNr;StockType'; - KORTTEKST_FORMAT_EXPAND = 'KortTekst;IdentNr;StockType;LangTekstN'; + SELECT_SERVER_URL = 'http://cacheaccept2010:57772/csp/dev1/WS.Prod.Select.CLS'; + OPTI_SERVER_URL = 'http://cacheaccept2010:57772/csp/dev1/WS.Prod.OptiBox.OptiServer.CLS'; type TProductsAgent = class private - FProdSelectServerSoap: SelectService.ProdSelectServerSoap; - procedure RegistreerZoekresultaten(ProductsContext: TProductsContext; DataSet: string); - procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: pxStatus); + FSelectServerSoap: SelectService.ProdSelectServerSoap; + FOptiBoxServerSoap: OptiServerService.OptiBoxServerSoap; + function GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; + procedure RegistreerZoekResultaten(ProductsContext: TProductsContext; DataSet: string); + procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: SelectService.pxStatus); overload; + procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: OptiServerService.pxStatus); overload; + function GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext): GetBoxDataIDsViaProductResponse; public Constructor Create(); procedure ZoekOpMetKortTekst(Zoek: string; KLNr: string; At: string; UserContext: TUserContext; ProductsContext: TProductsContext); + procedure ZoekProductDataMetProductNr(ProductNr: Integer; UserContext: TUserContext; ProductsContext: TProductsContext); end; implementation uses - StrUtils, System.Classes, Xml.XMLIntf, Xml.XMLDoc; + StrUtils, Xml.XMLIntf, Xml.XMLDoc; constructor TProductsAgent.Create(); begin - FProdSelectServerSoap := SelectService.GetProdSelectServerSoap(false, PROD_SERVER_URL, nil); + FSelectServerSoap := SelectService.GetProdSelectServerSoap(false, SELECT_SERVER_URL, nil); + FOptiBoxServerSoap := OptiServerService.GetOptiBoxServerSoap(false, OPTI_SERVER_URL, nil); end; procedure TProductsAgent.ZoekOpMetKortTekst(Zoek: string; KLNr: string; At: string; UserContext: TUserContext; @@ -50,17 +56,17 @@ ZoekCriteria.KLNr := KLNr; ZoekCriteria.Zoek := Zoek; ZoekCriteria.At := At; - ZoekCriteria.FormatCompact := KORTTEKST_FORMAT_COMPACT; - ZoekCriteria.FormatExpand := KORTTEKST_FORMAT_EXPAND; + ZoekCriteria.FormatCompact := 'KortTekst;IdentNr;StockType'; + ZoekCriteria.FormatExpand := 'KortTekst;IdentNr;StockType;LangTekstN'; ZoekData.Criteria := ZoekCriteria; - SelectResponseObj := FProdSelectServerSoap.Select(ZoekData); + SelectResponseObj := FSelectServerSoap.Select(ZoekData); // Response if SelectResponseObj.SelectResult = nil then begin // Gelukt - RegistreerZoekresultaten(ProductsContext, SelectResponseObj.varDataSet); + RegistreerZoekResultaten(ProductsContext, SelectResponseObj.varDataSet); end else begin @@ -72,71 +78,81 @@ end; end; -procedure TProductsAgent.RegistreerZoekresultaten(ProductsContext: TProductsContext; DataSet: string); +function TProductsAgent.GeefBruikbareLijnenUitXMLDataSet(DataSetXml: string): TStringList; var - TempStr: string; - Lijn: string; - Lijnen: tstringlist; - LijnenProduct: tstringlist; BeginOpslaan: Boolean; - XMLDoc: IXMLDocument; - NieuwProduct: TProductInformatie; + Lijn: string; + Lijnen: TStringList; begin - // Andere velden juist zetten - ProductsContext.IsOK := True; - ProductsContext.ErrorMessage := ''; - ProductsContext.InternalErrorMessage := ''; - - // Producten inladen - - Lijnen := tstringlist.Create; - LijnenProduct := tstringlist.Create; - + Lijnen := TStringList.Create; // Elke lijn overlopen (skip lege lijnen), maar pas beginnen opslaan vanaf dat we voorbij het schema zitten - // Dus alle 'Select' elementen BeginOpslaan := false; - for Lijn in SplitString(DataSet, sLineBreak) do + for Lijn in SplitString(DataSetXml, sLineBreak) do begin if Lijn = '' then continue; if BeginOpslaan then Lijnen.Add(Lijn); if (BeginOpslaan = false) and (ContainsStr(Lijn, '')) then begin - // De tekst is nu '') then + + Result := Lijnen; +end; + +procedure TProductsAgent.RegistreerZoekResultaten(ProductsContext: TProductsContext; DataSet: string); +var + TempStr: string; + Lijn: string; + Lijnen: TStringList; + LijnenProduct: TStringList; + XMLDoc: IXMLDocument; + NieuwProduct: TProductInformatie; +begin + // Andere velden juist zetten + ProductsContext.IsOK := True; + ProductsContext.ErrorMessage := ''; + ProductsContext.InternalErrorMessage := ''; + + // Producten inladen + LijnenProduct := TStringList.Create; + Lijnen := GeefBruikbareLijnenUitXMLDataSet(DataSet); + try + // De 'Select' elementen overlopen en elk element mappen naar een property van een instantie. + // Deze instantie toevoegen aan de lijst. + for Lijn in Lijnen do begin - TempStr := LijnenProduct.Text; - XMLDoc := LoadXMLData(TempStr); // XML document van maken - // Elementen uit XML laden, toewijzen en instantie toevoegen aan lijst. - NieuwProduct := TProductInformatie.Create(); - NieuwProduct.ProductNr := XMLDoc.DocumentElement.ChildValues['ProductNr']; - NieuwProduct.Tekst := XMLDoc.DocumentElement.ChildValues['Tekst']; - NieuwProduct.Kol1 := XMLDoc.DocumentElement.ChildValues['Kol1']; - NieuwProduct.Kol2 := XMLDoc.DocumentElement.ChildValues['Kol2']; - NieuwProduct.Kol3 := XMLDoc.DocumentElement.ChildValues['Kol3']; - NieuwProduct.Kol4 := XMLDoc.DocumentElement.ChildValues['Kol4']; - ProductsContext.Producten.Add(NieuwProduct); + LijnenProduct.Add(Lijn); + if ContainsStr(Lijn, '') then + begin + // Er zit een volledig item in de lijst + TempStr := LijnenProduct.Text; + XMLDoc := LoadXMLData(TempStr); // XML document van maken + // Elementen uit XML laden, toewijzen en instantie toevoegen aan lijst. + NieuwProduct := TProductInformatie.Create(); + NieuwProduct.ProductNr := XMLDoc.DocumentElement.ChildValues['ProductNr']; + NieuwProduct.Tekst := XMLDoc.DocumentElement.ChildValues['Tekst']; + NieuwProduct.Kol1 := XMLDoc.DocumentElement.ChildValues['Kol1']; + NieuwProduct.Kol2 := XMLDoc.DocumentElement.ChildValues['Kol2']; + NieuwProduct.Kol3 := XMLDoc.DocumentElement.ChildValues['Kol3']; + NieuwProduct.Kol4 := XMLDoc.DocumentElement.ChildValues['Kol4']; + ProductsContext.Producten.Add(NieuwProduct); + end; end; + finally + Lijnen.Free(); + LijnenProduct.Free(); end; - Lijnen.Free(); - LijnenProduct.Free(); - ProductsContext.NotifyChanged(); end; -procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: pxStatus); +procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: SelectService.pxStatus); begin // Ander velden leegmaken ProductsContext.Producten.Clear(); @@ -148,4 +164,82 @@ ProductsContext.NotifyChanged(); end; +function TProductsAgent.GetBoxDataIDsViaProduct(ProductNr: Integer; UserContext: TUserContext): GetBoxDataIDsViaProductResponse; +var + ZoekData: OptiServerService.GetBoxDataIDsViaProduct; +begin + ZoekData := nil; + try + // Request + ZoekData := OptiServerService.GetBoxDataIDsViaProduct.Create(); + ZoekData.SessionKey := UserContext.SessionKey; + ZoekData.ProductNr := ProductNr; + + Result := FOptiBoxServerSoap.GetBoxDataIDsViaProduct(ZoekData); + finally + ZoekData.Free(); + end; +end; + +procedure TProductsAgent.ZoekProductDataMetProductNr(ProductNr: Integer; UserContext: TUserContext; + ProductsContext: TProductsContext); +var + GetBoxDataIDsViaProductResponseObj: OptiServerService.GetBoxDataIDsViaProductResponse; + TempStr: string; + Lijn: string; + Lijnen: TStringList; + LijnenBoxDataID: TStringList; + XMLDoc: IXMLDocument; + BoxDataID: string; +begin + GetBoxDataIDsViaProductResponseObj := GetBoxDataIDsViaProduct(ProductNr, UserContext); + + // Response + if GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult <> nil then + // Mislukt + RegistreerMislukteOpzoeking(ProductsContext, GetBoxDataIDsViaProductResponseObj.GetBoxDataIDsViaProductResult); + + // Bruikbare informatie uit antwoord halen + + // Producten inladen + LijnenBoxDataID := TStringList.Create; + Lijnen := GeefBruikbareLijnenUitXMLDataSet(GetBoxDataIDsViaProductResponseObj.varDataSet); + try + // 'GetBoxDataIDsViaObjTypeAndRef' element overlopen en mappen naar een instantie. + for Lijn in Lijnen do + begin + LijnenBoxDataID.Add(Lijn); + if ContainsStr(Lijn, '') then + begin + // Er zit een volledig item in de lijst + TempStr := LijnenBoxDataID.Text; + XMLDoc := LoadXMLData(TempStr); // XML document van maken + // Elementen uit XML laden. + BoxDataID := XMLDoc.DocumentElement.ChildValues['ID']; + end; + end; + finally + Lijnen.Free(); + LijnenBoxDataID.Free(); + end; + + // Controleren dat er resultaat was + if BoxDataID = '' then + raise Exception.Create('Er is geen Box ID gevonden.'); + + // Met ID box data opvragen + +end; + +procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: OptiServerService.pxStatus); +begin + { TODO : ProductDetail leegmaken } + + ProductsContext.IsOK := pxStatusObj.IsOK; + ProductsContext.ErrorMessage := pxStatusObj.Message_; + ProductsContext.InternalErrorMessage := pxStatusObj.InternalMessage; + + ProductsContext.NotifyChanged(); +end; + end.