プロが教える店舗&オフィスのセキュリティ対策術

 今日は。
 正しい記述を御教授願います。

乏しい知識で御恥ずかしいですが、効率の良いコードをお願いします。


●環境
 VB6.0 アクセス2000

●目的
 下記テーブル[Allloto6]はロト6の全組合せで約600万通りあります。
この内、「A」に応じてレコードカウントを取得、変数[WOI(10)]に格納する。
因みに、A=1 は約85万通り

●不具合
 コードの内「★」の[ FOR I1= 1 TO 10 ]、10回繰り返すと「応答なし」になります。
[ FOR I1= 1 TO 1 ]のように1回のみなら問題無さそうですが、時間がかかり過ぎます。

●接続ADO
「Microsoft ActiveX Data Objects 2.x Library」にチェック

●テーブル Allloto6 --------------全て数値
ID A B C D E F
1 1 2 3 4 5 6
2 1 2 3 4 5 7
3 1 2 3 4 5 8
X 38 39 40 41 42 43
--------------------------------

●コード
Public IY1 As String: Public IY2 As String: Public IY0 As String: Public I1 As Integer
Public WOI(10) As Double
Public DDDD As New ADODB.Connection
Public RTR As New ADODB.Recordset

Public Sub SY_DT_A()

IY0 = "KM6"
IY1 = "Allloto6"

For I1 = 1 To 10 ★

IY2 = "SELECT * FROM " & IY1 & " WHERE A = " & I1 & " ORDER BY ID"

DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb"
DDDD.Open
RTR.Open IY2, DDDD, adOpenStatic, adLockOptimistic

If RTR.EOF = False Then
RTR.MoveLast
WOI(I1) = RTR.RecordCount
End If

RTR.Close: DDDD.Close

Next I1

END Sub

A 回答 (5件)

いろいろ考えて、以下のようになりましたが...



Public IY1 As String: Public IY2 As String: Public IY0 As String: Public I1 As Integer
Public WOI(10) As Double
Public DDDD As New ADODB.Connection
Public RTR As New ADODB.Recordset

Public Sub SY_DT_A()

IY0 = "KM6"
IY1 = "Allloto6"

DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb"
DDDD.Open

For I1 = 1 To 10

IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1

Set RTR = DDDD.Execute(IY2)

WOI(I1) = RTR.Fields("DataCount").Value

Next I1

RTR.Close
DDDD.Close

この回答への補足

 今晩は。
 何度も詳細説明を有難う御座います。

 さて、
失礼ですが、NO5 では [ FOR ]で2回繰り返しは「応答なし」、
代わりに、NO1 NO4 で、アタリでした。下記コードです。
30まで繰り返しで、所要時間約5分でした。


IY0 = "KM6"
IY1 = "Allloto6"

DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb"
DDDD.Open

For I1 = 1 To 30

IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1
RTR.Open IY2, DDDD, adOpenForwardOnly, adLockReadOnly

If RTR.Fields("DataCount").Value <> 0 Then
WOI(I1) = RTR.Fields("DataCount").Value
End If

RTR.Close

Next I1

DDDD.Close

補足日時:2013/06/03 23:24
    • good
    • 0
この回答へのお礼

 御教授頂いた事を参考にして、自分なりにサンプルを幾つか作って勉強してみようと思います。
また分からない時は、御付き合い頂ければ幸いです。

 詳細な御教授を有難う御座いました。

お礼日時:2013/06/03 23:24

私はアホか(苦笑)


まったく...

No.3 は、

If RTR.Fields("DataCount").Value <> 0 Then
WOI(I1) = RTR.Fields("DataCount").Value
End If

でした。
    • good
    • 0

No.2 の回答、間違っていました。



正しくは

If RTR.DataCount <> 0 Then
WOI(I1) = RTR.Fields("DataCount")
End If

でした。
すみません。

「補足」の方は
1、「カウント = -1」になる原因 ( できれば具体的に )
2、所要時間は仕方が無い ( YES - NO )

1 について
http://support.microsoft.com/kb/194973/ja

2 について
For ~ Next 2回ループで 約3分は時間がかかりすぎなので、なんとかしたい所ですね。
    • good
    • 0

No.1 一部間違いがあったので訂正



If RTR.DataCount <> 0 Then
WOI(I1) = RTR.DataCount
End If

この回答への補足

 今日は。御早い御回答有難う御座います。

ところで、恐れ入りますが「一部訂正」での[ RTR.DataCount ]ですと「メソッドが見つかりません」となるので、
[ RTR.RecordCount ]に変更したところ動作はしても「 WOI(1) = -1 」になります??
また、時間がかかると思い「 FOR で2回」にしましたが、それでも約3分かかります。更には[ WOI(1,2) ]が共に -1 になります。

 コードは問題ないとは思われますが「参照設定」などの設定間違いなど他の原因なのでしょうか?
「カウント=-1」これは、一旦無視しても「所要時間がかかり過ぎ」は仕方が無い事なのでしょうか?

 ここで恐れ入りますが、
1、「カウント = -1」になる原因 ( できれば具体的に )
2、所要時間は仕方が無い ( YES - NO )
上記2点を御教え願えませんか?

PS;
データ接続は「Dataコントロール」しか使った事が無く他の方法が未知の状態です。
又、pcは自作で CPU;2600K メモリ;8GB なので、所要時間は遅くはならないかと思われます。

補足日時:2013/06/03 14:48
    • good
    • 0

For ~ Next を以下のように変更



DDDD.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE =E:\U SS VB\IK NY DATA\" & IY0 & ".mdb"
DDDD.Open

For I1 = 1 To 10

IY2 = "SELECT Count(A) AS DataCount FROM " & IY1 & " WHERE A = " & I1

RTR.Open IY2, DDDD, adOpenForwardOnly, adLockReadOnly

If RTR.DataCount <> 0 Then
WOI(I1) = RTR.RecordCount
End If

RTR.Close

Next I1

DDDD.Close
    • good
    • 0

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