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

質問編集履歴

1

データ検索部分を追記しました

2018/04/12 07:08

投稿

Otazoman
Otazoman

スコア44

title CHANGED
File without changes
body CHANGED
@@ -33,13 +33,244 @@
33
33
 
34
34
  ### 試したこと
35
35
 
36
+
37
+ 下記がデータ検索にかかる部分の参考のソースです。
38
+ m_product_optionとINNER JOINする前はデータを
39
+ 検索結果もJsonで返ってきていました。
40
+ INNER JOINした後はJSONレコードが
41
+
42
+ ```JavaScript
43
+ //検索
44
+ function sSearch(param,mode){
45
+ if(mode!='a'){
46
+ var param2 = '['
47
+ var size = document.getElementsByClassName('search_panel').length;
48
+ for(var i=0;i<size;i++){
49
+ if(i==0){
50
+ param2 = param2 + '{"name":"p_1","value":"A"'
51
+ }else{
52
+ param2 = param2 + '{"name":"p_' + parseInt(i+1) + '","value":"3"'
53
+ }
54
+ if(i == size-1 ){
55
+ param2 = param2 + '}';
56
+ }else{
57
+ param2 = param2 + '},';
58
+ }
59
+ }
60
+ param2 = param2 + ']';
61
+ }
62
+ if(mode=='s'){
63
+ param = [param,param2];
64
+ }
65
+ if(mode=='d'){
66
+ var cmp = '[{"name":"cmp","value":"A"}]'
67
+ param.push(cmp);
68
+ }
69
+ //2番目にパラメータを追加する
70
+ if(mode=='c'){
71
+ param.splice(1, 0, param2);
72
+ }
73
+ console.log(param);
74
+ var sKey = buildSearchkey(param);
75
+ //検索キーを元にSQL組立
76
+ var searchSql = varSqlmaker(sKey);
77
+ var elm=document.getElementById("debugger");
78
+ elm.innerHTML=searchSql;
79
+ var resultJson = sResultData(searchSql);
80
+ console.log(resultJson);
81
+ }
82
+
83
+ // パラメータを分解
84
+ function buildSearchkey(param){
85
+ var rKey =[];
86
+ var sKey;
87
+ var sVal;
88
+ for (var i = 0; i < param.length;i++){
89
+ var rt = JSON.parse(param[i]);
90
+ for(var j = 0;j < rt.length;j++){
91
+ rKey.push ([rt[j].name,rt[j].value]);
92
+ }
93
+ }
94
+ return rKey;
95
+ }
96
+
97
+ //SQLの動的生成
98
+ function varSqlmaker(param){
99
+ //横持化
100
+ var getPanel = 'SELECT m_search.p_no '
101
+ + 'FROM m_search '
102
+ + 'GROUP BY m_search.p_no '
103
+ + 'ORDER BY m_search.p_no;'
104
+ var panNoJson = getJsonData(getPanel);
105
+ var sPivotSql = 'SELECT m_search.code, '
106
+ var rt = JSON.parse(panNoJson);
107
+ for(var i=0;i < rt['data'].length;i++){
108
+ var targetNo = rt['data'][i].panel_no;
109
+ sPivotSql = sPivotSql + ' Max(IIf([m_search.p_no]=' + targetNo
110
+ +',[m_search.search_flg],0)) AS ' + targetNo;
111
+ if(i !== rt['data'].length - 1 ){
112
+ sPivotSql = sPivotSql + ',';
113
+ }
114
+ }
115
+ sPivotSql = sPivotSql + ' FROM m_search '
116
+ + 'GROUP BY m_search.code '
117
+ + 'ORDER BY m_search.code';
118
+ //横持化
119
+ var getdisp = 'SELECT t_display_d.item_id '
120
+ + 'FROM t_display_detail '
121
+ + 'GROUP BY t_display_d.item_id '
122
+ + 'ORDER BY t_display_d.item_id; '
123
+ var dispNoJson = getJsonData(getdisp);
124
+
125
+ var dPivotSql = 'SELECT t_display_d.p_code, '
126
+ var dpselSql = '';
127
+ var rt = JSON.parse(dispNoJson);
128
+ for(var i=0;i < rt['data'].length;i++){
129
+ var targetNo = rt['data'][i].display_item_id;
130
+ dPivotSql = dPivotSql + ' Max(IIf([t_display_d.item_id]=' + targetNo
131
+ + ',[t_display_d.i_detail])) AS ' + targetNo;
132
+ dpselSql = dpselSql + ' First(dd.[' + targetNo + ']) AS ' + targetNo + ',';
133
+ if(i !== rt['data'].length - 1 ){
134
+ dPivotSql = dPivotSql + ',';
135
+ }
136
+ }
137
+ dPivotSql = dPivotSql + ' FROM t_display_detail '
138
+ + 'GROUP BY t_display_d.p_code '
139
+ + 'ORDER BY t_display_d.p_code';
140
+ // 検索条件にパネルの設定値埋込
141
+ var panelSql = 'SELECT m_search.p_no '
142
+ + 'FROM m_search WHERE m_search.search_activate_flg=1 '
143
+ + 'GROUP BY m_search.p_no ORDER BY m_search.p_no;';
144
+ var panelJson = getJsonData(panelSql);
145
+ var rt = JSON.parse(panelJson);
146
+ var sParaSql = '';
147
+ var j = 7;
148
+ for(var i=0;i < rt['data'].length;i++){
149
+ var targetNo = rt['data'][i].panel_no;
150
+ //テーブルのフラグとフォーム上のフラグ変換処理
151
+ var sVal;
152
+ if(j < param.length){
153
+ switch(param[j][1]){
154
+ case "1":
155
+ sVal = '=' + 1;
156
+ break;
157
+ case "2":
158
+ sVal = '=' + 0;
159
+ break;
160
+ case "3":
161
+ sVal = '>=' + 0;
162
+ break;
163
+ default:
164
+ sVal = '=' + param[j][1];
165
+ break;
166
+ }
167
+ }
168
+ var companyId = '"*"';
169
+ sParaSql = sParaSql + ' ((m.[' + targetNo + ']) '
170
+ + sVal + ') AND '
171
+ j = j + 1;
172
+ }
173
+ //検索項目のパラメータ設定
174
+ var whParSql = 'HAVING '
175
+ + ' (((i.sex)=' + param[0][1] +') AND '
176
+ + ' ((i.age)=' + param[1][1] +') AND '
177
+ + ' ((i.d_lim) >=' + param[6][1] +') AND '
178
+ + ' ((i.period_in)=' + param[2][1] +') AND '
179
+ + ' ((i.payment_p)=' + param[3][1] +') AND '
180
+ + ' ((i.payment_m)=' + param[4][1] +') AND '
181
+ + ' ((i.b_amount)=' + param[5][1] +'));'
182
+ //SQL生成
183
+ var mySql = 'SELECT p.product_code, m.code, p.product_name AS 1, '
184
+ +' i.b_amount AS 3, i.fee AS 4, '
185
+ + dpselSql
186
+ +' i.sex, i.age, i.d_lim, i.period_in, '
187
+ +' i.payment_p, i.payment_m ,Count(o.o_code) AS op_count'
188
+ +' FROM m_product_option AS o'
189
+ +' INNER JOIN (m_company AS c '
190
+ +' INNER JOIN((' + dPivotSql + ') AS dd '
191
+ +' INNER JOIN(((' + sPivotSql + ') AS m '
192
+ + 'INNER JOIN t_insurance AS i '
193
+ + ' ON m.code = i.code )'
194
+ + ' INNER JOIN m_product AS p '
195
+ + ' ON m.code = p.product_code )'
196
+ + ' ON dd.plan_code = m.code )'
197
+ + ' ON c.company_id = p.company_id )'
198
+ + ' ON p.product_code = o.product_code '
199
+ + ' WHERE ('
200
+ + sParaSql
201
+ + ' ((c.company_activate_flg)=1) '
202
+ + ' AND '
203
+ + ' ((p.product_active_flg)=1)'
204
+ + ' AND'
205
+ + '((p.company_id) Like '+ companyId + ') '
206
+ + ' AND'
207
+ + ' ((o.activate_flg)= 1 ))'
208
+ + ' GROUP BY '
209
+ + ' p.product_code, m.code, p.product_name, '
210
+ + ' i.b_amount, i.fee,'
211
+ + ' i.sex, i.age, i.d_lim, i.period_in, i.payment_p, i.payment_m, '
212
+ + whParSql;
213
+
214
+ return mySql;
215
+
216
+ }
217
+
218
+ // 検索結果のレコード件数を取得しレコードと一緒にJson出力
219
+ function sResultData(sql) {
220
+ try {
221
+ var rs = database.Execute(sql);
222
+ var recCount = rs.RecordCount
223
+ //console.log("SQL:" + sql);
224
+ //console.log("Count:" + rs.RecordCount);
225
+ var rJson = '[' + '{"count":"' + rs.RecordCount + '"},';
226
+ var j = 0;
227
+ if (rs.RecordCount == 0){
228
+ rJson = rJson + '{"data":"non"}';
229
+ }else{
230
+ for( ; !rs.EOF ; rs.MoveNext()) {
231
+ rJson = rJson+ '{' + '\n';
232
+ for (var i = 0; i < rs.Fields.Count; i++){
233
+ rJson = rJson + '\t\t' + '"' + rs.fields(i).Name + '":';
234
+ if (i == rs.Fields.Count -1){
235
+ rJson = rJson + '"' + escapeChar(rs.fields(i).Value) + '"' +'\n';
236
+ }else{
237
+ rJson = rJson + '"' + escapeChar(rs.fields(i).Value) + '",'+ '\n';
238
+ }
239
+ }
240
+ if(j == recCount - 1 ){
241
+ rJson = rJson + '\t' + '}' + '\n';
242
+ }else{
243
+ rJson = rJson + '\t' + '}' + ',' + '\n';
244
+ }
245
+ j= j + 1;
246
+ }
247
+ }
248
+ rJson = rJson + ']';
249
+ } catch(e1) {
250
+ if(rs != null){
251
+ try {rs.Close();} catch(e2) {}
252
+ rs = null;
253
+ }
254
+ if(database != null){
255
+ database.Close();
256
+ database = null;
257
+ }
258
+ throw e1;
259
+ }
260
+ return rJson;
261
+ rs = null;
262
+ database.Close();
263
+ database = null;
264
+ }
265
+
266
+ ```
267
+
36
268
  SQLが悪いのかと思いJavaScriptで生成されたSQLを取得し、
37
269
  ACCESSのクエリーに貼り付けて実行するとレコードはきちんと
38
270
  取得できていました。
39
271
  キャッシュでも残っているのかと考えてaccdbをコピーしリンク先を
40
- そちらにしてみましたが、結果は変わりません。
272
+ そちらに変更してみましたが、結果は変わりません。
41
273
 
42
-
43
274
  ### 補足情報(FW/ツールのバージョンなど)
44
275
  Windows10 64bit
45
276
  ACCESS2016