Componentes.Terceros.RemObj.../official/5.0.24.615/Data Abstract for Delphi/Samples/Business Processor/BizSchemaClient.pas

166 lines
3.8 KiB
ObjectPascal

unit BizSchemaClient;
interface
uses
Classes,
SchemaClient_Intf;
type
IBizCustomers = interface(ICustomers)
['{63BAECDD-6091-4A86-BA58-E6FFD5330240}']
end;
TBizCustomersDataTableRules = class(TCustomersDataTableRules, IBizCustomers)
end;
IBizOrders = interface(IOrders)
['{E43D1B71-EEF0-4805-9F1E-EE032353BD0F}']
end;
TBizOrdersDataTableRules = class(TOrdersDataTableRules, IBizOrders)
end;
TBizErrorMessageItem = class
public
Field: string;
ErrorMessage: string;
end;
TBizErrorMessage = class
private
FMessage: string;
FList: TList;
function GetItems(Index: integer): TBizErrorMessageItem;
function GetCount: integer;
function GetAsString: string;
procedure SetAsString(const Value: string);
public
constructor Create;
destructor Destroy; override;
function Add(AField: string; AErrorMessage: string): integer;
procedure Clear;
property ItemCount: integer read GetCount;
property Message: string read FMessage write FMessage;
property Items[Index: integer]: TBizErrorMessageItem read GetItems;
property AsString: string read GetAsString write SetAsString;
end;
implementation
uses uDADataTable, Variants;
{ TBizErrorMessage }
function TBizErrorMessage.Add(AField: string; AErrorMessage: string): integer;
var
Aitem: TBizErrorMessageItem;
begin
Aitem := TBizErrorMessageItem.Create;
Aitem.Field := AField;
Aitem.ErrorMessage := AErrorMessage;
Result := FList.Add(AItem);
end;
procedure TBizErrorMessage.Clear;
var
i: integer;
begin
for i := 0 to Flist.Count - 1 do
TBizErrorMessageItem(FList[i]).Free;
FList.Clear;
end;
constructor TBizErrorMessage.Create;
begin
inherited;
FList := TList.Create;
end;
destructor TBizErrorMessage.Destroy;
begin
Clear;
Flist.Free;
inherited;
end;
function TBizErrorMessage.GetAsString: string;
procedure WriteStringToStream(Str: string; Stream: TStringStream);
var
size: integer;
begin
size := Length(Str);
stream.Write(size, Sizeof(integer));
stream.WriteString(Str);
end;
var
Stream: TStringStream;
cnt: integer;
i: integer;
begin
Stream := TStringStream.Create('');
try
Stream.WriteString(Message);
i := 0;
stream.Write(Byte(i), 1);
cnt := GetCount;
stream.Write(cnt, SizeOf(cnt));
for i := 0 to cnt - 1 do
with Items[i] do begin
WriteStringToStream(Field, Stream);
WriteStringToStream(ErrorMessage, Stream);
end;
Result := Stream.DataString;
finally
Stream.Free;
end;
end;
function TBizErrorMessage.GetCount: integer;
begin
Result := FList.Count;
end;
function TBizErrorMessage.GetItems(Index: integer): TBizErrorMessageItem;
begin
Result := TBizErrorMessageItem(FList[Index]);
end;
procedure TBizErrorMessage.SetAsString(const Value: string);
function ReadStringToStream(Stream: TStringStream): string;
var
Size: integer;
begin
stream.Read(size, Sizeof(integer));
Result := stream.ReadString(size);
end;
var
Stream: TStringStream;
i, cnt: integer;
begin
Clear;
Stream := TStringStream.Create(Value);
try
Message := Pchar(Value);
if Stream.Size < Length(Message) + 1 then exit;
Stream.Seek(Length(Message) + 1, soFromBeginning);
stream.Read(cnt, SizeOf(cnt));
for i := 0 to cnt - 1 do
with Items[Add('', '')] do begin
Field := ReadStringToStream(Stream);
ErrorMessage := ReadStringToStream(Stream);
end;
finally
Stream.Free;
end;
end;
initialization
RegisterDataTableRules('Customers.ClientRules', TBizCustomersDataTableRules);
RegisterDataTableRules('Orders.ClientRules', TBizOrdersDataTableRules);
end.