oo4oでMSFlexGridにNULL値を入れるには?

解決


わか  2003-08-20 23:41:48  No: 108186

こんにちは。

現在oo4oでOracleに接続し、MSFlexGridに表示しています。
テーブル内にnull値ないと読み込めるのですが、null値があると
以下のエラーが表示されます。

「実行時エラー'94' NULL値の使い方が不正」

MSFlexGridにNULL値を入れるにはどうすればいいのでしょうか?

以下のコードで行っています。

Option Explicit
'*************oo4oオブジェクト変数の宣言*************
'OraSessionクラス    : 変数名 oraSession
'OraDatabaseクラス  : 変数名 oraDB
'OraDynasetクラス   : 変数名 oraTable
'****************************************************
Dim oraSession As Object
Dim oraDB As OraDatabase
Dim oraTable As OracleInProcServer.OraDynaset
---------------------------------------------------------
Private Sub cmdList_Click()
'全体表示をクリックしたときの処理
    Dim intColumn As Integer, intRow As Integer
    Dim intColMax As Integer

    oraTable.Refresh
    MSHFlexGrid1.Rows = oraTable.RecordCount + 1
    intColMax = oraTable.Fields.Count
    MSHFlexGrid1.Cols = intColMax + 1
    
    'テーブル名の表示
    With oraTable
        Do While intColumn < intColMax
            MSHFlexGrid1.TextMatrix(0, intColumn + 1) = _
            .Fields(intColumn).Name
            intColumn = intColumn + 1
        Loop
    End With
    
    intRow = 1
    intColumn = 1
    
    'テーブル情報の表示
    With oraTable
        Do Until .EOF
            MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
            For intColumn = 1 To intColMax
                MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
                .Fields(intColumn - 1).Value
            Next intColumn
            intRow = intRow + 1
            .MoveNext
        Loop
    End With
            
End Sub
------------------------------------------------------------------
Private Sub Form_Load()
    Set oraSession = CreateObject("OracleInProcServer.XOraSession")
    Set oraDB = oraSession.OpenDatabase _
    ("DB名", "ユーザー名/パスワード", ORADB_DEFAULT)
    Set oraTable = oraDB.CreateDynaset("select * from emp", 0&)
End Sub

cmdListボタンを押すとMSHFlexGrid1にOracleのempというテーブルが表示
されます。

環境は  VB6.0
        Oracle8.1.7  です

長くなってしまいましたが…皆様よろしくお願いいたします<(__)>


魔界の仮面弁士  2003-08-21 02:05:52  No: 108187

こういう時は、
  〜 = oraTable.Fields(n).Value & ""
のように、空文字列を連結すればOKです。

あるいは、Format関数を使う事もできます。例えば、
  〜 = Format( oraTable.Fields(n).Value, "#,0;;;(空です)")
のようにすれば、
  12345 なら "12,345"
  Null  なら "(空です)"
になります。


わか  2003-08-21 18:30:12  No: 108188

遅くなってしまって申し訳ありません。
魔界の仮面弁士様回答ありがとうございます(^^)

空文字列の連結を以下のように行ってみたのですが、Date型の
データがテーブルに含まれているとエラーが出てしまうようです(TT)
  For intColumn = 1 To intColMax
        MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
        .Fields(intColumn - 1).Value  &  ""
  Next intColumn

Format関数のほうはエラーは出ず、表示されるようなのですが、
Date型のデータが含まれていると表示がおかしくなってしまいます。

そこで、良くわからないところがあるのですが、Formatの  
  >"#,0;;;(空です)"
の部分は何を表しているのでしょう。「;;;」という書き方が
はじめてで何を表しているのかわからなくて・・・
よろしくお願いいたします。

あと、NullをNullとしてMSFlexGridに表示することって出来るのでしょうか?


魔界の仮面弁士  2003-08-21 20:42:41  No: 108189

>  >"#,0;;;(空です)"
> の部分は何を表しているのでしょう。「;;;」という書き方が
> はじめてで何を表しているのかわからなくて・・・
ヘルプで『Formar 関数』について調べて見てください。
左上に書いてある「関連項目」にて、詳しく解説されていますよ。(^_^;)

で…この"#,0;;;(空です)"は『数値表示書式』と呼ばれる物です。
数値表示書式には、4種類の書式パターンがあり、
 1. 正数
 2. 負数
 3. ゼロ
 4. NullまたはEmpty
のそれぞれに対して、書式を定義できるようになっています。
複数の書式を定義する場合は、それぞれを ; で区切ります。

例えば、
   Format(値,  "正数で#,0;負数で#,0;ゼロです;ヌルです")
のような書式に対して、いろいろな値(正数、負数、0、Nullなど)を
指定して見てください。第2引数で指定した書式の意味がわかると思います。

同様に『文字列表示書式』にも複数の書式(2書式)を同時に定義でき、例えば
   Format(now, "文字列の@@@;空です")
のような書式にする事ができます。こちらは、
 1. 以下の 2.以外のデータ
 2. NullまたはEmptyまたは空文字列
という意味になります。

なお、『日付表示書式』には1つの書式しかありませんので、
「;」で複数の書式を割り当てる事はできません。

> Date型のデータが含まれていると表示がおかしくなってしまいます。
Date型の場合には、どのようにして表示させていますか?
例えば、Format関数等を使わずに表示させた場合、
コントロールパネルの設定に応じた書式が使われますので、
環境によって、違う書式で出力される事になります。

また、Format関数を使うにしても、日付表示書式ではなく、
文字列書式や数値書式を適用してしまったとすれば、
望むべき結果は得られないでしょう。

> あと、NullをNullとしてMSFlexGridに表示することって出来るのでしょうか?
そもそもMSFlexGridは、データをStringで保持しています。
しかし、String型はNullを保持できませんので、替わりに、
「"Null"という文字列をセルに表示する」
「"(空データ)"という文字列をセルに表示する」
「何も表示しない("")が、セルの背景色を薄い黄色にする」
などといった、他の表現方法で誤魔化して見ては如何でしょう。

(元の値がNullかどうかは、IsNull関数で調べる事ができます)


わか  2003-08-21 22:30:13  No: 108190

>ヘルプで『Formar 関数』について調べて見てください。
>左上に書いてある「関連項目」にて、詳しく解説されていますよ。(^_^;)

あ・・・(><;)気づきませんでした。申し訳ありません。
今度から気をつけて見るようにいたしますm(__)m
でも、説明が分かり易くてすごく良かったです(^^)
本当にありがとうございます!

>Date型の場合には、どのようにして表示させていますか?
以下のコードでデータをMSFlexGridに入れていたので、特に
Format関数などは使っておりませんでした。

    'テーブル情報の表示
    With oraTable
        Do Until .EOF
            MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
            For intColumn = 1 To intColMax
                MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
                .Fields(intColumn - 1).Value
            Next intColumn
            intRow = intRow + 1
            .MoveNext
        Loop
    End With

>コントロールパネルの設定に応じた書式が使われますので、
>環境によって、違う書式で出力される事になります。
書式がコントロールパネルの設定による事をはじめて知りましたので
以下のコードに変更し、Nullも
>「"(空データ)"という文字列をセルに表示する」
という、魔界の仮面弁士さんの考えを使用させていただきました。

    With oraTable
        Do Until .EOF
            MSHFlexGrid1.TextMatrix(intRow, 0) = intRow
            For intColumn = 1 To intColMax
                If IsNull(.Fields(intColumn - 1).Value) Then
                    MSHFlexGrid1.TextMatrix(intRow, intColumn) =
                     _ "(空です)"
                ElseIf IsDate(.Fields(intColumn - 1).Value) Then
                    MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
                    Format(.Fields(intColumn - 1).Value, "yyyy/mm/dd")
                Else
                    MSHFlexGrid1.TextMatrix(intRow, intColumn) = _
                    .Fields(intColumn - 1).Value
                End If
            Next intColumn
            intRow = intRow + 1
            .MoveNext
        Loop
    End With

以上が解決したコードです。ありがとうございました<(__)>


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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