- ベストアンサー
レコードの位置を指定する方法について
- Access2007でDAOを使用してレコードの位置を指定する方法について質問があります。
- 現在のコードでは、rs.AbsolutePositionに値を渡してレコードにデータを挿入していますが、表示される結果が異なっています。
- 正しく値が渡されていない可能性があるので、コードを確認しましたが、問題は見つかりませんでした。どなたか解決策を教えていただけないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
データベースを取り扱う時に、良くある誤解の一つのせいです。 データベースのテーブルをファイルと同じように考えると、このようなミスをやります。 ファイルの場合は、いったん書き込みをしたら、変更しない限りは、レコードの順番が変わったりすることはありません。何度開き直しても、常に同じ順番で同じデータを返すことが保証されています。ですから、レコード番号の意味があります。 データベースのテーブルの場合は、テーブルに入れたデータは、単なる集合です。ここで集合という用語を使うのは、このレコード群には、「順番」がないんです。ですから、データの書き換えをしなくても、前に見た時と、今回見た時には、データの順番が違うことがあります。順番を保証しないので、たとえ、画面で見た時に、同じ順番で返してくれているように「見えても」、前提としては、今回のレコードセットと前回のレコードセットでは順番が変わると考えてプログラムは組まなければなりません。 今回の場合は、手順の1・2・3で、当然、レコードセットは開き直しているはずです。この3回のレコードセットでのレコードの順番は、全部違います。(偶然、同じような順番になることもありますが、あくまで偶然です。偶然の比率は実は結構高いんですけどね。) ここで、MSDNから、AbsolutePositionの説明の一部を引用します。 >AbsolutePosition プロパティを使うと、Recordset オブジェクト内の位置に基づいて特定のレコードに移動したり、カレント レコードの位置を決定することができます。 この説明通り、Recordsetの位置を決定するものなんです。たとえ、同じテーブルから同じ方法で生成したRecordsetでも、それは、違うレコードセットであり、AbsolutePositionの値を共用することはできません。 これは、次の説明にあります。 >注意 AbsolutePosition プロパティで、レコード番号の代用はできません。レコードの位置は、上位のレコードを削除すると変更されます。また、Recordset オブジェクトを再びクエリしたり開いたときに、レコードが AbsolutePosition の値と同じになるとは限りません。所定の位置を保持し、そして戻るにはブックマークを使います。ブックマークは、すべての型の Recordset オブジェクト間で位置を決定できる唯一の方法です。 はっきり書いてありますね。レコード番号の代用は出来ません。 ちなみに、acsessの場合は、ここにも書いてあるようにブックマークをこのかわりに使うことが出来ます。が、これも実は、結構使いでが制約されます。 データベースを取り扱う時に、レコードの順番が意味を持つ場合は、クエリで明確に順序を指定します。(そのための句がorder by句です。) そして、レコードを特定する時には、常に、主キーを使用します。レコードセットから、特定の行を特定する場合は、主キーの値を基本として、findメソッドでカーソルを移動することになります。 ソート順をちゃんと指定した場合でも、テーブルの更新によりレコードの順位が変わりますから、ソート順を指定してAbsolutePositionの値をレコード番号として使うという手法はやめた方が良いです。
その他の回答 (1)
- hatena1989
- ベストアンサー率87% (378/433)
下記のリンク先を熟読してください。 [ACC2003] MDB のレコードの並び順について http://support.microsoft.com/kb/834927/ja データベースは一般的にそうなのですが、入力順というのを保持していません。 並び替えを指定していない場合、次に開くときに入力順に開くとは限りません。 大量のデータを効率的に扱うためにそのような仕様になっています。 テーブルに並び順を決定するフィールドかオートナンバー型のフィールドを追加して、それを主キーにします。 主キーをもとにレコードを特定して値を入力するようにしてください。 フォームで開くときには、主キーフィールドで並び替えを設定します。
お礼
ご回答ありがとうございます。 もっとしっかり調べれば分かることでしたね。 非常に助かりました。ありがとうございました。
お礼
ご回答ありがとうございます。 基本的な勉強不足でした。 大変適切な回答でよく理解できました。 本当にありがとうございました。