fastreport中的明显计数

时间:2017-08-17 12:30:06

标签: delphi fastreport

有谁知道如何在fastreport中明确计算? 例 我有报告:

 Name   sex
 João    m
 João    m
 Maria   f

在正常计数中,结果将是3,但我想要一个只占用不重复字段名称的行数。 在这种情况下,结果将是2。 谁能帮我?这只是一个例子。 我不能在SQL中进行分组,因为我有几个字段。

2 个答案:

答案 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中执行此操作,则必须使用GroupHeaderGroupFooter

  

怎么样?

您必须在OnBeforePrint事件中编写脚本。

procedure OnGroupHeader1.OnBeforePrint; 

通过在对象检查器中双击事件来创建这个。