回答編集履歴

3

しゅうせい

2018/09/21 04:52

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -22,19 +22,31 @@
22
22
 
23
23
  ---
24
24
 
25
- rs_w取得データサイズオーバーフローが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
25
+ rs_w取得データサイズオーバーが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
26
26
 
27
27
 
28
28
 
29
29
  まず、以下の点について確認をお願いします。
30
30
 
31
- ・この処理を何度か行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
31
+ ・この処理を複数回行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
32
32
 
33
33
  ・毎回同じデータで問題が発生しているのであれば、問題が発生するデータになにか共通の特徴は見つかりませんか?(直前のデータの影響を受けている可能性もあります)
34
34
 
35
35
 
36
36
 
37
+ ---
38
+
39
+ 電話番号として登録されている文字に目には見えないゴミ文字(制御文字など)が含まれている可能性はないでしょうか?
40
+
41
+
42
+
43
+ 電話番号で連結する際、左辺はSQL内でテーブルカラムを参照していますが、右辺はrs_wから取り出した値を文字列として記述しています。
44
+
45
+ この文字列への変換の過程で右辺だけ制御文字がはずれ、制御文字を含むデータとは紐づかなくなっている可能性があるかもしれません。
46
+
47
+
48
+
37
- 以下は、電話番号から数字以外を除去し兄弟を探すサンプルコードです。
49
+ 以下は、数字以外の文字を除去した電話番号で兄弟を探すサンプルコードです。
38
50
 
39
51
  ```
40
52
 
@@ -142,7 +154,7 @@
142
154
 
143
155
 
144
156
 
145
- Debug.Print "rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
157
+ Debug.Print " rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
146
158
 
147
159
 
148
160
 
@@ -152,7 +164,7 @@
152
164
 
153
165
  If rs_m.EOF Then Exit For
154
166
 
155
- Debug.Print "rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
167
+ Debug.Print " rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
156
168
 
157
169
 
158
170
 
@@ -188,6 +200,4 @@
188
200
 
189
201
  ```
190
202
 
191
-
192
-
193
- れでも弟から兄は紐づかないでしょうか?
203
+ のコードを使用しても弟から兄は紐づかないでしょうか?

2

追記

2018/09/21 04:51

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -15,3 +15,179 @@
15
15
  rs_wを取得する際、テーブル構造やレコード件数によってすべてのデータが取得できていない、ということがあるかもしれませんので一度ご確認ください。
16
16
 
17
17
  見当違いでしたら申し訳ありません。
18
+
19
+
20
+
21
+ (追記 2018/09/21 12:00)
22
+
23
+ ---
24
+
25
+ rs_w取得データサイズのオーバーフローが原因ではなさそうでしたので、別の観点からアプローチしてみたいと思います。
26
+
27
+
28
+
29
+ まず、以下の点について確認をお願いします。
30
+
31
+ ・この処理を何度か行った場合、毎回同じデータで問題が発生しますか?(処理結果にバラつきはありませんか?)
32
+
33
+ ・毎回同じデータで問題が発生しているのであれば、問題が発生するデータになにか共通の特徴は見つかりませんか?(直前のデータの影響を受けている可能性もあります)
34
+
35
+
36
+
37
+ 以下は、電話番号から数字以外を除去して兄弟を探すサンプルコードです。
38
+
39
+ ```
40
+
41
+ Option Compare Database
42
+
43
+
44
+
45
+ '引数を数値に変換
46
+
47
+ Function fncToNumber(ByVal vVal As Variant) As Variant
48
+
49
+
50
+
51
+ Const sNUMS As String = "0123456789"
52
+
53
+
54
+
55
+ Dim rep As Variant '戻り値
56
+
57
+ Dim i As Integer
58
+
59
+
60
+
61
+ If IsNull(vVal) Then fncToNumber = Null: Exit Function
62
+
63
+
64
+
65
+ '半角変換
66
+
67
+ rep = StrConv(vVal, vbNarrow)
68
+
69
+
70
+
71
+ For i = 1 To LenB(vVal)
72
+
73
+ '1文字ずつチェック
74
+
75
+ If InStr(1, sNUMS, Mid$(vVal, i, 1)) = 0 Then
76
+
77
+ '数字でない文字は除去する
78
+
79
+ rep = Replace(rep, Mid$(vVal, i, 1), "")
80
+
81
+ End If
82
+
83
+ Next i
84
+
85
+
86
+
87
+ fncToNumber = rep
88
+
89
+
90
+
91
+ End Function
92
+
93
+
94
+
95
+ Public Sub 児童マスタ_兄弟_更新()
96
+
97
+ Dim db As DAO.Database
98
+
99
+ Dim rs_m As DAO.Recordset
100
+
101
+ Dim rs_w As DAO.Recordset
102
+
103
+ Dim i As Long
104
+
105
+
106
+
107
+ '兄弟用テーブルを削除して、児童マスタテーブルから最新データをコピー
108
+
109
+ Set db = CurrentDb
110
+
111
+ db.Execute "DELETE T_児童マスタ_兄弟.* FROM T_児童マスタ_兄弟;", dbFailOnError
112
+
113
+ db.Execute "INSERT INTO T_児童マスタ_兄弟 SELECT T_児童マスタ.* FROM T_児童マスタ;", dbFailOnError
114
+
115
+
116
+
117
+ Set rs_w = db.OpenRecordset("SELECT * FROM T_児童マスタ_兄弟 ORDER BY ID")
118
+
119
+
120
+
121
+ Do Until rs_w.EOF
122
+
123
+
124
+
125
+ '電話番号が一致するものを兄弟と判定する。
126
+
127
+ Dim strSQL As String
128
+
129
+ strSQL = "SELECT * FROM T_児童マスタ WHERE fncToNumber(電話番号)='" & fncToNumber(rs_w!電話番号) & "'" & _
130
+
131
+ " AND ID <>" & rs_w!ID & " ORDER BY ID;"
132
+
133
+
134
+
135
+ Debug.Print strSQL
136
+
137
+ Set rs_m = db.OpenRecordset(strSQL)
138
+
139
+
140
+
141
+ rs_w.Edit
142
+
143
+
144
+
145
+ Debug.Print "rs_w :ID[" & rs_w("ID") & "] TEL[" & rs_w("電話番号") & "]"
146
+
147
+
148
+
149
+ '兄弟(最大3人まで)
150
+
151
+ For i = 1 To 3
152
+
153
+ If rs_m.EOF Then Exit For
154
+
155
+ Debug.Print "rs_m(" & i & "):ID[" & rs_m("ID") & "] TEL[" & rs_m("電話番号") & "]"
156
+
157
+
158
+
159
+ rs_w("在学兄弟姉妹クラス" & i) = rs_m!学年 & rs_m!クラス
160
+
161
+ rs_w("在学兄弟姉妹名" & i) = rs_m!名
162
+
163
+ rs_m.MoveNext
164
+
165
+ Next
166
+
167
+ rs_w.Update
168
+
169
+ rs_m.Close
170
+
171
+ rs_w.MoveNext
172
+
173
+ Loop
174
+
175
+
176
+
177
+ Set rs_m = Nothing
178
+
179
+ rs_w.Close
180
+
181
+ Set rs_w = Nothing
182
+
183
+ Set db = Nothing
184
+
185
+
186
+
187
+ End Sub
188
+
189
+ ```
190
+
191
+
192
+
193
+ これでも弟から兄は紐づかないでしょうか?

1

修正

2018/09/21 03:05

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -1,8 +1,8 @@
1
- 兄のほうで結びつけできているということは、rs_m のひも付けできているということので、データ的な問題ではないような気がしています。
1
+ 兄のほうに弟の情報登録されるということは、rs_m取得時に兄と弟のひも付けできているということですので、データ不整合的な問題ではないような気がしています。
2
2
 
3
3
 
4
4
 
5
- 弟のほうにデータが登録されないということですが、兄と弟の結びつけは前述のとおり一度できているはずですので、そもそもrs_wで弟が処理対象に含まれていないということはないでしょうか?
5
+ 弟のほうに兄のデータが登録されないということですが、兄と弟の結びつけは前述のとおり一度できているはずですので、そもそもrs_wで弟が処理対象に含まれていないということはないでしょうか?
6
6
 
7
7
 
8
8