お世話になります。
今時、DAOを使ってMS-ACCESSのMDB形式のテーブルレコードを下記のコードのような感じでリー
ドしようとしているのですが
例えば、伝票の明細行レコードなど同一のインデックスキー(伝票番号など)を持つレコードが
複数存在している時には
第2優先インデックスフィールド(行番号)などを設定して、その順に呼び出すことはできない
でしょうか?
現時点では、同一伝票番号をもつ明細行レコードを物理的に書かかれている順でしか読めてない
のですが・・・^^;
何卒ご教授下さいませ。よろしくお願いします。
COleVariant vaKey, varField, varCurrentPos;
varCurrentPos = m_daoRecordset->GetBookmark();
m_daoRecordset->SetCurrentIndex(_T(伝票番号));
varKey = denpyoNumber;
if (!m_daoRecordset->Seek(_T(=), &varKey)) { // NOT FOUND;
m_daoRecordset->SetBookmark(varCurrentPos); // Return to saved position
AfxMessageBox(明細データが存在しません。, MB_OK);
return FALSE;
}
long dNum;
// 同一伝票番号の明細行レコードのフィールドを順に処理~リードする
do {
varField = m_daoRecordset->GetFieldValue(行番号);
・・・・
varField = m_daoRecordset->GetFieldValue(商品名);
・・・・
varField = m_daoRecordset->GetFieldValue(数量);
・・・・
varField = m_daoRecordset->GetFieldValue(単価);
・・・・
m_daoRecordset->MoveNext(); ←★ この読出しを行番号順に行えませんでしょうか?
if (m_daoRecordset->IsEOF())
break;
varField = m_daoRecordset->GetFieldValue(伝票番号);
dnum = V_I2(&varField);
} while (dNum == denpyoNumber);
A.伝票番号と行番号の2つをあわせて1個のインデクス作成、キーにする
B.Seek(dbOpenTable)をやめて、FindFirst(dbOpenDynaset Or Spanshot)にする
の、どっちかしかないんじゃないですかね。。
とざ様
アドヴァイスありがとうございます。
>A.伝票番号と行番号の2つをあわせて1個のインデクス作成、キーにする
これは例えば、伝票番号が4桁で行番号が2桁であれば、伝票番号+行番号
とかの名前でテキスト型6桁のフィールドを設けて
それをインデックスキーに設定してSeekするということですよね?
そうすれば、重複を許さない設定にしておいてもいいでしょうけど・・・
それとも、レコードフォーマットはいらわずに、既存の別々の2つのフィールドを
合わせたインデックスだけ作成・設定できて、Seekできるのでしょうか?
できれば後者のやり方が可能であれば、それにこしたことはないのですが
今のところ、自力では「dbOpenTable」では、前者のやり方しかできそうもない
気がしています。^^;
>B.Seek(dbOpenTable)をやめて、FindFirst(dbOpenDynaset Or Snapshot)にする
これは、当然?先ず下のような?SQLのSELECTステートメントを使ってオープンする
ということですか?
SELECT * FROM 伝票明細テーブル WHERE 伝票番号 = ????
みたいな↑感じでよかったでしょうか?
ダイナセットの操作(FindFirst?等)は、まだ慣れてないんですけど
(スナップショットとはどのようなものか?も、よくわかっていませんが^^;)
それから次に行番号順に読めますか?
しかし「dbOpenTable」でも同一キーフィールドを持つレコードが複数あれば
第2優先のインデックスも作れて、次にその順でリードできる機能くらい
DAOに備えておいてくれてないんですかね?マイクロソフトめ~(苦笑)
ADOなどは、どうなんでしょうか?今後そちらも学習したいと思っているのですが・・・
> 既存の別々の2つのフィールドを
> 合わせたインデックスだけ作成・設定できて、Seekできるのでしょうか?
はい、既存のフィールドに対してインデックスだけを作成するという意味でした。
> SELECT * FROM 伝票明細テーブル WHERE 伝票番号 = ????
Order By 伝票番号,行番号
を付加という意味でした。
うっかりしてました。
ADOはについては、わからないので、コメントできませんが、
その前にRDB(ORACLEなりSQLServerなりAccessMDBなり)について、
(もうちょっと)勉強したほうが、わかりやすそうな気がします。
DBにアクセスするためのものですから、
出来ることがDBに依存してしまうと思うので。
とざ様
お世話になります。
>既存のフィールドに対してインデックスだけを作成するという意味でした。
離れた別々のフィールドを合わせたインデックスのみを作成できるのですか?
ならば、もしやり方ご存知でしたらご教授下さい。今の自力ではMSDNヘルプや
手元の何冊かの本では探し当てられないんです~^^;
>RDBについて勉強したほうが、わかりやすそうな気がします。
そうですね。^^;まだまだ甘いですので、頑張ります。
> 離れた別々のフィールドを合わせたインデックスのみを作成できるのですか?
”離れた”が何を意味するのかわからないのですが、
同一テーブルであれば、2つのフィールド分の1つのインデックスを作成できます。
Access97では、テーブルのデザイン画面で、
メニューバーの「表示」→「インデックス」で設定画面が開きます。
#”新規に”一つのインデックス名を入力して、2つのフィールド名を入力します。
。。。画面構成からは、
1つのインデックスに対して、1つのフィールドしか設定できないように見えますけど、
出来ます。
#HelpでDAOのIndexesオブジェクトをみると、
Indexesオブジェクトは、Fieldsコレクションを持つことから、
Fieldオブジェクトが複数もてるようになっているのがわかると思います。
とざ様
お世話になります。
>#”新規に”一つのインデックス名を入力して、2つのフィールド名を入力します。
> 。。。画面構成からは、
> 1つのインデックスに対して、1つのフィールドしか設定できないように見えますけど
> 出来ます。
2つのフィールド名を入力するというのは、半角スペースか何かで区切ってでしょうか?
今のところ、閉じてまた開いたらインデックス名だけ残っていて、入力したつもりの
2つのフィールド名は消えていて空になっています。
複数フィールド名入力の場合、入力ルールなどがありますか?
とざ様
すいません。ヘルプとかも見ていたら、やり方わかったような気がします。
2番目以降のフィールド名は、インデックス名は空白のままで
フィールド名だけ下の行に書き足していくんですね?
> 2番目以降のフィールド名は、インデックス名は空白のままで
> フィールド名だけ下の行に書き足していくんですね?
そうですそうです!
、、、説明ヘタですんません;;
とざ様
お世話になります。
>、、、説明ヘタですんません;;
とんでもないです。
十分なところまでお答え下さり、本当に助かりました。
わからなければインデックス用に余計なフィールドを設けるとこでした。^^;
今更ながら、MS-ACCESSでも今時必要十分なことはできるみたいですね。
やはり、ただのISAMに比べてRDBのパワーって凄いですね。(苦笑)
今は名前だけしかまだ知りませんが^^;OracleやDB2とかって
それぞれ特有の使うメリットがあるんでしょうね?
これからコツコツ勉強頑張りたいです。
この度は、ありがとうございました。