fastreport 中的非重复计数
Distinct Count in fastreport
有谁知道如何在fastreport中进行不同的计数?
例子
我有报告:
Name sex
João m
João m
Maria f
在正常计数中,结果将是 3,但我想要一个只包含不重复字段名称的行数的结果。
在这种情况下,结果将是 2。
谁能帮我?那只是一个例子。
我无法在 SQL 中进行分组,因为我有多个字段。
您可以在没有 GROUP BY
的情况下在 Firebird 中执行此操作,因为:
DECLARE @T TABLE (ID INT IDENTITY (1,1), Name NVARCHAR(25) , Sex CHAR(1));
INSERT INTO @T VALUES
('Sami','M'),
('Sami','M'),
('Maria','F');
SELECT DISTINCT Name , Sex FROM @T
您也可以创建一个 View
,然后在您的报告中使用它。
如果您确实需要在 FastReport
中执行此操作,则必须使用 GroupHeader
和 GroupFooter
。
How ?
您必须在 OnBeforePrint
事件中编写脚本。
procedure OnGroupHeader1.OnBeforePrint;
通过双击对象检查器中的事件来创建这个。
我不擅长使用FastReport
,但我在FastReport
的官方论坛上找到了this page。
我认为您可以根据您的场景修改示例(请注意,语法可能需要一些调整)。
乐队:
GroupHeader1 <Sex>
MasterData1 [Name, Sex, ...]
GroupFooter1 [GetDistinctCount]
脚本(仅使用按字段排序的数据集进行计数):
var
LastValue : string;
DistinctCount : integer;
//create this event by double-clicking the event from the Object Inspector
procedure OnGroupHeader1.OnBeforePrint;
begin
if LastValue <> (<Datasetname."Sex">) then
Inc(DinstinctCount);
LastValue := <Datasetname."Sex">
end;
function GetDistinctCount: string;
begin
Result := IntToStr(DistinctCount);
end;
基本思想是每次字段值更改时 DistinctCount
变量都会递增。
脚本(应该也适用于未排序的数据集):
var
FoundValues : array of string;
(* !!IMPORTANT!!
You need to initialize FoundValues array before to start counting: *)
SetLength(FoundValues, 0);
function IndexOf(AArray : array of string; const AValue : string) : integer;
begin
Result := 0;
while(Result < Length(AArray)) do
begin
if(AArray[Result] = AValue) then
Exit;
Inc(Result);
end;
Result := -1;
end;
//create this event by double-clicking the event from the Object Inspector
procedure OnGroupHeader1.OnBeforePrint;
begin
if(IndexOf(FoundValues, <Datasetname."Sex">) = -1) then
begin
SetLength(FoundValues, Length(FoundValues) + 1);
FoundValues[Length(FoundValues) - 1] := <Datasetname."Sex">;
end;
end;
function GetDistinctCount: string;
begin
Result := IntToStr(Length(FoundValues));
end;
基本思想是将找到的每个不同值添加到 FoundValues
数组。
有谁知道如何在fastreport中进行不同的计数? 例子 我有报告:
Name sex
João m
João m
Maria f
在正常计数中,结果将是 3,但我想要一个只包含不重复字段名称的行数的结果。 在这种情况下,结果将是 2。 谁能帮我?那只是一个例子。 我无法在 SQL 中进行分组,因为我有多个字段。
您可以在没有 GROUP BY
的情况下在 Firebird 中执行此操作,因为:
DECLARE @T TABLE (ID INT IDENTITY (1,1), Name NVARCHAR(25) , Sex CHAR(1));
INSERT INTO @T VALUES
('Sami','M'),
('Sami','M'),
('Maria','F');
SELECT DISTINCT Name , Sex FROM @T
您也可以创建一个 View
,然后在您的报告中使用它。
如果您确实需要在 FastReport
中执行此操作,则必须使用 GroupHeader
和 GroupFooter
。
How ?
您必须在 OnBeforePrint
事件中编写脚本。
procedure OnGroupHeader1.OnBeforePrint;
通过双击对象检查器中的事件来创建这个。
我不擅长使用FastReport
,但我在FastReport
的官方论坛上找到了this page。
我认为您可以根据您的场景修改示例(请注意,语法可能需要一些调整)。
乐队:
GroupHeader1 <Sex>
MasterData1 [Name, Sex, ...]
GroupFooter1 [GetDistinctCount]
脚本(仅使用按字段排序的数据集进行计数):
var
LastValue : string;
DistinctCount : integer;
//create this event by double-clicking the event from the Object Inspector
procedure OnGroupHeader1.OnBeforePrint;
begin
if LastValue <> (<Datasetname."Sex">) then
Inc(DinstinctCount);
LastValue := <Datasetname."Sex">
end;
function GetDistinctCount: string;
begin
Result := IntToStr(DistinctCount);
end;
基本思想是每次字段值更改时 DistinctCount
变量都会递增。
脚本(应该也适用于未排序的数据集):
var
FoundValues : array of string;
(* !!IMPORTANT!!
You need to initialize FoundValues array before to start counting: *)
SetLength(FoundValues, 0);
function IndexOf(AArray : array of string; const AValue : string) : integer;
begin
Result := 0;
while(Result < Length(AArray)) do
begin
if(AArray[Result] = AValue) then
Exit;
Inc(Result);
end;
Result := -1;
end;
//create this event by double-clicking the event from the Object Inspector
procedure OnGroupHeader1.OnBeforePrint;
begin
if(IndexOf(FoundValues, <Datasetname."Sex">) = -1) then
begin
SetLength(FoundValues, Length(FoundValues) + 1);
FoundValues[Length(FoundValues) - 1] := <Datasetname."Sex">;
end;
end;
function GetDistinctCount: string;
begin
Result := IntToStr(Length(FoundValues));
end;
基本思想是将找到的每个不同值添加到 FoundValues
数组。