出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

配列   ZOOさん [2005/12/16 12:03:21] [5526]
  Re:配列   暇人さん [2005/12/16 14:39:27] [5527]
    Re:配列   ZOOさん [2005/12/16 15:41:34] [5528]
      Re:配列   Lightningさん [2005/12/16 17:12:38] [5529]
      Re:配列   暇人さん [2005/12/16 18:07:39] [5532]
      Re:配列   ビギナーズラックさん [2005/12/16 19:42:59] [5533]
        Re:配列   ビギナーズラックさん [2005/12/16 19:46:09] [5534]
  Re:配列   ZOOさん [2005/12/19 9:35:09] [5537]
    Re:配列   Lightningさん [2005/12/19 10:21:36] [5539]
      Re:配列   ZOOさん [2005/12/19 10:58:44] [5540]
        Re:配列   Lightningさん [2005/12/19 18:00:52] [5546]
          Re:配列   ZOOさん [2005/12/20 8:40:11] [5548]

[5526] 配列
投稿者:ZOOさん 2005/12/16 12:03:21
配列を使って、数値を保存して、
その数値を呼び出して、テーブルのセルに色をつけたいのですが、、
どうもうまくいきません。
色をつけるためのIf文に入っていきません。
すみませんが、誰か教えていただけないでしょうか?お願いします。
根本的に違っています?

For A = 0 To rs.RecordCount-1
Do While I <= rs.PageSize AND Not rs.EOF
Array_1(A) = rs("A")
Array_2(A) = rs("B")
Array_3(A) = rs("C")
A = A + 1
rs.MoveNext
Loop
Next

For I = 1 To 60 Step 1
Response.Write "<TR>"
For N = 1 To 80 Step 1

B = 0
Flag = 0

For B = 0 to rs.RecordCount-1
TATE = Array_1(B)
YOKO = Array_2(B)
If TATE = I AND YOKO = N Then
Response.Write "<TD width='5' height='5'><IMG src='../image/target.gif' width='5' height='5' border='0'></TD>"
Flag = 1
End If
COUNT = COUNT + 1
Next

If Flag = 0 Then
Response.Write "<TD width='5' height='5' bgcolor='#00ff00'>" & N & "</TD>"
End If

Next
Response.Write "</TR>"
Next

[5527] Re:配列
投稿者:暇人さん 2005/12/16 14:39:27
 正しく配列に値を取得できてない可能性があるので、配列の値とRecordCountを出力する事をおすすめします

For A =…文の前に
Response.Write "RecordCount:" & rs.RecordCount & "<br>"
For A =…文の後に
For i = 0 to Ubound(Array_1)
response.Write "Array_1(" & i & "):" & Array_1(i) & "<br>"
next

[5528] Re:配列
投稿者:ZOOさん 2005/12/16 15:41:34
数値は拾い出せました。

もうひとつ教えてください。

配列の宣言で Dim Array_1(X) と書きますよね?
僕は、Xの値を「rs.RecordCount」にしたくて「Dim Array_1(rs.RecordCount)」にしたらエラーでした。

()内をrs.RecordCountにしたいときの指定の仕方はどうしたらよいですか?

申し訳ありませんが、教えてください。



>  正しく配列に値を取得できてない可能性があるので、配列の値とRecordCountを出力する事をおすすめします
>
> For A =…文の前に
> Response.Write "RecordCount:" & rs.RecordCount & "<br>"
> For A =…文の後に
> For i = 0 to Ubound(Array_1)
> response.Write "Array_1(" & i & "):" & Array_1(i) & "<br>"
> next
>

[5529] Re:配列
投稿者:Lightningさん 2005/12/16 17:12:38
んと
dim Array_1()
redim Array_1(rs.RecordCount)
ではどうなります?

dimは基本的にその関数の中で使用するものの宣言で、redimは遅延宣言というかんじです。

ぶっちゃけ、配列を有限で宣言しないって手も可能ですが。
その場合は念のため、配列の最終に終端記号を仕込めば問題なく使用できるかと。
終端記号は配列に入る可能性の無い任意の文字列で、Do whileでも使ってループするといいかなとか思ったり。

[5532] Re:配列
投稿者:暇人さん 2005/12/16 18:07:39
> 数値は拾い出せました。


おめでとうございます
これはちゃんと表示されたととってよろしいのですよね?


>
> もうひとつ教えてください。
>
> 配列の宣言で Dim Array_1(X) と書きますよね?
> 僕は、Xの値を「rs.RecordCount」にしたくて「Dim Array_1(rs.RecordCount)」にしたらエラーでした。
>
> ()内をrs.RecordCountにしたいときの指定の仕方はどうしたらよいですか?
>
> 申し訳ありませんが、教えてください。
>

RecordsetをOpenした後にDimを宣言しているでしょうか?
当然Open前に指定すればエラーしますよね

ちゃんとやってるよという場合
Dim Array_1(CInt(rs.recordcount))
として明示的に数値変換してみてください

注意点:RecordsetがNullの場合エラーしてしまいます。そこで
IF rs.EOF Then
Dim Array_1(0)
Else
Dim Array_1(CInt(rs.RecordCount))
End IF
という様にしてNullの場合0に変換するようにします

[5533] Re:配列
投稿者:ビギナーズラックさん 2005/12/16 19:42:59
> 配列の宣言で Dim Array_1(X) と書きますよね?
> 僕は、Xの値を「rs.RecordCount」にしたくて「Dim Array_1(rs.RecordCount)」にしたらエラーでした。

数値が取れたということはrs.RecordCountは-1でない=カーソルタイプが適切に設定されている
という判断をします。

すでに別の方からの同様のコメントがあるようですが

>()内をrs.RecordCountにしたいときの指定の仕方はどうしたらよいですか?

これは

'ここでは配列のみを宣言(サイズ指定なし)
'おそらくモジュールま先頭部分に記述
Dim Array_1()

'rs.RecordCountが取得できる箇所
'おそらくrsを開いた後
'rs.RecordCountが0以上であることを確認しないとエラーになります。
if rs.eof then
'eof時の処理
else
ReDim Array_1(rs.RecordCount)'新しいサイズの割り当てを宣言
(上書きされます)ReDimをヘルプで調べればたくさん出てきます。
end if

が正解です。

あと回答ではないですが、どうも書き方が回りくどいというか
難しく書きすぎている=無駄が多いのでシンプルに書き直した方がいいと思うのは私だけでしょうか?

例えば
A=0
Do until

A=A+1
rs.movenext
Loop

とか

[5534] Re:配列
投稿者:ビギナーズラックさん 2005/12/16 19:46:09
> 例えば
> A=0
> Do until
> 〜
> A=A+1
> rs.movenext
> Loop
>
> とか

ごめんなさい
Do until rs.eof
が正解

[5537] Re:配列
投稿者:ZOOさん 2005/12/19 9:35:09
配列も出来ました。
ありがとうございました。
でも、やっぱりIf文へ入ってくれません・・・(><)
あと一歩なのに・・・。
教えてください。If文がおかしいのでしょうか?・・・m(__)m

Dim Array_1()
reDim Array_1(CInt(rs.recordcount))
Dim Array_2()
reDim Array_2(CInt(rs.recordcount))
For A = 0 To rs.RecordCount-1
Do While I <= rs.PageSize AND Not rs.EOF
Array_1(A) = rs("ABC")
Array_2(A) = rs("XYZ")
A = A + 1
rs.MoveNext
Loop
Next

For I = 1 To 62 Step 1
Response.Write "<TR>"
For N = 1 To 82 Step 1
B = 0
Flag = 0
For B = 0 to rs.RecordCount-1
TATE = Array_1(B)
YOKO = Array_2(B)
If TATE = I AND YOKO = N Then
Response.Write "<TD width='5' height='5'><IMG src='../image/target.gif' width='5' height='5' border='0'></TD>"
Flag = 1
End If
COUNT = COUNT + 1
Next
If Flag = 0 Then
Response.Write "<TD width='5' height='5'></TD>"
End If
Next
Response.Write "</TR>"
Next

[5539] Re:配列
投稿者:Lightningさん 2005/12/19 10:21:36
入ってくれないif文ってのは
-------引用開始---------
If TATE = I AND YOKO = N Then
Response.Write "<TD width='5' height='5'><IMG src='../image/target.gif' width='5' height='5' border='0'></TD>"
Flag = 1
End If
-----------------------
この部分?
どうにもソースを見る限り、独学の方かと思いますが・・・
#普通、AとかBとかって変数は使わんし
って、独学関係ないですが、とりあえず、IF文の前に変数を表示しちゃってみてください。

Respose.write "TATE=[" & TATE & "] I =[" & I & "] YOKO=[" & YOKO & "] N=[" & N & "]"
respnse.flush
if TATE=I AND YOKO = N THEN

みたいな感じに
あと、お勧めなのはANDを止めてifを二回にしてみる。
ANDとかのBoolean系な演算は便利ですが、デバグ時にはまることが多々あるきがします。

[5540] Re:配列
投稿者:ZOOさん 2005/12/19 10:58:44
お返事ありがとうございます

>Respose.write "TATE=[" & TATE & "] I =[" & I & "] YOKO=[" & YOKO & "] N=[" & N & "]"
>respnse.flush

やってみました。
表示結果が TATE=I、YOKO=N になっている所もあったのですが
If文は無視されてしまいます。
プログラムの流れがおかしいのでしょうか?教えてください。

If TATE = I Then
If YOKO = N Then
Response.Write "<TD width='5' height='5'><IMG src='../image/target.gif' width='5' height='5' border='0'></TD>"
Flag = 1
End If
End If

[5546] Re:配列
投稿者:Lightningさん 2005/12/19 18:00:52
> お返事ありがとうございます
>
> >Respose.write "TATE=[" & TATE & "] I =[" & I & "] YOKO=[" & YOKO & "] N=[" & N & "]"
> >respnse.flush
> ↑
> やってみました。
> 表示結果が TATE=I、YOKO=N になっている所もあったのですが
> If文は無視されてしまいます。
> プログラムの流れがおかしいのでしょうか?教えてください。
> ↓
> If TATE = I Then
> If YOKO = N Then
> Response.Write "<TD width='5' height='5'><IMG src='../image/target.gif' width='5' height='5' border='0'></TD>"
> Flag = 1
> End If
> End If
>
にゃんでだろ〜orz
とりあえず、数字の場合は
if cint(TATE) = cint(I) then
if cint(YOKO) = cint(N) then
としてみるとか・・・

文字列の場合は(forでstepきってまわしてるし、数字でしょうけど)
if lcase(trim(TATE)) = lcase(trim(I)) then
とかしないと引っかからないことがあるのには注意。
#大文字小文字は別、って言うのならばlcaseはいりませんが。

あと、蛇足だけど、型無し言語の場合、意識してフラグつけたほうがいいよ。
int_Tateとかstr_HTML_IMG1とか
プログラムが大きくなると間違えるから。
#本当はprivateにはpri_とかpublicにはpub_とかってフラグもつけたほうが良いんだけどね。

[5548] Re:配列
投稿者:ZOOさん 2005/12/20 8:40:11
>にゃんでだろ〜orz
>とりあえず、数字の場合は
>if cint(TATE) = cint(I) then
>if cint(YOKO) = cint(N) then
>としてみるとか・・・

毎度、ありがとうございます。
上記のやり方でやったら出来ました m(__)m
いろいろ勉強になりました。

もっと勉強していきたいと思います。
また、わからないことがあったら教えてください。
失礼します。



TreeBBS For ASP V.0.1.3
Program By YasNet