Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルデバッグでは正しいのですが
記事No10734
投稿日: 2011/04/14(Thu) 21:48
投稿者みよ
解決済: ON
OS:winXP_sp3
Access Version:2002
SQLserver:2005

御世話になります

SQLサーバーとMDBをリンクテーブルでつなぎ使用しています

今回ADOでレコードセットを作成して
フォームのソースにしようとしています

開く直前にイミディエイトウインドにデバッグさせると
レコードセットの中身を正しく表示しますが
フォーム上のテキストボックスではエラーと表示されます

これだけでは分かりにくいかもしれませんが
心当たりがありましたら、ご教示ください

タイトルRe: デバッグでは正しいのですが
記事No10735
投稿日: 2011/04/14(Thu) 23:10
投稿者コルネ
解決済: ON
>> デバッグでは正しいのですが
> 開く直前にイミディエイトウインドにデバッグさせると

イミディエイトウインドにフォーム上のテキストボックスの値を表示させたら正しかったのですか?

タイトルRe^2: デバッグでは正しいのですが
記事No10736
投稿日: 2011/04/15(Fri) 09:05
投稿者みよ
解決済: ON
ご回答ありがとうございます

> イミディエイトウインドにフォーム上のテキストボックスの値を表示させたら正しかったのですか?

フォームの、開く、イベントでレコードセットを作っています
そのイベントの最後で、確認のため
デバッグさせてます

rs2.MoveFirst

Do Until rs2.EOF

Debug.Print rs2!SID, rs2!hiniti_1, rs2!hiniti_2, ・・・・

rs2.MoveNext

Loop

その後で自己フォームにセットしています

Set Me.Recordset = rs2

このときのデバックプリントでは正常なのですが
フォームのソースとしてテキストボックスに反映されていないんです

分かりにくくてすいません、よろしくお願いいたします。

タイトルRe^3: デバッグでは正しいのですが
記事No10738
投稿日: 2011/04/15(Fri) 16:15
投稿者HANK
解決済: ON
ご参考に
文書番号: 281998 - 最終更新日: 2005年6月10日 - リビジョン: 4.2
[ACC2003] Microsoft Access フォームを ADO レコードセットに連結する方法 
http://www.accessclub.jp/bbs6/wforum.cgi?no=10736&reno=10735&oya=10734&mode=msgview&page=0

タイトルRe^4: デバッグでは正しいのですが
記事No10739
投稿日: 2011/04/15(Fri) 18:10
投稿者みよ
解決済: ON
HANK様ありがとうございます

> [ACC2003] Microsoft Access フォームを ADO レコードセットに連結する方法

上記を参考に、作っていたレコードセットは、テーブルを基にしたSQL文を
レコードソースにして、フォームのソースとして使っていました

今回は、フィールド名を動的に作って値を入れて行き、
全体をループさせてレコードセットを作りましたらうまくいかないのです

下が他のフォームで使えていたレコードセット
(変数の宣言は省きます)
(コネクションはmyconectとしてグローバル変数に"Provider=Microsoft.Access.OLEDB.10.0"
としてセットしてあります)

    mySQL = ""
mySQL = mySQL & "SELECT MT_D015syain.ID," _
& " FROM MT_D015syain" _
& " WHERE (((MT_D015syain.Live)=1));"

cn2.Open myconect

Set rs = New ADODB.Recordset

With rs

Set .ActiveConnection = cn2
.Source = mySQL
.LockType = adLockOptimistic
.Open

End With

上記を Set Me.Recordset = rs とするとフォームのソースにセットはできて、使えました
ここからですが
上記の社員ID(MT_D015syain.ID)を使って下記のように

Set rs2 = New ADODB.Recordset

start_bi = Date

With rs2.Fields

.Append "SID", adInteger
.Append "sya_name", adVarChar, 30

'レコードセットに記録先フィールドを個数分作る
For f_na = 1 To 6

.Append ("hiniti_" & CStr(f_na)), adVarChar, 30

Next f_na

End With

rs2.Open

'社員IDの数分をループ
Do Until rs.EOF

rs2.AddNew

rs2!SID = rs!ID

'記録先のフィールドを最後まで進める
For N_na = 1 To 6

toujitu = start_bi + N_na - 1

syoukei = Dsum("kou_suu" , "dbo_MT_K011kou_jisseki" ,"ID=" & rs!ID)

rs2.Fields("hiniti_" & CStr(N_na)) = syoukei

Next N_na

rs2.Update
rs2.MoveNext

rs.MoveNext
Loop

こうすると、最後にデバッグした時、全レコードの全フィールドが
正常にイミディエイトウインドに表示されますが、
ソースとしては使用できない、となります
よろしくご指導ください。

タイトルRe^5: デバッグでは正しいのですが
記事No10740
投稿日: 2011/04/16(Sat) 01:05
投稿者hatena
解決済: ON
> Set rs2 = New ADODB.Recordset
>
> start_bi = Date
>
> With rs2.Fields
>
> .Append "SID", adInteger
> .Append "sya_name", adVarChar, 30
>
> 'レコードセットに記録先フィールドを個数分作る
> For f_na = 1 To 6
>
> .Append ("hiniti_" & CStr(f_na)), adVarChar, 30
>
> Next f_na
>
> End With

テーブルやクエリから作成したレコードセットではなくメモリ上で作成したレコードセットですね。
名前は何というかは忘れましたが、このタイプのレコードセットは、

> ソースとしては使用できない、となります

ということだと思います。

一時テーブルとして使用したいという目的だと推測しますが、
素直に、テーブルを作成しておいて、それを利用するしかないのでは。

メモリ上で作成したレコードセットをフォームと連結できたら便利だと思い
かつて私もいろいろ試してみてダメだった記憶があります。

もし、出来るのなら、どこかにサンプルコードがあると思うのですが、見たことが
ないので、やはり無理なのでは。

タイトルRe^6: デバッグでは正しいのですが
記事No10741
投稿日: 2011/04/16(Sat) 08:36
投稿者みよ
解決済: ON
hatena様
ご回答ありがとうございます

> テーブルやクエリから作成したレコードセットではなくメモリ上で作成したレコードセットですね。
> 名前は何というかは忘れましたが、このタイプのレコードセットは、

> > ソースとしては使用できない、となります

そうですか、デバッグできてソースにできない理由が分かりました。

> 一時テーブルとして使用したいという目的だと推測しますが、
> 素直に、テーブルを作成しておいて、それを利用するしかないのでは。

その方向で、考えて見ようと思います。


それと、僅かな希望を持って、閉じるのはもう少し待たせていただきます。

タイトルRe: デバッグでは正しいのですが
記事No10770
投稿日: 2011/04/28(Thu) 14:34
投稿者みよ
解決済: ON
皆様、ご回答くださいまして、ありがとうございました。

時間も経過しましたので、閉じさせていただきます。

タイトル.LockType = adLockOptimistic
記事No10772
投稿日: 2011/05/04(Wed) 04:29
投稿者YU-TANG
解決済: ON
参照先http://https://gist.github.com/953997
こんばんは、YU-TANG です。

遅レスですが…見たのが今だから、しょうがない。

> 今回ADOでレコードセットを作成して
> フォームのソースにしようとしています
>
> 開く直前にイミディエイトウインドにデバッグさせると
> レコードセットの中身を正しく表示しますが
> フォーム上のテキストボックスではエラーと表示されます

https://gist.github.com/953997

ただし、可能なのは基本的に表示のみだと思っておいてください。
2003 では、下手な操作すると Access が強制終了します(レコード フィルタとか)。

それでは。

タイトルRe: .LockType = adLockOptimistic
記事No10773
投稿日: 2011/05/04(Wed) 16:44
投稿者みよ
解決済: ON
> こんばんは、YU-TANG です。
>
> 遅レスですが…見たのが今だから、しょうがない。

遅いなんてとんでもありません。
ご回答、ありがとうございます、リンク先見させていただきました。
難しそうなので、じっくり試したいと思います。

PS
ちょうど、質問を書き込むタイミングでこの回答を発見しました
別件ですが、できましたらそちらも宜しくお願い致します。

タイトルRe: .LockType = adLockOptimistic
記事No10776
投稿日: 2011/05/05(Thu) 02:42
投稿者hatena
解決済: ON
> https://gist.github.com/953997
>
> ただし、可能なのは基本的に表示のみだと思っておいてください。
> 2003 では、下手な操作すると Access が強制終了します(レコード フィルタとか)。

おー、さすが、YU-TANGさん。

2010で試してみました。
ちゃんと表示できますし、データの更新も可能ですね。
新規追加はできませんが、コマンドボタンでAddNewすれば
追加されます。

フィルターをかけたり、並べ替えをすると、
「テーブル名が無効です」というエラーがでますが、
強制終了はしません。
フォームのエラー時イベントでトラップして
エラーメッセージを変更することも可能です。

2003でも試してみましたが、やはり、
フィルタや並べ替えで強制終了しますが、
更新やAddNewは可能です。


2010でなら、一時テーブルとして、これは使えそうですね^^

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る