2017-08-17 12 views
2

fastreportで明確なカウントを行う方法を知っている人はいますか? 例 私はレポートがあります。通常のカウントでfastreportでの固有のカウント

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

を、結果は3になりますが、私は、フィールド名を繰り返さない行数だけを取るものをしたいです。 この場合、結果は2になります。 誰か助けてくれますか?これは単なる例です。 複数のフィールドがあるので、SQLでグループを実行することはできません。

+0

あなたはSQL Serverを持っていますか? – Sami

+0

いいえ...ファイアバード... – sounobre

答えて

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配列に追加されることです。

+0

それはそれがうまく働いたように...しかし、それは私が叫んでいる項目でソートされている場合のみ。それは厄介だ場合、それは間違った方法で来て、来て続けて... 例: 名のセックス ジョアンmの ジョアンmの マリア F数= 2の結果が正しい 名前セックス ジョアンです ジョアンmの 結果は3 ...間違って – sounobre

+0

@sounobreであるFメートル マリア:私はソートされていないデータセットでも – ExDev

+0

はsetLength(FoundValues、0)の作品なければならないメソッドを追加することで答えを更新しました。 setlengthの後にエラーが表示されています。 ':'期待値 – sounobre

0

あなたはようGROUP BYなしFirebirdの中でそれを行うことができます:あなたはまた、Viewを作成し、レポートにそれを使用することができます

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 

FastReportで実際に行う必要がある場合は、GroupHeaderGroupFooterを使用する必要があります。

How ?

あなたはOnBeforePrintイベントでスクリプトを書く必要があります。

procedure OnGroupHeader1.OnBeforePrint; 

オブジェクトインスペクタでイベントをダブルクリックして作成します。

+0

これはどのように高速レポートですか?私は迷っています... – sounobre

+0

スクリプトを書く必要がある場合は、 'GroupHeader'を使う必要はなく、値を表示できるコントロールです。しかし、それは過度のことです。私は単純な方法があると確信しています。 – Victoria

+0

このスクリプトはどのように見えますか? – sounobre