fastreportで明確なカウントを行う方法を知っている人はいますか? 例 私はレポートがあります。通常のカウントでfastreportでの固有のカウント
Name sex
João m
João m
Maria f
を、結果は3になりますが、私は、フィールド名を繰り返さない行数だけを取るものをしたいです。 この場合、結果は2になります。 誰か助けてくれますか?これは単なる例です。 複数のフィールドがあるので、SQLでグループを実行することはできません。
fastreportで明確なカウントを行う方法を知っている人はいますか? 例 私はレポートがあります。通常のカウントでfastreportでの固有のカウント
Name sex
João m
João m
Maria f
を、結果は3になりますが、私は、フィールド名を繰り返さない行数だけを取るものをしたいです。 この場合、結果は2になります。 誰か助けてくれますか?これは単なる例です。 複数のフィールドがあるので、SQLでグループを実行することはできません。
私は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
配列に追加されることです。
それはそれがうまく働いたように...しかし、それは私が叫んでいる項目でソートされている場合のみ。それは厄介だ場合、それは間違った方法で来て、来て続けて... 例: 名のセックス ジョアンmの ジョアンmの マリア F数= 2の結果が正しい 名前セックス ジョアンです ジョアンmの 結果は3 ...間違って – sounobre
@sounobreであるFメートル マリア:私はソートされていないデータセットでも – ExDev
はsetLength(FoundValues、0)の作品なければならないメソッドを追加することで答えを更新しました。 setlengthの後にエラーが表示されています。 ':'期待値 – sounobre
あなたはよう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
で実際に行う必要がある場合は、GroupHeader
とGroupFooter
を使用する必要があります。
How ?
あなたはOnBeforePrint
イベントでスクリプトを書く必要があります。
procedure OnGroupHeader1.OnBeforePrint;
オブジェクトインスペクタでイベントをダブルクリックして作成します。
あなたはSQL Serverを持っていますか? – Sami
いいえ...ファイアバード... – sounobre