グリッド上のチェックボックスONデータを更新・・・

解決


めぐぅ  2004-08-19 06:31:46  No: 115750

こんばんは  よろしこお願いします。
グリッド上にチェックボックスがあり、
明細表示した後、チェックONのデータに対して更新処理を行います。
For〜Nextでは明細上にチェックONのデータがいくつあるかカウントするための物です。変数「l」にチェックONのカウント数が格納されます。
そこで今、困っていることゎ、
If Me.pTblSyousai.Rows(i).Item("チェック") = True Then
でエラー「演算子が型'DBNull'および型'Boolean'に対して有効ではありません。」
というエラーが出ちゃてます。これがどこで引っかかってるのかわからないんです。。。
また、何故かこのエラーが出ないときもあります。謎・・・
うまく説明できず、言葉足らずでごめんなさい。
こんな初心者のあたしに何かアドバイスしていただけたらありがたいです。
よろしくお願いします(^∀^)/

*************************************************
    Public Sub Update()
        Dim i As Integer
        Dim l As Integer
        Uriage.BeginTrans()
        Try
            If ObjCommonCls.NtoZ(UriageNo) = 0 Then
                l = 0
                For i = 0 To pTblSyousai.Rows.Count - 1
                    If Me.pTblSyousai.Rows(i).Item("チェック") = True Then
                        l = l + 1
                    End If
                Next
                If l = 0 Then
                    MsgBox("対象データが存在しません", MsgBoxStyle.Information, gstrSystemName)
                    Exit Sub
                Else
                    Call Update_Data()
                    Call Data_Clear()
                    MsgBox("処理が終了しました", MsgBoxStyle.Information, gstrSystemName)

                End If
            End If
        Catch
            MsgBox(Err.Description, MsgBoxStyle.Exclamation, gstrSystemName)
            
            Uriage.RollbackTrans()
        Finally
            Uriage.CommitTrans()
        End Try
    End Sub


めぐぅ  2004-08-19 06:34:53  No: 115751

ごめんなさい・・・
vb.netなんですが、いいのかな・・??笑


特攻隊長まるるう  2004-08-19 17:56:53  No: 115752

>エラー「演算子が型'DBNull'および型'Boolean'に対して有効ではありません。」
>というエラーが出ちゃてます。これがどこで引っかかってるのかわからないんです。。。
エラー内容そのままです。
データベースで値が設定されていない場合、Null という特別な表現を使うのは
ご存知ですよね?これは 0 ではありませんし、ましてや Boolean 型でもありません。
データベース アプリケーションに既知の値が存在しないことを示してます。何だか
分からない状態です。(設定されてない状態なのですから当たり前ですが…(^^;))

では、めぐぅさんは『"何だか分からないモノ"は True ですか? False ですか? 』
と質問されたら困りませんか?人間でも困る事を質問されたら、コンピュータは
もっと困ります。ですから
    If Me.pTblSyousai.Rows(i).Item("チェック") = True Then
で If 『データベースの Null』 = True Then となった時にのみ、
『演算子(=)が型'DBNull'(データベースの Null)および型'Boolean'(True)に
対して有効ではありません。(判断できませんってば!)』と文句を言ってる訳です。
>また、何故かこのエラーが出ないときもあります。謎・・・
通常は True か False が設定されてますから判断できますよね?その場合、
エラーは出ません。

[VB.NET]で『データベースの Null』は
    DBNull.Value
で表されます。しかも参照型のため、演算子は Is を使います。

                    If Me.pTblSyousai.Rows(i).Item("チェック") Is DBNull.Value Then
                        ' Null だった時の処理
                    ElseIf Me.pTblSyousai.Rows(i).Item("チェック") = True Then
                        l = l + 1
                    End If

でどうでしょうか?


めぐぅ  2004-08-19 22:59:12  No: 115753

特攻隊長まるるうさま  はじめましてぇ。
ご親切に教えてくださってありがとうございますっ!光栄です!!

>If Me.pTblSyousai.Rows(i).Item("チェック") = True Then
>で If 『データベースの Null』 = True Then となった時にのみ、
>『演算子(=)が型'DBNull'(データベースの Null)および型'Boolean'(True)に
>対して有効ではありません。(判断できませんってば!)』と文句を言ってる訳で
>す。
なるほどなるほど・・・Nullチェックが必要ってことかぁー
で、実際教えてくださった

If Me.pTblSyousai.Rows(i).Item("チェック") Is DBNull.Value Then
    ' Null だった時の処理
ElseIf Me.pTblSyousai.Rows(i).Item("チェック") = True Then
    l = l + 1
End If

このソースでエラーは回避されたみたいです!!ありがとうございます!!
しかし・・・しっくりこないあたし・・・
グリット上の"チェック"はDataGridBoolColumnで定義されています。
Boolean 型なので、値としては「True」か「False」だけじゃないの!?
って考えてしまいます。
特攻隊長まるるう様が言うように・・・
>データベースで値が設定されていない場合、Null という特別な表現を使うのは
>ご存知ですよね?これは 0 ではありませんし、ましてや Boolean 型でもありま
>せん。
ってとこが勉強不足なのかもしれません。
とにかく、「チェックボックスのON・OFFを判断するときはNullチェックもやりなさい!!!」ってことで認識してOKですよね??
勉強のためにいろいろ教えてください。

ひとまず問題のエラーは解決しました!ありがとうございます!


特攻隊長まるるう  2004-08-20 01:45:51  No: 115754

>勉強のためにいろいろ教えてください。
それは自分で調べて下さい(^^;)
データベースの基礎知識が足りないんだったら、データベースを対象とした
入門書を買って読んで下さい。ここでボクに本にして数十ページの内容を
書き込めとでも?無茶言わないで下さいよ…。
本を読むと眠くなるのならセミナーでも受けて下さい。能力開発系のセミナー
の中にはデータベースに関するものもあります。
お金が掛けられないのなら…コツがつかめないと手間はかかりますが WEB 検索
ですか…。

プログラムに関することなので、知りたいキーワードに『VB.NET』とか『VB6』
とか関連させて調べると効率よく調べられるでしょう。
関連したサイトでキーワード検索するのも有効です。例えばマイクロソフト…
http://search.microsoft.com/search/search.aspx?st=b&View=ja-jp
http://support.microsoft.com/default.aspx?scid=fh;ja;kbhowto
例えば他の質問掲示板…
…まあ、これはたくさんあるので省略します。

>とにかく、「チェックボックスのON・OFFを判断するときはNullチェックもやりなさい!!!」ってことで認識してOKですよね??
チェックボックスだけではありません。Null を許容する設定(NOT NULL制約の無い)のフィールドは全てです。
[NULL 値]の理解はできていますか?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_qd_02_8pwy.asp
(余談ですが『空文字列』を指す場合もあります。 http://e-words.jp/w/E3838CE383AB.html
でもデータベースを対象とした話では違います。NULL 値は、認識できない値を示します。)
[列の制約とルール](NOT NULL制約)
http://www.microsoft.com/japan/technet/prodtechnol/sql/maintain/optimize/06ppcsqe.asp

>グリット上の"チェック"はDataGridBoolColumnで定義されています。
>Boolean 型なので、値としては「True」か「False」だけじゃないの!?
>って考えてしまいます。
それは今まで学校で習ってきた考え方ですね。しかしデータベースは3値論理なのです。
http://village.infoweb.ne.jp/~fwnk3364/mahtan/tech/sql/threeValue.html
このページは…ひとによっては面白いと思います。
http://www.geocities.jp/mickindex/database/db_3vl.html


めぐぅ  2004-08-20 03:51:25  No: 115755

特攻隊長まるるう様  ホントに丁寧にありがとうございます。
おっしゃるとおりですね^^  
甘えてました・・・すいません!!

データベース関連の知識が足りないと思われるので、VB.NETと平行して知識を深めていこうと思います。
ここで紹介して頂いたサイトも参考にさせて頂きます。

ホントありがとうございました!!がんばります!!
また何かお世話になることがありましたらよろしくお願いしますね♪


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




  


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