• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MDBレコードの並べ替え)

MDBレコードの並べ替え

このQ&Aのポイント
  • MFC6.0のCDao***クラスでAccess2000のMDBファイルを作成する方法
  • 日時フィールドをキーにレコードを昇順に表示させる方法
  • プログラム内でAccessのテーブルプロパティを設定する方法

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.2

そしたら ・MDB出力時・・・CDaoTableDef ・ユーザ参照時・・・CDaoQueryDef として、レコードセットクラスは2つ持つようにします。 CDaoQueryDef については、 仮に変数 db を CDaoDatabase 、 #define MYTABLE "XXTABLE" //テーブル名 #define MYDBDATE "XXDBDATE"//ソートフィールド名 とすると CDaoQueryDef query(&db); CString strSql; strSql.Format("SELECT * FROM %s ORDER BY %s", MYTABLE, MYDBDATE); query.Create(NULL, strSql); てな感じで。(打ちミスがあったら失礼) アクセスのデータシートビューのプロパティはMFC からの操作は基本的にできません。DAOSDKやらの 少しイレギュラーな技でやるらしいです、というより VCから操作すること自体があんまり推奨されてない みたいです。(VBだと普通にOK) アクセスのJetデータベースは標準的なDB操作から 少しハズれているので、特殊な事情がよくあったりする。 『DAOオブジェクトのOLEインターフェース』ってな 言葉あたりにヤタラに詳しそうな人がいたら、テーブル プロパティ操作を試してみてもいいかも知れません。 一般的なDB操作としては、こんなモンだと思われます。

secma
質問者

お礼

あああ、ありがとうございますぅ(^_^)!!! それにしても、MFCでプロパティを操作できないなんて、う~ん。 もう1つおまけに、質問させてください。これまでの私のやりかたでは CDaoTableDefで作成したテーブルにCDaoRecordset::SetFieldValue()で データ収集したシステム日時を含んだデータを出力しているのですが 何故か出力順どおりにレコードが並びません。 これって、プライマリキーもなにも設定せずに出力すると出力順 (日時昇順)にはならないのでしょうか? 一定時間システムを稼働させて収集したデータをAccessで開いてみると、 突然レコードが入れ替わっている個所があるのです。 キーを設定しなくとも、出力順になっているものだとばかり思っていた ので、これは出力方法を変えなければいけないのだ!と、 最初の質問をさせていただいたのです。 私のやりかたでは、出力順序は保証されないのでしょうか? データベースプログラミング恐るべし!

その他の回答 (2)

noname#2009
noname#2009
回答No.3

つまり 「ユーザーは気分次第でMDBファイルをアクセスで直接 見る」 ということとゆーことで? キーが特に設定されていないのであれば、インデックスを 日時フィールドに作ってください。CreateIndex() で 重複可能の指定で。 ただ、何も無ければ本来追加レコードは最終行に追加 されると思うので、確かに元々追加順のような気がする のですが。レコード番号が変わるのは他のフィールドに 何か設定がされてるのではないかという気もします。 データベースファイル自体は、本来ユーザインター フェースから隠蔽されているものなので、レコード番号を 意識するのは、どっちかというとパフォーマンス等を 考える場合なので。 正直そういう部分の保障というのは、あんまりピンと 来ないかなという感じです。

secma
質問者

お礼

cheさん、いろいろご親切にほんっとうにありがとうございました。 おっしゃるとおり「ユーザーは気分次第でMDBファイルをアクセスで 直接見る」ということです! まだ解決はしていないのですが、とりあえず、今回教えてくださった 方法のCreateIndex()について調べてみようかと思います。 はぁ、まだまだ勉強不足です。次回もまたお会いできることを願って!ます。 ありがとうございました。

noname#2009
noname#2009
回答No.1

データの参照をするときには多分 CDaoRecordset( 若しくはその派生クラス) を使っているんだと思われ ますが、その中で 1.Open() の第1引数で CDaoTableDef を使用 2.Open() の第2引数で SQL文を使用 3.Open() の第2引数をNULL の方法のどれかだとすると 1.CDaoQueryDef の使用に変える。クエリーは   ソート定義のSQLで作成する 2.SQLをソートにする 3.GetDefaultSQL() にソートのSQL文でオーバー   ライドする が、それぞれの対処です。 ソートのSQL文はテーブル名を「XXTABLE」、ソート フィールドを「dbDate」とすると "SELECT * FROM XXTABLE ORDER BY dbDate" です。 ただ根本的に >CDao*** ・・・CDaoDatabase と他には何を使用? >Access2000のMDBファイルを作成するプログラム・・・ MDB自身は既存で中のデータを作成? >ユーザーが参照したとき ・・・自作アプリでの表示方法? ってな辺りが、ちょっと把握できてないのでこんなモン しか言えません。全然違ったら残念。 一応参考までに、この辺のURLを。。 「検索ボタンのハンドラ」ってところを、よろしければ どうぞ。

参考URL:
http://kanon.plala.jp/develop/db.html
secma
質問者

補足

che さん!!!ありがとうございます!(;_;) 今回が初めてのデータベースプログラミングなので、毎日ハマリまくり なのです。本当に助かります! CDaoQueryDefを使ってみようと思います。が、またまた質問です。 CDaoDatabase、CDaoTableDef、 CDaoRecordset を今まで使って いましたが CDaoQueryDef を使うとすると、日時用フィールドの作成は どのようにしたら良いのでしょうか? CDaoQueryDef::Create() だけではモチロン、フィールドは 作成されませんよね?従来のCDaoTableDef::CreateField()に 相当する操作はどうしたら良いですか? 作成中のアプリでは、ある方法で収集したデータを連続的に MDBに出力して、ユーザーは任意のタイミングでそのMDBを参照します。 そのときの表示を日時昇順でおこないたい、というものです。 大変申し訳ないですが、ご教授よろしくお願いします!

関連するQ&A