Hi Pascal,
Lunchtime so I can answer your post
FRefetchRows is used as a boolean flag when TSqlitePassetDataset.InternalRefresh needs to refetch records from disk.
but since I already override TDataset.Refresh, setting FRefetchRows := True, it doesn't need to be set again in TSqlitePassDataset.EmptyTable.
Procedure TSqlitePassDataset.Refresh;
begin
FRefetchRows := True;
Inherited;
end;
{procedure InternalRefresh; virtual; abstract;
-------------------------------------------
Refresh the dataset.}
procedure TSqlitePassDataset.InternalRefresh;
begin
...
{ Queries data using SQL sentence : Refetch the records from Sqlite database engine }
Try
if FRefetchRows then
begin
FRecordset.Open(FSQLSelectStmt.SQL, FSQLSelectStmt.FPrimaryKeyCount);
MapFieldsToMemoryFieldBuffers;
if Not FLookupFieldsDisplayedRecordsOnly
then FillLookupFields(0, Pred(FRecordset.FRecordsCount));
if Not FCalcDisplayedRecordsOnly
then FillCalcFields(0, Pred(FRecordset.FRecordsCount));
FRefetchRows := False;
end;
...
Finally, I decided to change the behavior of EmptyTable :
When called directly from the current dataset, the data will be refreshed automatically
procedure TSqlitePassDataset.EmptyTable;
begin
if DatasetType = dtTable then
begin
FDatabase.Engine.ExecSQL('DELETE FROM "' + DatasetName + '";');
Refresh;
end;
end;
Suggest : I could extend the syntax to include dtQuery -> if DatasetType in [dtTable, dtQuery, dtSQLSelect] ?
When NOT called directly from the current dataset but from Database.TableDefs, the data will NOT be refreshed automatically (because you shouldn't be working on or displaying data from the table you want to empty...)
procedure TSqlitePassTableDefs.EmptyTable(Const TableName: String);
begin
FDatabase.Engine.ExecSQL('DELETE FROM "' + TableName + '";');
end;
Regards