unit fClientForm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROPoweredByRemObjectsButton, uDAPoweredByDataAbstractButton, ExtCtrls, Grids, DBGrids, uDAInterfaces; type TClientForm = class(TForm) Panel1: TPanel; DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton; Label1: TLabel; cbConditions: TComboBox; Panel2: TPanel; Label2: TLabel; edXML: TMemo; Panel4: TPanel; btLoad: TButton; btValidate: TButton; dgData: TDBGrid; procedure FormCreate(Sender: TObject); procedure cbConditionsChange(Sender: TObject); procedure btValidateClick(Sender: TObject); procedure btLoadClick(Sender: TObject); private { Private declarations } function GetTemplateWhereExpression: TDAWhereExpression; procedure ShowXML(aExpr: TDAWhereExpression); public { Public declarations } end; var ClientForm: TClientForm; implementation uses fClientDataModule; {$R *.dfm} procedure TClientForm.btLoadClick(Sender: TObject); var wb: TDAWhereBuilder; expr: TDAWhereExpression; expArr: array of TDAWhereExpression; begin wb := TDAWhereBuilder.Create; try with ClientDataModule do begin tbl_Workers.ClearRows(true); if Trim(edXML.Text) <> '' then expr := wb.XMLToExpression(edXML.Text) else expr := nil; SetLength(expArr, 1); expArr[0] := expr; RemoteDataAdapter.Fill([tbl_Workers], expArr); end; except on E: Exception do ShowMessage('Error loading data: ' + E.Message); end; wb.Free; end; procedure TClientForm.btValidateClick(Sender: TObject); var expr: TDAWhereExpression; wb: TDAWhereBuilder; begin wb := TDAWhereBuilder.Create; try try expr := wb.XMLToExpression(edXML.Text); expr.Validate; ShowMessage('XML Where expression is valid'); except on E: Exception do ShowMessage('XML Where expression is INVALID: ' + E.Message); end; finally wb.Free; end; end; procedure TClientForm.cbConditionsChange(Sender: TObject); var expr: TDAWhereExpression; begin expr := GetTemplateWhereExpression; ShowXML(expr); end; procedure TClientForm.FormCreate(Sender: TObject); begin // TODO: until DynamicRequest bug fixed //ClientDataModule.Login; Application.Title := ClientForm.Caption; cbConditionsChange(nil); end; function TClientForm.GetTemplateWhereExpression: TDAWhereExpression; var wb: TDAWhereBuilder; begin Result := nil; wb := TDAWhereBuilder.Create; with wb, ClientDataModule.tbl_Workers do case cbConditions.ItemIndex of //Position is Sales Manager 0: Result := NewBinaryExpression( NewField(LogicalName, 'WorkerPosition'), NewConstant('Sales Manager', datString), dboEqual); //Job is Sales Manager And City is Chicago 1: Result := NewBinaryExpression( NewBinaryExpression( NewField(LogicalName, 'WorkerPosition'), NewConstant('Sales Manager', datString), dboEqual), NewBinaryExpression( NewField(LogicalName, 'WorkerCity'), NewConstant('Chicago IL', datString), dboEqual), dboAnd); //City is Chicago or Atlanta 2: Result := NewBinaryExpression( NewField(LogicalName, 'WorkerCity'), NewList([NewConstant('Chicago IL', datString), NewConstant('Atlanta CA', datString)]), dboIn); //FirstName doesn't begin with A 3: Result := NewUnaryExpression( NewBinaryExpression( NewField(LogicalName, 'WorkerFirstName'), NewConstant('A%', datString), dboLike), duoNot); //(Position is Sales Representative Or Zip is NULL) And (City is Kirkland or Seattle) 4: Result := NewBinaryExpression( NewBinaryExpression( NewBinaryExpression( NewField(LogicalName, 'WorkerPosition'), NewConstant('Sales Representative', datString), dboEqual), NewBinaryExpression( NewField(LogicalName, 'WorkerZip'), NewNull, dboEqual), dboOr), NewBinaryExpression( NewField(LogicalName, 'WorkerCity'), NewList( [NewConstant('Kirkland', datString), NewConstant('Seattle', datString)] ), dboIn), dboAnd); // Wrong condition - incorrect field name 6: Result := NewBinaryExpression( NewField(LogicalName, 'Country_Name'), NewConstant('UK', datString), dboEqual); end; wb.Free; end; procedure TClientForm.ShowXML(aExpr: TDAWhereExpression); var wb: TDAWhereBuilder; begin edXML.Clear; if Assigned(aExpr) then begin wb := TDAWhereBuilder.Create; wb.Expression := aExpr; edXML.Text := wb.Xml; wb.Free; end; end; end.