SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

Accessのデータベースを帳票化する-クエリ結果によって値を入れ替える

クエリ結果によって帳票のタイトルを入れ替える

  • X ポスト
  • このエントリーをはてなブックマークに追加

前回に引き続き、PowerTools True WinReports for .NETのC1Reportコンポーネントを使ってAccessのデータから帳票を作成するアプリケーションを作ります。今回は、コードからレポートのヘッダーを操作し、抽出結果ごとにレポートタイトルの背景色や説明文の追加などを行えるようにします。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 前回に引き続き、PowerTools True WinReports for .NETのC1Reportコンポーネントを使ってAccessのデータから帳票を作成するアプリケーションを作ります。

 今回は、コードからレポートのヘッダーを操作し、抽出結果ごとにレポートタイトルの背景色や説明文の追加などを行えるようにします。

今までのヘッダー
今までのヘッダー
変更したヘッダー。クエリを実行した結果ごとに色と説明文を変える
変更したヘッダー。クエリを実行した結果ごとに色と説明文を変える

過去の記事

  1. Accessのデータベースを帳票化する
  2. Accessのデータベースを帳票化する-パラメータクエリの使用

対象読者

 Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。

プログラム実行時の注意事項

 本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下の3つのファイルが必要になります。

  • C1.C1Preview.2.dll…C1PrintDocumentコントロール(.NET Framework 2.0用)
  • C1.Win.C1Preview.2.dll…C1PrintPreviewコントロール(.NET Framework 2.0用)
  • C1.Win.C1Report.2.dll…C1Reportコントロール(.NET Framework 2.0用)

 これらのファイルを、実行プログラムと同じフォルダに格納します。なお、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

 また、サンプルデータベース「guiter.mdb」をドライブCのルートにおいてください。

コンポーネントのインストール

 はじめてPowerTools True WinReports for .NETおよびPowerTools Preview for .NETを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。

 製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。

 有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools True WinReports for .NETおよびPowerTools Preview for .NETを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」です。

「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」を追加する
「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」を追加する

GUIの作成

 今回は、GUIの作成・修正はありません。前回作成したプログラムに手を加えて、機能を拡張していきます。

GUIに変更はない
 GUIに変更はない

Fieldオブジェクトの働き

 このプログラムでは、パラメータクエリを実行した結果をレポートにする際に、メーカー名によってレポートのヘッダーの背景色と文字色を変えるようにします。これは、ヘッダーの部分に「Fields」というオブジェクト(Labelのようなオブジェクト)を組み込み、そこに文字列の設定や背景色の設定を行います。

 このFieldはレポート内にいくつも組み込むことができ、表示位置の指定や重なりの順序を指定できます。

 そこで、ヘッダー部にそれぞれのメーカーの簡単な説明文を表示するようにします。説明文はコード内に記述しそれを呼び出します。

ヘッダー部のFieldオブジェクト。2つのFieldを重ねて作成する
ヘッダー部のFieldオブジェクト。2つのFieldを重ねて作成する

タイトルの作成

 最初にレポートのタイトルを作成します。

 前回作成した「抽出実行」ボタンのClickイベントハンドラの、RecordSourceプロパティにSQL文字列を代入したコードの、次の行にコードを組み込んでいきます。

説明文の作成

 まず、メーカー説明用の文章(ここでは便宜上説明文は3つだけにしました)を作り、配列に格納しておきます。

Visual Basic
Dim exp(2) As String

exp(0) = "アメリカの老舗ギターブランド...愛されてきました。"
exp(1) = "日本を代表するギターメーカー...揃っています。"
exp(2) = "ポールリードスミスは、Gibson、...なりました。"
C#
String[] exp = new String[3];

exp[0] = "アメリカの老舗ギターブランド...愛されてきました。";
exp[1] = "日本を代表するギターメーカー...揃っています。";
exp[2] = "ポールリードスミスは、Gibson、...なりました。";

古いタイトル用Fieldの削除

 新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成します。

 レポートには、既に「製品情報」というFieldが組み込まれています。これは、C1Reportコンポーネントのレポートデザイナでレポートを作成したときに既に組み込まれています。

 そこで、まずこのFieldを削除し、次にメーカー名付きの新しいタイトルを組み込みます。

「製品情報」というFieldが組み込まれているのでこれを削除する
 「製品情報」というFieldが組み込まれているのでこれを削除する

 削除はデザイナで行っても構いませんが、このプログラムではパラメータクエリを実行するたびにタイトルを作り直しますので、コードで削除します。タイトル用のFieldは、C1Reportコンポーネントの、Sectionオブジェクトの下にあります。このオブジェクトは、Sectionsコレクションになっているので、Sectionsプロパティの引数に「SectionTypeEnum.Header」を指定することで、ヘッダー部にあるFieldsコレクションを参照できるようになります。

 Fieldの削除は、FieldsコレクションのRemoveメソッドを実行します。引数は、Fieldオブジェクトのインデックス番号またはオブジェクト名です。ヘッダー部のFieldオブジェクトは、この時点では1つしかありませんから、「0」を指定してRemoveメソッドを実行します。

 なお、C#ではSectionオブジェクトを一度オブジェクト変数に格納し、そこからFieldsプロパティにアクセスします。

Visual Basic
Dim f As Field

With Me.C1Report1.Sections(SectionTypeEnum.Header)
    .Fields.Remove(0)
C#
Field f ;
Section s;
s = c1Report1.Sections[SectionTypeEnum.Header];
s.Fields.Remove(0);

新しいタイトル用Fieldの作成

 次に、新しいタイトル用Fieldを作成します。これは、FieldsコレクションのAddメソッドを実行します。引数は、オブジェクト名、表示する文字列、表示位置、サイズの6つです。表示する文字は、「製品情報 - 」とComboBoxで選択されたメーカー名を組み合わせます。

 表示位置は、Fieldを配置する左端と上端の位置で、TWIP単位で指定します。サイズはFieldの幅と高さで、これもTWIP単位で指定します。

 作成したら、AddメソッドはFieldオブジェクトへの参照を返してきますので、これをオブジェクト変数に格納し、文字のサイズ、太字、文字色を設定します。

Visual Basic
f = .Fields.Add("title", "製品情報 - " & _
             Me.ComboBox1.SelectedItem, 100, 100, 8000, 1500)
f.Font.Size = 24
f.Font.Bold = True
f.ForeColor = Color.Beige
C#
f = s.Fields.Add("title", "製品情報 - " +
              ComboBox1.SelectedItem, 100, 100, 8000, 1500);
    f.Font.Size = 24;
    f.Font.Bold = true;
    f.ForeColor = Color.Beige;

説明用のFieldオブジェクトの削除

 既に説明用のFieldオブジェクトがあれば、これを削除します。

 もし、古い説明文が残っていたままだと、その上に新しいFieldが重なってしまいます。Fieldはデフォルトでは背景色が透明で文字だけが表示されるようになっているので、2つの文章が重なって表示されてしまうため、古い説明文のFieldを削除します。

 ただし、初めてプログラムを実行したときは、古い説明文のFieldはありませんから、FieldsコレクションのCountプロパティでFieldsオブジェクトの数をチェックしてから実行します。

Visual Basic
If .Fields.Count >= 2 Then
    .Fields.Remove("exp")
End If
C#
if(s.Fields.Count >= 2){
    s.Fields.Remove("exp");
}

 これで、パラメータクエリを実行するたびに、選択されたメーカー名のついたタイトルが作成され表示されるようになります。

説明用Fieldの作成

 今度は、メーカの説明文を表示するFieldを作成し、タイトル用Fieldの上に重ねて配置します(なお、ここでは便宜上3つだけ作成します)。

 この処理は、ComboBoxで選択されたメーカー名で処理を分岐するようにします。

Fieldの追加

 まず、タイトル用Fieldの高さと背景色を変更します。

 そして、タイトル用Fieldと同じようにFieldsコレクションのAddメソッドを実行します。引数の文字列は配列から取得します。

Visual Basic
Select Case Me.ComboBox1.SelectedIndex
    Case 0
        With Me.C1Report1.Sections(SectionTypeEnum.Header)
            .Height = 1000
            .Visible = True
            .BackColor = Color.BlueViolet

            f = .Fields.Add("exp", exp(0), 100, 800, 8000, 1500)
            f.Font.Size = 12
            f.ForeColor = Color.Gold
        End With
C#
switch(ComboBox1.SelectedIndex){
    case 0:
        s.Height = 1000;
        s.Visible = true;
        s.BackColor = Color.BlueViolet;
        f = s.Fields.Add("exp", exp[0], 100, 800, 8000, 1500);
        f.Font.Size = 12;
        f.ForeColor = Color.Gold;
        break;

 これで、1つ目のメーカー説明文が出来上がりました。同じようなコードを、他のメーカー分作成します。

タイトル文字の色を入れ替える

 なお、case 2とcase 3では、見栄えをよくするためだけですが、タイトルの文字色を入れ替えておきます。

 既に作成したFieldオブジェクトを参照するには、インデックス番号以外に、Addメソッドで付けたオブジェクト名を使って参照することもできます。

 タイトル用Fieldは、Addメソッドで「title」という名前をつけているので、これを使って参照します。

Visual Basic
.Fields("title").ForeColor = Color.Blue
C#
s.Fields["title"].ForeColor = Color.LimeGreen;

 これで、3種類のタイトルが出来上がります。

それぞれクエリの結果ごとにタイトルを入れ替える
それぞれクエリの結果ごとにタイトルを入れ替える

まとめ

 クエリの結果によってレポートの形式を切り替えることができるようになると、アプリケーションの魅力もぐっとアップします。

 今回は、説明文はコードの中に埋め込みましたが、説明文をデータベースやテキストファイルに格納しそこから取り出せるようにすれば、もっと便利な機能になります。

 ヘッダーを例にコードの説明をしましたが、Fieldはレポート内のいろいろなところに組み込め、それぞれセクションごとに分けて操作できるので、プログラム実行時にいろいろなレポートが作成できるようになります。今回は、Fieldを作り直して入れ替えるようにしましたが、すでにあるFieldのプロパティを操作してコンテンツを入れ替えるようにすることもできます。

 このFieldをうまく使うと、見栄えの良いレポートを作り出すことができます。

コード全文

Visual Basic
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Dim sqlstr As String

  sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " & _
             "製品一覧.カラー FROM(製品一覧)" & _
             " WHERE ((製品一覧.メーカー)='" & Me.ComboBox1.Text & "');"

  Me.C1Report1.DataSource.RecordSource = sqlstr

  'メーカーごとの説明文を作成-ここでは便宜上3つだけ作成
  Dim exp(2) As String

  exp(0) = "アメリカの老舗ギターブランド。エレキギターでは、" & _
           "レスポール、SG、アコースティックギターではハミング" & _
           "バード、ホロウ・ボディではES-335が代表的なギター。" & _
           "レスポールは、レッドツエッペリンのジミーペイジ、B'sの" & _
           "松本など数多くのプレーヤーに愛されてきました。"

  exp(1) = "日本を代表するギターメーカー。布袋寅泰やX-Japanの" & _
           "故Hide、L'Arc~en~Cielのkenなど、国内トップアー" & _
           "ティストが使用しているブランド。入門者用からプロフェッ" & _
           "ショナル用まで幅広いラインアップが揃っています。"

  exp(2) = "ポールリードスミスは、Gibson、Fenderに次ぐ第3のギター" & _
           "メーカーとして台頭してきました。" & _
           "高級な材料をふんだんに使用し、" & _
           "フレットにバードインレイをはめ込んだり、" & _
           "10TOPと呼ばれる木目の板を使うなど、見た目も華麗に" & _
           "作っていることが大きな特徴です。カルロス・サンタナが" & _
           "使用したことで世界的に有名になりました。"

  ' レポートヘッダにフィールドを追加します。
  Dim f As Field

  With Me.C1Report1.Sections(SectionTypeEnum.Header)

      '今あるヘッダーのFieldオブジェクトをコレクションから削除
      .Fields.Remove(0)

      '新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成
      f = .Fields.Add("title", "製品情報 - " & _
                      Me.ComboBox1.SelectedItem, 100, 100, 8000, 1500)
      f.Font.Size = 24
      f.Font.Bold = True
      f.ForeColor = Color.Beige

      'すでに説明用のFieldオブジェクトがあれば削除する
      If .Fields.Count >= 2 Then
          .Fields.Remove("exp")
      End If
  End With

  'ComboBoxで選択されたメーカーごとに説明文を作成
  '-ここでは便宜上3つだけ作成
  Select Case Me.ComboBox1.SelectedIndex
      Case 0

          'ヘッダー「製品情報」の背景色とサイズを変更
          With Me.C1Report1.Sections(SectionTypeEnum.Header)
              .Height = 1000
              .Visible = True
              .BackColor = Color.BlueViolet

              '説明文用のフィールドの追加
              f = .Fields.Add("exp", exp(0), 100, 800, 8000, 1500)
              f.Font.Size = 12
              f.ForeColor = Color.Gold
          End With

      Case 1
          With Me.C1Report1.Sections(SectionTypeEnum.Header)
              .Height = 1500
              .Visible = True
              .BackColor = Color.PeachPuff

              '説明文用のフィールドの追加
              f = .Fields.Add("exp", exp(1), 100, 800, 8000, 1500)
              f.Font.Size = 12
              f.ForeColor = Color.Olive

              'タイトル文字の色を入れ替える
              .Fields("title").ForeColor = Color.Blue
          End With

      Case 2
          With Me.C1Report1.Sections(SectionTypeEnum.Header)
              .Height = 1500
              .Visible = True
              .BackColor = Color.Chocolate

              '説明文用のフィールドの追加
              f = .Fields.Add("exp", exp(2), 100, 800, 8000, 1500)
              f.Font.Size = 12
              f.ForeColor = Color.Moccasin

              'タイトル文字の色を入れ替える
              .Fields("title").ForeColor = Color.LimeGreen
          End With

      Case Else
          With Me.C1Report1.Sections(SectionTypeEnum.Header)
              .Height = 800
              .BackColor = Color.DarkSeaGreen
               '説明文用のフィールドの追加
              f = .Fields.Add("exp", "作業中・・・", 100, 800, _
                              8000, 1500)
          End With
  End Select

  Me.C1PrintPreviewControl1.Document = Me.C1Report1.Document
  Me.C1PrintPreviewControl1.Invalidate()
End Sub
C#
private void button2_Click(object sender, EventArgs e)
{
  String sqlstr;

  sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " +
           "製品一覧.カラー FROM(製品一覧)" +
           " WHERE ((製品一覧.メーカー)='" + ComboBox1.Text + "');";

  c1Report1.DataSource.RecordSource = sqlstr;

  //メーカーごとの説明文を作成-ここでは便宜上3つだけ作成
  String[] exp = new String[3];

  exp[0] = "アメリカの老舗ギターブランド。エレキギターでは、" +
           "レスポール、SG、アコースティックギターではハミング" +
           "バード、ホロウ・ボディではES-335が代表的なギター。" +
           "レスポールは、レッドツエッペリンのジミーペイジ、B//sの" +
           "松本など数多くのプレーヤーに愛されてきました。";

  exp[1] = "日本を代表するギターメーカー。布袋寅泰やX-Japanの" +
           "故Hide、L//Arc~en~Cielのkenなど、国内トップアー" +
           "ティストが使用しているブランド。入門者用からプロフェッ" +
           "ショナル用まで幅広いラインアップが揃っています。";

  exp[2] = "ポールリードスミスは、Gibson、Fenderに次ぐ第3のギター" +
           "メーカーとして台頭してきました。高級な材料をふんだんに" +
           "使用し、フレットにバードインレイをはめ込んだり、" +
           "10TOPと呼ばれる木目の板を使うなど、見た目も華麗に" +
           "作っていることが大きな特徴です。カルロス・サンタナが" +
           "使用したことで世界的に有名になりました。";

  // レポートヘッダにフィールドを追加します。
  Field f ;

  Section s;
  s = c1Report1.Sections[SectionTypeEnum.Header];

  //今あるヘッダーのFieldオブジェクトをコレクションから削除
  s.Fields.Remove(0);

  //新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成
  f = s.Fields.Add("title", "製品情報 - " +
                  ComboBox1.SelectedItem, 100, 100, 8000, 1500);
  f.Font.Size = 24;
  f.Font.Bold = true;
  f.ForeColor = Color.Beige;

  //すでに説明用のFieldオブジェクトがあれば削除する
  if(s.Fields.Count >= 2){
      s.Fields.Remove("exp");
  }
        
  //ComboBoxで選択されたメーカーごとに説明文を作成
  //-ここでは便宜上3つだけ作成
  switch(ComboBox1.SelectedIndex){
       case 0:
           //ヘッダー「製品情報」の背景色とサイズを変更
           s.Height = 1000;
           s.Visible = true;
           s.BackColor = Color.BlueViolet;

           //説明文用のフィールドの追加
           f = s.Fields.Add("exp", exp[0], 100, 800, 8000, 1500);
           f.Font.Size = 12;
           f.ForeColor = Color.Gold;
           break;

       case 1:
           s.Height = 1500;
           s.Visible = true;
           s.BackColor = Color.PeachPuff;

           //説明文用のフィールドの追加
           f = s.Fields.Add("exp", exp[1], 100, 800, 8000, 1500);
           f.Font.Size = 12;
           f.ForeColor = Color.Olive;

            //タイトル文字の色を入れ替える
             s.Fields["title"].ForeColor = Color.Blue;
           break;

       case 2:
           s.Height = 1500;
           s.Visible = true;
           s.BackColor = Color.Chocolate;

           //説明文用のフィールドの追加
           f = s.Fields.Add("exp", exp[2], 100, 800, 8000, 1500);
           f.Font.Size = 12;
           f.ForeColor = Color.Moccasin;

           //タイトル文字の色を入れ替える
           s.Fields["title"].ForeColor = Color.LimeGreen;
           break;

       default:
           s.Height = 800;
           s.BackColor = Color.DarkSeaGreen;

           //説明文用のフィールドの追加
           f = s.Fields.Add("exp", "作業中・・・", 100, 800, 
                            8000, 1500);
           break;
       }

  c1PrintPreviewControl1.Document = c1Report1.Document;
  c1PrintPreviewControl1.Invalidate();
}

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1815 2008/06/24 15:07

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング