Implement OnFilterRecord

git-svn-id: trunk@32093 -
This commit is contained in:
blikblum 2015-10-18 18:53:47 +00:00
parent 72f60de3c4
commit 9aa6ea2255

View File

@ -109,6 +109,7 @@ type
{$endif} {$endif}
FInternalActiveBuffer: PDataRecord; FInternalActiveBuffer: PDataRecord;
FInsertBookmark: PDataRecord; FInsertBookmark: PDataRecord;
FFilterBuffer: TRecordBuffer;
FOnCallback: TSqliteCallback; FOnCallback: TSqliteCallback;
FMasterLink: TMasterDataLink; FMasterLink: TMasterDataLink;
FIndexFieldNames: String; FIndexFieldNames: String;
@ -176,6 +177,7 @@ type
procedure DoBeforeClose; override; procedure DoBeforeClose; override;
procedure DoAfterInsert; override; procedure DoAfterInsert; override;
procedure DoBeforeInsert; override; procedure DoBeforeInsert; override;
procedure DoFilterRecord(var Acceptable: Boolean); virtual;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override; procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override; procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override; function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
@ -578,6 +580,13 @@ begin
inherited DoBeforeInsert; inherited DoBeforeInsert;
end; end;
procedure TCustomSqliteDataset.DoFilterRecord(var Acceptable: Boolean);
begin
Acceptable := True;
if Assigned(OnFilterRecord) then
OnFilterRecord(Self, Acceptable);
end;
destructor TCustomSqliteDataset.Destroy; destructor TCustomSqliteDataset.Destroy;
begin begin
inherited Destroy; inherited Destroy;
@ -746,10 +755,14 @@ begin
else else
FieldOffset := FieldDefs.Count + FCalcFieldList.IndexOf(Field); FieldOffset := FieldDefs.Count + FCalcFieldList.IndexOf(Field);
if not (State in [dsCalcFields, dsInternalCalc]) then case State of
FieldRow := PPDataRecord(ActiveBuffer)^^.Row[FieldOffset] dsCalcFields, dsInternalCalc:
else FieldRow := PPDataRecord(CalcBuffer)^^.Row[FieldOffset];
FieldRow := PPDataRecord(CalcBuffer)^^.Row[FieldOffset]; dsFilter:
FieldRow := PPDataRecord(FFilterBuffer)^^.Row[FieldOffset];
else
FieldRow := PPDataRecord(ActiveBuffer)^^.Row[FieldOffset];
end;
Result := FieldRow <> nil; Result := FieldRow <> nil;
if Result and (Buffer <> nil) then //supports GetIsNull if Result and (Buffer <> nil) then //supports GetIsNull
@ -789,31 +802,46 @@ begin
end; end;
function TCustomSqliteDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; function TCustomSqliteDataset.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
var
Acceptable: Boolean;
SaveState: TDataSetState;
begin begin
Result := grOk; Result := grOk;
case GetMode of repeat
gmPrior: Acceptable := True;
if (FCurrentItem^.Previous = FBeginItem) or (FCurrentItem = FBeginItem) then case GetMode of
Result := grBOF gmPrior:
else if (FCurrentItem^.Previous = FBeginItem) or (FCurrentItem = FBeginItem) then
FCurrentItem:=FCurrentItem^.Previous; Result := grBOF
gmCurrent: else
if (FCurrentItem = FBeginItem) or (FCurrentItem = FEndItem) then FCurrentItem:=FCurrentItem^.Previous;
Result := grError; gmCurrent:
gmNext: if (FCurrentItem = FBeginItem) or (FCurrentItem = FEndItem) then
if (FCurrentItem = FEndItem) or (FCurrentItem^.Next = FEndItem) then Result := grError;
Result := grEOF gmNext:
else if (FCurrentItem = FEndItem) or (FCurrentItem^.Next = FEndItem) then
FCurrentItem := FCurrentItem^.Next; Result := grEOF
end; //case else
if Result = grOk then FCurrentItem := FCurrentItem^.Next;
begin end; //case
PDataRecord(Pointer(Buffer)^) := FCurrentItem; if Result = grOk then
FCurrentItem^.BookmarkFlag := bfCurrent; begin
GetCalcFields(Buffer); PDataRecord(Pointer(Buffer)^) := FCurrentItem;
end FCurrentItem^.BookmarkFlag := bfCurrent;
else if (Result = grError) and DoCheck then GetCalcFields(Buffer);
DatabaseError('No records found', Self); if Filtered then
begin
FFilterBuffer := Buffer;
SaveState := SetTempState(dsFilter);
DoFilterRecord(Acceptable);
if (GetMode = gmCurrent) and not Acceptable then
Result := grError;
RestoreState(SaveState);
end;
end
else if (Result = grError) and DoCheck then
DatabaseError('No records found', Self);
until (Result <> grOK) or Acceptable;
end; end;
function TCustomSqliteDataset.GetRecordCount: Integer; function TCustomSqliteDataset.GetRecordCount: Integer;
@ -1573,7 +1601,7 @@ begin
FMasterLink.DataSource := Value; FMasterLink.DataSource := Value;
end; end;
procedure TCustomSqliteDataset.ExecSQL(const ASQL: String); procedure TCustomSqliteDataset.ExecSQL(const ASql: String);
begin begin
if FSqliteHandle = nil then if FSqliteHandle = nil then
GetSqliteHandle; GetSqliteHandle;
@ -1831,7 +1859,8 @@ begin
Result := False; Result := False;
end; end;
procedure TCustomSqliteDataset.ExecCallback(const ASQL: String; UserData: Pointer = nil); procedure TCustomSqliteDataset.ExecCallback(const ASql: String;
UserData: Pointer);
var var
CallbackInfo: TCallbackInfo; CallbackInfo: TCallbackInfo;
begin begin
@ -1913,12 +1942,13 @@ begin
(FAddedItems.Count > 0) or (FDeletedItems.Count > 0); (FAddedItems.Count > 0) or (FDeletedItems.Count > 0);
end; end;
function TCustomSqliteDataset.QuickQuery(const ASQL: String): String; function TCustomSqliteDataset.QuickQuery(const ASql: String): String;
begin begin
Result := QuickQuery(ASQL, nil, False); Result := QuickQuery(ASQL, nil, False);
end; end;
function TCustomSqliteDataset.QuickQuery(const ASQL: String; const AStrList: TStrings): String; function TCustomSqliteDataset.QuickQuery(const ASql: String;
const AStrList: TStrings): String;
begin begin
Result := QuickQuery(ASQL, AStrList, False) Result := QuickQuery(ASQL, AStrList, False)
end; end;