tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルIF文で判断ミス
記事No13672
投稿日: 2009/05/14(Thu) 23:50
投稿者ゆき
いつも参考にさせてもらってます。
WINDOWSXP、VB6にて検査システムを作成しています。
サーバから検査データを抽出し、検査結果に対しIF文を使用させて
合否判断をする形で考えています。
まず、複数レコード有る抽出データをグリッドに読み込みます。
(1レコードに対しカラム方向に複数の検査項目結果が在ります)

グリッド 検査項目→
↓番号   a   b   c   d   e・・・・・・z 判定結果
A         1   2   8   4   3           2   合格
B     5   5   3   4   7            5  e不良
C     1   3   5   9   2            9  d不良    

Do〜Loopを使用しA,B,Cと順に判定します。
各項目a〜zの規格に対し規格外で在れば判定結果に何不良と表示します。

で、以下が判定に際し使用している記述です。
この記述で現象としておかしな所はある幾つかの検査項目の条件判断結果が
正常で無い事です。
例えば、検査項目cに関して規格最大が6規格最小が0の場合でグリッド上の
検査結果が5でも判定結果が不良と判断されたり、同検査項目で検査結果が1
で合格と判断されます。
私が見る限りではおかしい所は無いと思えるのですが、記述の誤りで判断結果
がおかしいのか、それともIF文自体をこういった形でたくさん使用しているの
が悪いのか、ご指摘ご指導して頂ければ勉強になります。
宜しくお願いいたします。

ちなみにこの判定方法では規格外が二つ以上あればグリッド上のカラムの数字が
大きい方から不良と判断されるのは、致し方ないですが。。。
そこには会えて触れないで下さいね。

ROWNO = 1 'グリッドのrows

Dim OUT_F As Long

Do Until INSDATARS.EOF

    OUT_F = 0
    
  With MSFlexGrid1
  Select Case INSDATARS!Max a
    Case "0"
           Select Case INSDATARS!Min a
                Case 0 '●規格無
                Case Is > 0 '●下限片側規格
                    If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"
           End Select
    Case Is > 0
            Select Case INSDATARS!Min a
                Case 0 '●上限片側規格
                    If .TextMatrix(ROWNO, 2) > INSDATARS!Max a Then OUT_F = "1"
                
                Case Is > 0 '●両側規格
                    If .TextMatrix(ROWNO, 2) > INSDATARS!Max a Then OUT_F = "1"
                    If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"
            End Select
    End Select

    Select Case INSDATARS!Max b
    Case "0"
           Select Case INSDATARS!Min b
                Case 0 '●規格無
                Case Is > 0 '●下限片側規格
                    If .TextMatrix(ROWNO, 3) < INSDATARS!Min b Then OUT_F = "2"
           End Select
    Case Is > 0
            Select Case INSDATARS!Min b
                Case 0 '●上限片側規格
                    If .TextMatrix(ROWNO, 3) > INSDATARS!Max b Then OUT_F = "2"
                
                Case Is > 0 '●両側規格
                    If .TextMatrix(ROWNO, 3) > INSDATARS!Max b Then OUT_F = "2"
                    If .TextMatrix(ROWNO, 3) < INSDATARS!Min b Then OUT_F = "2"
            End Select
    End Select
      ・
     ・
     ・
'----------------------------------------------------------------------------
    Select Case OUT_F
        Case 1
            .TextMatrix(ROWNO, 20) = "a不良"
        Case 2
            .TextMatrix(ROWNO, 20) = "b不良"
        Case 3
            .TextMatrix(ROWNO, 20) = "c不良"
     ・
     ・
     ・
    End Select
    
    End With
    
    ROWNO = ROWNO + 1
    
    INSDATARS.MoveNext
    
Loop

[ツリー表示へ]
タイトルRe: IF文で判断ミス
記事No13673
投稿日: 2009/05/15(Fri) 08:15
投稿者nobu
難しい問題点は別にして単純におかしなところがあると思いますが

> WINDOWSXP、VB6にて検査システムを作成しています。

> Dim OUT_F As Long
>     OUT_F = 0
>                     If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"

Dim OUT_F As Long なのに OUT_F = "1" はおかしいでしょう? 変数の型が違う。


>   Select Case INSDATARS!Max a
>            Select Case INSDATARS!Min a

上記の様な記述 INSDATARS!Max a や INSDATARS!Min a は
ソースを貼り付けてみましたがVB6ではエラーになりますが.....。 

実際のソースでは無い投稿なのでは....?

[ツリー表示へ]
タイトルRe^2: IF文で判断ミス
記事No13674
投稿日: 2009/05/15(Fri) 09:38
投稿者ゆき
> 難しい問題点は別にして単純におかしなところがあると思いますが
>
> > WINDOWSXP、VB6にて検査システムを作成しています。
>
> > Dim OUT_F As Long
> >     OUT_F = 0
> >  If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"
>
> Dim OUT_F As Long なのに OUT_F = "1" はおかしいでしょう? 変数の型が違う。

※正常に判定しないため、OUT_F=1にしたりOUT_F="1"にしたりと苦戦した名残です。すみません。
これは直接的な誤判断と関連性は有りませんでした。

>
> >   Select Case INSDATARS!Max a
> >            Select Case INSDATARS!Min a
>
> 上記の様な記述 INSDATARS!Max a や INSDATARS!Min a は
> ソースを貼り付けてみましたがVB6ではエラーになりますが.....。 
>
> 実際のソースでは無い投稿なのでは....?

※実際のソースをコピペはしていません。
見て頂く方にコピペでは分かり辛いですし、INSDATARS!Min a はレコードセットですので
ソースの貼り付けだけではエラーになります。

言葉足らずですみません。

[ツリー表示へ]
タイトルRe^3: IF文で判断ミス
記事No13677
投稿日: 2009/05/15(Fri) 10:00
投稿者魔界の仮面弁士
> ※実際のソースをコピペはしていません。
> 見て頂く方にコピペでは分かり辛いですし、
「現象を再現可能」な「最低限のコード」を見せて頂けないでしょうか。

現象の再現しない、しかもコンパイルの通らないコードを提示されても、
第三者が問題箇所を指摘するのは難しいです。文法違反の指摘ならば容易ですが。

> INSDATARS!Min a はレコードセットですので
あれ?
Recordset なのは「INSDATARS」であって、「INSDATARS!Min a」ではありませんよね。

ADO 2.5 の階層型レコードセットや、DAO 12.0 の複数値型フィールドを使っている場合は、
フィールド値が別の子レコードセットを返す事もありえますが、今回の件では
そうでは無いみたいですし。

それに、Min と a の間の空白も、VB 構文としては文法エラーとして扱われるでしょう。
INSDATARS![Min a].Value や INSDATARS.Fields("Min a").Value といった
記述ならばできますが……。


> ソースの貼り付けだけではエラーになります。
『見て頂く方にコピペでは分かり辛いですし』とありましたが、このように
文法エラーなソースを見て、そこから元のコードを推測するというのは、
元のソースを貼り付けられる以上に難しいです。

もし、コードでの掲載ができないのであれば、現在の判定フローを日本語で
説明してみては如何でしょうか? そうすれば、ロジックが間違っているのか、
それともそのロジックを VB に書き起こす際にミスがあったのかを切り分けられる人が
居るかもしれません。


それと、MSFlexGrid1.TextMatrix が返す値は、数値では無く文字列です。
文字列と数値を型変換する事無く比較する事は避け、数値型/文字列型の
いずれかに統一してから比較するようにした方が良いでしょう。型を意識しておかないと、
 「"2" < 10」… True
 「"2" < "10"」… False
であるといった、分かりにくい問題を生む事になります。

[ツリー表示へ]
タイトルRe^4: IF文で判断ミス 解決
記事No13679
投稿日: 2009/05/15(Fri) 12:41
投稿者ゆき
魔界の仮面弁士さん
いろいろご指摘有難うございます。
以後は気をつけます。

以下の件もCDECを使用し動作が確実な物になりました 。

>
> それと、MSFlexGrid1.TextMatrix が返す値は、数値では無く文字列です。
> 文字列と数値を型変換する事無く比較する事は避け、数値型/文字列型の
> いずれかに統一してから比較するようにした方が良いでしょう。型を意識しておかないと、
>  「"2" < 10」… True
>  「"2" < "10"」… False
> であるといった、分かりにくい問題を生む事になります。

[ツリー表示へ]
タイトルRe: IF文で判断ミス
記事No13675
投稿日: 2009/05/15(Fri) 09:46
投稿者GOD
> 例えば、検査項目cに関して規格最大が6規格最小が0の場合でグリッド上の
> 検査結果が5でも判定結果が不良と判断されたり、同検査項目で検査結果が1
> で合格と判断されます。
> 私が見る限りではおかしい所は無いと思えるのですが、記述の誤りで判断結果
> がおかしいのか、それともIF文自体をこういった形でたくさん使用しているの
> が悪いのか、ご指摘ご指導して頂ければ勉強になります。
>
投稿されたコードに c 部分がないので正しいかどうかは掲示板を見ている人には分かりません。

余分なことかもしれませんが↓は関数化できませんか。(aとbの比較法が同じなのでできると思うのですが、c〜zでは違う方法で比較しているのかな。)
>   Select Case INSDATARS!Max a
>     Case "0"
>            Select Case INSDATARS!Min a
>                 Case 0 '●規格無
>                 Case Is > 0 '●下限片側規格
>                     If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"
>            End Select
>     Case Is > 0
>             Select Case INSDATARS!Min a
>                 Case 0 '●上限片側規格
>                     If .TextMatrix(ROWNO, 2) > INSDATARS!Max a Then OUT_F = "1"
>                
>                 Case Is > 0 '●両側規格
>                     If .TextMatrix(ROWNO, 2) > INSDATARS!Max a Then OUT_F = "1"
>                     If .TextMatrix(ROWNO, 2) < INSDATARS!Min a Then OUT_F = "1"
>             End Select
>     End Select
----------- 呼び出し側
    Dim OUT_F As Boolean
    Dim strErr As String

    Do Until INSDATARS.EOF
        With MSFlexGrid1
            'aの処理
            OUT_F = FuncName(.TextMatrix(ROWNO, 2), INSDATARS!Min a, INSDATARS!Max a)
            If OUT_F Then
                strErr = strErr & "a不良,"
            End If
            'bの処理
            OUT_F = FuncName(.TextMatrix(ROWNO, 3), INSDATARS!Min b, INSDATARS!Max b)
            If OUT_F Then
                strErr = strErr & "b不良,"
            End If
            'c〜zの処理
            '
            If Right(strErr, 1) = "," Then
                strErr = Left(strErr, Len(strErr) - 1)
            End If
            .TextMatrix(ROWNO, 20) = strErr
        End With
        ROWNO = ROWNO + 1
        INSDATARS.MoveNext
    Loop
----------------------------------
'【機 能】
'   CompVal が規格内に収まっているか確認する
'【引き数】
'   CompVal     :比較する値
'   MinVal      :最小値
'   MaxVal      :最大値
'【戻り値】
'   True        :正常値
'   False       :異常値
Private Function FuncName(CompVal As Long, MinVal As Long, MaxVal As Long) As Boolean
     blnRet As Boolean

     blnRet = True
     Select Case MaxVal
     Case 0
            Select Case MinVal
                 Case 0 '●規格無
                 Case Is > 0 '●下限片側規格
                     If CompVal < MinVal Then blnRet = False
            End Select
     Case Is > 0
             Select Case MinVal
                 Case 0 '●上限片側規格
                     If CompVal > MaxVal Then blnRet = False
                
                 Case Is > 0 '●両側規格
                     If CompVal > MaxVal Then blnRet = False
                     If CompVal < MinVal Then blnRet = False
             End Select
     End Select
End Function

[ツリー表示へ]