QuickReportのDataSet

解決


take  2006-06-12 20:38:14  No: 22150  IP: 192.*.*.*

度々ですがよろしくおねがいします。

QuickReportで複数のマスタ作成画面からリスト物のレポートを動的に切り替えて出力したいと考えています。

QuickReport上に
TableとTitleBandを乗せておき
このTableをQuickReportのDataSetに設定
Table.TableNameは空白のままで…
各作業フォームから
procedure TForm***.ButtonClick;
begin
  //前処理
  QuickReport.Bands.HasDetail := True;
  QuickReport.DataSet.Close;
  QuickReport.Table.TableName := 'Mastar***.DB';
  with TQRDBText.Create(QuickReport) do
  begin
    Parent := QuickReport.Bands.DetailBand;
    Name := 'Code';
    Dataset := QuickReport.Table;
    DataField := 'Code';
    Size.Top  := 2;
    Size.Left := 10;
  end;
  with TQRDBText.Create(QuickReport) do
  begin
    Parent := QuickReport.Bands.DetailBand;
    Name := 'Name';
    Dataset := QuickReport.Table;
    DataField := 'Name';
    Size.Top  := 2;
    Size.Left := 25;
  end;

  //印刷
  QuickReport.Table.Active := True;
  QuickReport.Preview;
  //後処理
  QuickReport.Table.Active := False;
  QuickReport.Bands.HasDetail := False;
end;

大体こんな感じです。
レポートは初期生成のままです。

1回目の表示は上手く表示されるんですが、2回目別のデータベースを参照すると文字化けしたり、きちんとフィールドを参照できなくなったりします。
うまく、リセットする方法はないんでしょうか?
レポート自体を動的生成するしかないですか?

編集 削除
ナナ氏  2006-06-13 08:54:34  No: 22151  IP: 192.*.*.*

見たところコードと名称だけのようなので、単純に設計時に二つQRDBTextを配置しておいてDataSet・DataFieldの値を切り替えるのはダメなのでしょうか?
はずしていたらごめんなさい_(._.)_

編集 削除
take  2006-06-13 09:40:52  No: 22152  IP: 192.*.*.*

さらに3つめのTQxprとかの動的生成があったりするので、生成部分は呼び出し側によって変更してあります。
なので、解放とかはhasDetail := False;が楽かなぁと思ったんですが。

編集 削除
ナナ氏  2006-06-13 14:30:09  No: 22153  IP: 192.*.*.*

QRDBTextを動的生成でしたね、、失礼しました。
私の場合はそのような高度なことはしたことがないので設計時に必要な分だけ
配置しておきDataSet・DataField・Enabledを切り分けて使用していました。
Report自体も常に作成・廃棄しておりましたので今回の回答は間違っていますね。
失礼しました_(._.)_

編集 削除
take  2006-06-14 13:10:32  No: 22154  IP: 192.*.*.*

レポートの共有に断念しそうです。
ところで、生成廃棄は
QuickReport := TQuickReport.Create(self);



QuickReport.Free;
でされてるんですか?
試してみましたが、2度目の生成で既に存在するとエラーが出ました。

編集 削除
ナナ氏  2006-06-15 09:33:42  No: 22155  IP: 192.*.*.*

私の環境では上記の様な形でエラーは出ませんね。
念のためTry〜Finallyで破棄するのがいいのではないかと思います。

procedure TForm1.Button1Click(Sender: TObject);
begin
  QuickReport := TQuickReport.Create(self);

  try
    QuickReport.PreviewModal;
  finally
    QuickReport.Free;
  end;
end;

はずしていたらごめんなさい_(._.)_

編集 削除
ん?  2006-06-16 00:28:59  No: 22156  IP: 192.*.*.*

>  with TQRDBText.Create(QuickReport) do
>  begin
>    Parent := QuickReport.Bands.DetailBand;

勘違いでなのか、タイプミスなのか知りませんが・・・

これで生成されるTQRDBTextの所有者は、QuickReportであり、
DetailBandではありません。表示上、DetailBandにしているだけで、
HasDetail = False にすることで、DetailBandが亡くなっても
TQRDBTextのインスタンスは残ったままです。

もしかすると、DetailBand自身、消えていない可能性もあるかもしれません。

編集 削除
take  2006-06-16 20:01:04  No: 22157  IP: 192.*.*.*

やっぱり、hasBandを外しても解放されないんですか。
前に質問してBandを解放したら一緒に解放されるみたいなことを教えてもらったんで信じてみたんですが…
とりあえず、Report自体を生成廃棄する方向で制作することにしました。
ども、ありがとうございます。

編集 削除
ん?  2006-06-16 22:59:01  No: 22158  IP: 192.*.*.*

> やっぱり、hasBandを外しても解放されないんですか。

ちゃうちゃう!

> with TQRDBText.Create(QuickReport) do

開放したければ、これじゃなくて、

with TQRDBText.Create(QuickReport.Bands.DetailBand) do

Owner と Parent の違い理解して。

編集 削除