You've already forked lazarus-ccr
1. TRxDBGrid - add new metod in RxSortEngine for calc total values
2. In TZeosDataSetSortEngine add metod for for calc total values in RxDBGrid 3. In TZeosDataSetSortEngine add metod for for calc total values in RxDBGrid 4. In TRxMemoryDataSortEngine add metod for for calc total values in RxDBGrid git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2705 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -48,6 +48,9 @@ type
|
|||||||
{ TFBDataSetSortEngine }
|
{ TFBDataSetSortEngine }
|
||||||
|
|
||||||
TFBDataSetSortEngine = class(TRxDBGridSortEngine)
|
TFBDataSetSortEngine = class(TRxDBGridSortEngine)
|
||||||
|
protected
|
||||||
|
procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
|
||||||
|
function EnabledFooterRowsCalc:boolean;override;
|
||||||
public
|
public
|
||||||
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
||||||
procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
|
procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
|
||||||
@ -56,6 +59,34 @@ type
|
|||||||
implementation
|
implementation
|
||||||
uses FBCustomDataSet;
|
uses FBCustomDataSet;
|
||||||
|
|
||||||
|
type
|
||||||
|
THackFBDataSet = class(TFBDataSet);
|
||||||
|
THackRxColumnFooter = class(TRxColumnFooter);
|
||||||
|
|
||||||
|
procedure TFBDataSetSortEngine.UpdateFooterRows(ADataSet: TDataSet;
|
||||||
|
AGrid: TRxDBGrid);
|
||||||
|
var
|
||||||
|
i,j:integer;
|
||||||
|
Col:TRxColumn;
|
||||||
|
begin
|
||||||
|
if not Assigned(ADataSet) then exit;
|
||||||
|
|
||||||
|
for i:=0 to ADataSet.RecordCount-1 do
|
||||||
|
begin
|
||||||
|
for j:=0 to AGrid.Columns.Count-1 do
|
||||||
|
begin
|
||||||
|
Col:=TRxColumn(AGrid.Columns[j]);
|
||||||
|
if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
|
||||||
|
THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar( THackFBDataSet(ADataSet).GetAnyRecField(i, ADataSet.FieldByName(Col.Footer.FieldName)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TFBDataSetSortEngine.EnabledFooterRowsCalc: boolean;
|
||||||
|
begin
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TFBDataSetSortEngine.Sort(Field: TField; ADataSet: TDataSet;
|
procedure TFBDataSetSortEngine.Sort(Field: TField; ADataSet: TDataSet;
|
||||||
Asc: boolean; SortOptions: TRxSortEngineOptions);
|
Asc: boolean; SortOptions: TRxSortEngineOptions);
|
||||||
begin
|
begin
|
||||||
|
@ -12,12 +12,49 @@ type
|
|||||||
{ TZeosDataSetSortEngine }
|
{ TZeosDataSetSortEngine }
|
||||||
|
|
||||||
TZeosDataSetSortEngine = class(TRxDBGridSortEngine)
|
TZeosDataSetSortEngine = class(TRxDBGridSortEngine)
|
||||||
|
protected
|
||||||
|
procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
|
||||||
|
function EnabledFooterRowsCalc:boolean;override;
|
||||||
public
|
public
|
||||||
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
||||||
procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); override;
|
procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
uses ZDbcIntfs, ZVariant;
|
||||||
|
|
||||||
|
type
|
||||||
|
THackZeosDS = class(TZAbstractRODataset);
|
||||||
|
THackRxColumnFooter = class(TRxColumnFooter);
|
||||||
|
|
||||||
|
procedure TZeosDataSetSortEngine.UpdateFooterRows(ADataSet: TDataSet;
|
||||||
|
AGrid: TRxDBGrid);
|
||||||
|
var
|
||||||
|
RS:IZResultSet;
|
||||||
|
CurRow, i:integer;
|
||||||
|
Col:TRxColumn;
|
||||||
|
begin
|
||||||
|
if not Assigned(ADataSet) then exit;
|
||||||
|
RS:=THackZeosDS(ADataSet).ResultSet;
|
||||||
|
CurRow:=RS.GetRow;
|
||||||
|
RS.First;
|
||||||
|
while not RS.IsLast do
|
||||||
|
begin
|
||||||
|
for i:=0 to AGrid.Columns.Count-1 do
|
||||||
|
begin
|
||||||
|
Col:=TRxColumn(AGrid.Columns[i]);
|
||||||
|
if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
|
||||||
|
THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar(EncodeVariant(RS.GetValueByName(Col.FieldName)));
|
||||||
|
end;
|
||||||
|
RS.Next;
|
||||||
|
end;
|
||||||
|
RS.MoveAbsolute(CurRow);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TZeosDataSetSortEngine.EnabledFooterRowsCalc: boolean;
|
||||||
|
begin
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TZeosDataSetSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);
|
procedure TZeosDataSetSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);
|
||||||
begin
|
begin
|
||||||
|
@ -185,6 +185,10 @@ type
|
|||||||
TRxSortEngineOptions = set of TRxSortEngineOption;
|
TRxSortEngineOptions = set of TRxSortEngineOption;
|
||||||
|
|
||||||
TRxDBGridSortEngine = class
|
TRxDBGridSortEngine = class
|
||||||
|
protected
|
||||||
|
FGrid:TRxDBGrid;
|
||||||
|
procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);virtual; abstract;
|
||||||
|
function EnabledFooterRowsCalc:boolean;virtual;
|
||||||
public
|
public
|
||||||
procedure Sort(Field: TField; ADataSet: TDataSet; Asc: boolean; SortOptions: TRxSortEngineOptions); virtual; abstract;
|
procedure Sort(Field: TField; ADataSet: TDataSet; Asc: boolean; SortOptions: TRxSortEngineOptions); virtual; abstract;
|
||||||
procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); virtual;
|
procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); virtual;
|
||||||
@ -254,6 +258,8 @@ type
|
|||||||
function DeleteTestValue: boolean;
|
function DeleteTestValue: boolean;
|
||||||
function PostTestValue: boolean;
|
function PostTestValue: boolean;
|
||||||
function ErrorTestValue: boolean;
|
function ErrorTestValue: boolean;
|
||||||
|
protected
|
||||||
|
procedure UpdateTestValueFromVar(AValue:Variant);
|
||||||
public
|
public
|
||||||
constructor Create(Owner: TRxColumn);
|
constructor Create(Owner: TRxColumn);
|
||||||
property Owner: TRxColumn read FOwner;
|
property Owner: TRxColumn read FOwner;
|
||||||
@ -779,7 +785,7 @@ procedure RegisterRxDBGridSortEngine(RxDBGridSortEngineClass: TRxDBGridSortEngin
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses Math, rxdconst, rxstrutils, rxdbgrid_findunit, rxdbgrid_columsunit,
|
uses Math, rxdconst, rxstrutils, rxdbgrid_findunit, rxdbgrid_columsunit,
|
||||||
rxlookup, tooledit, LCLProc, rxfilterby, rxsortby;
|
rxlookup, tooledit, LCLProc, rxfilterby, rxsortby, variants;
|
||||||
|
|
||||||
const
|
const
|
||||||
EditorCommandStrs: array[0..10] of TIdentMapEntry =
|
EditorCommandStrs: array[0..10] of TIdentMapEntry =
|
||||||
@ -3691,6 +3697,16 @@ begin
|
|||||||
if not APresent then
|
if not APresent then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
|
if Assigned(FSortEngine) and (FSortEngine.EnabledFooterRowsCalc) then
|
||||||
|
begin
|
||||||
|
for i := 0 to Columns.Count - 1 do
|
||||||
|
TRxColumn(Columns[i]).Footer.ResetTestValue;
|
||||||
|
|
||||||
|
FSortEngine.UpdateFooterRows(DataSource.DataSet, Self);
|
||||||
|
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
Inc(FInProcessCalc);
|
Inc(FInProcessCalc);
|
||||||
DS := DataSource.DataSet;
|
DS := DataSource.DataSet;
|
||||||
;
|
;
|
||||||
@ -4888,6 +4904,36 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TRxColumnFooter.UpdateTestValueFromVar(AValue: Variant);
|
||||||
|
var
|
||||||
|
F: TField;
|
||||||
|
begin
|
||||||
|
if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
|
||||||
|
begin
|
||||||
|
F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FindField(FFieldName);
|
||||||
|
if (not VarIsEmpty(AValue)) and (AValue <> null) and Assigned(F) then
|
||||||
|
begin
|
||||||
|
if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
|
||||||
|
begin
|
||||||
|
case FValueType of
|
||||||
|
fvtMax: FTestValue := Max(FTestValue, AValue);
|
||||||
|
fvtMin: FTestValue := Min(FTestValue, AValue);
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
case FValueType of
|
||||||
|
fvtSum: FTestValue := FTestValue + AValue;
|
||||||
|
// fvtAvg:
|
||||||
|
fvtMax: FTestValue := Max(FTestValue, AValue);
|
||||||
|
fvtMin: FTestValue := Min(FTestValue, AValue);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
///!
|
///!
|
||||||
constructor TRxColumnFooter.Create(Owner: TRxColumn);
|
constructor TRxColumnFooter.Create(Owner: TRxColumn);
|
||||||
begin
|
begin
|
||||||
@ -4998,6 +5044,11 @@ end;
|
|||||||
|
|
||||||
{ TExDBGridSortEngine }
|
{ TExDBGridSortEngine }
|
||||||
|
|
||||||
|
function TRxDBGridSortEngine.EnabledFooterRowsCalc: boolean;
|
||||||
|
begin
|
||||||
|
Result:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TRxDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet;
|
procedure TRxDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet;
|
||||||
Asc: array of boolean; SortOptions: TRxSortEngineOptions);
|
Asc: array of boolean; SortOptions: TRxSortEngineOptions);
|
||||||
begin
|
begin
|
||||||
|
@ -150,6 +150,7 @@ type
|
|||||||
function GetRecNo: Integer; override;
|
function GetRecNo: Integer; override;
|
||||||
procedure SetRecNo(Value: Integer); override;
|
procedure SetRecNo(Value: Integer); override;
|
||||||
property Records[Index: Integer]: TMemoryRecord read GetMemoryRecord;
|
property Records[Index: Integer]: TMemoryRecord read GetMemoryRecord;
|
||||||
|
function GetAnyRecField(SrcRecNo:integer; AField:TField):variant;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -1323,6 +1324,41 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TRxMemoryData.GetAnyRecField(SrcRecNo: integer; AField: TField
|
||||||
|
): variant;
|
||||||
|
var
|
||||||
|
Data1: PChar;
|
||||||
|
I: Integer;
|
||||||
|
Item:TMemoryRecord;
|
||||||
|
begin
|
||||||
|
Item:=Records[SrcRecNo];
|
||||||
|
Data1 := FindFieldData(Item.Data, AField);
|
||||||
|
Inc(Data1); //Skip null flag
|
||||||
|
|
||||||
|
case AField.DataType of
|
||||||
|
ftString:Result := PChar(Data1);
|
||||||
|
ftSmallint:Result:=SmallInt(Data1^);
|
||||||
|
ftInteger,
|
||||||
|
ftDate,
|
||||||
|
ftTime,
|
||||||
|
ftAutoInc:Result:=Longint(Data1^);
|
||||||
|
ftWord:Result:=Word(Data1^);
|
||||||
|
ftBoolean:Result:=WordBool(Data1^);
|
||||||
|
ftFloat, ftCurrency:Result:=PDouble(Data1)^;
|
||||||
|
ftDateTime:Result:=PDateTime(Data1)^;
|
||||||
|
ftFixedChar:Result:=PChar(Data1);
|
||||||
|
ftWideString:Result:=PWideChar(Data1);
|
||||||
|
ftLargeint:Result:=Int64(Data1^);
|
||||||
|
ftVariant:
|
||||||
|
begin
|
||||||
|
Result := PVariant(Data1)^;
|
||||||
|
end;
|
||||||
|
ftGuid:Result:=PChar(Data1);
|
||||||
|
else
|
||||||
|
Result:=null;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TRxMemoryData.IsSequenced: Boolean;
|
function TRxMemoryData.IsSequenced: Boolean;
|
||||||
begin
|
begin
|
||||||
Result := not Filtered;
|
Result := not Filtered;
|
||||||
|
@ -43,6 +43,9 @@ type
|
|||||||
{ TRxMemoryDataSortEngine }
|
{ TRxMemoryDataSortEngine }
|
||||||
|
|
||||||
TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
|
TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
|
||||||
|
protected
|
||||||
|
procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
|
||||||
|
function EnabledFooterRowsCalc:boolean;override;
|
||||||
public
|
public
|
||||||
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
|
||||||
procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
|
procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
|
||||||
@ -51,6 +54,35 @@ type
|
|||||||
implementation
|
implementation
|
||||||
uses rxmemds;
|
uses rxmemds;
|
||||||
|
|
||||||
|
type
|
||||||
|
THackRxMemoryData = class(TRxMemoryData);
|
||||||
|
THackRxColumnFooter = class(TRxColumnFooter);
|
||||||
|
|
||||||
|
procedure TRxMemoryDataSortEngine.UpdateFooterRows(ADataSet: TDataSet;
|
||||||
|
AGrid: TRxDBGrid);
|
||||||
|
var
|
||||||
|
i, j:integer;
|
||||||
|
Col:TRxColumn;
|
||||||
|
begin
|
||||||
|
if not Assigned(ADataSet) then exit;
|
||||||
|
|
||||||
|
for j:=0 to ADataSet.RecordCount-1 do
|
||||||
|
begin
|
||||||
|
for i:=0 to AGrid.Columns.Count-1 do
|
||||||
|
begin
|
||||||
|
Col:=TRxColumn(AGrid.Columns[i]);
|
||||||
|
if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
|
||||||
|
THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar( THackRxMemoryData(ADataSet).GetAnyRecField(j, ADataSet.FieldByName(Col.Footer.FieldName)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TRxMemoryDataSortEngine.EnabledFooterRowsCalc: boolean;
|
||||||
|
begin
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet;
|
procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet;
|
||||||
Asc:boolean; SortOptions:TRxSortEngineOptions);
|
Asc:boolean; SortOptions:TRxSortEngineOptions);
|
||||||
begin
|
begin
|
||||||
|
Reference in New Issue
Block a user