現象 | 対応等 |
---|---|
同名のレポートをデザインビューで開くとフォームビューのフォームが閉じる | 対応策なし |
Option Compare Binaryで漢字がユニコード順で大小比較される、ヘルプではシフトJISとなっている | ヘルプの間違い |
Option Compare DatabaseでLike演算子の文字範囲指定に漢字を指定した場合、比較順序が比較演算子と異なりユニコード順になる | 対応策なし |
KeyPressイベントでKeyAscii=0としてもFEPの入力をキャンセルできない | 次期バージョンで対応 |
Err.Raise vbObjectError+1050とすると、1050番のエラーが発生するとヘルプには書いてあるが実際にはvbObjectError+1050のエラーが発生する | ヘルプの間違い VB5も同様 |
Err.Raise vbObjectError+513で、96番のエラーが発生する。この番号はVB5のオンラインヘルプで指示している番号であり、このバグのためにActiveXのエラー処理が正常に働かない可能性もある。 | 対応策なし |
Commitで引数にdbFlushOSCacheWritesを指定するとエラーになる | dbForceOSFlushの間違い |
レポートでグループ毎にページ番号とグループ内のページ数を表示する方法
レポートの機能を使って、グループ毎にページ番号とページ数を印刷することができます。レポートでは[Pages]を使って全体のページ数を各ページに印刷することができますが、この時Accessは全ページを2回スキャンしています。これを利用して1回目のスキャンで各グループのページ数を配列に保存しておき、2回目のスキャンで配列からページ数を取り出してコントロールに値をセットするのです。
具体的には、レポートに以下のプロシージャを記述してください。そうすれば[ページ数表示]というコントロールに表示されます。注意点として[Pages]をダミーで配置させておくことです。[ページ数表示]は、ページヘッダ・ページフッタどちらでもOKです。
1 | Option Compare Database |
レポートで複数レコードを横一行に表示させる方法
通常、詳細セクションは次のレコードに移るときに行を換えてしまいますが、MoveLayout プロパティを False に設定することで同じ行に重ね打ちします。さらに、コントロールの Left プロパティを設定すると印字する左右の位置を設定できますので、この2つを使うと複数レコードを横一行に印字できます。
下の例は、dataというフィールドがあるテーブルの複数レコードを一行に印字する例です。実際には、右いっぱいになったら改行するとか、別のフィールドでグループ化して改行するとかを考慮する必要がありますがこれは簡単にできるでしょう。
1 | Option Compare Database |
切り捨て・切り上げ・四捨五入
下の例は0に関して対称に丸めます。切り上げに関しては0.9を足して切り捨てをする方法がNifty Forumに紹介されているのを見かけますが間違いですので気をつけてください。
1 | '切り捨て |
リンクテーブルで Seek を使う方法
レコードセットで検索をする場合、FindFirstよりもIndexを使ったSeekを使ったほうが速いとされています。Seekを使うためには、dbOpenTableを指定してレコードセットを開く必要があります。次の手順を参考にしてください。
1 | Set db = DBEngine(0).OpenDatabase("テーブルを保存しているファイル") |
トランザクションと定義域集合関数
トランザクション中に定義域集合関数を使う場合には注意が必要です。トランザクションを開始してから加えた変更は DLookup などの定義域集合関数には反映されません。それに対し、Recordsetオブジェクトを使った場合はコミットする前でも変更が反映されます。
以下のサンプルはトランザクション中で、レコードのないテーブルに一件のレコードを追加し、これをDLookupとRecordsetの2つの方法で表示させようというものです。フィールド:f1を持つテーブル:T1を予め作成してこのプロシージャを実行してください。
1 | Sub Temp() |
トランザクションとRunSQLメソッド
RunSQLメソッドではトランザクションが効きません。トランザクション中ではExecuteメソッドを使う必要があります。
以下のサンプルはトランザクション中に、レコードのないテーブルに一件のレコードを追加し、ロールバックでもとに戻すものですが、RunSQLメソッドを使った場合は元に戻らず、トランザクションが効いていないことがわかります。フィールド:f1を持つテーブル:T1を予め作成してこのプロシージャを実行してください。RunSQLの行をコメントにして、Executeメソッドの行のコメントを外して実行するとロールバックで元に戻ります。
1 | Sub Temp() |