unit ProductsAgent; interface uses SysUtils, ObserverPattern, ApplicationContext, SelectService; // 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'; type TProductsAgent = class private FProdSelectServerSoap: SelectService.ProdSelectServerSoap; procedure RegistreerZoekresultaten(ProductsContext: TProductsContext; DataSet: string); procedure RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: pxStatus); public Constructor Create(); procedure ZoekOpMetKortTekst(Zoek: string; KLNr: string; At: string; UserContext: TUserContext; ProductsContext: TProductsContext); end; implementation uses StrUtils, System.Classes, Xml.XMLIntf, Xml.XMLDoc; constructor TProductsAgent.Create(); begin FProdSelectServerSoap := SelectService.GetProdSelectServerSoap(false, PROD_SERVER_URL, nil); end; procedure TProductsAgent.ZoekOpMetKortTekst(Zoek: string; KLNr: string; At: string; UserContext: TUserContext; ProductsContext: TProductsContext); var ZoekData: SelectService.Select; ZoekCriteria: SelectService.pxSelectCriteria; // Property van ZoekData SelectResponseObj: SelectService.SelectResponse; begin ZoekData := nil; try // Request ZoekData := SelectService.Select.Create(); ZoekCriteria := SelectService.pxSelectCriteria.Create(); ZoekData.SessionKey := UserContext.SessionKey; ZoekCriteria.KLNr := KLNr; ZoekCriteria.Zoek := Zoek; ZoekCriteria.At := At; ZoekCriteria.FormatCompact := KORTTEKST_FORMAT_COMPACT; ZoekCriteria.FormatExpand := KORTTEKST_FORMAT_EXPAND; ZoekData.Criteria := ZoekCriteria; SelectResponseObj := FProdSelectServerSoap.Select(ZoekData); // Response if SelectResponseObj.SelectResult = nil then begin // Gelukt RegistreerZoekresultaten(ProductsContext, SelectResponseObj.varDataSet); end else begin // Mislukt RegistreerMislukteOpzoeking(ProductsContext, SelectResponseObj.SelectResult); end; finally ZoekData.Free(); end; end; procedure TProductsAgent.RegistreerZoekresultaten(ProductsContext: TProductsContext; DataSet: string); var TempStr: string; Lijn: string; Lijnen: tstringlist; LijnenProduct: tstringlist; BeginOpslaan: Boolean; XMLDoc: IXMLDocument; NieuwProduct: TProductInformatie; begin // Andere velden juist zetten ProductsContext.IsOK := True; ProductsContext.ErrorMessage := ''; ProductsContext.InternalErrorMessage := ''; // Producten inladen Lijnen := tstringlist.Create; LijnenProduct := 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 begin if Lijn = '' then continue; if BeginOpslaan then Lijnen.Add(Lijn); if (BeginOpslaan = false) and (ContainsStr(Lijn, '')) then begin // De tekst is nu '') then 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); end; end; Lijnen.Free(); LijnenProduct.Free(); ProductsContext.NotifyChanged(); end; procedure TProductsAgent.RegistreerMislukteOpzoeking(ProductsContext: TProductsContext; pxStatusObj: pxStatus); begin // Ander velden leegmaken ProductsContext.Producten.Clear(); ProductsContext.IsOK := pxStatusObj.IsOK; ProductsContext.ErrorMessage := pxStatusObj.Message_; ProductsContext.InternalErrorMessage := pxStatusObj.InternalMessage; ProductsContext.NotifyChanged(); end; end.