VB:Ver6.0
OS:WindowsXP
テーブル[tbl_A]のデータをテーブル[tbl_b]にコピーし、テーブル[tbl_A]の発行フラグ=Falseなら
テーブル[tbl_C]からNo.を取得するという処理を行っています。
この処理を実行すると、抽出されたテーブル[tbl_A]のデータが2件なら、テーブル[tbl_b]のデータは4件と
コピーされるデータ件数が2倍になってしまいます。
テーブル[tbl_A]のデータをコピーしている最中にupdateしているためにrsA.EOFを正しく認識していないのでしょうか?
どうしても原因がわからず困っています。
原因や解決策がわかる方がいらっしゃいましたらどなたかご教授くださいますようお願いいたします。
TA_id,TA_addr,TA_no,TA_hakd,TA_hakf
1,東京,,,false
2,東京,,,false
3,大阪,,,false
TB_id,TB_addr,TB_no,TB_hakd,TB_hakf
1,東京,100,,false
2,東京,101,,false
1,東京,102,09/12/16,true
2,東京,103,09/12/16,true
Public Function WRITE_DATA() As Boolean
Dim rsA As New ADODB.Recordset
Dim rsB As New ADODB.Recordset
Dim strSql As String
WRITE_DATA = False
adoCon.BeginTrans
rsB.Open "tbl_B", adoCon, adOpenKeyset, adLockOptimistic
strSql = "select * from tbl_A where TA_addr = '東京'"
rsA.Open strSql, adoCon, adOpenKeyset, adLockOptimistic
Do While rsA.EOF = False
rsB.AddNew
rsB![TB_id] = rsA![TA_id]
rsB![TB_addr] = rsA![TA_addr]
rsB![TB_no] = rsA![TA_no]
rsB![TB_hakd] = rsA![TA_hakd]
rsB![TB_hakf] = rsA![TA_hakf]
if rsA![TA_hakf] = false then
strSql = "select * from tbl_C where TC_id = 'PRINTID'"
rsC.Open strSql, adoCon, adOpenKeyset, adLockOptimistic
rsC![TC_no] = rsC![TC_no] + 1
rsC.Update
rsB![TB_no] = rsC![TC_no]
rsC.Close
rsA![TA_no] = rsB![TB_no]
rsA![TA_hakd] = Format(Now, "yy/mm/dd")
rsA![TA_hakf] = true
rsA.Update
end if
rsB.Update
rsA.MoveNext
Loop
rsA.Close
rsB.Close
adoCon.CommitTrans
WRITE_DATA = True
Exit Function
お礼
rivoisuさん、大変お返事が遅くなり申し訳ありませんでした。 早速、ご教授いただいたとおりステップ実行をしながらいろいろ調査した結果 「Do While」のrsA.EOFは、データ件数×2回ループしないとTrueに変わらず 「Do While」でUPDATEするテーブルを1つだけにすると(rsC.Update・rsC.Updateを おこなわずrsB.Updateのみにする)、rsA.EOFはデータ件数と同じ回数ループして Trueになることが判明しました。 rivoisuさんから「EOFの認識間違いはない」と教えていただいたので、 もしかしたら原因は他にあるんじゃないかと疑い、同じプログラムを別の 事業所で実行してみたら、正常に動作しました。 tbl_Aはデータが2万件以上あり、問題の事業所は他の事業所に比べて回線?が 大変遅くデータの読み書きに時間がかかるため、それも視野に入れて調査を続け ようと思います。 まだ原因はわかりませんが、アドバイスのおかげで解決の糸口が見えてきました。 ご回答、本当にありがとうございました。