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

5.テーブルへの保存

Accessでのレポートの作成作業は、テーブルやクエリーで抽出したデータを印刷フォーマットに展開する作業だと言えます。それゆえテーブルレイアウトの設計は、他の言語を想定して構築されたシステムとは少し観点が異なってくると思います。
特に、今回はテーブルの内容をそのままレポートに配置できるように考えたため、印刷時にイベント処理で編集するような項目も、すべてテーブルに保存するようにしています。
テーブルレイアウトがいささか冗長的になっているのはそのためです。

なお、今回は先ずフォームに表示するようにしていますが、テーブルに保存する作業でも同じようなロジックを繰り返しています。また、1テーブルのインデックスキーは3つまで、1インデックスキーの構成フィールドも3つまでとしています。
運用にあたっては改良すべき点も多々あるかと思いますが、ご参考になればと思います。
テーブルレイアウトは、テーブル定義書の作成(1)をご覧ください。

5.1 テーブルの初期化

すべての使用テーブルのオブジェクト変数を定義し、テーブルを初期化します。

Dim rsDB As DAO.Recordset                       'T_DB用Recordset
Dim rsTB As DAO.Recordset 'T_TB用Recordset
Dim rsFLD As DAO.Recordset 'T_FLD用Recordset
Dim rsIX As DAO.Recordset 'T_IX用Recordset

CurrentDb.Execute ("delete * from T_DB") 'T_DB clear
CurrentDb.Execute ("delete * from T_TB") 'T_TB clear
CurrentDb.Execute ("delete * from T_FLD") 'T_FLD clear
CurrentDb.Execute ("delete * from T_IX") 'T_IX clear

5.2 T_DB(データベース情報の保存)

テキストボックス「DBFile」の内容をファイル名とパスにわけて「T_DB」に保存します。

➀ Set rsDB = Currentdb.OpenRecordset("T_DB")
テーブル「T_DB」を開きます。Currentdb は当AccessDB を指しています
➁ Me.DBFile:フォーム上のテキストボックスで、前回の テーブル定義書の作成(2)
ファイルダイアログの実行で指定されたファイル名が保存されています。
InStrRev:テキスト文を後ろから、"¥" を探しています。
「DBfile」に保存されたフルのファイル名を、名前とパスに分けるためです。
"¥"から後ろ(Right)がファイル名で、wk1に取り出しています。
"\"から前(Left)がパスで、wk2に取り出しています。
➂ rsDB.AddNew:テーブルにレコードを1件、新規追加します。
データは、wk1(ファイル名)、wk2(パス)、ID(インデクスキー)です。
Database は1件のみなので、ID=1 です。
rsDB.Update:レコードを更新します。
➃ テーブルを閉じ、オブジェクトを開放します。

5.3 T_TB(テーブル情報の保存)

指定ファイルのテーブルコレクションからテーブル情報を 「T_TB」 に保存します。

➀ Set rsTB= Currentdb.OpenRecordset("T_DB")
「T_TB」 のレコードセットを開きます。Currentdb は当AccessDB を指しています
Set wkDB = ~ OpenDatabase(me.DBFile):指定されたデータベースを開きます。
With wkDB:
wkDBのプロパティを「.」以下の記述で指定することができるようにします。
➁ TableID=0:テーブルの読み込み順を主キーにしていますのでゼロクリヤしています。
For Each ixtable in .TableDefs ~ Next ixtable:
wkDBのテーブルコレクションを順次検索します。
テーブル名の先頭(Left)の4文字が「Msys」はSystemTableなのでスキップします。
➂rsTB.Addnew:レコードを新規登録します、
レコード内容は、テーブル名、Linkファイルの場合はリンク元DB名,リンク元テーブル名、
説明文、です。
リンク元のテーブルがない場合には、リンク元のDB名などのデータを取得しようとすると
エラーになりますので、あらかじめ、 テーブルのフィールドには空白を登録した上で
エラー行は無視してそのまま次行(Resume next)に進んでいます
プロパティの検索が終了した時点で、エラーの無視は解除します。
rsTB.Update :レコードを登録します。
➃ すべてのテーブルの検索が終了後、「T_TB」を閉じます。

5.4 T_FLD(フィールド情報の保存)

「T_TB」をTableID順に読み出しテーブルのフィールド情報を「T_FLD」に保存します。

➀Set rsFLD:「T_FLD」 のレコードセットを開きます。
➁Set rsTB = Currentdb.OpenRecordset("select * from T_TB order by TB_TableID"):
「from T_TB」:テーブル 「T_TB」から
「select *」:すべて(*)のフィールドを選択し
「order by TableID」:TableID順に
レコードセットを開きます。
必要なデータは、IDとテーブル名のみなので、すべて(*)とせず具体的に、
「TB_TableID , TB_Name」と記述しても構いません。
➂Do Until rsTB.EoF = True ~ Loop
「T_TB」を先頭から最終レコードになるまで順に読みこみます。
➃For Each ixfld in.TableDefs(rsTB![TB_Name]).Fields ~ Next ixfld
in.TableDefs: wkDBのテーブルコレクションから
rsTB![TB_Name]:rsTBの「TB_Name」に保存されているテーブル名の
.Fields:フィールド情報
検索します。
➄データ型の判定は、 CGetType function を実行しています。
テーブル定義書の作成(2)を参照してください。
5.3 テーブル情報の保存と同様に、データ型によってはサポートしていないプロパティも
あるため、ゼロ又は空白を保存してから、エラーの場合は無視して次行へ進んでいます。
➅Next ixfld:フィールド検索の最後です。
➆rsTB.MoveNext:次のレコードに移動します。
Loop:最終レコード(Eof=true)になるまで、For文から繰り返します。
➇最終で、「T_TB」「T_FLD」を閉じて、オブジェクトを開放します。

5.5 T_IX (インデックス情報の保存)

再度、「T_TB」をTbaleID順に読み込みインデックス情報を「T_IX」に保存します。

➀Set rsIX:「T_IX」のレコードセットを開きます。
➁Set rsTB = Currentdb.OpenRecordset("select * from T_TB order by TB_TableID")
5.4 フィールド情報の登録と同様に「T_TB」をTableID順に読み出すように開きます。
Do Until rsTB.EoF = True ~ Loop
「T_TB」を先頭から最終レコードになるまで順に読みこみます。
➂For Each ixdexkey in.Tabledefs(rsTB![TB_Name]).Indexes ~ Next indexkey
in.TableDefs: wkDBのテーブルコレクションから
rsTB![TB_Name]:rsTBの「TB_Name」に保存されたテーブル名の
.indexes:インデクス情報
検索します。
➃For Each indexkeyfld in.TableDefs(rsTB![TB_Name]).Indexes(indexkey.Name).Fields
~ Next indexkeyfld
➂で読み込んだインデックスの構成フィールドを検索しています。
まず、インデックスを検索してからそのインデックスのプロパティを検索します。
➄検索結果をix3 構成フィールドをカウントしています。
ix3=1 の場合は1番目のフィールドです。
rsIX![IX_Field1]=indexkeyfld.Name :フィールド名
rsIX![IX_Field1AD]=GetAD2(indexkeyfld.Attributes) :昇順か降順か
➅Next indexkeyfld:構成フィールドは3つまでとしていますので、
Case Else文では、何も記述していません。つまり4つ以上は無視しています。
➆Next indexkey :インデックスキーも3つまでで、同様に4つ以上は無視しています。
➇rsTB.MoveNext:次のレコードに移動します。
➈最後に、レコードセットとデータベースを閉じて、オブジェクトを開放します。

御覧の通りデータベースから、テーブルやフィールド、及びインデックスの情報の取得する方法はほとんど同じです。テーブル定義書の作成(2)ではフォーム上に表示していますが、ここではレポートに展開するためにテーブルに保存しています。

テーブル定義書の作成(1)で、ご紹介している帳表はテーブル情報を少し編集しています。レポートの作成手順とともに次回にご紹介したいと思います。