- ベストアンサー
MDBレコードの並べ替え
- MFC6.0のCDao***クラスでAccess2000のMDBファイルを作成する方法
- 日時フィールドをキーにレコードを昇順に表示させる方法
- プログラム内でAccessのテーブルプロパティを設定する方法
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
そしたら ・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操作としては、こんなモンだと思われます。
その他の回答 (2)
つまり 「ユーザーは気分次第でMDBファイルをアクセスで直接 見る」 ということとゆーことで? キーが特に設定されていないのであれば、インデックスを 日時フィールドに作ってください。CreateIndex() で 重複可能の指定で。 ただ、何も無ければ本来追加レコードは最終行に追加 されると思うので、確かに元々追加順のような気がする のですが。レコード番号が変わるのは他のフィールドに 何か設定がされてるのではないかという気もします。 データベースファイル自体は、本来ユーザインター フェースから隠蔽されているものなので、レコード番号を 意識するのは、どっちかというとパフォーマンス等を 考える場合なので。 正直そういう部分の保障というのは、あんまりピンと 来ないかなという感じです。
お礼
cheさん、いろいろご親切にほんっとうにありがとうございました。 おっしゃるとおり「ユーザーは気分次第でMDBファイルをアクセスで 直接見る」ということです! まだ解決はしていないのですが、とりあえず、今回教えてくださった 方法のCreateIndex()について調べてみようかと思います。 はぁ、まだまだ勉強不足です。次回もまたお会いできることを願って!ます。 ありがとうございました。
データの参照をするときには多分 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を。。 「検索ボタンのハンドラ」ってところを、よろしければ どうぞ。
補足
che さん!!!ありがとうございます!(;_;) 今回が初めてのデータベースプログラミングなので、毎日ハマリまくり なのです。本当に助かります! CDaoQueryDefを使ってみようと思います。が、またまた質問です。 CDaoDatabase、CDaoTableDef、 CDaoRecordset を今まで使って いましたが CDaoQueryDef を使うとすると、日時用フィールドの作成は どのようにしたら良いのでしょうか? CDaoQueryDef::Create() だけではモチロン、フィールドは 作成されませんよね?従来のCDaoTableDef::CreateField()に 相当する操作はどうしたら良いですか? 作成中のアプリでは、ある方法で収集したデータを連続的に MDBに出力して、ユーザーは任意のタイミングでそのMDBを参照します。 そのときの表示を日時昇順でおこないたい、というものです。 大変申し訳ないですが、ご教授よろしくお願いします!
お礼
あああ、ありがとうございますぅ(^_^)!!! それにしても、MFCでプロパティを操作できないなんて、う~ん。 もう1つおまけに、質問させてください。これまでの私のやりかたでは CDaoTableDefで作成したテーブルにCDaoRecordset::SetFieldValue()で データ収集したシステム日時を含んだデータを出力しているのですが 何故か出力順どおりにレコードが並びません。 これって、プライマリキーもなにも設定せずに出力すると出力順 (日時昇順)にはならないのでしょうか? 一定時間システムを稼働させて収集したデータをAccessで開いてみると、 突然レコードが入れ替わっている個所があるのです。 キーを設定しなくとも、出力順になっているものだとばかり思っていた ので、これは出力方法を変えなければいけないのだ!と、 最初の質問をさせていただいたのです。 私のやりかたでは、出力順序は保証されないのでしょうか? データベースプログラミング恐るべし!