■ IF文を使ったUpdateをするには?

[Visual Basic Q & A 掲示板] [過去ログの一覧]


ゆみ 2008/01/10(木) 22:30:25 <初心者>
お世話になっています。
ゆみです。
昨日はありがとうございました。
連日になってしまい本当に申し訳ありませんが。
私の力不足で何度書き換えてもUpdateが上手くいかず困っています。
もし、分かる方がいらっしゃいましたら教えて頂けると嬉しいです。
まだ、初心者のため専門用語の知識が薄く。文章の内容が分かりづらかったり
ソースの書き方がめちゃくちゃだったりして見づらいかもしれませんが
見ていただけたら嬉しいです。よろしくお願いします。

【質問内容】

登録ボタンを押下した際に、「登録してもよろしいでしょうか?」というメッセージボックスを表示させ
「はい」を押した場合にテーブル「tb_syokuji」にID=1が合った場合はUpdateを行い
無かった場合は、insertを行いたいのですが上手くいきません。
insertはなんとか出来るようになったのですが、updeteが上手くいかず、
また、IDへの上書きも上手く出来ません。
色々と調べて文章を書き換えては見たのですが・・・・。
もし、分かる方がみえましたら教えていただけると嬉しいです。
本当に初歩的な事を聞いてしまって申し訳ないです。よろしくお願いします。


【ソース】


Private Sub sub_syokuji_Click()
    
    ret = MsgBox("登録してもよろしいでしょうか?", vbOKCancel)
    
    Set rs = New ADODB.Recordset
               
  If ret = 1 Then
'***********************************************************************************************
    'データの更新(未解決)
'***********************************************************************************************
    strSQL = "UPDATE tb_syokuji SET flgSyokuji1 = flgSyokuji(1),flgSyokuji2=flgSyokuji(2),flgSyokuji3=flgSyokuji(3),flgSyokuji4=flgSyokuji(4),flgSyokuji5=flgSyokuji(5),flgSyokuji6=flgSyokuji(6),flgSyokuji7=flgSyokuji(8),flgSyokuji9=flgSyokuji(9),flgSyokuji10=flgSyokuji(10), where ID = "1" ;"
        
    
'***********************************************************************************************
    'データの保存
'***********************************************************************************************
Else
   
        strSQL = "INSERT INTO tb_syokuji (flgSyokuji1,flgSyokuji2,flgSyokuji3,flgSyokuji4,flgSyokuji5,flgSyokuji6,flgSyokuji7,flgSyokuji8,flgSyokuji9,flgSyokuji10) " & _
             "VALUES ('" & flgSyokuji(1) & _
                      "', '" & flgSyokuji(2) & _
                      "', '" & flgSyokuji(3) & _
                      "', '" & flgSyokuji(4) & _
                      "', '" & flgSyokuji(5) & _
                      "', '" & flgSyokuji(6) & _
                      "', '" & flgSyokuji(7) & _
                      "', '" & flgSyokuji(8) & _
                      "', '" & flgSyokuji(9) & _
                      "', '" & flgSyokuji(10) & _
                      "'); "

 
        cn.Execute strSQL

End if

まさ 2008/01/10(木) 22:58:10
flgSyokujiは変数ですよね??
今のUPDATE文では「flgSyokuji(1)」に更新しようとしています。
なので、正しくは
strSQL =""
strSQL = strSQL & "UPDATE TB_SYOKUJI" & vbcrlf
strSQL = strSQL & "SET    FLGSYOKUJI1  = " & CStr(flgSyokuji(1)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI2  = " & CStr(flgSyokuji(2)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI3  = " & CStr(flgSyokuji(3)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI4  = " & CStr(flgSyokuji(4)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI5  = " & CStr(flgSyokuji(5)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI6  = " & CStr(flgSyokuji(6)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI7  = " & CStr(flgSyokuji(7)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI8  = " & CStr(flgSyokuji(8)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI9  = " & CStr(flgSyokuji(9)) & vbCrLf
strSQL = strSQL & "      ,FLGSYOKUJI10 = " & CStr(flgSyokuji(10)) & vbCrLf
strSQL = strSQL & "WHERE  ID = '1'" & vbCrLf
です。これもループ処理すると効率的です。

データの更新のSQL文、変数にセットできてますか??
WHEREの前で文字列が閉じられてるので、そもそも実行できていないのでは??

あと、余談ですがフィールドは文字型?数値型?
UPDATE文とINSERT文を見ると、型が違うように見えるのですが・・・。

>If ret = 1 Then
結果がOKボタンなので、1ではなく「vbOK」定数の方が後から見た時、
分かり易いですよ!
で、今の条件判断だと、
MsgBox("登録してもよろしいでしょうか?", vbOKCancel)
→OKボタンの時、更新。Cancelボタンの時、追加ですけど
これで良いのですか??

>「はい」を押した場合にテーブル「tb_syokuji」にID=1が合った場合はUpdateを行い
>無かった場合は、insertを行いたいのですが上手くいきません。
MsgBox("登録してもよろしいでしょうか?", vbYesNo)
だと思います。
vbYesの時、ID=1のレコード存在をチェック(SELECT文を発行)し、
あった場合、UPDATE文を、無かった場合、INSERT文を走らせる事になると思います。

しんご 2008/01/11(金) 01:10:51 <中級者>
いくつか質問を。

1.他のプログラムにてUpdateはできますか?
  簡単なデータベースとプログラムを作成して
  Updateができるかどうか、という意味です。

2.データベース接続時のLockTypeは何ですか?
  LockTypeがわからない場合はご自分で調べてください。

3.開発環境で走らせたとき、どこでエラーストップしますか?
  そのときのエラー文は何ですか?
  それともエラーは発生せず、プログラムが進んでしまいますか?

思うに、ゆみさんが作成しようとしているプログラムは
残念ながらゆみさんのレベルに合っていないような気がします。
VB6を始めて1ヶ月にしては、結構難しいことをやられているなぁ、と
思うのですが・・・データベースの基本はしっかり学びましたか?

簡単なプログラムを組んでみて「Updateとは何なのか?」
「Insertとは何なのか?」を自ら感じてください。

#もしかして

If ret = 1 Then
  ' データの更新(未解決)
  strSQL = "UPDATE tb_syokuji (中略)
  cn.Execute strSQL   ← これが抜けているだけとか?

Else

End if

ゆみ 2008/01/11(金) 01:41:23 <初心者>
【まささんへ】

いつもありがとうございます。
一度試してみます。

【しんごさんへ】

いつもありがとうございます。

1.他の項目も1項目にして専用のを設けて作ってみた
  のですが上手くいきませんでした。
   本やインターネットを見て、プログラムを書いてます。
2.LockTypeですか?すみません。
 分からないので調べます。
3.エラーは発生しないでプログラムが進んでしまい。
 何がいけないのかが分からない状況です。

確かに、VB初心者の私には見合っていないレベルだと思います。
データベースの基本は、前の会社でオラクルベースで教えてもらいました。
その時に、insert,update,delte,selectの基本4つと
サブクエリなどのオプション関数もいくつか教えてもらたのですが。

自分のレベルに合っていないので、中々進まないし、
まだまだ分からないことだらけで周りの人たちに迷惑を
かけてしまっているけど。
でも、なぜだか自分の中では新しいことに挑戦していくこと
に楽しいという気持ちが大きいです。
だから、もっと勉強して頑張りたいって思います。





いつも、ご回答いただいている、まささんとしんごさん本当に
ありがとうございます。

しんご 2008/01/11(金) 01:57:23 <中級者>
> 1.他の項目も1項目にして専用のを設けて作ってみた
>  のですが上手くいきませんでした。

なるほど。これでは当初やろうとしていた内容もできない訳ですね。

SQL文でUPDATE文を作る以外にも

Set rs = New ADODB.Recordset
With rs
  .Addnew
  .Field(0).Value = 1
  .Update
  .Close
End With

こんな方法もあります。もちろん、この手前ではテーブルを
オープンさせています。そのオープン時に指定するLockTypeを
間違えるとUpdateできません。間違えると、とあるところで
エラーが発生して止まりますけどね。

自分で調べることこそが、自分の身になる最良の方法だと思います。
がんばってください。

しんご 2008/01/11(金) 02:00:00 <中級者>
失礼。更新作業でしたね。

With rs
  .Addnew
  .Field(0).Value = 1
  .Update
  .Close
End With

これでは追加作業になるので・・・

With rs
 .MoveFirst
  .Field(0).Value = 1
  .UpdateBatch
  .Close
End With

です。

ゆみ 2008/01/11(金) 22:16:45 <初心者>
[[解決]]

まささん、しんごさん解決しました!!
いつも、ありがとうございます。
日々少しずつ調べながら進めているのですが・・・。
少しでも早く役立てるように頑張ります!!

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library