[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/02/23(Wed) 12:43
投稿者名:ももたろう
Eメール:
URL :
タイトル:
MSHFlexGridでのNULL表示について
いつもお世話になっております。

ACCESSのmdbを読み込ませて、MSHFlexGridに表示させようと思うのですが、
null値のところで止まってしまいます。
エラーmsg:「NULLの使い方が不正です」
null値も読み込ませるようなプロパティがあるのでしょうか?
プロパティを見ても分からなかったので教えて下さい。
よろしくお願いします。

ソースは下記になります。
Private Sub cmdSearch_Click()
    Dim cn              As New ADODB.Connection  'データベースに接続するためのコネクションオブジェクト
    Dim cmd             As ADODB.Command
    Dim rst             As ADODB.Recordset
    Dim strSQL          As String
    Dim i               As Integer
    
    Set cn = New ADODB.Connection
    cn.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\cr5000.mdb"
    cn.Open
    
    Set rst = New ADODB.Recordset
        
    strSQL = "select * from cr5000 where partName like '" & txtpartName.Text & _
            "' and partcode like '" & txtPartCode.Text & _
            "' and partcode like '" & txtGTCode.Text & _
            "' and partcode like '" & txtMaker.Text & _
            "'  and partcode like '" & txtMakerCode.Text & _
            "'  and partcode like '" & txtvalue.Text & _
            "'  and partcode like '" & txtNumberOfPin.Text & "'"
    Set rst = cn.Execute(strSQL, , adCmdText)
    
    frmShow1.Show
    i = 1
    
    Do While Not rst.EOF
        With frmShow1.MSHFlexGrid1
            .AddItem ""
            .TextMatrix(i, 0) = rst![*]
            .TextMatrix(i, 1) = rst![partName]
            .TextMatrix(i, 2) = rst![SearchCode]
            .TextMatrix(i, 3) = rst![PartsClass]
            .TextMatrix(i, 4) = rst![GTCode]
            .TextMatrix(i, 5) = rst![PartCode]
            .TextMatrix(i, 6) = rst![JapanesePartsName]
            .TextMatrix(i, 7) = rst![EnglishPartsName]
            .TextMatrix(i, 8) = rst![UsedSection]
            .TextMatrix(i, 9) = rst![RegisteredSection]
            .TextMatrix(i, 10) = rst![FailureRate]
        End With
        i = i + 1
        rst.MoveNext
    Loop
    
    rst.Close
    cn.Close
    Set rst = Nothing
    Set cn = Nothing
End Sub

投稿時間:2005/02/23(Wed) 15:25
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: MSHFlexGridでのNULL表示について
事前に置き換えておくのではだめですか?

投稿時間:2005/02/23(Wed) 15:33
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^2: MSHFlexGridでのNULL表示について
> 事前に置き換えておくのではだめですか?
mdbのデータを書き換える事ですか?
mdbデータは修正しないで、そのままの状態で表示したいのですが、難しいのでしょうか?

また、下記の様にnullだったら""を表示するIF文を加えてみたのですが、
rst![*] = Null で、NULLの値を認識してくれません。そのまま、Else文を処理してしまいます。
      If rst![*] = Null Then
                .TextMatrix(i, 0) = ""
            Else
                .TextMatrix(i, 0) = rst![*]
            End If

投稿時間:2005/02/23(Wed) 16:26
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^3: MSHFlexGridでのNULL表示について
自己レスです。

On Error Resume Next
を追加したら問題なくNULL値があっても表示されるました。

ありがとうございました。

投稿時間:2005/02/23(Wed) 16:40
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: MSHFlexGridでのNULL表示について
> On Error Resume Next
> を追加したら問題なくNULL値があっても表示されるました。

その方法だと、グリッドの内容は変化しない事になりますが、それでも大丈夫なのでしょうか?

たとえば、
  .TextMatrix(2, 2) = "ABC"
というデータが入っている状態で、
  On Error Resume Next
  .TextMatrix(2, 2) = Null
のようなコードを実行すると、グリッドの内容は "ABC" のままになってしまいます。

投稿時間:2005/02/23(Wed) 16:35
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: MSHFlexGridでのNULL表示について
> > 事前に置き換えておくのではだめですか?
> mdbのデータを書き換える事ですか?

SELECTで取得する時に、
  SELECT IIF(ISNULL(列名), '', 列名)
のような構文にすれば、NULLを空文字に置き換えられます。

> また、下記の様にnullだったら""を表示するIF文を加えてみたのですが、
> rst![*] = Null で、NULLの値を認識してくれません。

こういう時は、IsNull関数(など)を使ってみてください。


> そのまま、Else文を処理してしまいます。
ヘルプをもう一度良く見てみましょう。

ヘルプで[比較演算子]の項を見ると、「式1 = 式2」という比較式においては、
   両者が同一なら、True。
   両者が異なると、False。
   一方が Null だと、Null。
という結果になるという旨が書かれています。

つまり、『If (A = Null) Then』の条件式は、絶対に「真(True) にはならない」のです。
(ヘルプの[If...Then...Else ステートメント]の項も参照してみてください)


あるいは、
    .TextMatrix(i, 0) = "" & rst.Fields("partName").Value
のように、『空文字列 と連結させる』という逃げ方もあります。


もしくは、Nullからの変換関数を独自に用意しておき、
    .TextMatrix(i, 0) = Nz(rst.Fields("partName").Value)
のようなコードにするのも良いかと思います。


たとえば、Access の Nz関数を真似て変換関数を作るなら、こんな感じで。

  Public Function Nz(ByVal Value As Variant, Optional ValueIfNull As Variant) As Variant
    If Not IsNull(Value) Then
      Nz = Value
    ElseIf IsMissing(ValueIfNull) Then
      Nz = Empty
    Else
      Nz = ValueIfNull
    End If
  End Function

投稿時間:2005/02/24(Thu) 11:44
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^4: MSHFlexGridでのNULL表示について
魔界の仮面弁士さん返信ありがとうございます。

On Error Resume Next を使用しているからかもしれませんが、予想した結果と違った結果が表示
されてしまいます。(ヒットされてくるはずの値がヒットされてこない)

On Error Resume Next を削除して、アドバイス頂いた方法で再度作り直したいと思います。

結果を報告致しますので、しばらくお待ち下さい。

投稿時間:2005/02/25(Fri) 20:33
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^4: MSHFlexGridでのNULL表示について
いろいろ調べてみてIsNull関数を使うことにしました。
ありがとうございました。

> > また、下記の様にnullだったら""を表示するIF文を加えてみたのですが、
> > rst![*] = Null で、NULLの値を認識してくれません。
>
> こういう時は、IsNull関数(など)を使ってみてください。

新しい問題で、mdbにNULL値がある場合、検索してもヒットされてこない行があります。
但し、よくわからないんですが、NULL値があってもヒットされてくる行もあります。
ヒットされない行は何度実行してもヒットされてきません。
試しに、NULL値を無くしたらヒットされてくるので、NULL値があると検索がうまくいかないと
思っていますが、違う原因も考えられますか?
お手数おかけしますが、よろしくお願いします。

投稿時間:2005/02/27(Sun) 02:33
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: MSHFlexGridでのNULL表示について
> 新しい問題で、mdbにNULL値がある場合、検索してもヒットされてこない行があります。
その説明で理解するのは、かなり酷ですね……。(^^;

「どのようなコードで検索しているのか」が一切書かれていないので、
それだけでは何とも判断できません。


> 但し、よくわからないんですが、NULL値があってもヒットされてくる行もあります。
1. 『NULL』と『長さゼロの文字列』を混同していないか。
2. 『NULL』の項目に対して「= 演算子」で比較していないか。
などを良く確認してみてください。

投稿時間:2005/02/28(Mon) 13:05
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^6: MSHFlexGridでのNULL表示について
> > 新しい問題で、mdbにNULL値がある場合、検索してもヒットされてこない行があります。
> その説明で理解するのは、かなり酷ですね……。(^^;
>
> 「どのようなコードで検索しているのか」が一切書かれていないので、
> それだけでは何とも判断できません。

確かに!そうですよね、すみません、下記にコードを明記します。

  Dim strSQL          As String
    Dim i               As Long
    
    Dim rst     As DAO.Recordset
    Dim DB      As DAO.Database
    
    strSQL = "SELECT * FROM CR5000 WHERE partName like '" & txtpartName.Text & _
            "' and partcode like '" & txtPartCode.Text & _
            "' and GTCode like '" & txtGTCode.Text & _
            "' and Maker like '" & txtMaker.Text & _
            "' and MakerCode like '" & txtMakerCode.Text & _
            "' and value like '" & txtvalue.Text & _
            "' and NumberOfPin like '" & txtNumberOfPin.Text & "'"
    Debug.Print strSQL
    Set DB = OpenDatabase(App.Path & "\cr5000.mdb")
    Set rst = DB.OpenRecordset(strSQL)
    
    i = 1
    With rst
        Do While Not .EOF
            Debug.Print i & " " & rst![partName] & " " & rst![SearchCode] & " " & rst!
[PartsClass] & " " & _
                        rst![GTCode] & " " & rst![PartCode] & " " & rst![JapanesePartsName]
& " " & _
                        rst![NumberOfPin]
            .MoveNext
            i = i + 1
        Loop
    End With
        
    rst.Close
    DB.Close
    Set rst = Nothing
    Set DB = Nothing

> > 但し、よくわからないんですが、NULL値があってもヒットされてくる行もあります。
> 1. 『NULL』と『長さゼロの文字列』を混同していないか。
> 2. 『NULL』の項目に対して「= 演算子」で比較していないか。
> などを良く確認してみてください。

確認してから返信しますので、よろしくお願いします。

投稿時間:2005/02/28(Mon) 15:17
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^7: NULL表示について
> > > 新しい問題で、mdbにNULL値がある場合、検索してもヒットされてこない行があります。
>     strSQL = "SELECT * FROM CR5000 WHERE partName like '" & txtpartName.Text & _
>             "' and partcode like '" & txtPartCode.Text & _
>             "' and GTCode like '" & txtGTCode.Text & _
>             "' and Maker like '" & txtMaker.Text & _
>             "' and MakerCode like '" & txtMakerCode.Text & _
>             "' and value like '" & txtvalue.Text & _
>             "' and NumberOfPin like '" & txtNumberOfPin.Text & "'"

LIKE演算子で検索しているのですね。

相手がNULLの場合、『列名 LIKE '条件文字列'』では検索されないため、
『列名 IS NULL』を使う必要があります。


> > > 但し、よくわからないんですが、NULL値があってもヒットされてくる行もあります。
> > 1. 『NULL』と『長さゼロの文字列』を混同していないか。
> > 2. 『NULL』の項目に対して「= 演算子」で比較していないか。
> > などを良く確認してみてください。
> 確認してから返信しますので、よろしくお願いします。

NULL値の判断は、VBでは IsNull 関数を使って「If IsNull(値) Then」のように書きます。
SQLでは、IS演算子を使って「WHERE 列名 IS NULL」のように書く必要があります。


NULLは空データという意味ではなく、「不明な値」という意味を持つ事に注意してください。

内容が不明な値に対して、「=, LIKE, >, <」などで比較したとしても、データが
一致するかどうかはわかりませんよね。ですから、NULL と = や LIKE で比較した場合は、
結果は常に 不明値(NULL) となり、検索条件にはヒットしないはずです。

投稿時間:2005/02/28(Mon) 16:12
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^8: NULL表示について
魔界の仮面弁士さんいろいろと教えて頂き、ありがとうございました。

結局mdbデータを作成するところで、NULL値を""に変更するように修正しました。
なので、検索も問題なくできるようになりました。
今回の案件は時間に余裕があるので、他の書き方でも勉強してみたいと思います。
また、分からない事があった時は、よろしくお願いします。