- 締切済み
下記質問Vol.3です
If intSr = 1 Then intRes = MsgBox("追加してもO.K.ですか?", vbYesNo + vbQuestion) If intRes = vbYes Then With cmd .ActiveConnection = cn .CommandType = adCmdText .CommandText = strSQL .Execute End With Call 状態変化(2) End If Else intRes2 = MsgBox("更新しても良いですか?", vbYesNo + vbQuestion) If intRes2 = vbYes Then With cmd .ActiveConnection = cn .CommandType = adCmdText .CommandText = strSQL2 .Execute End With Call 状態変化(2) End If End If End Sub よろしくお願いします。 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=160999 http://www.okweb.ne.jp/kotaeru.php3?q=161003
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- TAGOSAKU7
- ベストアンサー率65% (276/422)
余談です。 Private cn As New ADODB.Connection Private rs As New ADODB.Recordset Private cmd As New ADODB.Command として宣言してますよね? とあるメーリングリストで As New 撲滅運動をしてました。(VB5の時代ですが・・・) まずは二つのソースを見てください。 Sub TEST1() Dim 変数 As New ADODB.Connection Set 変数 = Nohting End SUb Sub TEST2() Dim 変数 As ADODB.Connection Set 変数 = New ADODB.Connection Set 変数 = Nohting End SUb これは一見同じです。 しかし最後のNothingをセットした後に、宣言をしたときの状態に戻るので、TEST1は開放されきっていません。 たしかに一行省けるので、TEST1の方が見栄えはいいのですが・・・ VBはメモリの扱いが下手です。僕もDB系が多いですが、できるだけ負荷のかからない、そして「落ちない」処理になるように勤めています。 あくまでも余談です。。。
- urk
- ベストアンサー率33% (18/53)
cat_tomatoさんの説明を利用させていただいてこんな感じですか? (Oracleへの接続方法はちょっと異なりますが) >2.OKであれば商品IDをキーにSelectし、それがあるかないかチェックする。 StrSQL="select count(*) from 商品マスタ where " & "商品ID=" & txtループ(0).Text Set oraDs = oraDb.DbcreateDynaset(StrSQL, 0&) >ここで、ヒットすればすでに登録されているのでエラーではじけます。もしくは「更新しますか?」のメッセージなど。 >3.ヒットしなかったらInsert文を実行、更新するならUpdate文を実行すればよろしいかと・・・。 Cnt = oraDs.RecordCount If Cnt > 0 Then intRes2 = MsgBox("更新しても良いですか?", vbYesNo + vbQuestion) ' vbYes => 更新処理 ' vbNo => Cancel処理 else intRes = MsgBox("追加してもO.K.ですか?", vbYesNo + vbQuestion) ' vbYes => 追加処理 ' vbNo => Cancel処理 end if こんなことでいかがでしょうか?
- TAGOSAKU7
- ベストアンサー率65% (276/422)
以下のコードで登録の有無(登録件数)を得ることができます。 >既に登録されてる「商品ID」を「実行」ボタンクリック時にMsgBoxで「既に登録済み」と出すにはどうすれば? Main関数を参考にして、getCount関数を呼び出してください。戻り値が0のときは未登録です。 その他にもチェックロジックとして使用できます。 追加→戻り値 0 更新→戻り値 1 削除→戻り値 1 でないと、処理的な矛盾が発生すると思います。 Sub Main() Dim Cnn As ADODB.Connection 'DBに接続 Set Cnn = "接続" MsgBox getCount(Cnn, "商品マスタテーブル", 9) Set Cnn = Nothing End Sub Function getCount(inCnn As ADODB.Connection, inTblName As String, inSyouhinID As Long) Dim Rs As ADODB.Recordset Dim strSQL As String 'カウンタ初期化 getCount = 0 'レコードセット strSQL = "select count(*) from " & inTblName & _ " where 商品ID=" & inSyouhinID Set Rs = New ADODB.Recordset Rs.Open strSQL, inCnn '数を取得 getCount = Rs(0).Value 'それぞれ閉じて開放 Rs.Close Set Rs = Nothing End Function
- cat_tomato
- ベストアンサー率66% (6/9)
こんにちわ。 思うのですが、処理の順番がおかしいような・・・。 実行ボタンを押したら・・・ 1.入力されたテキストのエラーチェック(入力されているか、桁数など)をする。 2.OKであれば商品IDをキーにSelectし、それがあるかないかチェックする。 ここで、ヒットすればすでに登録されているのでエラーではじけます。もしくは「更新しますか?」のメッセージなど。 3.ヒットしなかったらInsert文を実行、更新するならUpdate文を実行すればよろしいかと・・・。 というのは、はずれでしょうか?
補足
早速の回答ありがとうございます。 一様ですね、実行時にはちゃんと処理はできるのですが・・・問題は既に登録済みの「商品ID」を「追加」ボタンを押した後に打ち込んだときに「既に存在します」とMsgBoxで出すためにはどこをどうすればよいかを質問の主点としてるのでご指摘の順番が違うというのは私の質問の解決に直結しますか?VBに関しては初心者なので詳しいご指摘をお願いします。 注文が多くてすいませんm(. .)m