6

会社から、delphiで記述された特定のアプリケーションのレポート機能を更新し、代わりにFastReportsを使用するためにクイックレポートを使用するように依頼されました。

現在の実装では、データベースからすべてのデータを取得し、レポートに必要なデータを整理および計算するために多くの作業を行い、これらすべてをいくつかの異なるオブジェクトに保存します。次に、クイックレポートのOnNeedDataイベントを使用して、データがなくなるまでバンドを埋めます(MoreData = falseを設定することで示されます)。

私が抱えている問題は、Fast Reportsが、私が持っていない実際のデータソースに接続するためのバンドを必要としているようです。また、fastReportsにはOnNeedDataのようなイベントがないようです。

データバンドの値をコードに入力し、バンドをデータセットに接続せずにすべてのデータが印刷されるまで、データバンドを再度印刷する方法はありますか?

この質問があいまいであることをお詫び申し上げます。レポート作成ソフトウェアは非常に新しいので、どこに行き、何を見るべきかについての提案をいただければ幸いです。

4

5 に答える 5

7

高速レポートは、_TFrxDataSetから派生する中間オブジェクトを使用して、印刷するデータをレポートエンジンに接続します。

プログラム自体が管理するデータソースにレポートを接続するには、TfrxUserDataSetコンポーネントを使用します。これにより、レポート内のデータセットを確認できますが、Fields(TStrings)プロパティで列名を手動で指定し、値を管理および提供します。次のイベントのイベントハンドラーをプログラムで作成します。

  • OnCheckEOFは機能的にはOnNeedDataと同等です。印刷するものがない場合は、EOFvarパラメーターをtrueに設定します。
  • OnFirstは、データの検索を開始するために必要なことをすべて実行します。
  • OnGetValueおよびOnNewGetValue は、現在の行の異なる列のそれぞれに値を提供します
  • OnNextOnPriorは、現在の行を1つ次または1つ前の位置に移動します。

ご覧のとおり、行/列の概念(DataSet)はレポートにデータを提供するために使用されますが、計算結果(リスト、配列、またはその他のオブジェクト)を格納するために使用する任意の構造からデータを取得できます。 / structure / fileなど)

レポート内で、バンドをこの論理データセットにリンクし、標準コンポーネントを使用してこのデータセットの列を出力します。

計算後にメモリ内のDataSetなど、すでにDataSetにデータがある場合は、TfrxDBDatasetを使用して、レポートをそのデータソースに直接バインドすることをお勧めします。

于 2012-12-17T06:15:17.960 に答える
2

TfrxUserDataSetを使用できます。フォルダ「demos」の下に「printstringlist」という名前のデモがあります。

于 2012-12-17T04:40:34.837 に答える
2

私たちのプロジェクトでは、TfrxCustomQueryから継承された独自のクラスを実装しました。この新しいクエリクラスは、SQLステートメントをアプリケーションの内部クエリエンジンにリダイレクトするだけです。この新しいクラスをFastReportパレットに登録し(FRバージョン3および4ではfrxDsgnIntf​​.frxObjects.RegisterObject *を使用)、TfrxADOQueryやその他の組み込みデータセットクラスの代わりに、すべてのレポートテンプレートで使用されるようになりました。

于 2012-12-17T06:29:26.943 に答える
1

別の方法は次のとおりです。

私はFastReportを何年も使用しています。私は時々同じような状況に遭遇します。オフラインの表形式のレポートには、メモリ内のデータセットを使用します。私はずっと前にDevExpressを購入したので、TdxMemDataを持っています。ただし、それがなくても、TClientDatasetコンポーネントを使用して満足するはずです。

その上、TfrxUserDatasetは、オブジェクトのリストを表示するときに使用する代替手段です。

于 2012-12-17T07:17:47.933 に答える
0

このようにする可能性はありますが、遅いですが、

コード:-

var
  FRX: TfrxReport;
procedure NewPage;
begin
  MyPage := TfrxReportPage.Create(FRX);
  MyPage.CreateUniqueName;
  MyPage.PaperSize := DMPAPER_A4;
end;
procedure ...(AText: string);
var
  frMemo : TfrxMemoView;
begin
  frMemo := TfrxMemoView.Create(MyPage);
  frMemo.CreateUniqueName;
  frMemo.Text := AText;
end;

よろしく
ハーマン

于 2015-01-31T10:09:32.350 に答える