スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

レポートの出力指示

レポートの元になっているテーブルのデータを無条件で全て出力する場合には、レポートを開くメソッドを組み込んだボタンをメニューに貼り付ければ終わりですが、大抵は何かしらの条件で抽出したいと思います。

その時はレポートの出力指示画面を用意します。そこで、様々な抽出条件を指定したり、場合によっては並び替え方法とか、プレビューするか実際に印刷するかの判断をさせたりもします。

ここでどんな条件で抽出したいかを決めていくのがまさに仕様決めでユーザーと綿密に決める必要があります。例えば今回は以下のようにデザインしました。抽出条件は以下のような意味を持たせます。

生徒番号:生徒番号のFROM~TOの範囲指定にします。何も入力しなければ、条件を指定しなかったと見なし、全ての生徒番号が対象になります。FROMのみ入力すれば、その番号以降全て、TOのみ入力すれば、その番号以前全てを対象とします。同じ番号を入力すればその番号のみが対象となります。
生徒姓かな:前方一致のワイルド検索とします。つまり、先頭から見て入力したかなが一致し、それ以降は何でもよしとします。例えば「こん」と入力すれば「こんの」でも「こんどう」でも対象とされます。ここでも何も入力しなければ全てが対象となります。
入学年月日:生徒番号と同様、入学年月日のFROM~TOの範囲指定にします。

尚、上記3つの条件を同時に入力した場合は、AND条件となります。逆に条件を何も入力しなければ全てのレコードが対象となるわけです。

 指示画面デザイン

この指示画面のプロパティを見てみましょう。通常の入力画面とは違い、レコードソースのない非連結フォームとします。メニューやこういった条件指示画面はテーブルと関連するわけではないので、非連結とします。

指示画面のプロパティ  

ここでのポイントは境界線スタイルです。「ダイアログ」とはWINDOWSの所謂ダイアログボックスのイメージです。つまり、常に前面に表示されていて、このフォームを閉じない限り他のウインドウの操作はできない状態にします。

プレビューボタンをクリック時のイベントとして以下のように記述します。

Private Sub プレビュー_Click()
If Not IsNull(Me!開始生徒番号) And Not IsNull(Me!終了生徒番号) Then
If Me!開始生徒番号 > Me!終了生徒番号 Then
Beep
MsgBox "生徒番号の指定が間違っています。"
Me!開始生徒番号.SetFocus
Exit Sub
End If
End If
If Not IsNull(Me!開始入学年月日) And Not IsNull(Me!終了入学年月日) Then
If Me!開始入学年月日 > Me!終了入学年月日 Then
Beep
MsgBox "入学年月日の指定が間違っています。"
Me!終了入学年月日.SetFocus
Exit Sub
End If
End If

Me.Visible = False
DoCmd.OpenReport "R_生徒一覧", acViewPreview
End Sub
開始生徒番号と終了生徒番号がNullでなかった場合には、開始と終了の順が逆だった場合にエラーにします。入学年月日も同様のチェックをします。エラーが無かった場合、Docmd.OpenReportメソッドを使用し、レポートを出力します。

レポート名の次にパラメータを指定でき、acViewPreviewはプレビュー表示を意味し、印刷する場合は、acViewNormalとします。

レポートを出力する前に「Me.Visible = False」というコードがありますが、指示画面を非表示にするという事です。 これがないと、プレビューしたレポートが指示画面の裏に隠れてしまいます。 というのは指示画面がダイアログになったいるので、常に前面に表示されてしまうからです。 それでは閉じてしまえばいいのではと思いますが、それもダメです。 レポートのレコードソースで指示画面に入力されている値を参照しているので、 閉じてしまうと参照エラーになってしまうからです。

次にレポートのレコードソースを見ていきましょう。生徒番号の抽出条件として以下を追加します。 フィールド欄にちょっと複雑な式を記述する必要があります。抽出条件欄には「True」と指定します。

レポートのレコードソース
 

ズーム表示して見てみます。

開始生徒番号の抽出条件 

この式の意味は、F_生徒一覧範囲指定フォームの開始生徒番号がNullの場合は何も条件を指定しなかったと見なし、Null以外の場合は、T_生徒番号の生徒番号がフォームの開始生徒番号以上のものを対象とします。

IIF()関数:IIF(評価式,評価式が真だった場合の値又は式,評価式が偽だった場合の値又は式)

真だった場合にはフィールド欄と抽出条件欄がTrue=Trueとなるので、特に何も条件を指定しなかったと見なすのです。

終了生徒番号の場合は、不等号が変わります。

終了生徒番号の抽出条件 

入学年月日も考え方は全く同様です。

開始入学年月日の抽出条件 

終了年月日の抽出条件 

姓かなはワイルド検索になるので、Like演算子を使う必要があります。使い方としては例えば姓かなの先頭が「こん」で始まるレコードを抽出したい場合には、以下のように指定します。

姓かな Like "こん*"

姓かなの抽出条件 

「こん」の部分がフォームからの変数になるので、上記のように指定します。

最後にレポート閉じる時の処理として以下を加えます。これはレポートを開くときにVisible = falseにしたので、元に戻す為です。

Forms!F_生徒一覧範囲指定.Visible = True

メニューにF_生徒一覧範囲を開くボタンを追加して終わりです。以下に今までの作った分のDBをダウンロード出来るようにしておきます。

http://www.mindaccess.com/download/20110107sample.zip

これで一通り、レポートの機能を解説しました。まだまだACCESSの豊富な機能は紹介し切れていませんが、いずれ応用編の方で紹介できる機会があると思います。

次回はクエリーについて話を進めていきたいと思います。今回のレポートを作成していく中でも既にクエリーを使用していたのですが、次回以降はちょっと趣向を変えて問題形式でクエリーについて詳しく解説していこうと思います。


スポンサーサイト

テーマ : データベース
ジャンル : コンピュータ

生徒と家族の連携(その2)

レポートで生徒と家族を連携して出力方法としてもう一つの方法はサブレポートを使う方法です。

まずサブレポートの方から作成していきます。サブレポートは詳細セクションのみで構成します。下記の様にデザインして「R_生徒一覧_サブ」と名前を付けて保存します。

 家族サブレポート

レコードソースはT_家族だけにします。メインレポートと連携するために「生徒番号」を追加しておくのを忘れないで下さい。

サブレポートのレコードソース

次にメインレポートのデザインです。生徒の情報は詳細セクションに定義します。その詳細セクション内にサブレポートをドラッグして追加します。名前は「R_生徒一覧_メイン」とします。

メインレポートのデザイン

R_生徒一覧_メインのレコードソースはT_生徒番号だけにします。

メインレポートのレコードソース 

生徒と家族を繋いでいる情報は「生徒番号」ですので、リンク親フィールドリンク子フィールドに「生徒番号」を指定します。

リンクフィールド 

プレビューした結果は前回出力したイメージと基本的に同様になります。

プレビューイメージ

生徒と家族を連携する方法として2つ紹介しました。やり方は全く違いますが、難易度、作成する手間をにおいてこの事例ではどちらでもあまり大差はありません。どちらの手法がいいかはケースバイケースになります。

次回ではレポートを出力する上での指示画面を作成し、指定された条件によって出力する方法を学びます。

テーマ : データベース
ジャンル : コンピュータ

生徒と家族の連携(その1)

今回はレポートでの生徒と家族の連携について考えてみます。

フォームにおいても同じテーマがありましたが、その時はサブフォームを使って実現しました。レポートにおいてもサブレポートというものがあり、その手法で実装が可能ですが、ここではグループ化を使って連携する方法で実現してみます。

まず、レポートのレコードソースプロパティでクエリービルダを起動します。現在はレコードソースには「T_生徒番号」が指定されていると思いますが、そのまま起動すると、クエリービルダにT_生徒番号だけが表示されていると思います。

そこで、テーブルを追加し、「T_家族」と繋ぎます。T_生徒番号とT_家族は生徒番号で連携し、1:多の関係になります。そこでクエリーの結果を表示させて確認して見て下さい。生徒の数×1生徒当たりの家族の数分の行数が表示されたと思います。

 リレーション

ここで注意したいのは両方のテーブルで同一のフィールド名があったときの対処です。データベースにおいてテーブル名が違えば同一フィールド名は定義可能ですが、同じクエリー(SQL)上で使用するときには一意になるように識別しなければなりません。ACCESSでは自動的に[テーブル名].[フィールド名]となります。自分で任意に名前を付けたい場合は任意の名前と本来のフィールド名をコロンで区切ります。

任意に指定した名前:フィールド名

リネイム 

続柄はコードなので、名称に変換するする必要があります。前回レポートの性別のコントロールソース中でCHOOSE関数を使用して実装しましたが、実は関数はクエリーの中でも使用できます。構文は全く同様です。そして循環参照を避けるためにリネイムしています。

choose関数 

これでレコードソースがクエリーとして生成されました。ここまでで生徒と家族を連携する準備が整ったことになります。次はレポートの設定に戻って、デザインで「グループ化と並び替え」をクリックします。

グループ化と並び替え 

プロパティシートが現れますので、グループ化として生徒番号を指定します。

生徒番号のグループ化 

すると、生徒番号ヘッダーが生成されます。デザインも以下のように変更します。家族の内容は詳細セクションとして定義します。出力イメージとしては1生徒番号の内容が出力された後に各家族の内容が(複数あれば複数行)出力されます。
  
生徒番号ヘッダー

デフォルトの設定としては生徒番号が変わっても続けて同一ページに出力されます。それは改ページプロパテが「しない」になっているからです。

改ページプロパティ 

もし、生徒番号がブレイクしたら、改ページをしたいのであれば以下のオプションから選択します。

カレントセクションの前:改ページをしてから新しい生徒番号の内容が出力されます。
カレントセクションの後:新しい生徒番号の内容が出力されてから、改ページされます。
カレントセクションの前後:新しい生徒番号を出力する前後に改ページが行われます。

一通り設定を施したプレビューイメージは以下の通りになります。

プレビュー

実はここでバグがある事に気付かれたでしょうか。生徒件数が3件と表示されています。Count関数は詳細セクションの表示件数つまり総家族レコードの件数をカウントしているのです。ここで必要なのは生徒番号レコードの件数です。レポートフッターでT_生徒番号のレコードをカウントするにはDcount関数を使用します。

DCount():定義域集合関数と言って指定されたテーブル又はクエリーのレコード件数を取得します。抽出条件を指定することも出来ます。ここでは以下のように指定します。

DCount("*","T_生徒番号")

レポートの「グループ化」という機能を使うことにより、サブレポートを使用せずとも生徒と家族の連携を実現できました。次回では逆にサブレポートを使って連携を実現したいと思います。

テーマ : データベース
ジャンル : コンピュータ

式、関数

 レポートの見栄えを良くしていくためにデザインを変更してみました。それに伴い、式や関数を使い書式を変更してみました。

レポートデザイン例

プレビューすると以下のようになります。

レポートプレビュー例

ここでのポイントはコントロールソースで使用する式と関数です。姓漢字と名漢字、姓かなと名かな、住所都道府県と住所市区郡と住所町名と住所ビル名は結合して表示した方がコンパクトで見やすいと思います。又、郵便番号や件数のように固定文字と連結するときも式を使います。性別のようにコードを名称に変換するのには関数を使います。

まず姓漢字と名漢字ですが、スペースを一つ入れて連結しています。通常コントロールソースにはテーブルのフィールドを指定しますが、「=」に続けてフィールド名を[     ]で囲み、「&」で他のフィールドや固定文字と結合することが出来ます。ここでは半角スペースを挟んで姓漢字と名漢字を連結しています。

ここで注意したいのは名前が「姓漢字」のままだとエラーになると言うことです。同じ名前だと循環参照が起きてしまうのです。そこで「姓漢字2」と名前を変えてあります。

姓漢字のプロパティ

姓かなと名かなも同様です。

姓かなのプロパティ 

住所も同様です。
 
住所のプロパティ 

郵便番号は固定文字「」を連結しています。

郵便番号のプロパティ 

レコード件数を取る関数にも固定文字を連結出来ます。

 レコード件数のプロパティ 

性別ではコードを名称に変換しています。

Choose():1番目の引数は数値型のフィールドを指定します。そしてそれをインデックスにして2番目以降に指定した文字列に置き換えます。ここでは性別が"1"だったら"男"、"2"だったら"女"に変換して表示します。

性別のプロパティ 

次回では生徒と家族を連携して出力する方法を学びます。


テーマ : データベース
ジャンル : コンピュータ

オートレポートの作成

 今回からレポートの作成に入ります。

レポートにもフォームの時同様、オートレポートというのがあってテーブルを選択し、ボタン一発で自動でレポートを作成する機能があります。まずはこの機能を使ってT_生徒番号を元に生徒一覧表を作ってみましょう。

項目が多いので自動で作成されたレポートだと1ページに収まり切りません。標準だと用紙サイズがA4縦になっています。これをまずページ設定でA4縦にします。さらに項目を2段うちにします。とりあえずページ内に収まるようにデザインしたのが以下の通りです。

レポートデザイン例

プレビューした結果が以下の通りです。

プレビュー例

R_生徒一覧として保存します。ここで各種設定を確認しておきます。レポートは以下のセクションで構成されます。

レポートヘッダー:1レポートの出力時の先頭に1回だけ出力する内容を指定します。R_生徒一覧ではレポートのタイトルを指定しています。ページ毎にタイトルを出力したければページヘッダーの方に持ってきます。又、出力した日付と時間も出力しています。

レポートフッター:1レポートの出力時の最後に1回だけ出力する内容を指定します。必ずしもレポートヘッダーと対をなす必要はありません。ヘッダーのみやフッターのみ出力することが可能です。ここではデータの件数を出力しています。

ページヘッダー:ページの先頭に出力する内容です。改頁される度に出力する内容を指定します。ここでは出力項目の見出しを指定しています。これはページ毎に出力しないと見にくいですからここで指定します。

ページフッター:ページ毎、ページの最後に出力する内容です。これもページヘッダーと必ずしも対をなす必要はありません。ここではページ数と総ページ数を出力します。

詳細:データの明細行に相当します。レコード1件で1回出力されます。ここが何段うちになろうとも詳細セクションで指定された内容が1件のレコード毎に出力されます。

更にグループ毎のヘッダーとフッターのセクションを階層的に追加できますが、それは後述します。

それでは、プロパティに関して見ていきましょう。

レポートのレコードソースと各コントロールのコントロースソースに関しては基本的にフォームと同様です。レコードソースではレポートの元になるテーブル又はクエリーを指定します。コントロースソースでは対応するフィールドを指定します。

レポートならではのプロパティがいろいろとあるのですが、それは追々説明しましょう。とりあえずはデフォルトのままで一覧表が出力されます。

最後に自動で作成された関数について解説しておきます。

ページヘッダーに生成された日付と時間ですが、これはコントロースソースプロパティに「=」に続けて関数を指定することで実装できます。

Date():現在の日付を取得する。
Time():現在の時刻を取得する。

日付のプロパティ 

時刻のプロパティ 

ページフッターにあるのはページ数と総ページ数です。「&」で文字列と連結することにより、自由な表記にカスタマイズ出来ます。

[Page]:現在のページ数
[Pages]:総ページ数

ページのプロパティ 

レポートフッターにあるのは明細行の総件数を取得する関数になります。Count関数はどのセクションにあるかにより、どの単位で集計するかが決定されます。ここではレポートフッターにあるので、総件数になっていますが、グループフッターにあれば各グループ単位で集計されます。つまり、グループがブレイクした時点で集計出力されます。

Count():レコードの件数を取得。

レコード件数のプロパティ 

次回では明細行をより見やすくするためにコントロールの表示形式を工夫していきましょう。

テーマ : データベース
ジャンル : コンピュータ

最新記事
全記事表示リンク

全ての記事を表示する

月別アーカイブ
カテゴリ
お問い合わせ
まずはこちらのフォームより御一報下さい。

名前:
メール:
件名:
本文:

検索フォーム
RSSリンクの表示
アクセスランキング
[ジャンルランキング]
コンピュータ
662位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
82位
アクセスランキングを見る>>
ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。