アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境:VB6.0+SP5, DB: Adaptive Server AnyWhere

こんにちは。
プログレスバーコントロールの使い方について質問させていただきます。

データベースにクエリを投げて、レコードセットを取得する関数myFunctionを次のように書きました。
ここで処理の進捗に合わせてプログレスバーを表示する機能を追加したいと思います。

参考書を調べた結果、↓のようなもの組み込めば良いのだろうと考えましたが、
繰り返し文の中身をどう記述して良いものかわかりません。

申し訳ありませんがお力を貸して頂けないでしょうか?
また、もっとスマートな方法があれば、そちらも教えていただけると助かります。
/////////////////////////////////////////////////////
'プログレスバーコントロールを設置したフォームを呼び出す
frm_progressBar.Show
frm_progressBar.ProgressBar1.Visible = True
frm_progressBar.ProgressBar1.Max = q_rs!rNum

For i = 1 To q_rs!rNum
frm_progressBar.ProgressBar1.Value = i
'レコード取得
Next i
//////////////////////////////////////////////////////

Public Function myFunction(query As String) As Recordset

Dim p_rs As Recordset 'DBから取得したレコードセット
Set p_rs = New ADODB.Recordset

Dim q_rs As Recordset 'レコード件数を格納
Set q_rs = New ADODB.Recordset

Dim i As Integer '

'テーブルのレコード件数を取得
Set q_rs = con.Execute("SELECT COUNT(*) as rNum FROM AppEnd_Logs", , adCmdText)

p_rs.CursorLocation = adUseClient
p_rs.Open query, con, adOpenStatic

Set myFuncsion = p_rs

q_rs.Close
Set q_rs = Nothing
End Function

A 回答 (2件)

ソースを見る限りだとレコード件数分だけ「何か」させたいのですよね?で、1件処理したらプログレスバーをびょーんって伸ばしたいんだと思うのですが...違います?



1.プログレスバーの使い方はよいようですが、minも設定することをおすすめします。
2.「繰り返し文の中身をどう記述して良いものかわかりません。」
→繰り返し文とはfor文のところを指していますよね。何をさせたいか分からないので答えようがありません。申し訳ないです。ひょっとして、自作関数の使い方を聞いてます?
3.「また、もっとスマートな方法があれば、そちらも教えていただけると助かります。」
→私なら、myFunctionはRecordsetではなく件数を返すようにします。あとはこんな感じかな?
-----------------
'プログレスバーフォーム表示
load frm_progressBar
frm_progressBar.show
with frm_progressBar.ProgressBar1
 .min = 0
 .max = myFunction(ぱらめた)
 .value = 0
end with

'件数分だけぐるぐる回す(.max-1しているのは0から開始しているため)
for i = 0 to frm_progressBar.ProgressBar1.max-1 step 1

 'レコード取得
 <<処理ロジック>>


 'プログレスバーをびょーんって伸ばす
 frm_progressBar.ProgressBar1.value += 1

next i
-----------------
さらにやるなら、frm_progressBarに「let property」でプロパティを作り、それを使ってカウントアップやmin/max値を設定できるようにするくらいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

説明が不足していました。
関数myFunctionはDBにクエリを投げて結果を取得する為に作成しました。
レコードの件数がそれなりに多いので↓の行でそれなりに時間がかかってしまいます。

  p_rs.Open query, con, adOpenStatic ...(*)

そこで処理の進捗をグラフィカルに表示できないか?と思いこのような質問をした次第です。
つまり、回答者様がおっしゃるように
>1件処理したらプログレスバーをびょーんって伸ばしたいということです。

関数myFunction中でレコード件数を取得しているのは、プログレスバーのmaxに利用するためだけであり、
実際の処理では必要ありません。(質問の際に分離するのを忘れていました。)

レコード取得の進捗と、カウンタを繋げてFOR文を書けば良いというのも理解できます。
わからないのはループの中に「レコード1件の取得」をどのように記述すれば良いのか、ということです。
上記(*)のような書き方であれば、一行で全件のレコードを取ってきてしまうと思います。

お礼日時:2005/11/23 20:02

なるほど理解しました。


自作関数はmax件数を取得するだけなのですね。

RecordsetオブジェクトにRecordCountというのがありますので、これで件数を取得することができます。
http://www.microsoft.com/japan/msdn/library/defa …

なので、自作関数でselect count(*) ~ではなく、select 項目名~でRecordsetを取得しましょう。で、maxプロパティにはq_rs.RecordCountで件数を設定し、あとは参考URL(vbaですが、基本的に一緒です)にあるとおり
Do Until RS.EOF
  debug.pring RS!フィールド名
  RS.MoveNext
Loop
でReccordsetのEOFまでまわせばOKです。

参考URL:http://www.geocities.jp/cbc_vbnet/ADO/recordset. …
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいました。
どうにも私の説明のしかたがまずかったみたいで、お手数ばかりかけてしまいました。
要はDBにクエリを投げて、それを取得するまでにかかる時間を計りたかったのです。
あの後資料をみれば、やはり無理っぽいとのことでした。

お礼日時:2005/12/07 14:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています