テキストボックスに再度値を格納して実行するには?

解決


初心者  2003-10-15 23:55:40  No: 109149

現在、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
もし、教えていただける方がいらっしゃったら助かります。


minami  2003-10-16 00:06:39  No: 109150

MsgBox "品目コードのテキストボックスに正しい品目コードを入力
                してください。"
のところで、メッセージボックスじゃなく  InputBoxを使ってみてはどうですか?

Dim strUserMsg as string
strUserMsg = InputBox("品目コードのテキストボックスに正しい品目コードを入力してください。")

strUserMsgに文字が入っていれば、TxtHinmokuCode.Textにセットしてから
CmdSansho_Click  をコールする。


minami  2003-10-16 00:08:14  No: 109151

この場合、InputBoxに表示するメッセージは
strUserMsg = InputBox("正しい品目コードを入力してください。")
とするべきでしたね^^;


初心者  2003-10-16 01:16:12  No: 109152

早速のご返事ありがとうございます。
教えていただいた、コードを元にコードを作り直してみました。

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しておきたいのですが、
どうしたらいいのでしょうか?


minami  2003-10-16 01:44:34  No: 109153

方法はいろいろあると思いますが、
まず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ボタンを再度クリックする。

っていう流れのほうが、すっきりするような・・・


初心者  2003-10-16 02:58:10  No: 109154

昨日も、今日も大変丁寧なアドバイスいただき感謝しております。
自分は、VB歴大体2ヶ月なのですがなかなか難しいですね。
VBの前はJavaを3ヶ月ほどやってたくらいです。
本当に初心者といってもいいほどのレベルなので、
minamiさんの暖かいアドバイスのおかげでだいぶ助かっております。
ラベルを使うという手があったんですね。
いや、気がつきませんでした。
やっぱり、いろいろな方法をかんがえることは大事ですね。
どうやったら、目標を達成できるかを考えてやっていくように常に考えて生きたいと思います。


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

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






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