現在、WindowsXP,Access2000,VB6.0Enterpriseを使って開発をしております。
その中で、MDBにVBのフォーム上から接続してフォーム上から入力した値を基にMDBのテーブルの内容を更新しようとコーディングを行っています。
そのなかで、困った問題が出てきました。
まず、MDBファイルの中に三つのテーブルを作成しました。
1つ目は、在庫トランです。
在庫トラン
品目コード 在庫数量
1 100
2 50
3 60
4 70
次に、売上トランです。
伝票No 品目コード 売上数量
次に品目マスターです。
品目コード 商品名
1 FDD
2 MO
3 CD-R
4 DVD-R
以上三つがテーブルの内容として初期設定したものです。
このなかで、売上トランにはフィールド名しか設定しておりませんが、
それは、VB上で作成する三つのフォーム
FrmUriageNyuryoku,FrmUriageShusei,FrmUriageSakujo
を実行していくことでレコードの追加、更新、削除が行われるようにコーディングしていくために、初期値は入れておりません。
今コーディングしているFrmUriageNyuryokuです。
'グローバル変数の定義
Option Explicit
Dim Cn As ADODB.Connection
'コマンドボタンを押した時の処理。
Private Sub CmdJikko_Click()
Dim IntUriageSuryo As Integer
Dim StrShohinName As String
Dim Rs As ADODB.Recordset
Dim SQL As String
Dim IntHinmokuCode As Integer
IntUriageSuryo = CInt(TxtUriageSuryo.Text)
StrShohinName = CStr(TxtShohinName.Text)
SQL = "UPDATE 在庫トラン SET 在庫数量 = 在庫数量 -
" + CIn(IntUriageSuryo) + ""
Set Rs = New ADODB.Recordset
End Sub
'コマンドボタンを押した時の処理。
'CmdJikko_Clickよりこちらの処理を先に行います。
Private Sub CmdSansho_Click()
Dim StrShohinName As String
Dim Rs As ADODB.Recordset
Dim SQ As String
Dim IntHinmokuCode As Integer
Set Rs = New ADODB.Recordset
IntHinmokuCode = CInt(TxtHinmokuCode.Text)
SQ = "SELECT 品目コード, 商品名 FROM 品目マスター WHERE 品目コー
ド = " + CStr(IntHinmokuCode) + ""
Call Rs.Open(SQ, Cn, adOpenStatic, adLockOptimistic)
If Rs.Fields("品目コード") = CStr(IntHinmokuCode) Then
TxtShohinName.Text = Rs.Fields("商品名")
Else
'あらかじめ品名マスターに格納されている品名コードとそれに対す
'る商品名がなかったら、テキストボックスに入力した文字列を空文
'字にしてテキストボックスに値を入力する。そして、また、最初か
'らCmdSansho_Clickを呼び出して、処理を実現するための処理。
MsgBox "品目マスターのフィールドには、その品名コードとそれに
対応する商品名がありません。"
TxtHinmokuCode = ""
Rs.Close
Set Rs = Nothing
IntHinmokuCode = 0
SQ = ""
MsgBox "品目コードのテキストボックスに正しい品目コードを入
力してください。"
Call CmdSansho_Click
End If
Rs.Close
Set Rs = Nothing
End Sub
'フォーム起動時にデータベースに接続する処理。
Private Sub Form_Load()
Set Cn = New ADODB.Connection
Cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=E:\練習問題\example14\db1.mdb"
Cn.Open
End Sub
この中で、
>MsgBox "品目コードのテキストボックスに正しい品目コードを入力
してください。"
の後に、テキストボックスから値を入力させるようにしたいのですが、
どうすればじっこうできるのか悩んでいます。
値を入力させた後にまたCmdSansho_Clickを呼び出して処理を最初
からやりたいと思っています。
>Call CmdSansho_Click
もし、教えていただける方がいらっしゃったら助かります。
MsgBox "品目コードのテキストボックスに正しい品目コードを入力
してください。"
のところで、メッセージボックスじゃなく InputBoxを使ってみてはどうですか?
Dim strUserMsg as string
strUserMsg = InputBox("品目コードのテキストボックスに正しい品目コードを入力してください。")
strUserMsgに文字が入っていれば、TxtHinmokuCode.Textにセットしてから
CmdSansho_Click をコールする。
この場合、InputBoxに表示するメッセージは
strUserMsg = InputBox("正しい品目コードを入力してください。")
とするべきでしたね^^;
早速のご返事ありがとうございます。
教えていただいた、コードを元にコードを作り直してみました。
Private Sub CmdSansho_Click()
Dim StrShohinName As String
Dim Rs As ADODB.Recordset
Dim SQ As String
Dim IntHinmokuCode As Integer
Dim StrUserMsg As String
Set Rs = New ADODB.Recordset
IntHinmokuCode = CInt(TxtHinmokuCode.Text)
SQ = "SELECT 品目コード, 商品名 FROM 品目マスター WHERE
品目コード = " + CStr(IntHinmokuCode) + ""
Call Rs.Open(SQ, Cn, adOpenStatic, adLockOptimistic)
If Rs.Fields("品目コード") = CStr(IntHinmokuCode) Then
TxtShohinName.Text = Rs.Fields("商品名")
Else
MsgBox "品目マスターのフィールドには、その品名コードとそれに対
応する商品名がありません。"
TxtHinmokuCode = ""
Rs.Close
IntHinmokuCode = 0
SQ = ""
StrUserMsg = InputBox("正しい品目コードを入力してください。")
If Not StrUserMsg = "" Then
TxtHinmokuCode.Text = StrUserMsg
Call CmdSansho_Click
Else
Do While StrUserMsg = ""
StrUserMsg = InputBox("正しい品目コードを入力してくだ
さい。")
TxtHinmokuCode.Text = StrUserMsg
Loop
Call CmdSansho_Click
End If
End If
Rs.Close
Set Rs = Nothing
End Sub
としてみましたが、この中で
End If
Rs.Close
Set Rs = Nothing
End Sub
となっているのですが、デバックを実行してみると、End Sub
を抜けた後、また
End If
Rs.Close
Set Rs = Nothing
End Sub
のコードのEnd Ifに戻ってきて一度
Rs.Closeを実行してレコードセットオブジェクトを閉じた
のに、もう一度Rs.Closeを実行してしまい
閉じたオブジェクトは操作できませんとか実行時エラーが発生してしまうの
ですが、これは最後の
Rs.Close
Set Rs = Nothing
の部分を削除するとうまくいくと思うのですが、
ほかのプロシジャーでもレコードセットオブジェクトを生成して
Openしたいので、End Subの前の部分で
レコードセットオブジェクトをCloseしておきたいのですが、
どうしたらいいのでしょうか?
方法はいろいろあると思いますが、
まずCmdSansho_Clickのプロシージャ内で
Call CmdSansho_Click
と、自分自身を呼び出すという処理、私ならまずやらないです。
Set Rs = New ADODB.Recordset
Retry: ’ラベルをここに追加
IntHinmokuCode = CInt(TxtHinmokuCode.Text)
(省略)
Call CmdSansho_Click この呼び出しを
Goto Retry に書き換えて、再度処理をする。
なんか、CmdSansho_Clickのボタンをクリックしたら最後、正しい品目コードを入力して処理を実行しないかぎり、途中でキャンセルすることが出来ないというのが
ちょっと引っかかります。(まあそういう仕様であればしょうがないですけど)
正しく動作させるために、あちこちにGoto文を入れないといけない感じだったので、あんまりよろしくないかと。
ここから先は余計なアドバイス^^;
End If
ErrLabel: ’ここにラベルをおいておく。ラベル以降は終了時に必要な処理。
Rs.Close
Set Rs = Nothing
End Sub
で、正しい品目コードが取れない場合
InputBoxを使うのではなく、メッセージボックスでメッセージだけ出して
Goto ErrLabel
でCmdSansho_Clickプロシージャを終了する。(Call CmdSansho_Clickは無し)
そしたらユーザーは、テキストボックスに正しい品目コードを入れて直して
CmdSanshoボタンを再度クリックする。
っていう流れのほうが、すっきりするような・・・
昨日も、今日も大変丁寧なアドバイスいただき感謝しております。
自分は、VB歴大体2ヶ月なのですがなかなか難しいですね。
VBの前はJavaを3ヶ月ほどやってたくらいです。
本当に初心者といってもいいほどのレベルなので、
minamiさんの暖かいアドバイスのおかげでだいぶ助かっております。
ラベルを使うという手があったんですね。
いや、気がつきませんでした。
やっぱり、いろいろな方法をかんがえることは大事ですね。
どうやったら、目標を達成できるかを考えてやっていくように常に考えて生きたいと思います。
ツイート | ![]() |