[BlueLeaf1336]> PROGRAM> Natural Born Junk>
history | TOP |
2003/01/21:作成(参考:MSDNライブラリ)
overview | TOP |
DelphiでMDBにつなぎたくなったらどうしますか?インターネットで調べますか? ..当たりです。なんぼでも情報があります。
そこを敢えて。というか、コレクションとオブジェクトの世界をぐるぐるとループで回したくて仕方がなくなったというか。 というわけで、Accessにサンプルでついてくるでかいmdbをループでぐるぐる回してみることにします。
DBEngineオブジェクトの眷属たち | TOP |
DAOモデルの構造を調べました。■はこのページで触ったものをあらわしています。
■DBEngineオブジェクト └Workspacesコレクション │ └Workspaceオブジェクト │ └Connectionsコレクション │ └Connectionオブジェクト │ │ └QueryDefsコレクション │ │ │ └QueryDefオブジェクト │ │ │ └Parametersコレクション │ │ │ │ └Parameterオブジェクト │ │ │ └Fieldsコレクション │ │ │ └Fieldオブジェクト │ │ └Recordsetsコレクション │ │ └Recordsetオブジェクト │ │ └Fieldsコレクション │ │ └Fieldオブジェクト │ └Databasesコレクション │ │ └■Databaseオブジェクト │ │ └■TableDefsコレクション │ │ │ └■TableDefオブジェクト │ │ │ └Fieldsコレクション │ │ │ │ └Fieldオブジェクト │ │ │ └Indexesコレクション │ │ │ └Indexオブジェクト │ │ │ └Fieldsコレクション │ │ │ └Fieldオブジェクト │ │ └Containersコレクション │ │ │ └Containerオブジェクト │ │ │ └Documentsコレクション │ │ │ └Documentオブジェクト │ │ └QueryDefsコレクション │ │ │ └QueryDefオブジェクト │ │ │ └Parametersコレクション │ │ │ │ └Parameterオブジェクト │ │ │ └Fieldsコレクション │ │ │ └Fieldオブジェクト │ │ └Recordsetsコレクション │ │ │ └Recordsetオブジェクト │ │ │ └Fieldsコレクション │ │ │ └Fieldオブジェクト │ │ └Relationsコレクション │ │ └Relationオブジェクト │ │ └Fieldsコレクション │ │ └Fieldオブジェクト │ └Groupsコレクション │ │ └Groupオブジェクト │ │ └Usersコレクション │ └Usersコレクション │ └Userオブジェクト │ └Groupsコレクション └Errorsコレクション └Errorオブジェクト
DBEngineオブジェクト・Databaseオブジェクト | TOP |
Delphiで、mdbファイルにアクセスするには、次のようにします。
uses ComObj, Variants; var daoDBEngine: Variant; //DBEngineオブジェクト daoDatabase: Variant; //Databaseオブジェクト(ですかね?) (* ============================================= procedure OpenMdb(); ============================================= *) procedure OpenMdb(); begin daoDBEngine := CreateOleObject('DAO.DBEngine.36'); daoDatabase := daoDBEngine.Workspaces[0].OpenDatabase('ADDRBOOK.MDB',False, False); end;
Delphi6では、Variant型がVariantsユニットにあるのでusesします。それから、CreateOleObjectを使うためにComObjユニットが必要です。 基本的に、全部呪文のようなものだと思ってますが、OpenDatabaseメソッドについてちょっと調べてみましょう。
構文
Set database = workspace.OpenDatabase (dbname, options, read-only, connect)
指定項目
database | 開くDatabaseオブジェクトを表すオブジェクト変数を指定 |
---|---|
workspace | (省略可能)データベースを含める既存のWorkspaceオブジェクトを表すオブジェクト変数を指定。引数workspaceが値を持たない場合、既定のワークスペースを使用 |
dbname | 既存のJetデータベースのファイル名 |
options | (省略可能)True:排他モード。False:(既定値)共有モード |
read-only | (省略可能)サブデータベースを読み取り専用権限で開く場合は、Trueが設定され、読み取り/書き込み権限で開く場合は、False が設定される |
connect | (省略可能)パスワードを含むさまざまな接続情報を示すサブタイプが文字列型 (String) であるバリアント型 (Variant) を指定 |
ということですんで、(EXEの起動フォルダーの中の)'ADDRBOOK.MDB'を、共有モードで読み書きモードで開いてるわけですね。 なんかすっきりしました。
TableDefsコレクション・TableDefオブジェクト | TOP |
データベースといえばテーブルです。 なので、テーブル定義(TableDefineの略じゃないかと勝手に思ってるんですが)を調べます。 以前、MDBのテーブル定義を取り出す方法がわからなくて弱ったことがありましたので、 うまくいけばそんなんもいけるといいなあと思っています。 このオブジェクトには今まで触ったことがないので、型だけ調査しておきます。
TableDefsコレクション | ||
---|---|---|
プロパティ | Count | コレクションが持つオブジェクト数。整数型(Integer)。 |
TableDefオブジェクト | ||
---|---|---|
プロパティ | Attributes | 長整数型(Long)の定数の組み合わせ(※1参照) |
ConflictTable | 文字列型(String) | |
Connect | 文字列型 (String) | |
DateCreated | サブタイプが日付/時刻型(Date/Time)であるバリアント型(Variant) | |
LastUpdated | サブタイプが日付/時刻型(Date/Time)であるバリアント型(Variant) | |
KeepLocal | テキスト型(Text) | |
Name | 文字列型(String) | |
RecordCount | 長整数型(Long) | |
Replicable | テキスト型(Text) | |
ReplicaFilter | 文字列型(String)またはブール型(Boolean) | |
SourceTableName | 文字列型(String) | |
Updatable | ブール型(Boolean) | |
ValidationRule | 文字列型(String) | |
ValidationText | 文字列型(String) | |
コレクション | Fields | Fieldコレクション |
Indexes | Indexコレクション |
(※1)TableDef.Attributes | |
---|---|
dbAttachExclusive | JetDBエンジンを使用するDBで、排他モードで開いたリンクテーブル。 |
dbAttachSavePWD | JetDBエンジンを使用するDBで、リモートテーブルに対するユーザーIDとパスワードは接続情報と共に保存される。 |
dbSystemObject | JetDBエンジンによって提供されるシステムテーブル。 |
dbHiddenObject | JetDBエンジンによって提供される非表示のテーブル。 |
dbAttachedTable | JetDBやParadoxなどの非ODBCデータソースのリンクテーブル。 |
dbAttachedODBC | MicrosoftSQLServerなどのODBCデータソースのリンクテーブル。 |
ここまできて、Propertiesコレクションに気づきました。 これは、
ConnectionオブジェクトとErrorオブジェクトを除くすべてのDAOオブジェクトは、Propertiesコレクションを1つずつ持っており、その中には一定の組み込みのPropertyオブジェクトが含まれています。 オブジェクトのPropertiesコレクションを使用して、オブジェクトの組み込みプロパティとユーザー定義のプロパティを列挙することができます。ただし、不適切な状況でプロパティの読み取りや書き込みをしようとすると、エラーが発生します。
と書いてある。必死こいてプロパティを調べんでも、オブジェクト名さえわかれば列挙できてたわけです。ただ、型名がわからないとVariantで受けることになって気持ち悪いことは悪いのですが。とりあえずTableDefについては、プロパティの型名まで調べましたので、これをつかって、ループをまわしたいと思います。
Propertiesコレクション | TOP |
覚えているうちにPropertiesの構造を調べておきます。
All DAO Objects └Propertiesコレクション └Propertyオブジェクト
昨日は、せっかく調べたからと書きましたが、やっぱりループでまわすには、Propertiesコレクション使わないとだめな気がしてきました。 ですので、TableDefs、TableDefのときと同じように、PropertiesコレクションとPropertyオブジェクトのプロパティ(変ですが)に付いて型を調べるとこんな感じになります。
Propertiesコレクション | ||
---|---|---|
プロパティ | Count | コレクションが持つオブジェクト数。整数型(Integer)。 |
Propertyオブジェクト | ||
---|---|---|
プロパティ | Inherited | ブール型(Boolean) |
Name | 文字列型(String) | |
Type | 操作の種類やデータ型を示す定数(※2参照) | |
Value | オブジェクトのTypeプロパティで指定しているデータ型に対応する値となるバリアント型(Variant) |
不適切な条件のもとでValueプロパティを設定または返そうとすると、トラップ可能なエラーが発生します。ということなので、覚えておきましょう。
(※2)Property.Type | |
---|---|
dbBigInt | Big Integer 型 (Big Integer) |
dbBinary | バイナリ型(Binary) |
dbBoolean | ブール型(Boolean) |
dbByte | バイト型(Byte) |
dbChar | CHAR型(Char) |
dbCurrency | 通貨型(Currency) |
dbDate | 日付/時刻型(Date/Time) |
dbDecimal | 10進型(Decimal) |
dbDouble | 倍精度浮動小数点数型(Double) |
dbFloat | 浮動小数点数型(Float) |
dbGUID | GUID型(GUID) |
dbInteger | 整数型(Integer) |
dbLong | 長整数型(Long) |
dbLongBinary | ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object) |
dbMemo | メモ型(Memo) |
dbNumeric | Numeric型(Numeric) |
dbSingle | 単精度浮動小数点数型(Single) |
dbText | テキスト型(Text) |
dbTime | 時刻型(Time) |
dbTimeStamp | タイムスタンプ型(TimeStamp) |
dbVarBinary | 可変長バイナリ型(VarBinary) |
TableDefsコレクションをループでまわそう | TOP |
さて、やっと準備がそろったような感じがするので、記念すべき第1回目のループをまわしたいと思います。 何をまわすかですが、[TableDefsコレクション]でいこうかと思います。 といっても、TableDefsコレクションのプロパティは[Count]しかないので面白くも何ともないんですが。 早い話、TableDefsコレクションのループは、TableDefを取り出すためにあるようなもんです(勝手)。
一瞬Propertiesコレクション使ってみようと思って速攻で間違いだと気づいたんですが、PropertiesコレクションはすべてのDAOオブジェクトが持っているコレクションなので、コレクション(今の話ではTableDefs)は、持ってないですね。試してないですが。なので、Propertiesコレクションは、もうちょっとだけ後です。
そういうわけでTableDefsでループいってみましょう。
var i: integer; begin for i := 0 to daoDatabase.TableDefs.Count - 1 do begin //something to do end; end;
これだけです。あまりに面白くないですが。最適化されてループも回らないんじゃないかといううわさもあります。 念のため、daoDatabaseは、このページのはるか上のほうで宣言したDatabaseオブジェクト用の変数です。
次いってみましょう。
TableDefオブジェクトをループでまわそう | TOP |
すぐ上では、TableDefsコレクションを軽くループでまわしました。 さっきはループの中では何もしませんでしたが、daoDatabase.TableDefs[i]とするとこれがTableDefオブジェクトになります。 そして、ココからが重要なのですが、TableDefオブジェクトはPropertiesコレクションを持っていますので、さらにループをまわすことができます。 いってみましょう。
var i, j: integer; begin for i := 0 to daoDatabase.TableDefs.Count - 1 do begin for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do begin //something to do end; end; end;
PropertiesコレクションもやはりプロパティにCountしか持ってませんので、処理を何も記述しないと面白くありません。 が、徐々にチョボ連結がかなり長くなってきましたので、整理しておきます。
daoDatabase | Databaseオブジェクト |
---|---|
daoDatabase.TableDefs | TableDefsコレクション |
daoDatabase.TableDefs[i] | TableDefオブジェクト |
daoDatabase.TableDefs[i].Properties | TableDefオブジェクトのPropertiesコレクション |
です。Propertiesコレクションは、object.Properties[j]とすることで、Propertyオブジェクトを取り出すことができます。 やってみましょう。
var i, j: integer; begin for i := 0 to daoDatabase.TableDefs.Count - 1 do begin for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do begin Memo1.Lines.Add(daoDatabase.TableDefs[i].Properties[j].Name); end; end; end;
とりあえず.Name(プロパティの名称)を使ってみました。 これで、現在開いているデータベースの中の全テーブルのプロパティの一覧名称が表示できます。 上でまとめていますが、propertyオブジェクトには、Inherited・Name・Type・Valueの4つのプロパティがありますので、それぞれを取り出してみることにします。 ただ、Valueの取出しには、エラー発生がありえるので注意しろということですので、エラーを無視するようにしておきます。 といっても、文字列型の.Nameのようにはいきません。 とりあえず簡単そうな、.Inherited(Boolean)と.Name(string)でやって、残りは考えることにしましょう。
var i, j: integer; begin for i := 0 to daoDatabase.TableDefs.Count - 1 do begin for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do begin try Memo1.Lines.Add( BoolToStr(daoDatabase.TableDefs[i].Properties[j].Inherited, True) + ' : ' + daoDatabase.TableDefs[i].Properties[j].Name + ' : ' + VarTypeAsText(daoDatabase.TableDefs[i].Properties[j].Type) + ' : ' + VarToStr(daoDatabase.TableDefs[i].Properties[j].Value) ); except on E:Exception do begin Memo1.Lines.Add(Format('%d : %s', [i, E.Message])); end; end; end; end; end;
基本的にVariant型なんですが、わかる範囲で変換しようとしている努力が見受けられるかと思います。 一応言い訳しますと、.InheritedはBooleanだとわかっているので、Trueを"True"、Falseを"False"という文字列に変換してくれる関数を使用しています。それから、VarTypeAsTextは、「Varなんとか」でコード補完したときに、それっぽい名称の関数が出たので使ってみました。VarToStrも同じ理由です。
実行結果の一部はこんな感じです。..しかしめちゃくちゃ遅いです。3回ぐらいとまってんちゃうか?と思って止めてしまいました。
------------------------------------------------------- i := 0 ------------------------------------------------------- False : Name : Variant : MSysAccessObjects False : Updatable : Null : True False : DateCreated : OleStr : 1999/03/09 16:47:56 False : LastUpdated : OleStr : 1999/03/09 16:47:59 False : Connect : Variant : False : Attributes : Single : 2 False : SourceTableName : Variant : False : RecordCount : Single : 223 False : ValidationRule : Variant : False : ValidationText : Variant : False : ConflictTable : Variant : False : ReplicaFilter : Variant : ------------------------------------------------------- i := daoDatabase.TableDefs.Count - 1 ------------------------------------------------------- False : Name : Variant : TMP_インポート False : Updatable : Null : True False : DateCreated : OleStr : 1999/02/03 18:06:53 False : LastUpdated : OleStr : 1999/02/03 18:06:54 False : Connect : Variant : False : Attributes : Single : 0 False : SourceTableName : Variant : False : RecordCount : Single : 0 False : ValidationRule : Variant : False : ValidationText : Variant : False : ConflictTable : Variant : False : ReplicaFilter : Variant : False : Orientation : Smallint : 0 False : OrderByOn : Null : False False : NameMap : Boolean : ?? -------------------------------------------------------
最初と最後でプロパティの数が違うのが気持ち悪いですが、名前からして、システムテーブルとユーザテーブルの違いということにしておきます。でも、思っていたよりもそれっぽいのが表示されているようです(エディタで整形しています)。 ただ、Attributesに関しては、ページの上の方で調べた定数の組み合わせを取り出してもよさそうな気がします。 それから、プロパティオブジェクトの.Typeについても、表にまとめたような形でわかるとうれしいので、やってみようと思います。
TableDefオブジェクトをループでまわそう - その2(TableDef.Attributes) | TOP |
上で使った、VarTypeAsTextですが、これって何でしょう? ヘルプに載ってないし、ネットで調べてもほとんどつかまりません。 外国の人が個人的に作ったユニットの中に関数として使ってあったのが見つかったぐらいです。 何で使っているDelphiで使えるんでしょう?
さて、TableDef.Attributesは、Long型の定数の組み合わせということなので、次のようにして取り出せるはずです。
(* ============================================= function TableDefAttrToStr(Attr: Long): string; ============================================= *) function TableDefAttrToStr(Attr: Long): string; begin Result := ''; if (Attr and dbAttachExclusive) <> 0 then Result := Result + ',dbAttachExclusive()'; if (Attr and dbAttachSavePWD) <> 0 then Result := Result + ',dbAttachSavePWD'; if (Attr and dbSystemObject) <> 0 then Result := Result + ',dbSystemObject'; if (Attr and dbHiddenObject) <> 0 then Result := Result + ',dbHiddenObject'; if (Attr and dbAttachedTable) <> 0 then Result := Result + ',dbAttachedTable'; if (Attr and dbAttachedODBC) <> 0 then Result := Result + ',dbAttachedODBC'; Delete(Result, 1, 1); end;
..コンパイルエラーでした。「dbAttachExclusiveなんて知らんぞ」と。そういえばあたりまえです。 だーれも宣言してくれていません。 で、ネットで調べたらもろ表にまとめてくれているページがあったんですが、なんか悔しいのでDelphi-MLの過去ログを調べてみると、
タイプライブラリの取り込みでユニットを作成して
という記述を見つけました。 とはいえここまでやってきて、タイプライブラリを使ってしまうのも再び悔しいので、必要になった定数だけもらうことにします。 そのぐらいだったら許すことにします。
プロジェクト(P)--タイプライブラリの取り込み(L)...で、Microsoft DAO 3.6 Object Library (Version 5.0)を選択し、ユニットの作成(U)をすると、一瞬でできました。 悲しくなりましたが、気を持ち直して、TableDef.Attributes関係の定数を探すと、すぐ見つかりました。 次の表にまとめておきます。
dbAttachExclusive | $00010000 |
---|---|
dbAttachSavePWD | $00020000 |
dbSystemObject | $80000002 |
dbAttachedTable | $40000000 |
dbAttachedODBC | $20000000 |
dbHiddenObject | $00000001 |
これを定数宣言してやればよいということなので、ユニットの最初のほうにでも追加することにします。 ..うまくいきました。一応うまくいったコードを書いておきます。 といっても、上に書いてあるコードとほとんど同じですが、Propertiesコレクションに対して[j]ではなく、['Attributes']としてアクセスしています。この関数の動作を見るのに、他のプロパティが邪魔だったのでこうしています。
var i: integer; begin for i := 0 to daoDatabase.TableDefs.Count - 1 do begin Memo1.Lines.Add( daoDatabase.TableDefs[i].Name + ' : ' + daoDatabase.TableDefs[i].Properties['Attributes'].Name + ' : ' + <b>TableDefAttrToStr</b>(daoDatabase.TableDefs[i].Properties['Attributes'].Value) ); end; end;結果は、
MSysAccessObjects : dbSystemObject MSysACEs : dbSystemObject MSysCmdbars : dbSystemObject MSysObjects : dbSystemObject MSysQueries : dbSystemObject MSysRelationships : dbSystemObject T_グループ : T_住所録一般 : T_住所録勤務先 : T_住所録家族 : T_住所録自宅 : T_名簿 : T_差出人 : T_検索条件 : TMP_インポート :
となっています(出力結果はエディタで整形しています)。 おそらく普通のテーブルでは、何のAttributesも設定されていないと考えられます(つまり、Attributes=0)。
TableDefオブジェクトをループでまわそう - その3(Property.Type) | TOP |
それから、Property.Typeも同じやり方で表示するようにします。 上と同じタイプライブラリから抜き出した定数値は次のようになっています。 こっちは、さっきのように定数名(dbAttachExclusive)をそのまま返すのではなく、「メモ型」などのようにわかりやすい名称に変換するようにします。なので、すでに上のほうに示した表に定数値を追加した形で書き直すことにします。
dbBoolean | $00000001 | ブール型(Boolean) |
---|---|---|
dbByte | $00000002 | バイト型(Byte) |
dbInteger | $00000003 | 整数型(Integer) |
dbLong | $00000004 | 長整数型(Long) |
dbCurrency | $00000005 | 通貨型(Currency) |
dbSingle | $00000006 | 単精度浮動小数点数型(Single) |
dbDouble | $00000007 | 倍精度浮動小数点数型(Double) |
dbDate | $00000008 | 日付/時刻型(Date/Time) |
dbBinary | $00000009 | バイナリ型(Binary) |
dbText | $0000000A | テキスト型(Text) |
dbLongBinary | $0000000B | ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object) |
dbMemo | $0000000C | メモ型(Memo) |
dbGUID | $0000000F | GUID型(GUID) |
dbBigInt | $00000010 | Big Integer 型 (Big Integer) |
dbVarBinary | $00000011 | 可変長バイナリ型(VarBinary) |
dbChar | $00000012 | CHAR型(Char) |
dbNumeric | $00000013 | Numeric型(Numeric) |
dbDecimal | $00000014 | 10進型(Decimal) |
dbFloat | $00000015 | 浮動小数点数型(Float) |
dbTime | $00000016 | 時刻型(Time) |
dbTimeStamp | $00000017 | タイムスタンプ型(TimeStamp) |
これも定数宣言と、変換関数を作ることにします。 属性のように組み合わせるものではないので、case文で分岐させて結果を返すように作ります。
(* ============================================= function PrpertyTypeToStr(Prop: integer): string; ============================================= *) function PrpertyTypeToStr(APropType: integer): string; begin case APropType of dbBoolean : Result := 'ブール型(Boolean)'; dbByte : Result := 'バイト型(Byte)'; dbInteger : Result := '整数型(Integer)'; dbLong : Result := '長整数型(Long)'; dbCurrency : Result := '通貨型(Currency)'; dbSingle : Result := '単精度浮動小数点数型(Single)'; dbDouble : Result := '倍精度浮動小数点数型(Double)'; dbDate : Result := '日付/時刻型(Date/Time)'; dbBinary : Result := 'バイナリ型(Binary)'; dbText : Result := 'テキスト型(Text)'; dbLongBinary: Result := 'ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object)'; dbMemo : Result := 'メモ型(Memo)'; dbGUID : Result := 'GUID型(GUID)'; dbBigInt : Result := 'Big Integer 型 (Big Integer)'; dbVarBinary : Result := '可変長バイナリ型(VarBinary)'; dbChar : Result := 'CHAR型(Char)'; dbNumeric : Result := 'Numeric型(Numeric)'; dbDecimal : Result := '10進型(Decimal)'; dbFloat : Result := '浮動小数点数型(Float)'; dbTime : Result := '時刻型(Time)'; dbTimeStamp : Result := 'タイムスタンプ型(TimeStamp)'; else Result := 'UnKnown(' + IntToStr(APropType) + ')' end; end;
ほとんど同じコードですので、結果も同じ箇所を抜き出すことにします。 違いは、1回目がVarTypeAsText(正体不明。でも、DelphiはVarinants.VarTypeAsTextと表示している)を、2回目がPrpertyTypeToStr(自作)の関数を使用して、型名を取得しているところです。
------------------------------------------------------- i := 0 ------------------------------------------------------- False : Name : メモ型(Memo) : MSysAccessObjects False : Updatable : ブール型(Boolean) : True False : DateCreated : 日付/時刻型(Date/Time): 1999/03/09 16:47:56 False : LastUpdated : 日付/時刻型(Date/Time): 1999/03/09 16:47:59 False : Connect : メモ型(Memo) : False : Attributes : 長整数型(Long) : 2 False : SourceTableName : メモ型(Memo) : False : RecordCount : 長整数型(Long) : 223 False : ValidationRule : メモ型(Memo) : False : ValidationText : メモ型(Memo) : False : ConflictTable : メモ型(Memo) : False : ReplicaFilter : メモ型(Memo) : ------------------------------------------------------- i := daoDatabase.TableDefs.Count - 1 ------------------------------------------------------- False : Name : メモ型(Memo) : TMP_インポート False : Updatable : ブール型(Boolean) : True False : DateCreated : 日付/時刻型(Date/Time): 1999/02/03 18:06:53 False : LastUpdated : 日付/時刻型(Date/Time): 1999/02/03 18:06:54 False : Connect : メモ型(Memo) : False : Attributes : 長整数型(Long) : 0 False : SourceTableName : メモ型(Memo) : False : RecordCount : 長整数型(Long) : 0 False : ValidationRule : メモ型(Memo) : False : ValidationText : メモ型(Memo) : False : ConflictTable : メモ型(Memo) : False : ReplicaFilter : メモ型(Memo) : False : Orientation : バイト型(Byte) : 0 False : OrderByOn : ブール型(Boolean) : False False : NameMap : ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object) : ?? -------------------------------------------------------
こんなもんですかね。ここまででテーブル自体の設定値はそこそこ取れています。
このページで使用したソースコード | TOP |
次は、いよいよテーブル定義(フィールドの構成)に進むことにします。今までは、
daoDatabase.TableDefs[i].Properties[j].XXXXX
でしたが、これがさらに長くなって、
daoDatabase.TableDefs[i].Fields[j].Properties[k].XXXXX
となります。楽しみです。それから、ココまでに記述したソースコードも記念に置いときます。
EOF | TOP |