前提・実現したいこと
・児童マスタテーブルから兄弟情報の入ったテーブルを更新したい。
・兄弟関係は2つのテーブルの電話番号の一致とする。
発生している問題
・電話番号が一致していても所々データが落ちる。(1000件中10件程度) 主として「兄IDのデータを処理したときには弟IDのレコードが取得できており」、 その後「弟IDのデータも処理はされたけど兄IDのデータは取得できていなかった」
該当のソースコード
VBA
1Public Sub 児童マスタ_兄弟_更新() 2 Dim db As DAO.Database 3 Dim rs_m As DAO.Recordset 4 Dim rs_w As DAO.Recordset 5 Dim i As Long 6 7 '兄弟用テーブルを削除して、児童マスタテーブルから最新データをコピー 8 Set db = CurrentDb 9 db.Execute "DELETE T_児童マスタ_兄弟.* FROM T_児童マスタ_兄弟;", dbFailOnError 10 db.Execute "INSERT INTO T_児童マスタ_兄弟 SELECT T_児童マスタ.* FROM T_児童マスタ;", dbFailOnError 11 12 Set rs_w = db.OpenRecordset("SELECT * FROM T_児童マスタ_兄弟 ORDER BY ID") 13 14 Do Until rs_w.EOF 15 16 '電話番号が一致するものを兄弟と判定する。 17 Set rs_m = db.OpenRecordset( _ 18 "SELECT * FROM T_児童マスタ WHERE 電話番号='" & rs_w!電話番号 & _ 19 "' AND ID <>" & rs_w!ID & " ORDER BY ID;") 20 21 rs_w.Edit 22 23 '兄弟(最大3人まで) 24 For i = 1 To 3 25 If rs_m.EOF Then Exit For 26 rs_w("在学兄弟姉妹クラス" & i) = rs_m!学年 & rs_m!クラス 27 rs_w("在学兄弟姉妹名" & i) = rs_m!名 28 rs_m.MoveNext 29 Next 30 rs_w.Update 31 rs_m.Close 32 rs_w.MoveNext 33 Loop 34 35 Set rs_m = Nothing 36 rs_w.Close 37 Set rs_w = Nothing 38 Set db = Nothing 39 40End Sub
試したこと
兄弟関係の落ちたデータに関わる、電話番号の確認。
・ハイフンの文字コードも一致しているか。
・半角スペースや改行コードが混入していないか。
For文の中にDebug.Printを入れて、一件ずつチェック。
・問題はやはり発生しており原因不明
補足情報
Access 2016, 2010
試したことは何を確認したの?なんとなくですがデータの問題では?
「試したこと」を少し詳しく書かせていただきました。よろしくお願いいたします。
Group Byて使えませんでしたかねー、データを先に正規化した方が良いですよー、後、データ構造が知りたいです(画面コピーでOK)
データ構造は以前質問させていただいたこちらでもよろしいでしょうか。個人情報が詰まっているので、必要な部分だけ上手く画面コピーができません。 https://teratail.com/questions/51877
Group Byを使った方法が思い付きませんでした。よい方法がありましたら宜しくお願いします。
T_児童マスタには、在学兄弟姉妹クラス1~3は、ないですよね?
ありません。T_児童マスタ_兄弟の方だけに必要なフィールドです。基本となるT_児童マスタからは除いてあります。
count関数とGroup Byで兄弟の要る電話番号は抽出出来ますから(countの結果が2以上ならば兄弟が要る)。後はそれを元に処理できませんか?
ありがとうございます。明日書き換えてみます。
4人目の兄弟とかではないのでしょうか?(3人目までは登録されるけど、4人目から落ちるので)
rs_w の キー(電話番号)に不安があるなら、値調整(Trim等)してアップデートした方が確実かと。
4人目の兄弟は存在しないことが確定しているので、現在の仕様では3人までです。
電話番号の値調整も改めて行ってみます。ありがとうございます。
回答2件
あなたの回答
tips
プレビュー