teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

しゅうせい

2018/09/21 04:52

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -10,13 +10,19 @@
10
10
 
11
11
  (追記 2018/09/21 12:00)
12
12
  ---
13
- rs_w取得データサイズオーバーフローが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
13
+ rs_w取得データサイズオーバーが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
14
14
 
15
15
  まず、以下の点について確認をお願いします。
16
- ・この処理を何度か行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
16
+ ・この処理を複数回行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
17
17
  ・毎回同じデータで問題が発生しているのであれば、問題が発生するデータになにか共通の特徴は見つかりませんか?(直前のデータの影響を受けている可能性もあります)
18
18
 
19
+ ---
20
+ 電話番号として登録されている文字に目には見えないゴミ文字(制御文字など)が含まれている可能性はないでしょうか?
21
+
22
+ 電話番号で連結する際、左辺はSQL内でテーブルカラムを参照していますが、右辺はrs_wから取り出した値を文字列として記述しています。
23
+ この文字列への変換の過程で右辺だけ制御文字がはずれ、制御文字を含むデータとは紐づかなくなっている可能性があるかもしれません。
24
+
19
- 以下は、電話番号から数字以外を除去し兄弟を探すサンプルコードです。
25
+ 以下は、数字以外の文字を除去した電話番号で兄弟を探すサンプルコードです。
20
26
  ```
21
27
  Option Compare Database
22
28
 
@@ -70,12 +76,12 @@
70
76
 
71
77
  rs_w.Edit
72
78
 
73
- Debug.Print "rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
79
+ Debug.Print " rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
74
80
 
75
81
  '兄弟(最大3人まで)
76
82
  For i = 1 To 3
77
83
  If rs_m.EOF Then Exit For
78
- Debug.Print "rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
84
+ Debug.Print " rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
79
85
 
80
86
  rs_w("在学兄弟姉妹クラス" & i) = rs_m!学年 & rs_m!クラス
81
87
  rs_w("在学兄弟姉妹名" & i) = rs_m!名
@@ -93,5 +99,4 @@
93
99
 
94
100
  End Sub
95
101
  ```
96
-
97
- れでも弟から兄は紐づかないでしょうか?
102
+ のコードを使用しても弟から兄は紐づかないでしょうか?

2

追記

2018/09/21 04:51

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -6,4 +6,92 @@
6
6
  それでも弟の値が更新されてこないようならrs_wループで処理対象に含まれていない可能性が大です。
7
7
 
8
8
  rs_wを取得する際、テーブル構造やレコード件数によってすべてのデータが取得できていない、ということがあるかもしれませんので一度ご確認ください。
9
- 見当違いでしたら申し訳ありません。
9
+ 見当違いでしたら申し訳ありません。
10
+
11
+ (追記 2018/09/21 12:00)
12
+ ---
13
+ rs_w取得データサイズのオーバーフローが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
14
+
15
+ まず、以下の点について確認をお願いします。
16
+ ・この処理を何度か行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
17
+ ・毎回同じデータで問題が発生しているのであれば、問題が発生するデータになにか共通の特徴は見つかりませんか?(直前のデータの影響を受けている可能性もあります)
18
+
19
+ 以下は、電話番号から数字以外を除去して兄弟を探すサンプルコードです。
20
+ ```
21
+ Option Compare Database
22
+
23
+ '引数を数値に変換
24
+ Function fncToNumber(ByVal vVal As Variant) As Variant
25
+
26
+ Const sNUMS As String = "0123456789"
27
+
28
+ Dim rep As Variant '戻り値
29
+ Dim i As Integer
30
+
31
+ If IsNull(vVal) Then fncToNumber = Null: Exit Function
32
+
33
+ '半角変換
34
+ rep = StrConv(vVal, vbNarrow)
35
+
36
+ For i = 1 To LenB(vVal)
37
+ '1文字ずつチェック
38
+ If InStr(1, sNUMS, Mid$(vVal, i, 1)) = 0 Then
39
+ '数字でない文字は除去する
40
+ rep = Replace(rep, Mid$(vVal, i, 1), "")
41
+ End If
42
+ Next i
43
+
44
+ fncToNumber = rep
45
+
46
+ End Function
47
+
48
+ Public Sub 児童マスタ_兄弟_更新()
49
+ Dim db As DAO.Database
50
+ Dim rs_m As DAO.Recordset
51
+ Dim rs_w As DAO.Recordset
52
+ Dim i As Long
53
+
54
+ '兄弟用テーブルを削除して、児童マスタテーブルから最新データをコピー
55
+ Set db = CurrentDb
56
+ db.Execute "DELETE T_児童マスタ_兄弟.* FROM T_児童マスタ_兄弟;", dbFailOnError
57
+ db.Execute "INSERT INTO T_児童マスタ_兄弟 SELECT T_児童マスタ.* FROM T_児童マスタ;", dbFailOnError
58
+
59
+ Set rs_w = db.OpenRecordset("SELECT * FROM T_児童マスタ_兄弟 ORDER BY ID")
60
+
61
+ Do Until rs_w.EOF
62
+
63
+ '電話番号が一致するものを兄弟と判定する。
64
+ Dim strSQL As String
65
+ strSQL = "SELECT * FROM T_児童マスタ WHERE fncToNumber(電話番号)='" & fncToNumber(rs_w!電話番号) & "'" & _
66
+ " AND ID <>" & rs_w!ID & " ORDER BY ID;"
67
+
68
+ Debug.Print strSQL
69
+ Set rs_m = db.OpenRecordset(strSQL)
70
+
71
+ rs_w.Edit
72
+
73
+ Debug.Print "rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
74
+
75
+ '兄弟(最大3人まで)
76
+ For i = 1 To 3
77
+ If rs_m.EOF Then Exit For
78
+ Debug.Print "rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
79
+
80
+ rs_w("在学兄弟姉妹クラス" & i) = rs_m!学年 & rs_m!クラス
81
+ rs_w("在学兄弟姉妹名" & i) = rs_m!名
82
+ rs_m.MoveNext
83
+ Next
84
+ rs_w.Update
85
+ rs_m.Close
86
+ rs_w.MoveNext
87
+ Loop
88
+
89
+ Set rs_m = Nothing
90
+ rs_w.Close
91
+ Set rs_w = Nothing
92
+ Set db = Nothing
93
+
94
+ End Sub
95
+ ```
96
+
97
+ これでも弟から兄は紐づかないでしょうか?

1

修正

2018/09/21 03:05

投稿

jawa
jawa

スコア3020

answer CHANGED
@@ -1,6 +1,6 @@
1
- 兄のほうで結びつけできているということは、rs_m のひも付けできているということので、データ的な問題ではないような気がしています。
1
+ 兄のほうに弟の情報登録されるということは、rs_m取得時に兄と弟のひも付けできているということですので、データ不整合的な問題ではないような気がしています。
2
2
 
3
- 弟のほうにデータが登録されないということですが、兄と弟の結びつけは前述のとおり一度できているはずですので、そもそもrs_wで弟が処理対象に含まれていないということはないでしょうか?
3
+ 弟のほうに兄のデータが登録されないということですが、兄と弟の結びつけは前述のとおり一度できているはずですので、そもそもrs_wで弟が処理対象に含まれていないということはないでしょうか?
4
4
 
5
5
  例えばrs_mを参照しない値(固定値など)で更新してみてはどうでしょう?
6
6
  それでも弟の値が更新されてこないようならrs_wループで処理対象に含まれていない可能性が大です。