有谁知道如何在fastreport中明确计算? 例 我有报告:
Name sex
João m
João m
Maria f
在正常计数中,结果将是3,但我想要一个只占用不重复字段名称的行数。 在这种情况下,结果将是2。 谁能帮我?这只是一个例子。 我不能在SQL中进行分组,因为我有几个字段。
答案 0 :(得分:1)
我不熟练使用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
数组中。
答案 1 :(得分:0)
您可以在没有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
。
怎么样?
您必须在OnBeforePrint
事件中编写脚本。
procedure OnGroupHeader1.OnBeforePrint;
通过在对象检查器中双击事件来创建这个。