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」とラベルを付けています。
| № | 項 目 | 説 明 |
| 1 | TB_Key1Name | インデクスキーの名前 |
| 2 | TB_Key1Primary | 主キーの場合は「はい」、主キーでなければ「いいえ」 |
| 3 | TB_Key1Unique | 固有キーの場合は「はい」、重複キーの場合は「いいえ」 |
| 4 | TB_Key1IgnoreNulls | Null値の場合は無視なら「はい」、無視しない場合は「いいえ」 |

①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)の場合は空白にしています。
| № | 項目 | 説明 |
| 1 | FLD_K1 | k1の構成フィールドの場合 キー内の順(大きさ)+ 並び(A:昇順、D:降順) |
| 2 | FLD_K2 | K2の構成フィールドの場合 キー内の順(大きさ)+ 並び(A:昇順、D:降順) |
| 3 | FLD_K3 | K3の構成フィールドの場合 キー内の順(大きさ)+ 並び(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:サブルーチンから戻ります。
全体を通して、作業単位でコツコツと積み上げるコードをご紹介しましたが、プログラムのフローは理解していただけるかと思います。
しかし、重複するコードも多く、柔軟性もなければ美しくもないですね。コードの整理は必要かと思います。インデックスやフィールドの個数制限など、システムとしても改良する点があるかと思います。
この後、改良版をお届けしたいと思いますが、とりあえず今回はこれで完了といたします。
最後まで御覧くださりありがとうございました。
参考にしてくださる方がおられれば嬉しく思います。
