
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4853 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2048 lines
65 KiB
ObjectPascal
2048 lines
65 KiB
ObjectPascal
{*********************************************************}
|
|
{* VpDBIsamDS.PAS 1.03 *}
|
|
{*********************************************************}
|
|
|
|
{* ***** BEGIN LICENSE BLOCK ***** *}
|
|
{* Version: MPL 1.1 *}
|
|
{* *}
|
|
{* The contents of this file are subject to the Mozilla Public License *}
|
|
{* Version 1.1 (the "License"); you may not use this file except in *}
|
|
{* compliance with the License. You may obtain a copy of the License at *}
|
|
{* http://www.mozilla.org/MPL/ *}
|
|
{* *}
|
|
{* Software distributed under the License is distributed on an "AS IS" basis, *}
|
|
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *}
|
|
{* for the specific language governing rights and limitations under the *}
|
|
{* License. *}
|
|
{* *}
|
|
{* The Original Code is TurboPower Visual PlanIt *}
|
|
{* *}
|
|
{* The Initial Developer of the Original Code is TurboPower Software *}
|
|
{* *}
|
|
{* Portions created by TurboPower Software Inc. are Copyright (C) 2002 *}
|
|
{* TurboPower Software Inc. All Rights Reserved. *}
|
|
{* *}
|
|
{* Contributor(s): *}
|
|
{* Steve Forbes *}
|
|
{* *}
|
|
{* ***** END LICENSE BLOCK ***** *}
|
|
|
|
{ This unit was provided by Steve Forbes and is used with permission }
|
|
|
|
|
|
{$I Vp.INC}
|
|
unit VpDBIsamDS;
|
|
{ DBISAM DataStore Component }
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Classes, Dialogs, SysUtils, Db, DBISAMTb, DBISAMLb,
|
|
VpBase, VpData, VpSR, VpBaseDS, VpDBDS, VpException;
|
|
|
|
type
|
|
TVpDBISAMDataStore = class(TVpCustomDBDataStore)
|
|
protected
|
|
FDatabase : TDBISAMDatabase;
|
|
FResourceTable : TDBISAMQuery;
|
|
FEventsTable : TDBISAMQuery;
|
|
FContactsTable : TDBISAMQuery;
|
|
FTasksTable : TDBISAMQuery;
|
|
FRecordIDTable : TDBISAMQuery;
|
|
FSessionName : string;
|
|
|
|
{ property getters }
|
|
function GetDatabaseName: string;
|
|
function GetConnected: Boolean;
|
|
function GetDirectory: String;
|
|
|
|
{ ancestor property getters }
|
|
function GetResourceTable : TDataset; override;
|
|
function GetEventsTable : TDataset; override;
|
|
function GetContactsTable : TDataset; override;
|
|
function GetTasksTable : TDataset; override;
|
|
|
|
{ property setters }
|
|
procedure SetConnected(const Value: boolean); override;
|
|
procedure SetDirectory(const AValue: String);
|
|
|
|
procedure Loaded; override;
|
|
procedure SetFilterCriteria(aTable: TDataset; aUseDateTime: Boolean;
|
|
aResourceID: Integer; aStartDateTime : TDateTime;
|
|
aEndDateTime: TDateTime); override;
|
|
procedure InitializeRecordIDTable;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
function GetNextID(TableName: string): Integer; override;
|
|
procedure Load; override;
|
|
procedure CreateTable(TableName: string);
|
|
procedure CreateIndexDefs(const TableName : string; IndexDefs : TIndexDefs); override;
|
|
procedure CreateFieldDefs(const TableName : string; FieldDefs : TFieldDefs); override;
|
|
|
|
procedure PostResources; override;
|
|
procedure PostEvents; override;
|
|
procedure PostContacts; override;
|
|
procedure PostTasks; override;
|
|
|
|
procedure PurgeResource(Res: TVpResource); override;
|
|
procedure PurgeEvents(Res: TVpResource); override;
|
|
procedure PurgeContacts(Res: TVpResource); override;
|
|
procedure PurgeTasks(Res: TVpResource); override;
|
|
|
|
property Database: TDBISAMDatabase read FDatabase;
|
|
|
|
published
|
|
{ properties }
|
|
property DayBuffer;
|
|
property ResourceID;
|
|
property ReadOnly;
|
|
property Directory: String read GetDirectory write SetDirectory;
|
|
{ events }
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
{$IFDEF VERSION6}
|
|
Variants,
|
|
{$ELSE}
|
|
FileCtrl,
|
|
{$ENDIF}
|
|
VpConst;
|
|
|
|
(*****************************************************************************)
|
|
{ TVpDBISAMDataStore }
|
|
|
|
constructor TVpDBISAMDataStore.Create(AOwner: TComponent);
|
|
begin
|
|
FConnected := false;
|
|
FSessionName := 'Default';
|
|
FResourceID := 0;
|
|
|
|
FDatabase := TDBISAMDatabase.Create(self);
|
|
FDatabase.DatabaseName := '';
|
|
FDatabase.Connected := false;
|
|
FDatabase.SessionName := FSessionName;
|
|
|
|
FResourceTable := TDBISAMQuery.Create(self);
|
|
|
|
{$IFDEF VERSION5}
|
|
FResourceTable.ReadOnly := FReadOnly;
|
|
{$ENDIF}
|
|
|
|
FResourceTable.RequestLive := True;
|
|
FResourceTable.SQL.Text := 'SELECT * FROM Resources';
|
|
// FResourceTable.DatabaseName := 'pig'; How funny!
|
|
// ShowMessage(FResourceTable.Database.DatabaseName);
|
|
|
|
FEventsTable := TDBISAMQuery.Create(self);
|
|
|
|
{$IFDEF VERSION5}
|
|
FEventsTable.ReadOnly := FReadOnly;
|
|
{$ENDIF}
|
|
|
|
// FEventsTable.DatabaseName := FDatabase.Name;
|
|
FEventsTable.RequestLive := True;
|
|
FEventsTable.SQL.Text := 'SELECT * FROM Events '
|
|
+ 'WHERE (ResourceID = :ResID) '
|
|
+ 'AND ((StartTime >= :STime1 AND EndTime <= :ETime) '
|
|
+ 'OR (RepeatCode > 0 AND :STime2 <= RepeatRangeEnd))';
|
|
|
|
FContactsTable := TDBISAMQuery.Create(self);
|
|
|
|
{$IFDEF VERSION5}
|
|
FContactsTable.ReadOnly := FReadOnly;
|
|
{$ENDIF}
|
|
|
|
// FContactsTable.DatabaseName := FDatabase.Name;
|
|
FContactsTable.RequestLive := True;
|
|
FContactsTable.SQL.Text := 'SELECT * FROM Contacts '
|
|
+ 'WHERE ResourceID = :ResID';
|
|
|
|
FTasksTable := TDBISAMQuery.Create(self);
|
|
|
|
{$IFDEF VERSION5}
|
|
FTasksTable.ReadOnly := FReadOnly;
|
|
{$ENDIF}
|
|
|
|
// FTasksTable.DatabaseName := FDatabase.Name;
|
|
FTasksTable.RequestLive := True;
|
|
FTasksTable.SQL.Text := 'SELECT * FROM Tasks '
|
|
+ 'WHERE ResourceID = :ResID';
|
|
|
|
FRecordIDTable := TDBISAMQuery.Create(self);
|
|
|
|
{$IFDEF VERSION5}
|
|
FRecordIDTable.ReadOnly := FReadOnly;
|
|
{$ENDIF}
|
|
|
|
FRecordIDTable.DatabaseName := FDatabase.Name;
|
|
FRecordIDTable.RequestLive := True;
|
|
|
|
inherited;
|
|
end;
|
|
{=====}
|
|
|
|
destructor TVpDBISAMDataStore.Destroy;
|
|
begin
|
|
{ free tables }
|
|
FDatabase.Close;
|
|
FDatabase.Free;
|
|
FResourceTable.Free;
|
|
FEventsTable.Free;
|
|
FContactsTable.Free;
|
|
FTasksTable.Free;
|
|
FRecordIDTable.Free;
|
|
|
|
inherited;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetDatabaseName: string;
|
|
begin
|
|
result := FDataBase.DatabaseName;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetConnected: Boolean;
|
|
begin
|
|
result := FDatabase.Connected;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetResourceTable : TDataset;
|
|
begin
|
|
Result := FResourceTable;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetEventsTable : TDataset;
|
|
begin
|
|
Result := FEventsTable;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetContactsTable : TDataset;
|
|
begin
|
|
Result := FContactsTable;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetTasksTable : TDataset;
|
|
begin
|
|
Result := FTasksTable;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.Load;
|
|
begin
|
|
if not FDatabase.Connected then exit;
|
|
|
|
FResourceTable.Close;
|
|
FEventsTable.Close;
|
|
FContactsTable.Close;
|
|
FTasksTable.Close;
|
|
|
|
inherited Load;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetNextID(TableName: string): Integer;
|
|
var
|
|
Query: TDBISAMQuery;
|
|
GotIt: Boolean;
|
|
ID : Integer;
|
|
FldName : string;
|
|
begin
|
|
{ The DBISAMDataStore uses a support table called RecordIDS, or whatever }
|
|
{ is defined in the RecordIDTableName constant. It has one record, and is }
|
|
{ used to keep track of the last ID used for each table. }
|
|
|
|
{ In a multi-user environment, This prevents collisions between two users }
|
|
{ who happen to enter the same type of new record at the same time. }
|
|
|
|
{ New record ID's are created here and then the Record ID table is }
|
|
{ immediately updated to reflect the new value. If the table is }
|
|
{ unsuccessfully updated, then it is assumed that another user has claimed }
|
|
{ that ID, so the ID is incremented and another attempt is made, until we }
|
|
{ are successful. }
|
|
|
|
Query := TDBISAMQuery.Create(self);
|
|
ID := 0;
|
|
try
|
|
Query.SessionName := FSessionName;
|
|
Query.DatabaseName := FDatabase.DatabaseName;
|
|
|
|
Query.Sql.Text := 'Select * from ' + RecordIDTableName;
|
|
Query.Open;
|
|
|
|
if TableName = ResourceTableName then begin
|
|
FldName := 'ResourceID';
|
|
ID := Query.FieldByName('ResourceID').AsInteger;
|
|
|
|
end else if TableName = TasksTableName then begin
|
|
FldName := 'TaskID';
|
|
ID := Query.FieldByName('TaskID').AsInteger;
|
|
|
|
end else if TableName = EventsTableName then begin
|
|
FldName := 'EventID';
|
|
ID := Query.FieldByName('EventID').AsInteger;
|
|
|
|
end else if TableName = ContactsTableName then begin
|
|
FldName := 'ContactID';
|
|
ID := Query.FieldByName('ContactID').AsInteger;
|
|
|
|
end else begin
|
|
raise EInvalidTable.Create;
|
|
exit;
|
|
end;
|
|
|
|
Query.Close;
|
|
Query.SQL.Text := 'Update ' + RecordIDTableName + ' Set ' + FldName
|
|
+ ' = :NewID Where (' + FldName + ' = :OldID)';
|
|
|
|
GotIt := false;
|
|
while not GotIt do begin
|
|
Inc(ID);
|
|
Query.ParamByName('NewID').AsInteger := ID;
|
|
Query.ParamByName('OldID').AsInteger := ID - 1;
|
|
Query.ExecSQL;
|
|
|
|
GotIt := (Query.RowsAffected = 1);
|
|
end;
|
|
finally
|
|
Query.Close;
|
|
Query.Free;
|
|
end;
|
|
|
|
result := ID;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.CreateTable(TableName: string);
|
|
var
|
|
Table: TDBISAMTable;
|
|
begin
|
|
Table := TDBISAMTable.Create(self);
|
|
try
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
|
|
if TableName = ResourceTableName then begin
|
|
{ Create Resources Table }
|
|
Table.Active := false;
|
|
Table.TableName := ResourceTableName;
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
end
|
|
|
|
else if TableName = EventsTableName then begin
|
|
{ Create Events Table }
|
|
Table.Active := false;
|
|
Table.TableName := EventsTableName;
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
end
|
|
|
|
else if TableName = ContactsTableName then begin
|
|
{ Create Contacts Table }
|
|
Table.Active := false;
|
|
Table.TableName := ContactsTableName;
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
end
|
|
|
|
else if TableName = TasksTableName then begin
|
|
{ Create Tasks Table }
|
|
Table.Active := false;
|
|
Table.TableName := TasksTableName;
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
end
|
|
|
|
else if TableName = RecordIDTableName then begin
|
|
{ Create Tasks Table }
|
|
Table.Active := false;
|
|
Table.TableName := RecordIDTableName;
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
end;
|
|
|
|
Table.DatabaseName := FDatabase.DatabaseName;
|
|
CreateFieldDefs(TableName, Table.FieldDefs);
|
|
CreateIndexDefs(TableName, Table.IndexDefs);
|
|
|
|
if Table <> nil then
|
|
Table.CreateTable;
|
|
|
|
if TableName = RecordIDTableName then
|
|
InitializeRecordIDTable;
|
|
finally
|
|
Table.Free;
|
|
end;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.InitializeRecordIDTable;
|
|
var
|
|
Qry: TDBISAMQuery;
|
|
ID: Integer;
|
|
begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.DatabaseName := FDatabase.DatabaseName;
|
|
|
|
Qry.SQL.Text := 'Select * from ' + RecordIDTableName;
|
|
Qry.Open;
|
|
if Qry.RowsAffected = 0 then begin
|
|
{ create one record in the table }
|
|
Qry.SQL.Clear;
|
|
Qry.SQL.Text := 'INSERT INTO ' + RecordIDTableName
|
|
+ '(ResourceID, EventID, TaskID, ContactID) '
|
|
+ 'VALUES(0, 0, 0, 0)';
|
|
Qry.ExecSQL;
|
|
end;
|
|
Qry.Close;
|
|
|
|
{ Initialize Resource ID }
|
|
Qry.SQL.Text := 'Select Max(ResourceID) as MaxRes from '
|
|
+ ResourceTableName;
|
|
Qry.Open;
|
|
ID := Qry.Fields[0].AsInteger;
|
|
Qry.Close;
|
|
|
|
Qry.SQL.Text := 'Update ' + RecordIDTableName + ' Set ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := ID;
|
|
Qry.ExecSQL;
|
|
|
|
{ Initialize Event RecordID }
|
|
Qry.SQL.Text := 'Select Max(RecordID) as MaxEvent from '
|
|
+ EventsTableName;
|
|
Qry.Open;
|
|
ID := Qry.Fields[0].AsInteger;
|
|
Qry.Close;
|
|
|
|
Qry.SQL.Text := 'Update ' + RecordIDTableName + ' Set EventID = :EvID';
|
|
Qry.ParamByName('EvID').AsInteger := ID;
|
|
Qry.ExecSQL;
|
|
|
|
{ Initialize Contact RecordID }
|
|
Qry.SQL.Text := 'Select Max(RecordID) as MaxContact from '
|
|
+ ContactsTableName;
|
|
Qry.Open;
|
|
ID := Qry.Fields[0].AsInteger;
|
|
Qry.Close;
|
|
|
|
Qry.SQL.Text := 'Update ' + RecordIDTableName + ' Set ContactID = :CoID';
|
|
Qry.ParamByName('CoID').AsInteger := ID;
|
|
Qry.ExecSQL;
|
|
|
|
{ Initialize Task RecordID }
|
|
Qry.SQL.Text := 'Select Max(RecordID) as MaxTask from ' + TasksTableName;
|
|
Qry.Open;
|
|
ID := Qry.Fields[0].AsInteger;
|
|
Qry.Close;
|
|
|
|
Qry.SQL.Text := 'Update ' + RecordIDTableName + ' Set TaskID = :TsID';
|
|
Qry.ParamByName('TsID').AsInteger := ID;
|
|
Qry.ExecSQL;
|
|
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.Loaded;
|
|
begin
|
|
inherited;
|
|
if not (csDesigning in ComponentState) then
|
|
Connected := AutoConnect;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.PostResources;
|
|
var
|
|
I: Integer;
|
|
Resource: TVpResource;
|
|
Qry: TDBISAMQuery;
|
|
begin
|
|
if (Resources.Count > 0) then begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDatabase.DatabaseName;
|
|
Qry.RequestLive := true;
|
|
try
|
|
for I := pred(Resources.Count) downto 0 do begin
|
|
Resource := Resources.Items[I];
|
|
if Resource = nil then begin
|
|
Continue;
|
|
end;
|
|
|
|
if Resource.Deleted then begin
|
|
PurgeEvents(Resource);
|
|
PurgeContacts(Resource);
|
|
PurgeTasks(Resource);
|
|
Qry.SQL.Text := 'DELETE FROM Resources '
|
|
+ 'WHERE ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := Resource.ResourceID;
|
|
Qry.ExecSQL;
|
|
Resource.Free;
|
|
Continue;
|
|
end
|
|
|
|
else if Resource.Changed then begin
|
|
Qry.SQL.Text := 'SELECT * FROM Resources '
|
|
+ 'WHERE ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := Resource.ResourceID;
|
|
Qry.Open;
|
|
|
|
if Qry.Locate('ResourceID', Resource.ResourceID, [])
|
|
then begin
|
|
{ existing record found }
|
|
Qry.Edit;
|
|
try
|
|
Qry.FieldByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.FieldByName('Description').AsString := Resource.Description;
|
|
Qry.FieldByName('Notes').AsString := Resource.Notes;
|
|
Qry.FieldByName('ResourceActive').AsBoolean := Resource.Active;
|
|
Qry.FieldByName('UserField0').AsString := Resource.UserField0;
|
|
Qry.FieldByName('UserField1').AsString := Resource.UserField1;
|
|
Qry.FieldByName('UserField2').AsString := Resource.UserField2;
|
|
Qry.FieldByName('UserField3').AsString := Resource.UserField3;
|
|
Qry.FieldByName('UserField4').AsString := Resource.UserField4;
|
|
Qry.FieldByName('UserField5').AsString := Resource.UserField5;
|
|
Qry.FieldByName('UserField6').AsString := Resource.UserField6;
|
|
Qry.FieldByName('UserField7').AsString := Resource.UserField7;
|
|
Qry.FieldByName('UserField8').AsString := Resource.UserField8;
|
|
Qry.FieldByName('UserField9').AsString := Resource.UserField9;
|
|
Qry.Post;
|
|
except
|
|
Qry.Cancel;
|
|
raise EDBPostError.Create;
|
|
end;
|
|
end else begin
|
|
Qry.SQL.Clear;
|
|
Qry.SQL.Text := 'INSERT INTO Resources '
|
|
+ '(ResourceID, Description, Notes, ResourceActive, UserField0, '
|
|
+ 'UserField1, UserField2, UserField3, UserField4, UserField5, '
|
|
+ 'UserField6, UserField7, UserField8, UserField9) '
|
|
+ 'VALUES(:ResID, :Descr, :Notes, :ResActive, :UserField0, '
|
|
+ ':UserField1, :UserField2, :UserField3, :UserField4, '
|
|
+ ':UserField5, :UserField6, :UserField7, :UserField8, '
|
|
+ ':UserField9)';
|
|
|
|
Qry.ParamByName('ResID').AsInteger := Resource.ResourceID;
|
|
Qry.ParamByName('Descr').Asstring := Resource.Description;
|
|
Qry.ParamByName('Notes').AsString := Resource.Notes;
|
|
Qry.ParamByName('ResActive').AsBoolean := Resource.Active;
|
|
Qry.ParamByName('UserField0').AsString := Resource.UserField0;
|
|
Qry.ParamByName('UserField1').AsString := Resource.UserField1;
|
|
Qry.ParamByName('UserField2').AsString := Resource.UserField2;
|
|
Qry.ParamByName('UserField3').AsString := Resource.UserField3;
|
|
Qry.ParamByName('UserField4').AsString := Resource.UserField4;
|
|
Qry.ParamByName('UserField5').AsString := Resource.UserField5;
|
|
Qry.ParamByName('UserField6').AsString := Resource.UserField6;
|
|
Qry.ParamByName('UserField7').AsString := Resource.UserField7;
|
|
Qry.ParamByName('UserField8').AsString := Resource.UserField8;
|
|
Qry.ParamByName('UserField9').AsString := Resource.UserField9;
|
|
|
|
Qry.ExecSQL;
|
|
end;
|
|
Resource.Changed := false;
|
|
end;
|
|
{ if this is the active resource, then update all of its stuff }
|
|
if Resource.ResourceID = ResourceID then begin
|
|
PostEvents;
|
|
PostContacts;
|
|
PostTasks;
|
|
end;
|
|
end;
|
|
Resources.Sort;
|
|
|
|
if not Loading then
|
|
NotifyDependents;
|
|
|
|
if Assigned(AfterPostResources) then
|
|
FAfterPostResources(self);
|
|
finally
|
|
Qry.Close;
|
|
Qry.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PostEvents;
|
|
var
|
|
I: Integer;
|
|
Event: TVpEvent;
|
|
Qry: TDBISAMQuery;
|
|
F: TField;
|
|
FixedLoc, FixedLocP: String;
|
|
begin
|
|
if (Resource <> nil) and Resource.EventsDirty then begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDatabase.DatabaseName;
|
|
Qry.RequestLive := true;
|
|
|
|
for I := pred(Resource.Schedule.EventCount) downto 0 do begin
|
|
Event := Resource.Schedule.GetEvent(I);
|
|
if Event.Deleted then begin
|
|
Qry.SQL.Text := 'DELETE FROM Events '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Event.RecordID;
|
|
Qry.ExecSQL;
|
|
Event.Free;
|
|
Continue;
|
|
end
|
|
|
|
else if Event.Changed then begin
|
|
Qry.SQL.Text := 'SELECT * FROM Events '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Event.RecordID;
|
|
Qry.Open;
|
|
|
|
if Qry.FieldByName('Location') <> nil then begin // new
|
|
FixedLoc := 'Location, ';
|
|
FixedLocP := ':Loc, ';
|
|
end else begin
|
|
FixedLoc := '';
|
|
FixedLocP := '';
|
|
end;
|
|
|
|
if Qry.Locate('RecordID', Event.RecordID, [])
|
|
then begin
|
|
{ existing record found }
|
|
Qry.Edit;
|
|
try
|
|
Qry.FieldByName('RecordID').AsInteger := Event.RecordID;
|
|
Qry.FieldByName('StartTime').AsDateTime := Event.StartTime;
|
|
Qry.FieldByName('EndTime').AsDateTime := Event.EndTime;
|
|
Qry.FieldByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.FieldByName('Description').AsString := Event.Description;
|
|
F := Qry.FieldByName('Location'); // new
|
|
if F <> nil then F.AsString := Event.Location;
|
|
Qry.FieldByName('Notes').AsString := Event.Notes;
|
|
Qry.FieldByName('Category').AsInteger := Event.Category;
|
|
Qry.FieldByName('DingPath').AsString := Event.DingPath;
|
|
Qry.FieldByName('AllDayEvent').AsBoolean := Event.AllDayEvent;
|
|
Qry.FieldByName('AlarmSet').AsBoolean := Event.AlarmSet;
|
|
Qry.FieldByName('AlarmAdvance').AsInteger := Event.AlarmAdvance;
|
|
Qry.FieldByName('AlarmAdvanceType').AsInteger := Ord(Event.AlarmAdvanceType);
|
|
Qry.FieldByName('SnoozeTime').AsDateTime := Event.SnoozeTime;
|
|
Qry.FieldByName('RepeatCode').AsInteger := Ord(Event.RepeatCode);
|
|
Qry.FieldByName('RepeatRangeEnd').AsDateTime := Event.RepeatRangeEnd;
|
|
Qry.FieldByName('CustomInterval').AsInteger := Event.CustomInterval;
|
|
Qry.FieldByName('UserField0').AsString := Event.UserField0;
|
|
Qry.FieldByName('UserField1').AsString := Event.UserField1;
|
|
Qry.FieldByName('UserField2').AsString := Event.UserField2;
|
|
Qry.FieldByName('UserField3').AsString := Event.UserField3;
|
|
Qry.FieldByName('UserField4').AsString := Event.UserField4;
|
|
Qry.FieldByName('UserField5').AsString := Event.UserField5;
|
|
Qry.FieldByName('UserField6').AsString := Event.UserField6;
|
|
Qry.FieldByName('UserField7').AsString := Event.UserField7;
|
|
Qry.FieldByName('UserField8').AsString := Event.UserField8;
|
|
Qry.FieldByName('UserField9').AsString := Event.UserField9;
|
|
Qry.Post;
|
|
except
|
|
Qry.Cancel;
|
|
raise EDBPostError.Create;
|
|
end;
|
|
end else begin
|
|
Qry.Close;
|
|
Qry.SQL.Text := 'INSERT INTO Events '
|
|
+ '(RecordID, StartTime, EndTime, ResourceID, Description, ' + FixedLoc
|
|
+ 'Notes, SnoozeTime, Category, DingPath, AllDayEvent, AlarmSet, '
|
|
+ 'AlarmAdvance, AlarmAdvanceType, RepeatCode, '
|
|
+ 'RepeatRangeEnd, CustomInterval, '
|
|
+ 'UserField0, UserField1, UserField2, UserField3, UserField4, '
|
|
+ 'UserField5, UserField6, UserField7, UserField8, UserField9) '
|
|
+ 'VALUES(:RecID, :STime, :ETime, :ResID, :Desc, ' + FixedLocP
|
|
+ ':Notes, :SnTime, :Cat, :DPath, :ADEvent, :ASet, :AAdvance, '
|
|
+ ':AAdvanceType, :RCode, :RRangeEnd, :CInterval, :UserField0, '
|
|
+ ':UserField1, :UserField2, :UserField3, :UserField4, '
|
|
+ ':UserField5, :UserField6, :UserField7, :UserField8, '
|
|
+ ':UserField9)';
|
|
|
|
Qry.ParamByName('RecID').AsInteger := Event.RecordID;
|
|
Qry.ParamByName('STime').AsDateTime := Event.StartTime;
|
|
Qry.ParamByName('ETime').AsDateTime := Event.EndTime;
|
|
Qry.ParamByName('ResID').AsInteger := Resource.ResourceID;
|
|
Qry.ParamByName('Desc').AsString := Event.Description;
|
|
if FixedLocP <> '' then Qry.ParamByName('Loc').AsString := Event.Location;
|
|
Qry.ParamByName('Notes').AsString := Event.Note;
|
|
Qry.ParamByName('SnTime').AsDateTime := Event.SnoozeTime;
|
|
Qry.ParamByName('Cat').AsInteger := Event.Category;
|
|
Qry.ParamByName('DPath').AsString := Event.DingPath;
|
|
Qry.ParamByName('ADEvent').AsBoolean := Event.AllDayEvent;
|
|
Qry.ParamByName('ASet').AsBoolean := Event.AlarmSet;
|
|
Qry.ParamByName('AAdvance').AsInteger := Event.AlarmAdvance;
|
|
Qry.ParamByName('AAdvanceType').AsInteger := Ord(Event.AlarmAdvanceType);
|
|
Qry.ParamByName('RCode').AsInteger := Ord(Event.RepeatCode);
|
|
Qry.ParamByName('RRangeEnd').AsDateTime := Event.RepeatRangeEnd;
|
|
Qry.ParamByName('CInterval').AsInteger := Event.CustomInterval;
|
|
Qry.ParamByName('UserField0').AsString := Event.UserField0;
|
|
Qry.ParamByName('UserField1').AsString := Event.UserField1;
|
|
Qry.ParamByName('UserField2').AsString := Event.UserField2;
|
|
Qry.ParamByName('UserField3').AsString := Event.UserField3;
|
|
Qry.ParamByName('UserField4').AsString := Event.UserField4;
|
|
Qry.ParamByName('UserField5').AsString := Event.UserField5;
|
|
Qry.ParamByName('UserField6').AsString := Event.UserField6;
|
|
Qry.ParamByName('UserField7').AsString := Event.UserField7;
|
|
Qry.ParamByName('UserField8').AsString := Event.UserField8;
|
|
Qry.ParamByName('UserField9').AsString := Event.UserField9;
|
|
|
|
Qry.ExecSQL;
|
|
end;
|
|
Event.Changed := false;
|
|
end;
|
|
end;
|
|
Resource.Schedule.Sort;
|
|
NotifyDependents;
|
|
finally
|
|
Qry.CLose;
|
|
Qry.Free;
|
|
end;
|
|
Resource.EventsDirty := false;
|
|
Resource.Schedule.Sort;
|
|
|
|
if not Loading then
|
|
NotifyDependents;
|
|
|
|
if Assigned(AfterPostEvents) then
|
|
FAfterPostEvents(self);
|
|
end;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PostContacts;
|
|
var
|
|
I: Integer;
|
|
Contact: TVpContact;
|
|
Qry: TDBISAMQuery;
|
|
F: TField;
|
|
FixedNote, FixedNoteP: String;
|
|
begin
|
|
if (Resource <> nil) and Resource.ContactsDirty then begin
|
|
{ Dump this resource's dirty contacts to the DB }
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDatabase.DatabaseName;
|
|
Qry.RequestLive := true;
|
|
|
|
for I := pred(Resource.Contacts.Count) downto 0 do begin
|
|
Contact := Resource.Contacts.GetContact(I);
|
|
|
|
if Contact.Deleted then begin
|
|
Qry.SQL.Text := 'DELETE FROM Contacts '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Contact.RecordID;
|
|
Qry.ExecSQL;
|
|
Contact.Free;
|
|
Continue;
|
|
end
|
|
|
|
else if Contact.Changed then begin
|
|
Qry.SQL.Text := 'SELECT * FROM Contacts '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Contact.RecordID;
|
|
Qry.Open;
|
|
|
|
if Qry.FieldByName('Notes') <> nil then begin
|
|
FixedNote := 'Notes, '; FixedNoteP := ':Note, ';
|
|
end else
|
|
if Qry.FieldByName('Note') <> nil then begin
|
|
FixedNote := 'Note, '; FixedNoteP := ':Notes, ';
|
|
end else begin
|
|
FixedNote := ''; FixedNoteP := '';
|
|
end;
|
|
|
|
if Qry.Locate('RecordID', Contact.RecordID, [])
|
|
then begin
|
|
{ existing record found }
|
|
Qry.Edit;
|
|
try
|
|
Qry.FieldByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.FieldByName('RecordID').AsInteger := Contact.RecordID;
|
|
Qry.FieldByName('FirstName').AsString := Contact.FirstName;
|
|
Qry.FieldByName('LastName').AsString := Contact.LastName;
|
|
Qry.FieldByName('Title').AsString := Contact.Title;
|
|
Qry.FieldByName('Company').AsString := Contact.Company;
|
|
Qry.FieldByName('Job_Position').AsString := Contact.Job_Position;
|
|
Qry.FieldByName('EMail').AsString := Contact.EMail;
|
|
Qry.FieldByName('Address').AsString := Contact.Address;
|
|
Qry.FieldByName('City').AsString := Contact.City;
|
|
Qry.FieldByName('State').AsString := Contact.State;
|
|
Qry.FieldByName('Zip').AsString := Contact.Zip;
|
|
Qry.FieldByName('Country').AsString := Contact.Country;
|
|
F := Qry.FieldByName('Notes');
|
|
if F = nil then F := Qry.FieldByName('Note'); // deprecated
|
|
if F <> nil then F.AsString := Contact.Notes;
|
|
Qry.FieldByName('Phone1').AsString := Contact.Phone1;
|
|
Qry.FieldByName('Phone2').AsString := Contact.Phone2;
|
|
Qry.FieldByName('Phone3').AsString := Contact.Phone3;
|
|
Qry.FieldByName('Phone4').AsString := Contact.Phone4;
|
|
Qry.FieldByName('Phone5').AsString := Contact.Phone5;
|
|
Qry.FieldByName('PhoneType1').AsInteger := Contact.PhoneType1;
|
|
Qry.FieldByName('PhoneType2').AsInteger := Contact.PhoneType2;
|
|
Qry.FieldByName('PhoneType3').AsInteger := Contact.PhoneType3;
|
|
Qry.FieldByName('PhoneType4').AsInteger := Contact.PhoneType4;
|
|
Qry.FieldByName('PhoneType5').AsInteger := Contact.PhoneType5;
|
|
Qry.FieldByName('Category').AsInteger := Contact.Category;
|
|
Qry.FieldByName('Custom1').AsString := Contact.Custom1;
|
|
Qry.FieldByName('Custom2').AsString := Contact.Custom2;
|
|
Qry.FieldByName('Custom3').AsString := Contact.Custom3;
|
|
Qry.FieldByName('Custom4').AsString := Contact.Custom4;
|
|
Qry.FieldByName('UserField0').AsString := Contact.UserField0;
|
|
Qry.FieldByName('UserField1').AsString := Contact.UserField1;
|
|
Qry.FieldByName('UserField2').AsString := Contact.UserField2;
|
|
Qry.FieldByName('UserField3').AsString := Contact.UserField3;
|
|
Qry.FieldByName('UserField4').AsString := Contact.UserField4;
|
|
Qry.FieldByName('UserField5').AsString := Contact.UserField5;
|
|
Qry.FieldByName('UserField6').AsString := Contact.UserField6;
|
|
Qry.FieldByName('UserField7').AsString := Contact.UserField7;
|
|
Qry.FieldByName('UserField8').AsString := Contact.UserField8;
|
|
Qry.FieldByName('UserField9').AsString := Contact.UserField9;
|
|
Qry.Post;
|
|
except
|
|
Qry.Cancel;
|
|
raise EDBPostError.Create;
|
|
end;
|
|
end else begin
|
|
Qry.Close;
|
|
Qry.SQL.Text := 'INSERT INTO Contacts '
|
|
+ '(ResourceID, RecordID, FirstName, LastName, Title, Company, '
|
|
+ 'Job_Position, EMail, Address, City, State, Zip, Country, '
|
|
+ FixedNote + 'Phone1, Phone2, Phone3, Phone4, Phone5, PhoneType1, '
|
|
+ 'PhoneType2, PhoneType3, PhoneType4, PhoneType5, Category, '
|
|
+ 'Custom1, Custom2, Custom3, Custom4, UserField0, UserField1, '
|
|
+ 'UserField2, UserField3, UserField4, UserField5, UserField6, '
|
|
+ 'UserField7, UserField8, UserField9 ) '
|
|
|
|
+ 'VALUES(:ResourceID, :RecordID, :FirstName, :LastName, :Title, '
|
|
+ ':Company, :Job_Position, :EMail, :Address, :City, :State, :Zip, '
|
|
+ ':Country, ' + FixedNoteP + ':Phone1, :Phone2, :Phone3, :Phone4, :Phone5, '
|
|
+ ':PhoneType1, :PhoneType2, :PhoneType3, :PhoneType4, :PhoneType5, '
|
|
+ ':Category, :Custom1, :Custom2, :Custom3, :Custom4, :UserField0, '
|
|
+ ':UserField1, :UserField2, :UserField3, :UserField4, :UserField5, '
|
|
+ ':UserField6, :UserField7, :UserField8, :UserField9)';
|
|
|
|
Qry.ParamByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.ParamByName('RecordID').AsInteger := Contact.RecordID;
|
|
Qry.ParamByName('FirstName').AsString := Contact.FirstName;
|
|
Qry.ParamByName('LastName').AsString := Contact.LastName;
|
|
Qry.ParamByName('Title').AsString := Contact.Title;
|
|
Qry.ParamByName('Company').AsString := Contact.Company;
|
|
Qry.ParamByName('Job_Position').AsString := Contact.Job_Position;
|
|
Qry.ParamByName('EMail').AsString := Contact.EMail;
|
|
Qry.ParamByName('Address').AsString := Contact.Address;
|
|
Qry.ParamByName('City').AsString := Contact.City;
|
|
Qry.ParamByName('State').AsString := Contact.State;
|
|
Qry.ParamByName('Zip').AsString := Contact.Zip;
|
|
Qry.ParamByName('Country').AsString := Contact.Country;
|
|
if FixedNoteP <> '' then Qry.ParamByName('Notes').AsString := Contact.Notes;
|
|
Qry.ParamByName('Phone1').AsString := Contact.Phone1;
|
|
Qry.ParamByName('Phone2').AsString := Contact.Phone2;
|
|
Qry.ParamByName('Phone3').AsString := Contact.Phone3;
|
|
Qry.ParamByName('Phone4').AsString := Contact.Phone4;
|
|
Qry.ParamByName('Phone5').AsString := Contact.Phone5;
|
|
Qry.ParamByName('PhoneType1').AsInteger := Contact.PhoneType1;
|
|
Qry.ParamByName('PhoneType2').AsInteger := Contact.PhoneType2;
|
|
Qry.ParamByName('PhoneType3').AsInteger := Contact.PhoneType3;
|
|
Qry.ParamByName('PhoneType4').AsInteger := Contact.PhoneType4;
|
|
Qry.ParamByName('PhoneType5').AsInteger := Contact.PhoneType5;
|
|
Qry.ParamByName('Category').AsInteger := Contact.Category;
|
|
Qry.ParamByName('Custom1').AsString := Contact.Custom1;
|
|
Qry.ParamByName('Custom2').AsString := Contact.Custom2;
|
|
Qry.ParamByName('Custom3').AsString := Contact.Custom3;
|
|
Qry.ParamByName('Custom4').AsString := Contact.Custom4;
|
|
Qry.ParamByName('UserField0').AsString := Contact.UserField0;
|
|
Qry.ParamByName('UserField1').AsString := Contact.UserField1;
|
|
Qry.ParamByName('UserField2').AsString := Contact.UserField2;
|
|
Qry.ParamByName('UserField3').AsString := Contact.UserField3;
|
|
Qry.ParamByName('UserField4').AsString := Contact.UserField4;
|
|
Qry.ParamByName('UserField5').AsString := Contact.UserField5;
|
|
Qry.ParamByName('UserField6').AsString := Contact.UserField6;
|
|
Qry.ParamByName('UserField7').AsString := Contact.UserField7;
|
|
Qry.ParamByName('UserField8').AsString := Contact.UserField8;
|
|
Qry.ParamByName('UserField9').AsString := Contact.UserField9;
|
|
|
|
Qry.ExecSQL;
|
|
end;
|
|
Contact.Changed := false;
|
|
end;
|
|
end;
|
|
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
Resource.ContactsDirty := false;
|
|
|
|
if not Loading then
|
|
NotifyDependents;
|
|
|
|
if Assigned(AfterPostContacts) then
|
|
FAfterPostContacts(self);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TVpDBISAMDataStore.PostTasks;
|
|
var
|
|
I: Integer;
|
|
Task: TVpTask;
|
|
Qry : TDBISAMQuery;
|
|
begin
|
|
if (Resource <> nil) and Resource.TasksDirty then begin
|
|
{ Dump this resource's dirty contacts to the DB }
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDatabase.DatabaseName;
|
|
Qry.RequestLive := true;
|
|
|
|
for I := pred(Resource.Tasks.Count) downto 0 do begin
|
|
Task := Resource.Tasks.GetTask(I);
|
|
if Task.Deleted then begin
|
|
Qry.SQL.Text := 'DELETE FROM Tasks '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Task.RecordID;
|
|
Qry.ExecSQL;
|
|
Task.Free;
|
|
Continue;
|
|
end
|
|
|
|
else if Task.Changed then begin
|
|
Qry.SQL.Text := 'SELECT * FROM Tasks '
|
|
+ 'WHERE RecordID = :ID';
|
|
Qry.ParamByName('ID').AsInteger := Task.RecordID;
|
|
Qry.Open;
|
|
|
|
if Qry.Locate('RecordID', Task.RecordID, [])
|
|
then begin
|
|
{ existing record found }
|
|
Qry.Edit;
|
|
try
|
|
Qry.FieldByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.FieldByName('Description').AsString := Task.Description;
|
|
Qry.FieldByName('Details').AsString := Task.Details;
|
|
Qry.FieldByName('Complete').AsBoolean := Task.Complete;
|
|
Qry.FieldByName('DueDate').AsDateTime := Task.DueDate;
|
|
Qry.FieldByName('CreatedOn').AsDateTime := Task.CreatedOn;
|
|
Qry.FieldByName('CompletedOn').AsDateTime := Task.CompletedOn;
|
|
Qry.FieldByName('Priority').AsInteger := Task.Priority;
|
|
Qry.FieldByName('Category').AsInteger := Task.Category;
|
|
Qry.FieldByName('UserField0').AsString := Task.UserField0;
|
|
Qry.FieldByName('UserField1').AsString := Task.UserField1;
|
|
Qry.FieldByName('UserField2').AsString := Task.UserField2;
|
|
Qry.FieldByName('UserField3').AsString := Task.UserField3;
|
|
Qry.FieldByName('UserField4').AsString := Task.UserField4;
|
|
Qry.FieldByName('UserField5').AsString := Task.UserField5;
|
|
Qry.FieldByName('UserField6').AsString := Task.UserField6;
|
|
Qry.FieldByName('UserField7').AsString := Task.UserField7;
|
|
Qry.FieldByName('UserField8').AsString := Task.UserField8;
|
|
Qry.FieldByName('UserField9').AsString := Task.UserField9;
|
|
Qry.Post;
|
|
except
|
|
Qry.Cancel;
|
|
raise EDBPostError.Create;
|
|
end;
|
|
end else begin
|
|
Qry.Close;
|
|
Qry.SQL.Text := 'INSERT INTO Tasks '
|
|
+ '(RecordID, ResourceID, Description, Details, '
|
|
+ 'Complete, DueDate, CreatedOn, CompletedOn, Priority, Category, '
|
|
+ 'UserField0, UserField1, UserField2, UserField3, UserField4, '
|
|
+ 'UserField5, UserField6, UserField7, UserField8, UserField9) '
|
|
|
|
+ 'VALUES(:RecordID, :ResourceID, :Description, :Details, '
|
|
+ ':Complete, :DueDate, :CreatedOn, :CompletedOn, :Priority, '
|
|
+ ':Category, :UserField0, :UserField1, :UserField2, :UserField3, '
|
|
+ ':UserField4, :UserField5, :UserField6, :UserField7, '
|
|
+ ':UserField8, :UserField9)';
|
|
|
|
Qry.ParamByName('RecordID').AsInteger := Task.RecordID;
|
|
Qry.ParamByName('ResourceID').AsInteger := Resource.ResourceID;
|
|
Qry.ParamByName('Description').AsString := Task.Description;
|
|
Qry.ParamByName('Details').AsString := Task.Details;
|
|
Qry.ParamByName('Complete').AsBoolean := Task.Complete;
|
|
Qry.ParamByName('DueDate').AsDateTime := Task.DueDate;
|
|
Qry.ParamByName('CreatedOn').AsDateTime := Task.CreatedOn;
|
|
Qry.ParamByName('CompletedOn').AsDateTime := Task.CompletedOn;
|
|
Qry.ParamByName('Priority').AsInteger := Task.Priority;
|
|
Qry.ParamByName('Category').AsInteger := Task.Category;
|
|
Qry.ParamByName('UserField0').AsString := Task.UserField0;
|
|
Qry.ParamByName('UserField1').AsString := Task.UserField1;
|
|
Qry.ParamByName('UserField2').AsString := Task.UserField2;
|
|
Qry.ParamByName('UserField3').AsString := Task.UserField3;
|
|
Qry.ParamByName('UserField4').AsString := Task.UserField4;
|
|
Qry.ParamByName('UserField5').AsString := Task.UserField5;
|
|
Qry.ParamByName('UserField6').AsString := Task.UserField6;
|
|
Qry.ParamByName('UserField7').AsString := Task.UserField7;
|
|
Qry.ParamByName('UserField8').AsString := Task.UserField8;
|
|
Qry.ParamByName('UserField9').AsString := Task.UserField9;
|
|
Qry.ExecSQL;
|
|
end;
|
|
Task.Changed := false;
|
|
end
|
|
end;
|
|
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
|
|
Resource.TasksDirty := false;
|
|
|
|
if not Loading then
|
|
NotifyDependents;
|
|
|
|
if Assigned(AfterPostTasks) then
|
|
FAfterPostTasks(self);
|
|
end;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PurgeResource(Res: TVpResource);
|
|
begin
|
|
Res.Deleted := true;
|
|
PostResources;
|
|
Load;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PurgeEvents(Res: TVpResource);
|
|
var
|
|
Qry: TDBISAMQuery;
|
|
begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDataBase.DatabaseName;
|
|
|
|
Qry.SQL.Text := 'delete from Events where ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := Res.ResourceID;
|
|
Qry.ExecSQL;
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
Res.Schedule.ClearEvents;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PurgeContacts(Res: TVpResource);
|
|
var
|
|
Qry: TDBISAMQuery;
|
|
begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDataBase.DatabaseName;
|
|
|
|
Qry.SQL.Text := 'delete from Contacts where ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := Res.ResourceID;
|
|
Qry.ExecSQL;
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
Res.Contacts.ClearContacts;
|
|
end;
|
|
|
|
procedure TVpDBISAMDataStore.PurgeTasks(Res: TVpResource);
|
|
var
|
|
Qry: TDBISAMQuery;
|
|
begin
|
|
Qry := TDBISAMQuery.Create(self);
|
|
try
|
|
Qry.SessionName := FSessionName;
|
|
Qry.DatabaseName := FDataBase.DatabaseName;
|
|
|
|
Qry.SQL.Text := 'delete from Tasks where ResourceID = :ResID';
|
|
Qry.ParamByName('ResID').AsInteger := Res.ResourceID;
|
|
Qry.ExecSQL;
|
|
finally
|
|
Qry.Free;
|
|
end;
|
|
Res.Tasks.ClearTasks;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.SetConnected(const Value: boolean);
|
|
var
|
|
DBPath : string;
|
|
Str : string;
|
|
begin
|
|
{ disconnect if destroying }
|
|
if csDestroying in ComponentState then begin
|
|
FDataBase.Connected := false;
|
|
exit;
|
|
end;
|
|
|
|
{ Don't connect at designtime }
|
|
if csDesigning in ComponentState then exit;
|
|
|
|
{ Don't try to connect until we're all loaded up }
|
|
if csLoading in ComponentState then exit;
|
|
|
|
if FDatabase.DatabaseName = '' then
|
|
FDatabase.DatabaseName := 'VpDatabase' + Name[Length(Name)];
|
|
|
|
FDataBase.Connected := Value;
|
|
if FDataBase.Connected then begin
|
|
if FDatabase.Directory <> '' then
|
|
DBPath := FDatabase.Directory + '\'
|
|
else
|
|
DBPath := '';
|
|
|
|
{ Create / Open Resources Table}
|
|
Str := FDatabase.DatabaseName;
|
|
FResourceTable.DatabaseName := Str;
|
|
if (not FileExists(DBPath + ResourceTableName + '.*'))
|
|
then CreateTable(ResourceTableName);
|
|
try
|
|
FResourceTable.Open;
|
|
except
|
|
if AutoCreate then begin
|
|
CreateTable(ResourceTableName);
|
|
FResourceTable.Open;
|
|
end;
|
|
end;
|
|
|
|
{ Create / Open Events Table }
|
|
FEventsTable.DatabaseName := FDatabase.DatabaseName;
|
|
if (not FileExists(DBPath + EventsTableName + '.*'))
|
|
then CreateTable(EventsTableName);
|
|
SetFilterCriteria(FEventsTable,
|
|
True,
|
|
ResourceTable.FieldByName('ResourceID').AsInteger,
|
|
TimeRange.StartTime,
|
|
TimeRange.EndTime);
|
|
try
|
|
FEventsTable.Open;
|
|
except
|
|
if AutoCreate then begin
|
|
CreateTable(EventsTableName);
|
|
FEventsTable.Open;
|
|
end;
|
|
end;
|
|
|
|
{ Create / Open Contacts Table }
|
|
FContactsTable.DatabaseName := FDatabase.DatabaseName;
|
|
if (not FileExists(DBPath + ContactsTableName + '.*'))
|
|
then CreateTable(ContactsTableName);
|
|
SetFilterCriteria(FContactsTable, False,
|
|
ResourceTable.FieldByName('ResourceID').AsInteger,
|
|
0, 0);
|
|
try
|
|
FContactsTable.Open;
|
|
except
|
|
if AutoCreate then begin
|
|
CreateTable(ContactsTableName);
|
|
FContactsTable.Open;
|
|
end;
|
|
end;
|
|
|
|
{ Create / Open Tasks Table }
|
|
FTasksTable.DatabaseName := FDatabase.DatabaseName;
|
|
if (not FileExists(DBPath + TasksTableName + '.*'))
|
|
then CreateTable(TasksTableName);
|
|
SetFilterCriteria(FTasksTable, False,
|
|
ResourceTable.FieldByName('ResourceID').AsInteger,
|
|
0, 0);
|
|
try
|
|
FTasksTable.Open;
|
|
except
|
|
if AutoCreate then begin
|
|
CreateTable(TasksTableName);
|
|
FTasksTable.Open;
|
|
end;
|
|
end;
|
|
|
|
{ Create / Open RecordID Table }
|
|
FRecordIDTable.DatabaseName := FDatabase.DatabaseName;
|
|
if (not FileExists(DBPath + RecordIDTableName + '.*'))
|
|
then CreateTable(RecordIDTableName);
|
|
|
|
Load;
|
|
end
|
|
else begin
|
|
FTasksTable.Close;
|
|
FContactsTable.Close;
|
|
FResourceTable.Close;
|
|
FEventsTable.Close;
|
|
end;
|
|
|
|
inherited SetConnected(Database.Connected);
|
|
end;
|
|
{=====}
|
|
|
|
{ Called by the ancestor to properly filter the data for each table, }
|
|
{ based on the ResourceID, Date and DayBuffer values. }
|
|
{ Each TVpCustomDBDataStore descendant should define their own }
|
|
{ SetFilterCriteria procedure. }
|
|
procedure TVpDBISAMDataStore.SetFilterCriteria(aTable :TDataset;
|
|
aUseDateTime: Boolean; aResourceID: Longint; aStartDateTime: TDateTime;
|
|
aEndDateTime: TDateTime);
|
|
var
|
|
Qry: TDBISAMQuery;
|
|
begin
|
|
Qry := (aTable as TDBISAMQuery);
|
|
|
|
Qry.Close;
|
|
|
|
Qry.ParamByName('ResID').AsInteger := aResourceID;
|
|
|
|
if Qry = EventsTable then begin
|
|
Qry.ParamByName('STime1').AsDateTime := aStartDateTime;
|
|
Qry.ParamByName('ETime').AsDateTime := aEndDateTime;
|
|
Qry.ParamByName('STime2').AsDateTime := aStartDateTime;
|
|
end;
|
|
|
|
Qry.Open;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.CreateIndexDefs(const TableName: string;
|
|
IndexDefs: TIndexDefs);
|
|
begin
|
|
if TableName = ResourceTableName then begin
|
|
with IndexDefs do begin
|
|
Clear;
|
|
{ DBISAM primary keys have no name }
|
|
with AddIndexDef do begin
|
|
Name := '';
|
|
Fields := 'ResourceID';
|
|
Options := [ixPrimary,ixUnique];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'Descr_ndx';
|
|
Fields := 'Description';
|
|
Options := [ixCaseInsensitive];
|
|
end;
|
|
end;
|
|
end else if TableName = EventsTableName then begin
|
|
with IndexDefs do begin
|
|
Clear;
|
|
{ DBISAM primary keys have no name }
|
|
with AddIndexDef do begin
|
|
Name := '';
|
|
Fields := 'RecordID';
|
|
Options := [ixPrimary,ixUnique];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'rid_st_ndx';
|
|
Fields := 'ResourceID;StartTime';
|
|
Options := [ixCaseInsensitive];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'st_ndx';
|
|
Fields := 'StartTime';
|
|
Options := [];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'et_ndx';
|
|
Fields := 'EndTime';
|
|
Options := [];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := VpcIndexNameResID;
|
|
Fields := 'ResourceID';
|
|
Options := [];
|
|
end;
|
|
end;
|
|
end else if TableName = ContactsTableName then begin
|
|
with IndexDefs do begin
|
|
Clear;
|
|
{ DBISAM primary keys have no name }
|
|
with AddIndexDef do begin
|
|
Name := '';
|
|
Fields := 'RecordID';
|
|
Options := [ixPrimary,ixUnique];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := VpcIndexNameResID;
|
|
Fields := 'ResourceID';
|
|
Options := [];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'LName_ndx';
|
|
Fields := 'LastName';
|
|
Options := [ixCaseInsensitive];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'Company_ndx';
|
|
Fields := 'Company';
|
|
Options := [ixCaseInsensitive];
|
|
end;
|
|
end;
|
|
end else if TableName = TasksTableName then begin
|
|
with IndexDefs do begin
|
|
Clear;
|
|
{ DBISAM primary keys have no name }
|
|
with AddIndexDef do begin
|
|
Name := '';
|
|
Fields := 'RecordID';
|
|
Options := [ixPrimary,ixUnique];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := VpcIndexNameResID;
|
|
Fields := 'ResourceID';
|
|
Options := [];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'DueDate';
|
|
Fields := 'DueDate';
|
|
Options := [];
|
|
end;
|
|
with AddIndexDef do begin
|
|
Name := 'CompletedOn';
|
|
Fields := 'CompletedOn';
|
|
Options := [];
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.CreateFieldDefs(const TableName: string;
|
|
FieldDefs: TFieldDefs);
|
|
begin
|
|
if TableName = ResourceTableName then begin
|
|
with FieldDefs do begin
|
|
Clear;
|
|
{ Resource ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Description }
|
|
with AddFieldDef do begin
|
|
Name := 'Description';
|
|
DataType := ftString;
|
|
Size := 250;
|
|
Required := false;
|
|
end;
|
|
{ Notes }
|
|
with AddFieldDef do begin
|
|
Name := 'Notes';
|
|
DataType := ftMemo;
|
|
Required := false;
|
|
end;
|
|
{ Image Index }
|
|
with AddFieldDef do begin
|
|
Name := 'ImageIndex';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Active }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceActive';
|
|
DataType := ftBoolean;
|
|
Required := false;
|
|
end;
|
|
{ UserField0 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField0';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField1 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField1';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField2 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField2';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField3 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField3';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField4 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField4';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField5 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField5';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField6 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField6';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField7 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField7';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField8 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField8';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField9 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField9';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
end;
|
|
end else if TableName = EventsTableName then begin
|
|
with FieldDefs do begin
|
|
Clear;
|
|
{ Record ID }
|
|
with AddFieldDef do begin
|
|
Name := 'RecordID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ StartTime }
|
|
with AddFieldDef do begin
|
|
Name := 'StartTime';
|
|
DataType := ftDateTime;
|
|
Required := true;
|
|
end;
|
|
{ EndTime }
|
|
with AddFieldDef do begin
|
|
Name := 'EndTime';
|
|
DataType := ftDateTime;
|
|
Required := true;
|
|
end;
|
|
{ Resource ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Description }
|
|
with AddFieldDef do begin
|
|
Name := 'Description';
|
|
DataType := ftString;
|
|
Size := 250;
|
|
Required := false;
|
|
end;
|
|
{ Locataion } // new
|
|
with AddFieldDef do begin
|
|
Name := 'Location';
|
|
DataType := ftString;
|
|
Size := 255;
|
|
Required := false;
|
|
end;
|
|
{ Notes }
|
|
with AddFieldDef do begin
|
|
Name := 'Notes';
|
|
DataType := ftMemo;
|
|
Required := false;
|
|
end;
|
|
{ Category }
|
|
with AddFieldDef do begin
|
|
Name := 'Category';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ AllDayEvent }
|
|
with AddFieldDef do begin
|
|
Name := 'AllDayEvent';
|
|
DataType := ftBoolean;
|
|
Required := false;
|
|
end;
|
|
{ DingPath }
|
|
with AddFieldDef do begin
|
|
Name := 'DingPath';
|
|
DataType := ftString;
|
|
Size := 250;
|
|
Required := false;
|
|
end;
|
|
{ AlarmSet }
|
|
with AddFieldDef do begin
|
|
Name := 'AlarmSet';
|
|
DataType := ftBoolean;
|
|
Required := false;
|
|
end;
|
|
{ Alarm Advance }
|
|
with AddFieldDef do begin
|
|
Name := 'AlarmAdvance';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Alarm Advance Type }
|
|
with AddFieldDef do begin
|
|
Name := 'AlarmAdvanceType';
|
|
DataType := ftWord;
|
|
Required := false;
|
|
end;
|
|
{ SnoozeTime }
|
|
with AddFieldDef do begin
|
|
Name := 'SnoozeTime';
|
|
DataType := ftDateTime;
|
|
Required := true;
|
|
end;
|
|
{ Repeat Code }
|
|
with AddFieldDef do begin
|
|
Name := 'RepeatCode';
|
|
DataType := ftWord;
|
|
Required := false;
|
|
end;
|
|
{ Repeat Range End }
|
|
with AddFieldDef do begin
|
|
Name := 'RepeatRangeEnd';
|
|
DataType := ftDateTime;
|
|
Required := false;
|
|
end;
|
|
{ Custom Repeat Interval }
|
|
with AddFieldDef do begin
|
|
Name := 'CustomInterval';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ UserField0 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField0';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField1 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField1';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField2 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField2';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField3 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField3';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField4 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField4';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField5 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField5';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField6 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField6';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField7 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField7';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField8 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField8';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField9 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField9';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
end;
|
|
end else if TableName = ContactsTableName then begin
|
|
with FieldDefs do begin
|
|
Clear;
|
|
{ Record ID }
|
|
with AddFieldDef do begin
|
|
Name := 'RecordID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Resource ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ FirstName }
|
|
with AddFieldDef do begin
|
|
Name := 'FirstName';
|
|
DataType := ftString;
|
|
Size := 50;
|
|
Required := false;
|
|
end;
|
|
{ LastName }
|
|
with AddFieldDef do begin
|
|
Name := 'LastName';
|
|
DataType := ftString;
|
|
Size := 50;
|
|
Required := false;
|
|
end;
|
|
{ Birthdate }
|
|
with AddFieldDef do begin
|
|
Name := 'Birthdate';
|
|
DataType := ftDate;
|
|
Required := false;
|
|
end;
|
|
{ Anniversary }
|
|
with AddFieldDef do begin
|
|
Name := 'Anniversary';
|
|
DataType := ftDate;
|
|
Required := false;
|
|
end;
|
|
{ Title }
|
|
with AddFieldDef do begin
|
|
Name := 'Title';
|
|
DataType := ftString;
|
|
Size := 50;
|
|
Required := false;
|
|
end;
|
|
{ Company }
|
|
with AddFieldDef do begin
|
|
Name := 'Company';
|
|
DataType := ftString;
|
|
Size := 50;
|
|
Required := false;
|
|
end;
|
|
{ Position }
|
|
with AddFieldDef do begin
|
|
Name := 'Job_Position';
|
|
DataType := ftString;
|
|
Size := 30;
|
|
Required := false;
|
|
end;
|
|
{ Address }
|
|
with AddFieldDef do begin
|
|
Name := 'Address';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ City }
|
|
with AddFieldDef do begin
|
|
Name := 'City';
|
|
DataType := ftString;
|
|
Size := 50;
|
|
Required := false;
|
|
end;
|
|
{ State }
|
|
with AddFieldDef do begin
|
|
Name := 'State';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Zip }
|
|
with AddFieldDef do begin
|
|
Name := 'Zip';
|
|
DataType := ftString;
|
|
Size := 10;
|
|
Required := false;
|
|
end;
|
|
{ Country }
|
|
with AddFieldDef do begin
|
|
Name := 'Country';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Note }
|
|
with AddFieldDef do begin
|
|
Name := 'Note';
|
|
DataType := ftMemo;
|
|
Required := false;
|
|
end;
|
|
{ Phone1 }
|
|
with AddFieldDef do begin
|
|
Name := 'Phone1';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Phone2 }
|
|
with AddFieldDef do begin
|
|
Name := 'Phone2';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Phone3 }
|
|
with AddFieldDef do begin
|
|
Name := 'Phone3';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Phone4 }
|
|
with AddFieldDef do begin
|
|
Name := 'Phone4';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Phone5 }
|
|
with AddFieldDef do begin
|
|
Name := 'Phone5';
|
|
DataType := ftString;
|
|
Size := 25;
|
|
Required := false;
|
|
end;
|
|
{ Phone1 }
|
|
with AddFieldDef do begin
|
|
Name := 'PhoneType1';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Phone2 }
|
|
with AddFieldDef do begin
|
|
Name := 'PhoneType2';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Phone3 }
|
|
with AddFieldDef do begin
|
|
Name := 'PhoneType3';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Phone4 }
|
|
with AddFieldDef do begin
|
|
Name := 'PhoneType4';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Phone5 }
|
|
with AddFieldDef do begin
|
|
Name := 'PhoneType5';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Category }
|
|
with AddFieldDef do begin
|
|
Name := 'Category';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ EMail }
|
|
with AddFieldDef do begin
|
|
Name := 'EMail';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ Custom1 }
|
|
with AddFieldDef do begin
|
|
Name := 'Custom1';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ Custom2 }
|
|
with AddFieldDef do begin
|
|
Name := 'Custom2';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ Custom3 }
|
|
with AddFieldDef do begin
|
|
Name := 'Custom3';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ Custom4 }
|
|
with AddFieldDef do begin
|
|
Name := 'Custom4';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField0 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField0';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField1 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField1';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField2 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField2';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField3 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField3';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField4 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField4';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField5 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField5';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField6 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField6';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField7 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField7';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField8 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField8';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField9 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField9';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
end;
|
|
end else if TableName = TasksTableName then begin
|
|
with FieldDefs do begin
|
|
Clear;
|
|
{ Record ID }
|
|
with AddFieldDef do begin
|
|
Name := 'RecordID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Resource ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Complete }
|
|
with AddFieldDef do begin
|
|
Name := 'Complete';
|
|
DataType := ftBoolean;
|
|
Required := false;
|
|
end;
|
|
{ Description }
|
|
with AddFieldDef do begin
|
|
Name := 'Description';
|
|
DataType := ftString;
|
|
Size := 250;
|
|
Required := false;
|
|
end;
|
|
{ Details }
|
|
with AddFieldDef do begin
|
|
Name := 'Details';
|
|
DataType := ftMemo;
|
|
Required := false;
|
|
end;
|
|
{ Created On Date }
|
|
with AddFieldDef do begin
|
|
Name := 'CreatedOn';
|
|
DataType := ftDateTime;
|
|
Required := false;
|
|
end;
|
|
{ Priority }
|
|
with AddFieldDef do begin
|
|
Name := 'Priority';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Category }
|
|
with AddFieldDef do begin
|
|
Name := 'Category';
|
|
DataType := ftInteger;
|
|
Required := false;
|
|
end;
|
|
{ Completed On Date }
|
|
with AddFieldDef do begin
|
|
Name := 'CompletedOn';
|
|
DataType := ftDateTime;
|
|
Required := false;
|
|
end;
|
|
{ Due Date }
|
|
with AddFieldDef do begin
|
|
Name := 'DueDate';
|
|
DataType := ftDateTime;
|
|
Required := false;
|
|
end;
|
|
{ UserField0 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField0';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField1 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField1';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField2 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField2';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField3 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField3';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField4 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField4';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField5 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField5';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField6 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField6';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField7 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField7';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField8 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField8';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
{ UserField9 }
|
|
with AddFieldDef do begin
|
|
Name := 'UserField9';
|
|
DataType := ftString;
|
|
Size := 100;
|
|
Required := false;
|
|
end;
|
|
end;
|
|
end else if TableName = RecordIDTableName then begin
|
|
{ The RecordID Table has only one record with 4 fields }
|
|
{ each field contains the last record ID for each of the other tables }
|
|
with FieldDefs do begin
|
|
Clear;
|
|
{ Resource ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ResourceID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Event ID }
|
|
with AddFieldDef do begin
|
|
Name := 'EventID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Task ID }
|
|
with AddFieldDef do begin
|
|
Name := 'TaskID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
{ Contact ID }
|
|
with AddFieldDef do begin
|
|
Name := 'ContactID';
|
|
DataType := ftInteger;
|
|
Required := true;
|
|
end;
|
|
end; {with FieldDefs do}
|
|
end;
|
|
end;
|
|
{=====}
|
|
|
|
function TVpDBISAMDataStore.GetDirectory: String;
|
|
begin
|
|
Result := FDatabase.Directory;
|
|
end;
|
|
{=====}
|
|
|
|
procedure TVpDBISAMDataStore.SetDirectory(const AValue: String);
|
|
begin
|
|
FDatabase.Directory := AValue;
|
|
end;
|
|
|
|
end.
|