テーブル定義書の作成(5)

7. テーブルレイアウトの作成

7.1 イベントの処理

テーブル一覧表の作成(4)と同様に
クリック時のイベント処理に埋め込みマクロを設定します。
アクションの追加で「レポートを開く」を選択し、レポート名は「テーブルレイアウト」、ビューは「印刷プレビュー」です。

7.2 レポートの作成

7.2.1 レポートデザインを開く

➀「レポートデザイン」から空のデザインフォームを作成します。
ページヘッダーと詳細とページフッターの領域のみが作成されます。

このレポートはテーブルでグループ化して、「FLD_TableIDヘッダー」を追加しています。
グループ化の設定は、7.2.3 グループ化の設定 で説明します。
➁そのために、まず「レコードソース」の「…」からクエリービルダーを開いてください。
 まだ、レコードソースは空白の状態です。

7.2.2 クエリービルダーを開く

上半分を「フィールドリスト」、下半分を「デザイングリッド」と言います。

➀「フィールドリスト」の空白の領域で右クリックでショートメニューを開き、
 「テーブルの表示」をクリックして、テーブル一覧を表示させます。
「T_DB」(データベース情報)、「T_TB」(テーブル情報)、「T_FLD」(フィールド情報)
を選択して、追加ボタンをクリックしてください。
➁「フィールドリスト」に上記3つのテーブルが表示されます。
「TB_TableID」と「FLD_TableID」とは直線で結ばれていますが、これはこのフィールドで
両テーブルが紐づけられていることを示しています。
 (「T_DB」はこのサンプルでは、どのテーブルとも紐づけられていません。)
➂「デザイングリッド」で、テーブルを選択し必要なフィールドを指定していきます。
「*」はそのテーブルのすべてのフィールドを選択します。
➃「Table_ID」順の「Field_ID」順に印刷するためテーブルの読み込み順を指定します。
テーブルから「T_TB」、フィールドから「TB_TableID」を選び、並び替えを昇順、同様に
テーブルから「T_FLD」、フィールドから「FLD_FieldID」を選び昇順を指定します。
➄「T_DB」の「抽出条件」は、「DB_ID」= 1 です。

 この設定に従ってクエリー文が作成されます。ショートメニューの「SQLビュー」で
 確認できます。このSQL文が「レコードソース」に入ります。

クエリー文です。

「INNER JOIN」は、連結されたテーブルの両フィールドの条件が一致したレコードのみが選択されます。一致しないレコードは選択されません。
一致しない場合、左に記載されたテーブルのレコードは取り込む場合は「LEFT JOIN」、逆の場合は「RIGHT JOIN」と記述します。
デフォルトは「INNER JOIN」ですので、修正する場合はSQL文を開いてください。
「WHERE」 句は抽出する条件文です。
「ORDER BY」句は並び順です。降順の場合は「DESC」がフィールドの後ろにつきます。

7.2.3 グループ化の設定

➀主メニューのレポートデザインタブから「並べ替え/グループ化の設定」をクリックします。
ページフッターの下に「グループ化・並び替え・集計」の設定ウィンドウが表示されます。
グループ化で「FLD_TableID」を選択すると、ページヘッダーの下に「FLD_TableIDヘッダー」
 の領域が追加されます。
 
「その他」タブで、フッターなど必要なら追加設定できます。
グループ化とはブレイクキーを設定したということです。キーブレイク時の処理は
 書式タブから行います。このレポートでは改頁するようするため、[FLD_TableIDヘッダー」
の書式タブから、改ページ」に「カレントセクションの前」を選択してください。
これで、「T_FLD」の「FLD_TableID」が変わるたびに改ページしてくれます。

7.2.4 グループヘッダーと詳細の印字

グループヘッダーには、「T_TB」からテーブル名とインデックス情報を配置します。
詳細領域には「T_FLD」からフィールド情報を配置します。

テーブル定義書の作成(3)で作成した「T_TB」「T_FLD」「T_IX」はデータベースのプロパティからの情報のみを保存しています。
上記のレイアウトにするため、「T_IX」のインデックス情報を「T_TB」「T_FLD」に追加します。

7.2.5 「T_TB」テーブルの編集

「T_TB」には1インデックスキーにつき、下記の4つフィールドを持っています。
当サンプルでは、1テーブルにインデックスキーは3つまでとしていますので、
フィールド名には、「TB_Key1」「TB_Key2」「TB_Key3」をそれぞれに付加しています。
レイアウト上では、キーは「K1」「K2」「K3」とラベルを付けています。

項 目 説 明
1TB_Key1Nameインデクスキーの名前
TB_Key1Primary主キーの場合は「はい」、主キーでなければ「いいえ」
3TB_Key1Unique固有キーの場合は「はい」、重複キーの場合は「いいえ」
4TB_Key1IgnoreNullsNull値の場合は無視なら「はい」、無視しない場合は「いいえ」
①rsTB:「T_TB」テーブルのレコードセットを定義します。
 インデックスキーで検索するため、キーには「PrimaryKey」を指定しています。
➁Dim sql As String:クエリー文を保存するための変数です。
➂rsIX:「T_IX」のレコードセットは、SQL文で定義しています。
  Order By IX_TableID、IX_IndexID :読みこみ順は、TableID順のIndexID順です。
  Do Until EOF = True ~ Loop:最終レコードになるまで順に読み込みます。
➃rsTB.Seek “=”,rsIX![IX_TableID]:
rsIXの「IX_TableID」と等しいキーを持つレコードを、rsTBの先頭から検索します。
 If rsTB.NoMatch=Fale :
  逆説的ですが条件に一致するレコードがあった場合の処理を記述しています。 
  rsTBのキーは固有キーですので、一致するレコードは1件しかありません。
⑤ rsTB.Edit:「T_TB」のレコードセットを編集します。
 Index_IDの番号より、該当フィールドにインデックス情報を取り込みます。
⑥ rsTB.Update :「T_TB」のレコードセットを更新します。
⑦rsIX.MoveNext:次のレコードに移動します。
 最後まで読み込んだら終了です。

7.2.6 「T_FLD」テーブルの編集

「T_FLD」には、そのフィールドがインデックスキーの構成フィールドであった場合のための、キー内の構成順(キーの大小順)と昇順か降順かを保存するフィールドを持っています。
「K1」「K2」「K3」は各インデックスキーのラベル番号です。

上記の例では「T_FLD」テーブルは、3つのインデックスキー(Key1、Key2、PrimaryKey)を持っています。
Key1の構成は、FLD_TableIDの昇順、FLD_Nameの昇順
Key2の構成は、FLD_Typeの降順
PrimaryKeyの構成は、FLD_TableIDの昇順、FLD_FieldIDの昇順
※ Dは降順(descending)で、昇順(ascending)の場合は空白にしています。

項目説明
FLD_K1k1の構成フィールドの場合
キー内の順(大きさ)+ 並び(A:昇順、D:降順)
FLD_K2K2の構成フィールドの場合
キー内の順(大きさ)+ 並び(A:昇順、D:降順)
FLD_K3K3の構成フィールドの場合
キー内の順(大きさ)+ 並び(A:昇順、D:降順)
①rsFLD:「T_FLD」テーブルのレコードセットを定義しています。
  インデックスキーは「Key1」で、「Table_ID」「Fild_Name」で検索します。
 rsIX:「T_IX」テーブルのレコードセットは順に読み込みます。
  Order By IX_TableID、IX_IndexID :TableID順のIndexID順です。
 Do Until EOF=True ~ Loop:最終レコードになるまで読み込みます。
③インデクスの構成フィールドが空白でない場合は、サブ「FldKeySet」を実行します。
④rsIX.MoveNext:次のレコードに移動します。
 最後まで読み込んだら終了です。

サブ「FldKeySet」
⑤rsFLD.Seek "=",rsIX![IX_TabelID],KeyField :
 インデックスの構成フィールド名(KeyField)で「T_FLD」のレコードセットを検索します。
「Key1」は固有キーなので、1件のみ一致するフィールドがヒットします。
⑥該当フィールドが見つかったら、構成順と並びを取り込みます。
⑦Return:サブルーチンから戻ります。

全体を通して、作業単位でコツコツと積み上げるコードをご紹介しましたが、プログラムのフローは理解していただけるかと思います。
しかし、重複するコードも多く、柔軟性もなければ美しくもないですね。コードの整理は必要かと思います。インデックスやフィールドの個数制限など、システムとしても改良する点があるかと思います。
この後、改良版をお届けしたいと思いますが、とりあえず今回はこれで完了といたします。

最後まで御覧くださりありがとうございました。
参考にしてくださる方がおられれば嬉しく思います。