Componentes.Terceros.RemObj.../internal/5.0.29.665/1/Data Abstract for Delphi/Samples/Dynamic SQL/DynSQLService_Impl.pas

166 lines
5.4 KiB
ObjectPascal

unit DynSQLService_Impl;
{----------------------------------------------------------------------------}
{ This unit was automatically generated by the RemObjects SDK after reading }
{ the RODL file associated with this project . }
{ }
{ This is where you are supposed to code the implementation of your objects. }
{----------------------------------------------------------------------------}
interface
uses
{vcl:} Classes, SysUtils,
{RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Ancestor Implementation:} DataAbstractService_Impl,
{Used RODLs:} DataAbstract4_Intf, uDAInterfaces,
{Generated:} DynSQLLibrary_Intf, uDAClasses, uDADelta,
uDABin2DataStreamer, uDADataStreamer, uDAScriptingProvider,
uDABusinessProcessor;
type
{ TDynSQLService }
TDynSQLService = class(TDataAbstractService, IDynSQLService)
DataStreamer: TDABin2DataStreamer;
BusinessProcessor: TDABusinessProcessor;
Schema: TDASchema;
procedure BusinessProcessorGenerateSQL(Sender: TDABusinessProcessor;
ChangeType: TDAChangeType; const ReferencedStatement: TDAStatement;
const aDelta: IDADelta; var SQL: String);
procedure BusinessProcessorProcessError(Sender: TDABusinessProcessor;
aChangeType: TDAChangeType; aChange: TDADeltaChange;
const aCommand: IDASQLCommand; var CanRemoveFromDelta: Boolean;
Error: Exception);
procedure BusinessProcessorAfterProcessChange(
Sender: TDABusinessProcessor; aChange: TDADeltaChange;
Processed: Boolean; var CanRemoveFromDelta: Boolean);
private
procedure Log(aStr: string);
function _GetConnection: IDAConnection;
protected
function MyUpdateData(const aTableName: String; const Delta: Binary): Binary;
end;
implementation
{$R *.dfm}
uses
{Generated:} DynSQLLibrary_Invk, DynSQLServerMain, Dialogs, TypInfo;
procedure Create_DynSQLService(out anInstance: IUnknown);
begin
anInstance := TDynSQLService.Create(nil);
end;
{ TDynSQLService }
function TDynSQLService._GetConnection: IDAConnection;
begin
Result := DynSQLServerMainForm.DAConnectionManager.NewConnection('ADO');
end;
procedure TDynSQLService.Log(aStr: string);
begin
DynSQLServerMainForm.Log(aStr);
end;
function TDynSQLService.MyUpdateData(const aTableName: String; const Delta: Binary): Binary;
var
conn: IDAConnection;
realdelta: IDADelta;
i: integer;
sql: string;
fOldDeltaname: string;
begin
Log('');
Log('');
// Opens a connection
conn := _GetConnection;
// Creates a delta object
realdelta := NewDelta('tempDelta');
// Converts the binary stream we just received.
DataStreamer.Initialize(Delta, aiReadFromBeginning);
try
fOldDeltaname:=DataStreamer.DeltaNames[0];
DataStreamer.ReadDelta(DataStreamer.DeltaNames[0], realdelta);
finally
DataStreamer.Finalize;
end;
if (aTableName = '') or (realdelta.Count=0) then begin
// Builds a fake SQL string for updating and displays it
sql := 'Updating query "' + DataStreamer.DeltaNames[0] + '", fields ';
for i := 0 to (realdelta.LoggedFieldCount - 1) do
sql := sql + realdelta.LoggedFieldNames[i] + '(' + GetEnumName(TypeInfo(TDADataType), Ord(realdelta.LoggedFieldTypes[i])) + '), ';
sql := Copy(sql, 1, Length(sql) - 2);
Log(sql);
end
else begin
realDelta.LogicalName:= aTableName;
// setup of ReferencedDataset used in BP.ProcessDelta
with Schema.Datasets.DatasetByName(BusinessProcessor.ReferencedDataset),Statements[0] do begin
TargetTable:=aTableName;
ColumnMappings.Clear;
Fields.Clear;
for i:=0 to realdelta.LoggedFieldCount-1 do begin
Fields.Add(realdelta.LoggedFieldNames[i],realdelta.LoggedFieldTypes[i]);
with ColumnMappings.Add do begin
DatasetField:= realdelta.LoggedFieldNames[i];
TableField:= realdelta.LoggedFieldNames[i];
SQLOrigin:= realdelta.LoggedFieldNames[i];
end;
end;
end;
BusinessProcessor.ProcessDelta(conn,realdelta);
end;
Result:=Binary.Create;
realdelta.LogicalName:=fOldDeltaname;
DataStreamer.Initialize(Result, aiWrite);
try
DataStreamer.WriteDelta(realdelta);
finally
DataStreamer.Finalize;
end;
end;
procedure TDynSQLService.BusinessProcessorGenerateSQL(
Sender: TDABusinessProcessor; ChangeType: TDAChangeType;
const ReferencedStatement: TDAStatement; const aDelta: IDADelta;
var SQL: String);
begin
Log('Generated SQL: '+SQL);
end;
procedure TDynSQLService.BusinessProcessorProcessError(
Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
aChange: TDADeltaChange; const aCommand: IDASQLCommand;
var CanRemoveFromDelta: Boolean; Error: Exception);
begin
Log('Error during processing change (RecID=' + IntToStr(aChange.RecID)+')');
Log(Error.Message);
end;
procedure TDynSQLService.BusinessProcessorAfterProcessChange(
Sender: TDABusinessProcessor; aChange: TDADeltaChange;
Processed: Boolean; var CanRemoveFromDelta: Boolean);
begin
if Processed then
Log('Change (RecID=' + IntToStr(aChange.RecID) +') is processed')
else
Log('Change (RecID=' + IntToStr(aChange.RecID) +') isn''t processed');
end;
initialization
TROClassFactory.Create('DynSQLService', Create_DynSQLService, TDynSQLService_Invoker);
finalization
end.