性格いい人が優勝

Access 2013 vba
メイン画面に、2つのサブフォーム(共に帳票)があり
親→子→孫
となっています。
この時、親、子、孫のレコードを取得して
ある書類を作成しエクセルに出力しようとしています。

この場合、親のデータは普通に変数Aに入れて
子のデータは一次元配列B()に入れ
孫のデータは一次元配列C(0)~C(3)に入れたものを、更に子用の一次元配列B1()~B4()に入れるように作りにしようと考えています。
この場合、
子の画面で次の2レコード目に進んだ時、子画面用のB1...B4の配列変数に入れている孫のC(0)~C(3)の配列の中身は、子画面の一レコードと二レコード目では同じものになるのでしょうか。

もし、同じものになるのであれば、この方法は使えないと思っていますが。。。
他に何か良い方法はありますでしょうか。
Accessで、クラスを作って、それを配列変数に入れるとか・・・

よろしくお願いします。

A 回答 (3件)

細かいことですが「RecordsetClone」は「変数」ではなくて「プロパティ」です。


さて、本題ですが、

> 一つお聞きしたいのですが、RecordsetClone変数だと、フィールド更新後に使うと、値が古いものが取得されてしまい、うまく計算が出来ない時があります。

フィールドは更新したが、まだレコード保存していない状態だとそうなるかもしれません。
フィールドを更新して、それを参照して使用する場合は、事前にレコード保存してテーブルに格納しておくべきですね。

テーブルに格納せずに、エラーや操作ミスで終了してしまった場合、テーブルの値と参照使用した値に矛盾が生じてしまう可能性があります。

フィールドを更新した場合は、RecordsetClone でデータを参照する前に、
DoCmd.RunCommand acCmdSaveRecord
でレコード保存しておくといいでしょう。。

Me.Recordset だと、レコードセットでの操作(レコード移動など)が直接フォームに影響を与えてしまうので、
処理が重くなるので避けるべきです。

他にもフォームのレコードセットを参照する方法として、RecordSet.Clone があります。

「フォームの Recordset, RecorsetClone, RecordSet.Clone の違い」はWEB検索すると詳しい解説が見つかると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

RecordsetCloneを取得する前に、レコード保存をする・・・
これをしているとうまく処理ができています。ありがとうございます。

>「フォームの Recordset, RecorsetClone, RecordSet.Clone の違い」はWEB検索すると詳しい解説が見つかると思います。

こちらは、参照してみました。処理速度の違いもあるということですね。ありがとうございます

お礼日時:2015/01/13 17:30

Accessのテーブルデータを他のアプリケーションに渡す一つの手法としてユーザー定義型(C言語の構造体)を利用する手があります。

その場合、

BSave(変数名)

などの関数で、バイナリーデータとして一気に吐き出し

BLoad(変数名)

などの関数で、バイナリーデータを変数に一気に取り込むことも可能です。

http://www.cc.kyoto-su.ac.jp/~yamada/pB/struct.h …

質問の案件では、構造体をメンバにする構造体を作成することになるかと思います。
    • good
    • 0
この回答へのお礼

fa007さん、ご説明ありがとうございました。

ご説明していただいた構造体.構造体変数を使いました。

またよろしくお願いします。

お礼日時:2015/01/12 15:40

RecordsetCloneプロパティで直接フォームのレコードセットにアクセスできます。


あるいは、レコードソースのテーブルをレコードセットとして開いてアクセスすることもできます。

レコードセットは、配列の高機能版と考えられるので、わざわざ配列に格納したり、クラスを作成するという手間をかける必要はないでしょう。
    • good
    • 0
この回答へのお礼

hatenaさん、ご回答ありがとうございます。

親フォームに複数のサブフォームが有り、そこからまた、マスターの値などを取得しなくてはいけなくて、なかなか複雑になりそうなので、RecordsetCloneを使うのと、同時に、構造体の構造体変数も使う事になりました。

一つお聞きしたいのですが、RecordsetClone変数だと、フィールド更新後に使うと、値が古いものが取得されてしまい、うまく計算が出来ない時があります。

この時には、Me.Recordset
で画面に直結したレコードセットを取得して値を取得するようにしましたが、これでもよろしいのでしょうか?

不都合があるとすれば、間違ってCloseしてしまうと、画面もエラーになってしまうぐらいかなと思いますが・・・

よろしくお願いします

お礼日時:2015/01/12 15:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す