既に開いているフォームのデータを更新するには?

解決


ろうろう  2003-09-02 03:37:48  No: 108404

はじめまして、VB初心者の者です。
どうぞお教えください。
VB6.0で作成したフォームで、MDBのDBを操作しています。
FORM1でDBのデータを表示し、FORM1から展開したFORM2でデータの登録を
おこない、その結果をFORM1に更新させたいのですが、この更新部分が
うまくいきません。
FORM1は連結フォームとデータグリッドで構成。(データグリッド部を更新したい。)
DBとの接続はうまくいっています。
既に開いていてデータを表示しているform1を再更新するにはどうすればいいのでしょうか?
(formの更新ではない?)

'FORM2

Private Sub Command1_Click()
Dim rs As New ADODB.Recordset

rs.Open "kotbl", cn, adOpenForwardOnly, adLockPessimistic
'新規レコードをDBに登録
rs.AddNew
rs![カード番号] = Form1.txtカード番号.Text
rs![交渉日時] = Now
rs![発信先] = DataCombo2.Text
rs![AITE] = DataCombo1.Text
rs.Update
'FORM1のデータグリッド部更新処理
Call FORM1.refreshdata
FORM1.Refresh
Set rs = Nothing
End Sub

'データグリッド更新処理(form1上のコード)

Public Sub refreshdata()
Dim rs As New ADODB.Recordset
Dim mysql As String

'SQLステートメント
    mysql = " SELECT kotbl.カード番号, kotbl.交渉日時,kotbl.発信先
,kotbl.AITE,From  kotbl where kotbl.カード番号 = '" & txtカード番号.Text & "'"
rs.Open mysql, deMain.cnSalse, adOpenStatic, adLockOptimistic
Set dbgsub.DataSource = rs
dbgsub.Columns("カード番号").Visible = False
dbgsub.Columns("交渉日時").Width = 60 * 15
dbgsub.Columns("発信先").Width = 60 * 15
dbgsub.Columns("AITE").Width = 60 * 15
END SUB


ry  2003-09-02 17:07:02  No: 108405

> この更新部分がうまくいきません。

どのようにうまくいかないのか判りませんが・・・

この投稿の場合、SQL文間違ってます。
×「〜kotbl.AITE,From〜」
○「〜kotbl.AITE From〜」
転記ミスかもしれないのではずしてる気もしますが。

とりあえず、失敗する状況を詳しく書かれた方が、
返事ももらいやすいかと思います。


ろうろう  2003-09-05 19:39:18  No: 108406

ryさん  ご指摘ありがとうございます。
エラー内容なのですが、form1の表示内容が更新されない、といったものです。
(特にエラーMSGが表示されるといった類ではありません。)

①FORM1でDBの内容を表示(データグリッド)
②FORM2でDBにデータ追加
③FORM1の内容(データグリッド)に更新内容が反映・・・

②のDBにデータ追加まではYまくいっているのですが、
③が反映されません。
FORM1のデータグリッドの内容を更新するには
一体どうすればいいのでしょうか。


ry  2003-09-05 20:50:04  No: 108407

なんとなくですが。

Private Sub Command1_Click()
  〜略
rs.Open "kotbl", cn, adOpenForwardOnly, adLockPessimistic

↑ここでロックされているので

  〜略

rs.Update

←この位置でレコードセットを閉じてみるとか・・・

'FORM1のデータグリッド部更新処理
Call FORM1.refreshdata

  〜略

どうでしょうか・・・


ろうろう  2003-09-05 21:05:56  No: 108408

ryさん  ありがとうございます。
早速やってみました。

'FORM2

Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
rs.Open "kotbl", cn, adOpenForwardOnly, adLockPessimistic
'新規レコードをDBに登録
rs.AddNew
rs![カード番号] = Form1.txtカード番号.Text
rs![交渉日時] = Now
rs![発信先] = DataCombo2.Text
rs![AITE] = DataCombo1.Text
rs.Update
rs.close

'FORM1のデータグリッド部更新処理
Call FORM1.refreshdata

Set rs = Nothing
End Sub

form1はどうしても更新されません・・・。
う〜む。開きぱなしではダメ?
なんなんでしょう。


ry  2003-09-05 22:09:14  No: 108409

すんません、お手上げです。

確認ですが、
① Form1.RefreshData()を実行→1件も無いはずなので空っぽ?
② 更新されている事をAccessで確認?
③ Form1.RefreshData()を実行→やはり空っぽ?

こういう動きですよね?


ろうろう  2003-09-05 22:23:14  No: 108410

ryさん  ありがとうございます。
お手上げといわずにどうかよろしくお願いします。
(ryさんだけが頼りです。。【><。】)

①DBには当初からいくつかデータが入っており、
  FORM1のLOAD時にRefreshDataをCALLして
  データグリッドに表示しています。

②FORM1上にはいくつかボタンがあり「FORM2を呼び出すもの」
  「次のレコードを表示させるもの」「前のレコードを表示させるもの」等が
  あります。
  FORM2でデータ登録後はFORM1のデータグリッドには何の変化もないですが、
  「次の・・」を押下しさらに「前の・・・」を押下して戻ってみると、
  追加したデータが反映しています。
  (FORM2で登録後、DBを直接覗いてみても追加されている事が確認できていま    す。)

既にFORM1のLOAD時に、データグリッドにその時点のデータを表示しており、
FORM2のデータ追加によってその表示をUPDATEしたいのですが、
一度FORM1を閉じて再度OPENしないと表示されないようです。
よく業務アプリケーションなどで、交渉内容を登録すれば、
その結果が即座にデータグリッドに表示され確認できる、というのを
見るのですが、「表示」と「登録」のFORMが異なると、難しいのでしょうか?
つたない説明で申し訳ありません。
(他に記さないといけない情報がございましたらご連絡くださいませ。)
どうぞよろしくお願いいたします。


ry  2003-09-05 23:02:34  No: 108411

Form1とForm2で同じConnectionを使ってみるとどうでしょうか?


ry  2003-09-05 23:24:28  No: 108412

DataGridを使った事が無いのでよくわかりませんが
グリッドのRefreshを実行してみるとか。


ろうろう  2003-09-05 23:39:47  No: 108413

ryさんありがとうございます。
>Form1とForm2で同じConnectionを使ってみるとどうでしょうか?
私も、form1とform2の双方のload時で下記を実行しているのが、
おかしいのかなと思っていました。

Private Sub Form_Load()

cn.ConnectionString = "provider = microsoft.jet.oledb.4.0;" _
& "Data Source = I:\DATA\S&P\as.mdb"
cn.Open

End Sub

ただ、form1で宣言したconnection変数[cs]がform2では使用できなかったので、やむなくform2でも再度宣言・接続しています。
form1では  Public cs AS New ADODB.Connnection  と Public で宣言して
いるのですが、fom2でが使用できませんでした。。。
同じconnectionを使用するにはどう記述すればいいのでしょうか?
(教えてちゃんですいません・・・。)

※データグリッドのrefreshはだめでした・・・。
  Form1.dbgsub.Refresh


nanashi  2003-09-05 23:56:01  No: 108414

> 同じconnectionを使用するにはどう記述すればいいのでしょうか?

Form1ではなく、標準モジュールでPublic宣言するか、
『form1.cs』とすれば使えませんか?

上記のやりとりをちゃんと読んでないので適当に思い付いたことを書きます。
(つーか、長くて読む気しなかった…/汗)

1)Form1とForm2で異なるRecordSetを使っている。
2)Form2で追加して、Form1に表示してる。

という状況なら、Form1のRecordSetをRequeryしないとForm2で更新、追加した内容は反映されません。
その上で表示部分をRefleshしてみては?


ろうろう  2003-09-06 03:34:40  No: 108415

nanashiさん、ご指摘ありがとうございます。

>1)Form1とForm2で異なるRecordSetを使っている。
>2)Form2で追加して、Form1に表示してる。

まさしくその通りです。
恥ずかしながら、rs.Requery はどの箇所に記述すれば
いいのでしょうか?


nanashi  2003-09-06 04:03:30  No: 108416

RequeryはOpen時に使ったSQL文を使ってRecordSetを再取得します。
なので当然、Form2で更新した後ですね。

レコードセットが違うのでForm1のRsは取得した時点のままですから、
更新して内容が変わった後にRequeryする必要があります。


ろうろう  2003-09-06 04:19:56  No: 108417

ありがとうございます。
え〜と、form2にDeactivateイベントを追加し、
そこに記述しました。

Private Sub Form_Deactivate()
rs.Requery
Form1.Refresh
End Sub

form1に変更ありません。(T^T) 

>更新して内容が変わった後にRequeryする必要があります。
更新して内容が変わったというイベントはどうやって取得すればいいでしょうか?
すいません。。。恐らくこのRequeryが要因と思われます。
もう少しお願いいたします。


ry  2003-09-06 10:57:23  No: 108418

> form1では  Public cs AS New ADODB.Connnection  と Public で宣言して
> いるのですが、fom2でが使用できませんでした。。。
> 同じconnectionを使用するにはどう記述すればいいのでしょうか?

-- From1 ---
Private cs AS New ADODB.Connnection

Public Function GetCn() As ADODB.Connection
    Set GetCn = cs
End Sub

--- Form2 ---
Private Sub Command1_Click()
    Dim cn As ADODB.Connection

    Set Cn = Form1.GetCn

---

試してないので動くかどうかわかりません。


ry  2003-09-06 11:05:45  No: 108419

nanashiさん wrote:
> Form1のRecordSetをRequeryしないとForm2で更新、追加した内容は
> 反映されません。

ろうろうさん wrote:
> え〜と、form2にDeactivateイベントを追加し、
> そこに記述しました。

> Private Sub Form_Deactivate()
> rs.Requery
> Form1.Refresh
> End Sub

これでは、Form2のレコードセットがRequeryされただけでは?


nanashi  2003-09-08 19:32:02  No: 108420

> 更新して内容が変わったというイベントはどうやって取得すればいいでしょうか?

イベントじゃないです。
追加、更新のロジックは自分で組んでるんですよね?
Form2で追加、更新した後にForm1で使ってるRecordSetをRequeryするんです。

ryさんがご指摘されているようにForm2のRecordSetをRequeryしても全く意味はありません。


ろうろう  2003-09-08 20:04:11  No: 108421

nanashiさん  ryさん

詳細にわたりお教えいただきありがとうございます。
(本当に感謝いたします。)
Form1のRecordSetをRequeryする方法ですが、
①form2のコードのrs.updateの後に記述すればよいのでしょうか。
②(だとしましたら)form2上から、form1のrsを指定するには
  どのように記述すればいいのでしょうか?

form2からform1のRecordSetを指定しようと
色々試行錯誤したのですが、うまくいきません。
本当に一から十まで申し訳ございませんが
どうかお教えください。


nanashi  2003-09-08 21:08:07  No: 108422

※丸付き数字は文字化けする可能性があるので使わないで下さい。

> 1)form2のコードのrs.updateの後に記述すればよいのでしょうか。

はい。

> 2)form2上から、form1のrsを指定するにはどのように記述すればいいのでしょうか?

案1.
Form1のRecordSetをPublic宣言してForm2から下記のようにして呼ぶ。

    Form1.Rs.Requery

案2.
Form1にRecordSetをRequeryするPublicプロシージャを作ってそれをForm2からCallする。

'(Form1)---
Public Sub RecordSet_Requery()
    Rs.Requery
End Sub

'(Form2)---
    ・
    ・
    ・
    Rs.Update

    Call Form1.RecordSet_Requery
    ・
    ・
    ・


ろうろう  2003-09-08 21:46:29  No: 108423

nanashiさん

ありがとうございます!
早速両方を試してみました。
その結果、どちらでも下記エラーが表示されます。
「オブジェクトが閉じている場合は、アプリケーションが
  要求した操作は許可されません。」
この場合のオブジェクトはform1のRecordSetを
指しているのでしょうか?
どのようなことが要因に考えられますでしょうか?

(何度も申し訳ございません。)


ry  2003-09-08 22:08:00  No: 108424

エラーのダイアログのデバッグを選ぶと、止まってる行が黄色で
選ばれると思うんですよ。
その前後のコード(最低限変数の定義がわかる場所)を示して
もらわないとなにがなんやらわからないと思います。

んで、おそらくですけど、エラーの意味は文字通り
「閉じてあるレコードセットに対して操作した」
んだと思います。


nanashi  2003-09-08 22:48:57  No: 108425

前の方の投稿を見てて思ったんですけど、プロシージャごとにレコードセットをDim宣言してませんか?
それじゃ全然ムリッスね。

なんか何をやってるのか、何をやりたいのか、どうしたらいいのかが分からなくなってきたなー(−−;


ろうろう  2003-09-10 03:55:56  No: 108426

ryさん  nanashiさん
ありがとうございます。
変数の宣言部分を見直す等、試行錯誤し修正してみました。
ただ、相変わらずデータグリッドは更新されません。。
ただその前に、form1で使用した接続情報が
form2で使用できない点について、なんとか解決できないものかと
考えています。(これも理由の一つなような気がするので。)
関係する現時点のコードをUPいたします。
よろしければ一度見ていただけないでしょうか。
本当にあつかましいお願いで申し訳ございませんが
なんとかしたいと考えています。
どうかよろしくお願いいたします。

↓↓form1上のコード↓↓
Option Explicit
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public dbname As String

'Form1ロード時に接続
Private Sub Form_Load()
dbname = GetDataSource()
cn.ConnectionString = "provider = microsoft.jet.oledb.4.0;" _
& "Data Source =" & dbname
cn.Open
Call refreshdata
End Sub

'データグリッドの更新処理
Public Sub refreshdata()
Dim mysql As String
'SQLステートメント
 mysql = " SELECT 交渉履歴.カード番号, 交渉履歴.交渉内容 From 交渉履歴 where 交渉履歴.カード番号 = '" & txtカード番号(0).Text & "'"
rs.CursorLocation = adUseClient
rs.Open mysql, cn, adOpenKeyset, adLockOptimistic
Set dbgsub.DataSource = rs
dbgsub.Columns("カード番号").Visible = False
dbgsub.Columns("交渉内容").Width = 60 * 50
dbgsub.Refresh
End Sub

'DataEnvironmentデザイナで取得したconnectオブジェクトと同期を取る為、
 データソースを取得
Public Function GetDataSource()
Dim startPos As Long
Dim endPos As Long
Dim skip As Long
startPos = InStr(1, deMain.cnSalse.ConnectionString, "Data Source=", vbTextCompare)
endPos = InStr(startPos, deMain.cnSalse.ConnectionString, ";", vbTextCompare)
skip = Len("Data Source=")
GetDataSource = Mid(deMain.cnSalse.ConnectionString, startPos + skip, endPos - (startPos + skip))
End Function

'レコードセットの更新
Public Sub rs_Requery()
rs.Requery
End Sub

↓↓form2上のコード↓↓

Private Sub Form_Load()
Command1.Enabled = False
End Sub

'データの追加処理
Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
rs.CursorLocation = adUseClient
>'下記のcnが使用できない。「コンテキストで閉じられているか無効です。」
rs.Open "交渉履歴", cn, adOpenDynamic, adLockOptimistic
rs.AddNew
rs![カード番号] = Form1.txtカード番号(0).Text
rs![交渉内容] = Text1.Text
rs.Update
rs.Close
Set rs = Nothing
Set Form1.rs = Nothing
'form1のデータグリッドの更新処理
Call Form1.refreshdata
Call Form1.rs_Requery
Form1.dbgsub.Refresh
Form1.Refresh
End Sub


ろうろう  2003-09-10 05:17:30  No: 108427

接続の件は解決しました。
nanashiさんが以前ご指摘されましたように
標準モジュールで宣言すればform2でも
うまく利用できることができました。
あとは、データグリッドの反映のみです。。。。
エラー表示は何も出ませんが、相変わらず
fom2による更新処理では変更されません。
form2でデータ登録後、form1上で
requeryを実行すれば更新されます・・・。

formの開け方や連結が問題なのでしょうか。


ろうろう  2003-09-10 05:54:13  No: 108428

解決いたしました!
form1の開け方が問題だったようです。
form1は標準モジュールから呼び出しているのですが
変数に一度Setして呼び出していたのが間違いだったようです。

(今まで)
sub main()
public for1 as form1
set for1 = new form1
load for1
for1.show
end sub

(変更)
sub main()
load form1
form1.show
end sub

ryさん  nanashiさん
本当に今ままで見捨てずにありがとうございました。
お二人はほんとうに感謝しております。
ありがとうございました。

※これに懲りずにまたお願いいたします。。。


ろうろう  2003-09-10 05:55:03  No: 108429

解決済みチェック忘れていました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加