2015年2月13日金曜日

[MSAccess] クエリの入力には、1つ以上のテーブルまたはクエリが必要です

SELECT 句にサブクエリが含まれると、エラーとなる場合がある。

(エラーとなるサンプル)
SELECT
  Now As 日付,
  (SELECT Price FROM テーブル1 WHERE code='0001') As 時価

エラーメッセージ:[3067] クエリの入力には、1つ以上のテーブルまたはクエリが必要です。

Access SQL では、こういう場合に無用なダミーテーブルを準備する必要はない。ただし迂回策として、サブクエリの代わりに DLookup 関数を使う方法がある。

(修正したSQL)
SELECT
  Now As 日付,
  DLookup("Price", "テーブル1", "code='0001'") As 時価


■ 参考資料

[ACC2003] DLookup() の使い方、例、トラブルシューティング
http://support.microsoft.com/kb/285866/ja

2015年2月12日木曜日

[MSAccess] オブジェクトが正しくないか、現在設定されていません

CurrentDb メソッドを使って DAO オブジェクトの参照を取得した場合に、エラーが発生することが多い。

(エラーとなるサンプル)
Dim Table As DAO.TableDef
Set Table = CurrentDb.TableDefs("テーブル1")
Debug.Print Table.Name

エラーメッセージ:[3420] オブジェクトが正しくないか、現在設定されていません。

マイクロソフト サポート情報によると、これは CurrentDb メソッドの参照を明示的に変数に代入してから使用する必要がある、とのこと。

(改善例)
Dim DB As DAO.Database
Set DB = CurrentDb()
Dim Table As DAO.TableDef
Set Table = DB.TableDefs("テーブル1")
Debug.Print Table.Name


これだとバグとしか思えないんですが、言語仕様なんでしょうか・・

■ 参考資料

ACC: "Object Invalid or No Longer Set" Error Using CurrentDb
http://support.microsoft.com/kb/167173/ja

2015年2月9日月曜日

[MSAccess] 数値の出力フォーマット

SELECT 句などで数値の出力フォーマットを指定したい場合は、FormatNumber 関数が利用できます。

(例)
SELECT FormatNumber(12345, 2, True, False, True) As Value1
パラメータの意味は順に、出力する値/少数は2桁/小数点の左側の 0 を表示/負の値をかっこで囲まない/桁区切り記号を使用する

(出力結果)
Value1
---------
12,345.00


値がNullの場合は空欄で出力されます。

■ 参考資料

FormatNumber 関数 (Visual Basic)
https://msdn.microsoft.com/ja-jp/library/xfta99yt.aspx

[MSAccess] クエリ定義の SELECT で指定されている別名が循環参照を発生させています

関数を使う項目にカラムと同名で別名を付ける場合は、循環参照となってしまう。

(例)
SELECT Min(価格) As 価格
[エラーメッセージ] クエリ定義の SELECT で指定されている別名 '価格' が循環参照を発生させています。


これは、Microsoft Access では SELECT 句内の項目を参照できるために発生するもので、この解決方法としてはカラムがあるテーブル名を指定してやれば良い。

(対策例)
SELECT Min([商品].価格) As 価格


この仕様を利用すると、Oracle等では1階層のクエリでは実装できないことができる。

(例)
SELECT
  1 AS COL1,
  2 AS COL2,
  COL1 + COL2 AS COL3

ORA-00904: 'COL1' 無効な識別子です。

Microsoft Access であれば、SELECT 句内の項目は参照することができるので、このSQL は実行可能である。

上記SQLの結果
COL1 COL2 COL3
---- ---- ----
1    2    3

2015年2月7日土曜日

[MSAccess] テーブル レコードの並び順を変更する

リレーショナル型データベースにおいて、テーブルのレコードは通常ならば並び順は何も保証されないが、Microsoft Access のデータシート ビューでは、行の並び替えを指定することができる。

1.プロパティを指定する

テーブルのデザイン ビューを開いて プロパティシート を開き、「並び替え(OrderBy)」項目に、ソートする項目を記述します。複数の項目でソート順を指定する場合は、コンマで区切ります。
(例)col1, col2

VBA等のプログラム側から設定するには、DAO.Property の OrderBy プロパティを変更する
CurrentDb.TableDefs("テーブル1").Properties("OrderBy").Value = "フィールド1"

2.主キーを指定する

主キーの本来の用途ではありませんが、主キーはデータシート ビューにおいて暗黙的な並べ替えを行います。

3.(その他の手段)編集可能なクエリを使用する

クエリに並び替え(ソート順)を指定すれば、もちろんソートされます。またテーブルの結合や集約などが無いクエリであれば、クエリのデータシート ビューからデータの編集が可能です。

■ 参考資料

[ACC2003] MDB のレコードの並び順について
http://support.microsoft.com/kb/834927/ja

テーブルの概要
https://support.office.microsoft.com/ja-jp/article/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E6%A6%82%E8%A6%81-78ff21ea-2f76-4fb0-8af6-c318d1ee0ea7?CTT=5&origin=HA102809525&CorrelationId=e502ec4d-3485-49d2-aabd-7fdf708a4eef&ui=ja-JP&rs=ja-JP&ad=JP#__migbm_12
並べ替え 1 つ以上のフィールドを選択して、データシート ビューでの行の既定の並べ替え順を指定します。