[リストへもどる]
一括表示

投稿時間:2002/08/20(Tue) 12:08
投稿者名:びっぐむーん
Eメール:bobble2@yahoo.co.jp
URL :
タイトル:
レコードカウントの取得についての質問
はじめまして。
教えて頂きたいことがあります。

初めに私の勤務している会社では開発は全て外注に出している為に私自身プログラムの開発は
ほとんどできません。
(ソースを見るくらいのレベルです)
ですから説明に至らぬところが多々あるとは思いますが、その辺りを踏まえてご教授願えたらと思い
ます。

実行環境 VB5.0
         ORACLE 7.3.4
         WINDOWS NT 4.0

    ORACLEへの接続 OO4O

処理内容 VBの画面から伝票b入力しその伝票データの内容を画面上に表示させる。

画面機能 F3  KEY データ検索
    F9  KEY 画面クリア(F3で読み込んだデータをの画面クリア)
    F10 KEY 終了

オラクル上に伝票データがあり、それを画面から伝票b入力して該当するデータの内容を画面に
表示させるのですが、1伝票bノ対して明細が20行を超えると、なぜか画面には20行しか
表示されません。
しかし一度F9の画面クリアを押した後に再度同じ伝票b入力すると何故か今度は正しく表示され
ます。

この伝票内容検索の画面を立ち上げた後、一番最初に検索を行う伝票が20行を超えた時だけ
こんな現象が発生します。

オラクルのテーブルから読んできたデータを画面に表示させる際に

WHILE NOT oraRST.EOF
(値を代入する処理)
WEND

で画面上の項目に代入していっているんですが

例えば26行明細の伝票を検索した際、
画面を立ち上げた時の一回目のoraRST.RECORDCOUNT は 20(←これがおかしい!!)
                    2回目以降は正しく26と返ってきます。

また明細件数が20行ぴったりだった場合は
oraRST.RECORDCOUNTは20なんですがWHILE 〜 WEND のループを21回まわってしまいます。
(20行処理したにも関わらずEOFを検知しない。結果として画面上には20行目のデータが
 ダブって表示され21行明細の様に表示される(この現象も画面を立ち上げた時の一回目のみ
 で2回目以降は20行で正しく表示されます))

なぜ立ち上げた一回目の伝票が20行を超えた時だけこんな現象がおこるのでしょうか?

開発元にも確認をとってもらっているんですが、原因不明という答えしか返ってきません。
どうか宜しくお願いします。

長々とすいませんでした。

投稿時間:2002/08/20(Tue) 12:38
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re: レコードカウントの取得についての質問
まあ、ソースも不明なので答えようもないのですが

初めてSQLを発行するときにLIMITを指定しているのでは?

投稿時間:2002/08/20(Tue) 14:16
投稿者名:びっぐむーん
Eメール:bobble2@yahoo.co.jp
URL :
タイトル:
Re^2: レコードカウントの取得についての質問
NAOさん 早速のお返事ありがとうございます。

正直なところLIMITをつけると言う意味がもう一つわかりません(笑)
ちょっと勉強がてらに調べてみます。

また分からない事があれば教えて下さい。

投稿時間:2002/08/20(Tue) 16:52
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re^3: レコードカウントの取得についての質問
LIMIT って言うのは、SQL の SELECT 文でヒットするレコードが
いっぱいあるときに、ヒットした結果を全部受け取るのではなくて
「ここからここまで」欲しい、と制限をかけることです

たぶんソースのどこかで
"SELECT なんとか FROM テーブル名 WHERE 条件指定 LIMIT 20 OFFSET 0"
とかやっているところがないですか?
LIMIT でソースの中を検索してみるといいかも

投稿時間:2002/08/20(Tue) 18:46
投稿者名:びっぐむーん
Eメール:bobble2@yahoo.co.jp
URL :
タイトル:
Re^4: レコードカウントの取得についての質問
お返事ありがとうございます。

LIMITで検索をして見ましたがHITしませんでした。

後、私が勘違いをしている部分があった?それとも新手のバグ?と思う部分があったので
改めて説明させていただきます。

データの取得方法?はこんな感じでやってると思われます。

*********************************
Public gobjOraDatabase As OraDatabase

Public Const ORADYN_READONLY = &H4&
Public Const ORADYN_NOCACHE = &H8&

*********************************
Dim oraRst  As OraDynaset
Dim G_RECCOUNT      As Long
Dim RowCnt          As Integer      '行カウンタ
*********************************

    With gobjOraDatabase
        '拠点
        .Parameters.Add "IN_KYOTEN_CD", KyotenCd, ORAPARM_INPUT
        .Parameters("IN_KYOTEN_CD").ServerType = ORATYPE_NUMBER
        
        '伝票
        .Parameters.Add "IN_FUJI_NO", FujiNo, ORAPARM_INPUT
        .Parameters("IN_FUJI_NO").ServerType = ORATYPE_NUMBER
    End With

    Set oraRst = gobjOraDatabase.CreatePlsqlDynaset("Begin Pack_受領.RstMain納品書
           (:IN_KYOTEN_CD,:IN_FUJI_NO,:RstMainNouhinData);end;", _
                      "RstMainNouhinData", ORADYN_READONLY + ORADYN_NOCACHE)

*********************************<ストアド側の定義>
TYPE RstMainNouhinData IS REF CURSOR RETURN CurMainNouhinData%ROWTYPE;

CURSOR CurMainNouhinData IS
SELECT ・・・・
FROM   ・・・・
WHERE  ・・・・・;
*********************************<ストアド側の定義>

   G_RECCOUNT = oraRst.RecordCount → この時点では26件と表示されます

   ROWCNT = 0
   While Not oraRst.EOF
       <代入処理>
     RowCnt = RowCnt + 1
     oraRst.MoveNext
   WEND

   MSGBOX RowCnt       → このMSGBOX は21と表示されます

と、こんな感じなんです。

実際は26行データなんですが、ROWCNTは21の時点でループを抜けてしまいます。
この後、画面には21行表示されているんですが、20行目と21行目は同じデータになってます。

いつもながら長々とすいません。
処理概要はこの程度でわかりますでしょうか?

投稿時間:2002/08/20(Tue) 18:52
投稿者名:とろ
Eメール:
URL :
タイトル:
Re^5: レコードカウントの取得についての質問
>    While Not oraRst.EOF
>        <代入処理>
>      RowCnt = RowCnt + 1
>      oraRst.MoveNext
>    WEND

<代入処理> の中で、
oraRst.MoveNext や oraRst.MovePrevious
を行っていないですか?

投稿時間:2002/08/20(Tue) 20:41
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re^5: レコードカウントの取得についての質問
>G_RECCOUNT = oraRst.RecordCount → この時点では26件と表示されます

なるほど。ここでちゃんと件数が取れるなら LIMIT のせいではなさそうですね。
とろさんのおっしゃるとおり、<代入処理>の中が怪しいのですが、

2回目以降は大丈夫という現象は、なんか変数が別のところで使われていて
かぶっているとかでおかしくなっているのかなぁ?

投稿時間:2002/08/21(Wed) 08:39
投稿者名:びっぐむーん
Eメール:bobble2@yahoo.co.jp
URL :
タイトル:
Re:レコードカウントの取得について
とろさん、NAOさんお返事ありがとうございます。

そうなんです。毎回同じ現象がでるのなら調べようがあるんですが、
立ち上げた初回だけがおかしいというところが不思議なんです。

とろさんのおっしゃるように代入処理の中でのorarst.movenext みたいな処理は
ソースを確認しましたがありませんでした。

もしよろしければ、後どの辺りを調べたらいいのか教えて頂けないでしょうか?
宜しくお願いします。

投稿時間:2002/08/21(Wed) 18:58
投稿者名:びっぐむーん
Eメール:bobble2@yahoo.co.jp
URL :
タイトル:
(お礼)レコードカウントの取得
while not orarst.eof

このwhile文の前に
orarst.refresh の行を追加してやったら
正しく表示されるようになりました。

正直なぜこの一文を追加したらうまくいくのかはわかりません(笑)
いろいろありがとうございました。


※ タイトル短くさせて頂きました(管理人)