• 締切済み

下記質問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

みんなの回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

余談です。 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)
回答No.3

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)
回答No.2

以下のコードで登録の有無(登録件数)を得ることができます。 >既に登録されてる「商品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

回答No.1

こんにちわ。 思うのですが、処理の順番がおかしいような・・・。 実行ボタンを押したら・・・ 1.入力されたテキストのエラーチェック(入力されているか、桁数など)をする。 2.OKであれば商品IDをキーにSelectし、それがあるかないかチェックする。 ここで、ヒットすればすでに登録されているのでエラーではじけます。もしくは「更新しますか?」のメッセージなど。 3.ヒットしなかったらInsert文を実行、更新するならUpdate文を実行すればよろしいかと・・・。 というのは、はずれでしょうか?

jixyoji
質問者

補足

早速の回答ありがとうございます。 一様ですね、実行時にはちゃんと処理はできるのですが・・・問題は既に登録済みの「商品ID」を「追加」ボタンを押した後に打ち込んだときに「既に存在します」とMsgBoxで出すためにはどこをどうすればよいかを質問の主点としてるのでご指摘の順番が違うというのは私の質問の解決に直結しますか?VBに関しては初心者なので詳しいご指摘をお願いします。 注文が多くてすいませんm(. .)m

関連するQ&A

  • Executeされない理由が知りたいので

    Excel VBAのADODBコネクションについて。 Executeされない理由が知りたいのです。 お世話になっております。 引継が上手いいかず、原因が分からないExcelVBAがあり困っております。 【フォーム】ボタン3を押します。 Private Sub CommandButton3_Click() If MsgBox("当月の予定原価を集計します", vbYesNo) = vbNo Then Exit Sub End If DbLogic.ConnectionOpen DbLogic.ExePrc DbLogic.ConnectionClose MsgBox "終了しました", vbOKOnly End Sub 【標準モジュール】DbLogic Sub ConnectionOpen() '接続文字列作成 Dim con_str As String con_str = "Driver={Oracle in OraHome92};DBQ=" & oracle_sid & _ ";UID=" & oracle_user & _ ";PWD=" & oracle_password ' 接続オブジェクトの作成 Set cn = CreateObject("ADODB.Connection") ' 接続 cn.Open con_str cmd.ActiveConnection = cn cmd.CommandTimeout = 0 End Sub Function ExePrc() cmd.CommandType = adCmdStoredProc cmd.CommandText = "prc_yotei_genka_meisai" cmd.Execute ←処理が終わらない cmd.CommandType = adCmdText End Function デバックをすると cmd.Executeで処理が終わらずに【応答なし】になってしまいます。 調べるとココにはSQLを渡すと思ったのですが、違うようなのです。 ConnectionOpenは処理されて、 ExePrcのcmd.Executeで止まってしまいます。 prc_yotei_genka_meisaiを適当に変更したら、 実行時エラー2147467259(`80004005) となりエラーで止まりますので、 prc_yotei_genka_meisaiここの何かに問題があるのかなとは 当たりを付けております。 先月までは普通に動いたとのことなのですが、 考えられる要因などご存知の方おられませんでしょうか。 よろしくお願い致します。

  • Insert時に一意制約エラーがでる。

    よろしくお願いします。 VB6.0 DB:ORACLE8.1.6 クライアントWIN2000 サーバーWIN2000SERVER VBでデータをINSERTするプログラムを作ったのですが、どうしても一意制約エラーが出てしまいます。 これはデータの都合上仕方が無いのか? (データの主キーに「.」が入っているのでエラーになるのでしょうか?) プログラムが悪いのか? よろしくお願いします。 エラーは2回目の実行部分です。 データ(すべて文字型) 000   001   002 ベルリン12345 ベルリン 12345 ベルリン123.45 ベルリン 123.45 ベルリン123 45 ベルリン 123 45 プログラム strSql = "Insert Into KUNIBETU(k000,k001,k002) Values ('ベルリン12345','ベルリン,'12345')" '処理のチェック If Execute_sql(strSql) = False Then Err.Raise -1, , "失敗しました!" cn.RollbackTrans rs.Close Set rs = Nothing cn.Close Set cn = Nothing Exit Sub End If strSql = "Insert Into KUNIBETU(k000,k001,k002) Values ('ベルリン1234.5','ベルリン','123.45')" '処理のチェック If Execute_sql(strSql) = False Then Public Function Execute_sql(strSql As String) As Boolean Dim cmd As New ADODB.Command Execute_sql = False ' Commandオブジェクトを作成 Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSql ' アクション クエリーを実行 cmd.Execute      ←←←←←←エラー部分 Set cmd = Nothing Execute_sql = True Exit Function

  • レコードの削除

    VB6.0 ACCESSで開発しています。 t_nyukoテーブルのデータを全て削除するのは下記のように 出来たのですが dataGridに表示されているものを1つ選択し 選択されたものだけ削除したいのですがどうすればいいのでしょうか? よろしくお願いします。 Private Sub Command1_Click() Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim cat As New ADODB.Command Dim strSQL As String   Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open cat.ActiveConnection = cn strSQL = "DELETE FROM t_nyuko " Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSQL cmd.Execute cn.Close Set cmd = Nothing Set cn = Nothing Set cat = Nothing End Sub

  • 下記質問Vol.2です

    strSQL = "insert into 商品マスタ values(" & txtループ(0).Text & ",'" & _ txtループ(1).Text & "'," & txtループ(2).Text & ")" strSQL2 = "update 商品マスタ set 商品名=" & "'" & txtループ(1).Text & "'," & "単価=" & _ txtループ(2).Text & " where " & "商品ID=" & txtループ(0).Text If txtループ(0).Text = "" Then MsgBox "商品IDに何かを入力してください" txtループ(0).SetFocus Exit Sub End If If txtループ(1).Text = "" Then MsgBox "商品名に何かを入力してください" txtループ(1).SetFocus Exit Sub End If If txtループ(2).Text = "" Then MsgBox "単価に何かを入力してください" txtループ(2).SetFocus Exit Sub End If vol.3へ 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=160999

  • aspファイルの内容が全くわかりません。困っています。

    asp.netの初心者です。 今まで管理されていた人が休職してしまったので、代わりに修正や加工を少し行っていました。 しかし、以下のファイル内容が全く分かりません。(抜粋です。) 正常に使用しているファイルです。 最後の Session("pointzan")=rs("PointZan") はどこのデータベースから受け取っているのでしょうか? Select文がどこにも書かれていないので、全くわかりません。 それとも別のファイルなどに飛んで処理しているのでしょうか? rs("PointZan")を呼び出しているデータベースがどこなのかを知りたいです!! よろしくお願いいたします。 ---------------------------------------------- If Request.Form("CODE")="" then wID = Trim(Request("CODE")) Set pm = cm.CreateParameter("ID",129,1,13,wID) '(name,Char,Input,Length,Value) cm.Parameters.Append pm cm.CommandText = "UP_HIKI01" cm.CommandType = 4 cm.ActiveConnection = cn Set rs=cm.Execute Else wID = Trim(Request.Form("CODE")) Set pm = cm.CreateParameter("ID",129,1,13,wID) '(name,Char,Input,Length,Value) cm.Parameters.Append pm cm.CommandText = "UP_HIKI01" cm.CommandType = 4 cm.ActiveConnection = cn Set rs=cm.Execute End If Session("code")=rs("Code") Session("pointzan")=rs("PointZan") YVC1=rs("YVC1") If YVC1="" or isNULL(YVC1) Then session("YVC1")="" End If ----------------------------------------------

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • CMD.Executeの結果をメッセージボックスで表示したい

    Public Sub SQLActionCmd()     Dim CN As ADODB.Connection     Dim CMD As ADODB.Command     Dim MYSQL As String     '接続     Set CN = CurrentProject.Connection     '更新     MYSQL = "SELECT * FROM 名簿 WEHRE 性別 = "男" ;"     Set CMD = New ADODB.Command     CMD.ActiveConnection = CN     CMD.CommandText = MYSQL     CMD.Execute    '終了     Set CMD = Nothing     RS.Close: Set RS = Nothing     CN.Close: Set CN = Nothing    End Sub と言う感じで実際にはAccessのフォームのボタンをクリックしたタイミングでコードをかいているのですが、このCMD.EXECUTEを実行した結果、テーブルに該当データがなければない旨のメッセージボックスを出したいのです。 そういうことは可能でしょうか?

  • ストアドプロシージャの実行で...

    Test_Pro、というストアドプロシージャを実行させたいんですが、 Microsoft OLE DB Provider for SQL Server エラー '80040e14' ストアド プロシージャ 'Test_Pro' が見つかりませんでした。 というエラーが出てしまいます。どうして??? 実行させる為に書いたソースは、 set cmd = Server.CreateObject("ADODB.command") Set cmd.ActiveConnection = conn cmd.CommandText = "Test_Pro" cmd.CommandType = 4 Set rs = cmd.Execute("@a", a) です。

  • <>&などを保存する方法をおしえてください。

    <>&などを保存する方法をおしえてください。 NameTextBox CommentTextBox 保存ボタン があり保存ボタンを押すと 下記コードが実行されるようにしました。 これで、保存はできるようになったのですが <>&などを使用するとエラーとなってしまします。 <>&を使用するにはどのようにしたらいいのでしょうか? 教えてください。 Dim strSQL As String = "INSERT INTO tableA (Name,Comment) VALUES (@Name,@Comment)" Using con As New SqlConnection(conStr) Dim command As New SqlCommand(strSQL, con) con.Open() Using cmd1 As SqlDataReader = con.CreateCommand() cmd1.CommandType = CommandType.Text Try with cmd1 .Parameters.Add("@Name", SqlDbType.NVarChar) .Parameters.Add("@Comment", SqlDbType.NVarChar) .Parameters("@Name").Value = NameTextBox .Parameters("@Comment").Value = CommentTextBox End With cmd1.CommandText = strSQL cmd1.ExecuteNonQuery() Catch er As Exception Finally con.Close() Catch ex As Exception Finally con.Close() End Try End Using End Using

  • エクセルからアクセスのアクションクエリ エラー

    今までできてたコードが急にできなくなりました。 エクセルからアクセスのアクションクエリを実行するvbaコードなのですが Sub 削除クエリを実行する () Dim cmd As New ADODB.Command Dim MySQL As String cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & "D:\(test).accdb" MySQL = "DELETE Tローカル.* FROM Tローカル;" cmd.ActiveConnection = cn cmd.CommandText = MySQL cmd.Execute MySQL cn.Close: Set cn = Nothing End Sub を、今までやっていたのに、 昨日からできなくなりました。 cn.Open "Provider の部分で、 実行時エラー、-2147467259(80004005) エラーを特定できません。 となります。 環境は、win7、オフィス2010です。