001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.business;
017
018 import java.sql.Connection;
019 import java.sql.ParameterMetaData;
020 import java.sql.PreparedStatement;
021 import java.sql.ResultSet;
022 import java.sql.ResultSetMetaData;
023 import java.sql.SQLException;
024 // import java.text.DateFormat;
025 // import java.text.SimpleDateFormat;
026 import java.util.Date;
027 import java.util.HashMap;
028 import java.util.Locale;
029 import java.util.Map;
030 import java.util.Set;
031 import java.util.Arrays;
032
033 import org.opengion.fukurou.db.ConnectionFactory;
034 import org.opengion.fukurou.db.DBFunctionName;
035 import org.opengion.fukurou.db.DBUtil;
036 import org.opengion.fukurou.db.Transaction;
037 import org.opengion.fukurou.model.Formatter;
038 import org.opengion.fukurou.util.Closer;
039 import org.opengion.fukurou.util.ErrMsg;
040 import org.opengion.fukurou.util.ErrorMessage;
041 import org.opengion.fukurou.util.HybsLoader;
042 import org.opengion.fukurou.util.StringUtil;
043 import org.opengion.fukurou.util.SystemParameter;
044 import org.opengion.fukurou.util.HybsDateUtil;
045
046 /**
047 * 業務ロジãƒ?‚¯をå?ç�?�™るためにå¿?¦�な共通メソãƒ?ƒ‰の実行を行ってã�?‚‹抽象クラスですã?
048 *
049 * メインロジãƒ?‚¯につã�?�¦は、各サブクラスで実è£?�™るå¿?¦�がありますã?
050 *
051 * @og.rev 5.1.1.0 (2009/12/01) 新規作æ?
052 * @og.group 業務ロジãƒ?‚¯
053 *
054 * @version 5.0
055 * @author Hiroki Nakamura
056 * @since JDK1.6,
057 */
058 public abstract class AbstractBizLogic {
059 private static final String CR = System.getProperty("line.separator");
060
061 /** エラーメãƒ?‚»ージをセãƒ?ƒˆする際に使用しまã�?{@value} */
062 protected static final int OK = ErrorMessage.OK;
063 /** エラーメãƒ?‚»ージをセãƒ?ƒˆする際に使用しまã�?{@value} */
064 protected static final int WARNING = ErrorMessage.WARNING;
065 /** エラーメãƒ?‚»ージをセãƒ?ƒˆする際に使用しまã�?{@value} */
066 protected static final int NG = ErrorMessage.NG;
067 /** エラーメãƒ?‚»ージをセãƒ?ƒˆする際に使用しまã�?{@value} */
068 protected static final int EXCEPTION = ErrorMessage.EXCEPTION;
069 /** エラーメãƒ?‚»ージをセãƒ?ƒˆする際に使用しまã�?{@value} */
070 protected static final int ORCL_ERR = ErrorMessage.ORCL_ERR;
071
072 private Connection conn = null;
073 private Transaction tran = null; // 5.1.9.0 (2010/08/01) シーケンス対å¿?
074 private String dbid = null; // 5.1.9.0 (2010/08/01) シーケンス対å¿?
075 DBFunctionName dbName = null; // 5.1.9.0 (2010/08/01) シーケンス対å¿?
076 private HybsLoader loader = null;
077 private String[] keys = null;
078 private String[] vals = null;
079 private final StringBuilder paramKeysStr = new StringBuilder( "|" );
080 private final Map<String, String> variableMap = new HashMap<String, String>();
081 private final Map<String, Formatter> formatMap = new HashMap<String, Formatter>();
082 private final Map<String, SystemParameter> sysParamMap = new HashMap<String, SystemParameter>();
083 private final ErrorMessage errMsg = new ErrorMessage();
084 // private String rtn = null;
085 private String bizRtn = null; // 5.1.8.0 (2010/07/01) メソãƒ?ƒ‰名と変数名をåˆ?�‘るã?
086 // private boolean isDebug = false;
087 private boolean debugFlag = false; // 5.1.8.0 (2010/07/01) メソãƒ?ƒ‰名と変数名をåˆ?�‘るã?
088
089 private final StringBuilder debugMsg = new StringBuilder();
090 private boolean useParamMetaData = false; // 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ConnectionFactory経由で取得ã?(PostgreSQL対å¿?
091
092 /**
093 * 配å?側ãƒ??ブルモãƒ?ƒ«
094 *
095 * 配å?型テーブルモãƒ?ƒ«自体ã?、protected属æ?であるため、サブクラスから直接参ç?することができますã?
096 * ä½?�—、これã?、各業務ロジãƒ?‚¯で直接参ç?することを想定したものではなくã?BizLogicの
097 * メイン構é?を拡張するサブクラスを定義する際に使用することを想定してã�?�¾すã?
098 * (こã?想定がなければ、本来は、package privateにすべきでã�?
099 * こã?ため、業務ロジãƒ?‚¯を各実è£?‚¯ラスでは直接参ç?しなã�?�§下さã�??
100 */
101 protected ArrayTableModel table = null;
102
103 /**
104 * 配å?型テーブルモãƒ?ƒ«の現在の処ç�?¡?
105 *
106 * 行番号自体ã?、protected属æ?であるため、サブクラスから直接参ç?することができますã?
107 * ä½?�—、これã?、各業務ロジãƒ?‚¯で直接参ç?することを想定したものではなくã?BizLogicの
108 * メイン構é?を拡張するサブクラスを定義する際に使用することを想定してã�?�¾すã?
109 * (こã?想定がなければ、本来は、package privateにすべきでã�?
110 * こã?ため、業務ロジãƒ?‚¯を各実è£?‚¯ラスでは直接参ç?しなã�?�§下さã�??
111 *
112 * ※ インãƒ?ƒƒクス(row)とは、このArrayTableModel に持つ vals 配å?の行ã?インãƒ?ƒƒクスですã?
113 * よって、オリジナルのDBTableModelの行番号ではありませんã€?
114 */
115 protected int row = -1;
116
117 // /**
118 // * DBのコネクションオブジェクトをæŒ?®šしますã?
119 // * å�?®Ÿè£?‚¯ラスでは、コネクションのcommit,rollbackは行われませんã€?
120 // * (全てのDB処ç�??ã€?つのトランザクションとして処ç�?�•れますã?)
121 // * こã?ため、commit,rollbackは呼び出しå?で行うå¿?¦�がありますã?
122 // * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
123 // *
124 // * @param cn DB接ç¶?
125 // */
126 // void setConnection( final Connection cn ) {
127 // if( conn != null ) { throw new RuntimeException( "既に接続オブジェクトがセãƒ?ƒˆされてã�?�¾すã?" ); }
128 // conn = cn;
129 // }
130
131 /**
132 * DBのトランザクションオブジェクトをæŒ?®šしますã?
133 * å�?®Ÿè£?‚¯ラスでは、コネクションのcommit,rollbackは行われませんã€?
134 * (全てのDB処ç�??ã€?つのトランザクションとして処ç�?�•れますã?)
135 * こã?ため、commit,rollbackは呼び出しå?で行うå¿?¦�がありますã?
136 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
137 *
138 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
139 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ConnectionFactory経由で取得ã?(PostgreSQL対å¿?
140 *
141 * @param tr トランザクション
142 */
143 public void setTransaction( final Transaction tr ) {
144 tran = tr;
145 conn = tran.getConnection( dbid );
146 useParamMetaData = ConnectionFactory.useParameterMetaData( dbid ); // 5.3.8.0 (2011/08/01)
147 }
148
149 /**
150 * 接続å?IDを指定しますã?
151 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
152 *
153 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
154 *
155 * @param id 接続å?ID
156 */
157 void setDbid( final String id ) {
158 dbid = id;
159 }
160
161 /**
162 * 業務ロジãƒ?‚¯のクラスをロードするためã?クラスローãƒ??をセãƒ?ƒˆしますã?
163 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
164 *
165 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
166 *
167 * @param ldr クラスローãƒ??
168 */
169 void setLoader( final HybsLoader ldr ) {
170 if( loader != null ) {
171 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
172 // throw new RuntimeException( "既にクラスローãƒ??がセãƒ?ƒˆされてã�?�¾すã?" );
173 String errMsg = "既にクラスローãƒ??がセãƒ?ƒˆされてã�?�¾すã?" ;
174 throw new RuntimeException( errMsg );
175 }
176 loader = ldr;
177 }
178
179 /**
180 * 配å?型テーブルモãƒ?ƒ«をセãƒ?ƒˆしますã?
181 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
182 *
183 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
184 *
185 * @param tbl 配å?型テーブルモãƒ?ƒ«
186 */
187 void setTable( final ArrayTableModel tbl ) {
188 if( table != null ) {
189 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
190 // throw new RuntimeException( "既に配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�¾すã?" );
191 String errMsg = "既に配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�¾すã?" ;
192 throw new RuntimeException( errMsg );
193 }
194 table = tbl;
195 }
196
197 /**
198 * 固定å?のキーをCSV形式でæŒ?®šしますã?
199 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
200 *
201 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
202 *
203 * @param ks キー
204 */
205 void setKeys( final String[] ks ) {
206 if( keys != null ) {
207 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
208 // throw new RuntimeException( "既に固定å?配å?(キー)がセãƒ?ƒˆされてã�?�¾すã?" );
209 String errMsg = "既に固定å?配å?(キー)がセãƒ?ƒˆされてã�?�¾すã?" + CR
210 + " KESY =" + Arrays.toString( keys ) + CR
211 + " in keys=" + Arrays.toString( ks ) ;
212 throw new RuntimeException( errMsg );
213 }
214 keys = ks;
215 }
216
217 /**
218 * 固定å?の値をCSV形式でæŒ?®šしますã?
219 * こã?メソãƒ?ƒ‰はã€?度しかセãƒ?ƒˆすることができませんã€?回以上呼び出しするとエラーになりますã?
220 *
221 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
222 *
223 * @param vs 値
224 */
225 void setVals( final String[] vs ) {
226 if( vals != null ) {
227 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
228 // throw new RuntimeException( "既に固定å?配å?(値)がセãƒ?ƒˆされてã�?�¾すã?" );
229 String errMsg = "既に固定å?配å?(値)がセãƒ?ƒˆされてã�?�¾すã?" + CR
230 + " VALS =" + Arrays.toString( vals ) + CR
231 + " in vals=" + Arrays.toString( vs ) ;
232 throw new RuntimeException( errMsg );
233 }
234 vals = vs;
235 }
236
237 /**
238 * こã?処ç�??実行ユーザーIDを指定しますã?
239 *
240 * @param id 実行ユーザーID
241 */
242 void setUserId( final String id ) {
243 variableMap.put( "CON.USERID", id);
244 }
245
246 /**
247 * 親(呼び出ã�?PGIDを指定しますã?
248 *
249 * @param id 親PGID
250 */
251 void setParentPgId( final String id ) {
252 variableMap.put( "CON.PGPID", id );
253 }
254
255 /**
256 * ãƒ?ƒ�ãƒ?‚°モードにしますã?
257 */
258 void setDebug() {
259 // isDebug = true;
260 debugFlag = true;
261 }
262
263 /**
264 * ãƒ?ƒ�ãƒ?‚°メãƒ?‚»ージを取得しますã?
265 *
266 * @return ãƒ?ƒ�ãƒ?‚°メãƒ?‚»ージ
267 */
268 String getDebugMsg() {
269 return debugMsg.toString();
270 }
271
272 /**
273 * 処ç�?‚’実行しますã?
274 * 処ç�??方法ã?、main()メソãƒ?ƒ‰により定義されますã?
275 * 実è£?‚¯ラスで発生したå?ての例外ã?、Throwableオブジェクトとしてスローされますã?
276 * 呼び出しå?では、例外を確実にcatchして、commit,rollbackを行ってくださいã€?
277 *
278 * @og.rev 5.1.9.0 (2010/08/01) シーケンス対å¿?
279 *
280 * @return 処ç�?�Œ成功したかどã�?�‹
281 * @throws Throwable 実行時の全エラーを上位に転送しますã?
282 */
283 boolean exec() throws Throwable {
284 dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( dbid ) );
285 makeParamMap();
286 init();
287 return main();
288 }
289
290 /**
291 * 処ç�??メインロジãƒ?‚¯の前å?ç�?‚’記述しますã?
292 *
293 * こã?メソãƒ?ƒ‰自体ã?、protected属æ?であるため、サブクラスから直接参ç?することができますã?
294 * ä½?�—、これã?、各業務ロジãƒ?‚¯で直接参ç?することを想定したものではなくã?BizLogicの
295 * メイン構é?を拡張するサブクラスを定義する際に使用することを想定してã�?�¾すã?
296 * (こã?想定がなければ、本来は、package privateにすべきでã�?
297 * こã?ため、業務ロジãƒ?‚¯を各実è£?‚¯ラスでは直接参ç?しなã�?�§下さã�??
298 */
299 abstract protected void init();
300
301 /**
302 * 処ç�??メインロジãƒ?‚¯を記述しますã?
303 *
304 * こã?メソãƒ?ƒ‰自体ã?、protected属æ?であるため、サブクラスから直接参ç?することができますã?
305 * ä½?�—、これã?、各業務ロジãƒ?‚¯で直接参ç?することを想定したものではなくã?BizLogicの
306 * メイン構é?を拡張するサブクラスを定義する際に使用することを想定してã�?�¾すã?
307 * (こã?想定がなければ、本来は、package privateにすべきでã�?
308 * こã?ため、業務ロジãƒ?‚¯を各実è£?‚¯ラスでは直接参ç?しなã�?�§下さã�??
309 *
310 * @return 処ç�?�Œ正常終äº?�—たか
311 */
312 abstract protected boolean main();
313
314 /**
315 * 結果スãƒ??タスを返しますã?
316 *
317 * @return 結果スãƒ??タス
318 */
319 int getKekka() {
320 return errMsg.getKekka();
321 }
322
323 /**
324 * エラーメãƒ?‚»ージオブジェクトを返しますã?
325 *
326 * @return エラーメãƒ?‚»ージ
327 */
328 ErrorMessage getErrMsg() {
329 return errMsg;
330 }
331
332 /**
333 * 業務ロジãƒ?‚¯の戻りå?を返しますã?
334 *
335 * @return 戻りå?
336 */
337 String getReturn() {
338 return bizRtn;
339 }
340
341 /**
342 * 業務ロジãƒ?‚¯を実行するために、テーブルモãƒ?ƒ«が外部からセãƒ?ƒˆされるå¿?¦�があるã�?
343 * を返しますã?
344 * å¿??である場合ã?そã?業務ロジãƒ?‚¯は、子ロジãƒ?‚¯として呼び出すことができませんã€?
345 * これは、子ロジãƒ?‚¯呼び出し時は、テーブルモãƒ?ƒ«がセãƒ?ƒˆされなã�?�Ÿめですã?
346 * (こã?クラスは、テーブルモãƒ?ƒ«が外部からæŒ?®šされてã�?‚‹å¿?¦�ã?ありませんã€?
347 *
348 * こã?メソãƒ?ƒ‰自体ã?、protected属æ?であるため、サブクラスから直接参ç?することができますã?
349 * ä½?�—、これã?、各業務ロジãƒ?‚¯で直接参ç?することを想定したものではなくã?BizLogicの
350 * メイン構é?を拡張するサブクラスを定義する際に使用することを想定してã�?�¾すã?
351 * (こã?想定がなければ、本来は、package privateにすべきでã�?
352 * こã?ため、業務ロジãƒ?‚¯を各実è£?‚¯ラスでは直接参ç?しなã�?�§下さã�??
353 *
354 * @return ãƒ??ブルモãƒ?ƒ«が外部からセãƒ?ƒˆされるå¿?¦�があるかどã�?�‹(常にfalse)
355 */
356 protected boolean isRequireTable() {
357 return false;
358 }
359
360 /**
361 * ãƒ?ƒ�ãƒ?‚°モードかどã�?�‹を返しまã�?
362 *
363 * @return ãƒ?ƒ�ãƒ?‚°モードかどã�?�‹
364 */
365 final protected boolean isDebug() {
366 // return isDebug;
367 return debugFlag;
368 }
369
370 /**
371 * ãƒ?ƒ�ãƒ?‚°メãƒ?‚»ージを追åŠ?�—ますã?
372 *
373 * @param msg 追åŠ?�™るデバッグメãƒ?‚»ージ
374 */
375 final protected void debug( final String msg ) {
376 debugMsg.append( msg ).append( CR );
377 }
378
379 /**
380 * æŒ?®šされたキーの値を返しますã?
381 *
382 * @param key キー
383 *
384 * @return 変数値
385 */
386 final protected String var( final String key ) {
387 return variableMap.get( key );
388 }
389
390 /**
391 * æŒ?®šされたキーの値をint型に変換して返しますã?
392 *
393 * @param key キー
394 *
395 * @return 変数値
396 */
397 final protected int vari( final String key ) {
398 return var( key ) == null ? 0 : Integer.valueOf( var( key ) );
399 }
400
401 /**
402 * æŒ?®šされたキーの値をdouble型に変換して返しますã?
403 *
404 * @param key キー
405 *
406 * @return 変数値
407 */
408 final protected double vard( final String key ) {
409 return var( key ) == null ? 0.0 : Double.valueOf( var( key ) );
410 }
411
412 /**
413 * パラメーターのキーä¸?¦§をé?列形式で返しますã?
414 * こã?パラメーターは、業務ロジãƒ?‚¯å†?�§セãƒ?ƒˆされたパラメーターも含まれますã?でご注意下さã�??
415 *
416 * @return パラメーターのキー配å?
417 */
418 final protected String[] varKeys() {
419 // return variableMap.keySet().toArray( new String[0] );
420 Set<String> keys = variableMap.keySet();
421 return keys.toArray( new String[keys.size()] );
422 }
423
424 /**
425 * æŒ?®šされたキーで値を登録しますã?
426 * パラメーターとしてこã?業務ロジãƒ?‚¯が呼ばれる際ã?引数となってã�?‚‹場合ã?ã€?
427 * エラーとなりますã?
428 *
429 * @og.rev 5.2.1.0 (2010/10/01) チェãƒ?‚¯のバグを修正
430 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
431 *
432 * @param key キー
433 * @param val 値
434 */
435 final protected void set( final String key, final String val ) {
436 // if( paramKeysStr.indexOf( key ) >= 0 ) {
437 if( paramKeysStr.indexOf( "|" + key + "|" ) >= 0 ) {
438 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
439 // throw new RuntimeException( "引数と同じ名前の変数を定義することはできません" );
440 String errMsg = "引数と同じ名前の変数を定義することはできませんã€? + CR
441 + " key =" + key + CR
442 + " 引数 =" + paramKeysStr ;
443 throw new RuntimeException( errMsg );
444 }
445 variableMap.put( key, val );
446 }
447
448 /**
449 * æŒ?®šされたキーで値を登録しますã?
450 * パラメーターとしてこã?業務ロジãƒ?‚¯が呼ばれる際ã?引数となってã�?‚‹場合ã?ã€?
451 * エラーとなりますã?
452 *
453 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
454 *
455 * @param key キー
456 * @param val 値
457 */
458 final protected void set( final String key, final int val ) {
459 set( key, String.valueOf( val ) );
460 }
461
462 /**
463 * æŒ?®šされたキーで値(doubleåž?を登録しますã?
464 * パラメーターとしてこã?業務ロジãƒ?‚¯が呼ばれる際ã?引数となってã�?‚‹場合ã?ã€?
465 * エラーとなりますã?
466 *
467 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ?
468 *
469 * @param key キー
470 * @param val 値
471 */
472 final protected void set( final String key, final double val ) {
473 set( key, String.valueOf( val ) );
474 }
475
476 /**
477 * 処ç�?¸の行ã?æŒ?®šされたキー(カラãƒ?��)の値を返しますã?
478 *
479 * @param key キー
480 *
481 * @return 値
482 */
483 final protected String line( final String key ) {
484 return line( key, row );
485 }
486
487 /**
488 * メインの配å?型テーブルモãƒ?ƒ«に対して、行をæŒ?®šして値を取得しますã?
489 * æŒ?®šされた行がç¯?›²をè¶?�ˆてã�?‚‹場合ã?、nullを返しますã?
490 *
491 * @og.rev 5.1.8.0 (2010/07/01) ãƒ??ブルに存在しなã�?‚«ラãƒ?��を指定したå?合に、NullPointerExceptionが発生するバグを修正
492 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
493 *
494 * @param key キー
495 * @param rw 行番号(インãƒ?ƒƒクス)
496 *
497 * @return 値
498 */
499 final protected String line( final String key, final int rw ) {
500 // return( rw < 0 || rw >= table.getRowCount() ? null : table.getValue( rw, key ) );
501 if( table == null ) {
502 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
503 // throw new RuntimeException( "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#line()メソãƒ?ƒ‰はできませんã€? );
504 String errMsg = "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#line( String,int )メソãƒ?ƒ‰はできませんã€? + CR
505 + " line( " + key + "," + rw + " );" + CR ;
506 throw new RuntimeException( errMsg );
507 }
508 else if( rw < 0 || rw >= table.getRowCount() ) {
509 return null;
510 }
511 else {
512 int col = table.getColumnNo( key );
513 if( col < 0 ) {
514 return null;
515 }
516 else {
517 return table.getValue( rw, col );
518 }
519 }
520 }
521
522 /**
523 * 処ç�?¸の行ã?æŒ?®šされたキー(カラãƒ?��)の値をint型に変換して返しますã?
524 *
525 * @param key キー
526 *
527 * @return 値
528 */
529 final protected int linei( final String key ) {
530 return line( key ) == null ? 0 : Integer.valueOf( line( key ) );
531 }
532
533 /**
534 * メインの配å?型テーブルモãƒ?ƒ«に対して、行をæŒ?®šして値をint型に変換して返しますã?
535 * æŒ?®šされた行がç¯?›²をè¶?�ˆてã�?‚‹場合ã?、nullを返しますã?
536 *
537 * @param key キー
538 * @param rw 行番号(インãƒ?ƒƒクス)
539 *
540 * @return 値
541 */
542 final protected int linei( final String key, final int rw ) {
543 return line( key, rw ) == null ? 0 : Integer.valueOf( line( key, rw ) );
544 }
545
546 /**
547 * 処ç�?¸の行ã?æŒ?®šされたキー(カラãƒ?��)の値をdouble型に変換して返しますã?
548 *
549 * @param key キー
550 *
551 * @return 値
552 */
553 final protected double lined( final String key ) {
554 return line( key ) == null ? 0.0 : Double.valueOf( line( key ) );
555 }
556
557 /**
558 * メインの配å?型テーブルモãƒ?ƒ«に対して、行をæŒ?®šして値をdouble型に変換して返しますã?
559 * æŒ?®šされた行がç¯?›²をè¶?�ˆてã�?‚‹場合ã?、nullを返しますã?
560 *
561 * @param key キー
562 * @param rw 行番号(インãƒ?ƒƒクス)
563 *
564 * @return 値
565 */
566 final protected double lined( final String key, final int rw ) {
567 return line( key, rw ) == null ? 0.0 : Double.valueOf( line( key, rw ) );
568 }
569
570 /**
571 * ãƒ??ブルのカラãƒ?��のä¸?¦§をé?列形式で返しますã?
572 *
573 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
574 *
575 * @return ãƒ??ブルのカラãƒ?��配å?
576 */
577 final protected String[] lineKeys() {
578 if( table == null ) {
579 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
580 // throw new RuntimeException( "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#line()メソãƒ?ƒ‰はできませんã€? );
581 String errMsg = "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#lineKeys()メソãƒ?ƒ‰はできませんã€? ;
582 throw new RuntimeException( errMsg );
583 }
584 else {
585 return table.getNames();
586 }
587 }
588
589 /**
590 * ãƒ??ブルにカラãƒ?�Œ存在してã�?‚‹かを返しますã?
591 *
592 * @og.rev 5.2.0.0 (2010/09/01)
593 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
594 *
595 * @param clm カラãƒ?��
596 *
597 * @return 存在してã�?‚‹場å�?rue、存在してã�?�ªã�??å�?alse
598 */
599 final protected boolean isLine( final String clm ) {
600 if( table == null ) {
601 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
602 // throw new RuntimeException( "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#line()メソãƒ?ƒ‰はできませんã€? );
603 String errMsg = "配å?型テーブルモãƒ?ƒ«がセãƒ?ƒˆされてã�?�ªã�?�Ÿめã?#isLine( String )メソãƒ?ƒ‰はできませんã€? + CR
604 + " isLine( " + clm + " );" + CR ;
605 throw new RuntimeException( errMsg );
606 }
607 return ( table.getColumnNo( clm ) < 0 ) ? false : true ;
608 }
609
610 /**
611 * 業務ロジãƒ?‚¯の戻りå?をセãƒ?ƒˆしますã?
612 *
613 * @param rtn 戻りå?
614 */
615 final protected void rtn( final String rtn ) {
616 // final protected void setReturn( final String rtn ) {
617 // rtn = r;
618 bizRtn = rtn;
619 }
620
621 /**
622 * 子ロジãƒ?‚¯を実行しますã?
623 * 実行する子ロジãƒ?‚¯の呼び出しã?、親クラスと同じソースパス、クラスパスで呼び出しされますã?
624 * 子ロジãƒ?‚¯に渡す引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
625 * またã?子ロジãƒ?‚¯の戻りå?は、val("SUB_RETURN")で取得することができますã?
626 *
627 * @param subLogicName 子ロジãƒ?‚¯å�?
628 * @param key キー(CSV形å¼?
629 * @param val 値(CSV形å¼?
630 *
631 * @return 処ç�?�Œ正常終äº?�—たか
632 */
633 final protected boolean call( String subLogicName, String key, String val ) {
634 return call( subLogicName, key, val, row, table );
635 }
636
637 /**
638 * 子ロジãƒ?‚¯を実行しますã?
639 * 実行する子ロジãƒ?‚¯の呼び出しã?、親クラスと同じソースパス、クラスパスで呼び出しされますã?
640 * 子ロジãƒ?‚¯に渡す引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
641 * こã?場合ã?値は、引数でæŒ?®šされたã€??列型ãƒ??ブルモãƒ?ƒ«の行に対応するå?になりますã?
642 * またã?子ロジãƒ?‚¯の戻りå?は、val("RETURN")で取得することができますã?
643 *
644 * @og.rev 5.1.9.0 (2010/08/01) シーケンス対å¿?
645 * @og.rev 5.4.1.0 (2011/11/01) 値にカンマが含まれてã�?‚‹場合に正しく動作しなã�?ƒ�グを修正
646 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
647 *
648 * @param subLogicName 子ロジãƒ?‚¯å�?
649 * @param key キー(CSV形å¼?
650 * @param val 値(CSV形å¼?
651 * @param rw 行番号(インãƒ?ƒƒクス)
652 * @param tbl 配å?型テーブルモãƒ?ƒ«
653 *
654 * @return 処ç�?�Œ正常終äº?�—たか
655 */
656 final protected boolean call( String subLogicName, String key, String val, int rw, ArrayTableModel tbl ) {
657 AbstractBizLogic subLogic = (AbstractBizLogic)loader.newInstance( subLogicName );
658
659 if( subLogic.isRequireTable() ) {
660 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
661 // throw new RuntimeException( "こã?クラスは、外部からãƒ??ブルモãƒ?ƒ«をセãƒ?ƒˆするå¿?¦�があるため、子ロジãƒ?‚¯として呼び出すことはできませんã€?クラスå�?" + subLogic.getClass().getName() + "]" );
662 String errMsg = "こã?クラスは、外部からãƒ??ブルモãƒ?ƒ«をセãƒ?ƒˆするå¿?¦�があるため、子ロジãƒ?‚¯として呼び出すことはできませんã€? + CR
663 + " [クラスå�?" + subLogic.getClass().getName() + "]" + CR
664 + " subLogicName =" + subLogicName
665 + " key =[" + key + "]"
666 + " val =[" + val + "]" + CR ;
667 throw new RuntimeException( errMsg );
668 }
669
670 // subLogic.setConnection( conn );
671 subLogic.setTransaction( tran );
672 subLogic.setLoader( loader );
673 subLogic.setKeys( StringUtil.csv2Array( key ) );
674 // subLogic.setVals( StringUtil.csv2Array( replaceParam( val, rw, tbl ) ) );
675 // 5.4.1.0 (2011/11/01) 値にカンマが含まれてã�?‚‹場合に正しく動作しなã�?ƒ�グを修正
676 String[] vals = StringUtil.csv2Array( val );
677 for( int i=0; i<vals.length; i++ ) {
678 vals[i] = replaceParam( vals[i], rw, tbl );
679 }
680 subLogic.setVals( vals );
681 subLogic.setUserId( variableMap.get( "CON.USERID" ) );
682 subLogic.setParentPgId( variableMap.get( "CON.PGID" ) );
683 if( debugFlag ) {
684 subLogic.setDebug();
685 }
686
687 boolean rtn = false;
688 try {
689 rtn = subLogic.exec();
690 }
691 catch( Throwable th ) {
692 // // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
693 // throw new RuntimeException( "子ロジãƒ?‚¯の呼び出しでエラーが発生しましたã€?logic=" + subLogicName + "]", th );
694 String errMsg = "子ロジãƒ?‚¯の呼び出しでエラーが発生しましたã€? + CR
695 + " subLogicName =" + subLogicName + CR
696 + " key =[" + key + "]"
697 + " val =[" + val + "]" + CR ;
698 throw new RuntimeException( errMsg ,th );
699 }
700 variableMap.put( "RETURN", subLogic.getReturn() );
701
702 if( debugFlag ) { debug( subLogic.getDebugMsg() ); }
703
704 ErrMsg[] errs = subLogic.getErrMsg().toArray();
705 if( errs.length > 0 ) {
706 ErrorMessage errMsgTmp = new ErrorMessage();
707 for( int i = 0; i < errs.length; i++ ) {
708 // errMsgTmp.addMessage( errs[i].copy( errs[i].getNo() + rw ) );
709 errMsgTmp.addMessage( errs[i].copy( rw ) );
710 }
711 errMsg.append( errMsgTmp );
712 }
713
714 return rtn;
715 }
716
717 /**
718 * SQLを実行しますã?
719 * SQLæ–?�«は、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
720 * selectæ–?‚’発行したå?合ã?そã?結果セãƒ?ƒˆは、var(カラãƒ?��)で取得することができますã?
721 * 2行以上が返された場合でもã?1行目のみが登録されますã?
722 * またã?検索件数、更新件数につã�?�¦は、var("SQL_ROWCOUNT")で取得することができますã?
723 *
724 * @param sq SQLæ–?—å?
725 */
726 final protected void sql( final String sq ) {
727 sql( sq, row, table );
728 }
729
730 /**
731 * SQLを実行しますã?
732 * SQLæ–?�«は、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
733 * [XXXX]形式ã?変数の置き換えには、引数でæŒ?®šされた配å?型テーブルモãƒ?ƒ«の行が使用されますã?
734 * selectæ–?‚’発行したå?合ã?そã?結果セãƒ?ƒˆは、var(カラãƒ?��)で取得することができますã?
735 * 2行以上が返された場合でもã?1行目のみが登録されますã?
736 * またã?検索件数、更新件数につã�?�¦は、var("SQL_ROWCOUNT")で取得することができますã?
737 *
738 * @param sq SQLæ–?—å?
739 * @param rw 行番号(インãƒ?ƒƒクス)
740 * @param tbl 配å?型テーブルモãƒ?ƒ«
741 */
742 final protected void sql( final String sq, final int rw, final ArrayTableModel tbl ) {
743 ArrayTableModel tbl2 = execSQL( sq, rw, tbl );
744
745 if( tbl2 != null && tbl2.getRowCount() > 0 ) {
746 String[] names = tbl2.getNames();
747 String[] vals = tbl2.getValues( 0 );
748 for( int i = 0; i < names.length; i++ ) {
749 variableMap.put( names[i], vals[i] );
750 }
751 }
752 }
753
754 /**
755 * シーケンス名よりシーケンスオブジェクトを検索しã?次の値を取りå?しますã?
756 * DBに対するシーケンスオブジェクトã?予め作æ?されてã�?‚‹å¿?¦�がありますã?
757 *
758 * またã?MySQLの場合ã?、シーケンスオブジェクトが実è£?�•れてã�?�ªã�?�Ÿめã?
759 * å†?ƒ¨çš?�«は、引数のシーケンス名と同じ名前のãƒ??ブルから、Integer型ã?
760 * "SEQID"とã�?�†é ?›®名を検索することにより、シーケンスをエミュレートしてã�?�¾すã?
761 *
762 * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
763 *
764 * @param seqName シーケンスå�?
765 *
766 * @return シーケンス番号
767 * @see org.opengion.fukurou.db.DBFunctionName#getSequence(String,Transaction)
768 */
769 final protected int seq( final String seqName ) {
770 return dbName.getSequence( seqName, tran );
771 }
772
773 /**
774 * SQLを実行しますã?
775 *
776 * @param sq SQLæ–?—å?
777 * @param rw 行番号(インãƒ?ƒƒクス)
778 * @param tbl 配å?型テーブルモãƒ?ƒ«
779 *
780 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
781 *
782 * @return 結果セãƒ?ƒˆ(配å?型テーブルモãƒ?ƒ«)
783 *
784 * @og.rev 5.1.2.0 (2010/01/01) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
785 * @og.rev 5.1.8.0 (2010/07/01) column名ã?大æ–?—化しã?é ?›®名ã?取得ã?#getColumnLabel()で行うã€?PotgreSQL対å¿?バグ修正)
786 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ConnectionFactory経由で取得ã?(PostgreSQL対å¿?、setNull 対å¿?
787 */
788 private ArrayTableModel execSQL( final String sq, final int rw, final ArrayTableModel tbl ) {
789 String sql = sq;
790
791 sql = replaceParam( sql, false ); // [XXXX]の変換はここでは行わなã�??
792
793 Formatter format = null;
794 if( tbl != null && sql.indexOf( '[' ) >= 0 ) {
795 format = getFormatter( sql, tbl );
796 sql = format.getQueryFormatString();
797 }
798
799 PreparedStatement pstmt = null;
800 ResultSet result = null;
801 ArrayTableModel tbl2 = null;
802 try {
803 pstmt = conn.prepareStatement( sql );
804 if( tbl != null && format != null ) {
805 int[] clmNo = format.getClmNos();
806
807 // 5.1.2.0 (2010/01/01) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
808 // boolean useParamMetaData = ApplicationInfo.useParameterMetaData( conn ); // 5.3.8.0 (2011/08/01)
809 if( useParamMetaData ) {
810 ParameterMetaData pMeta = pstmt.getParameterMetaData();
811 for( int i = 0; i < clmNo.length; i++ ) {
812 int type = pMeta.getParameterType( i+1 );
813 // 5.3.8.0 (2011/08/01) setNull 対å¿?
814 // pstmt.setObject( i+1, tbl.getValue( rw, clmNo[i] ), type );
815 String val = tbl.getValue( rw, clmNo[i] );
816 if( val == null || val.isEmpty() ) {
817 pstmt.setNull( i+1, type );
818 }
819 else {
820 pstmt.setObject( i+1, val, type );
821 }
822 }
823 }
824 else {
825 for( int i = 0; i < clmNo.length; i++ ) {
826 pstmt.setObject( i+1, tbl.getValue( rw, clmNo[i] ) );
827 }
828 }
829 }
830 boolean status = pstmt.execute();
831 result = pstmt.getResultSet();
832
833 if( status ) {
834 ResultSetMetaData metaData = result.getMetaData();
835 int cols = metaData.getColumnCount();
836
837 String[] names = new String[cols];
838 for( int i = 0; i < cols; i++ ) {
839 // 5.1.8.0 (2010/07/01) column名ã?大æ–?—化しã?é ?›®名ã?取得ã?#getColumnLabel()で行うã€?PotgreSQL対å¿?バグ修正)
840 // names[i] = metaData.getColumnName( i+1 );
841 names[i] = metaData.getColumnLabel( i+1 ).toUpperCase( Locale.JAPAN );
842 }
843
844 String[][] tblVals = DBUtil.resultToArray( result, false );
845 tbl2 = new ArrayTableModel( names, tblVals );
846
847 variableMap.put( "SQL_ROWCOUNT", String.valueOf( pstmt.getFetchSize() ) );
848 }
849 else {
850 variableMap.put( "SQL_ROWCOUNT", String.valueOf( pstmt.getUpdateCount() ) );
851 }
852 }
853 catch( SQLException ex ) {
854 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
855 // throw new RuntimeException( "配å?型テーブルモãƒ?ƒ«の生æ?に失敗しました", ex );
856 String errMsg = "配å?型テーブルモãƒ?ƒ«の生æ?に失敗しましたã€? + CR
857 + " sql =" + sql + CR
858 + " ArrayTableModel=" + tbl ;
859 throw new RuntimeException( errMsg,ex );
860 }
861 finally {
862 Closer.resultClose( result );
863 Closer.stmtClose( pstmt );
864 }
865 return tbl2;
866 }
867
868 /**
869 * エラーメãƒ?‚»ージを追åŠ?�—ますã?
870 * エラーメãƒ?‚»ージの引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
871 *
872 * @param kekka エラーレベル
873 * @param id エラーメãƒ?‚»ージID
874 * @param args エラーメãƒ?‚»ージパラメーター
875 */
876 final protected void error( final int kekka, final String id, final String... args ) {
877 error( row, kekka, id, args );
878 }
879
880 /**
881 * 行指定でエラーメãƒ?‚»ージを追åŠ?�—ますã?
882 * エラーメãƒ?‚»ージの引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
883 *
884 * @param rw 行番号(インãƒ?ƒƒクス)
885 * @param kekka エラーレベル
886 * @param id エラーメãƒ?‚»ージID
887 * @param args エラーメãƒ?‚»ージパラメーター
888 */
889 final protected void error( final int rw, final int kekka, final String id, final String... args ) {
890 errMsg.addMessage( rw, kekka, id, replaceParam( args ) );
891 }
892
893 /**
894 * パラメーターのå¿??チェãƒ?‚¯を行いますã?
895 * キーは、カンマ区åˆ?‚Šでè¤?•°æŒ?®šすることができますã?
896 *
897 * @param cs カラãƒ?カンマ区åˆ?‚Š)
898 *
899 * @return エラーが発生したå?合ã?false、それ以外ã?true
900 */
901 final protected boolean must( final String cs ) {
902 if( cs == null || cs.length() == 0 ) {
903 return true;
904 }
905
906 boolean rtn = true;
907 String[] clms = StringUtil.csv2Array( cs );
908 for( int i=0; i<clms.length; i++ ) {
909 String val = variableMap.get( clms[i] );
910 if( val == null || val.length() == 0 ) {
911 error( 2, "ERR0012", "{#" + clms[i] + "}" );
912 rtn = false;
913 }
914 }
915 return rtn;
916 }
917
918 /**
919 * マスタチェãƒ?‚¯を行いますã?
920 *
921 * @og.rev 5.6.3.1 (2013/04/05) isErrThrow 引数を追åŠ?
922 *
923 * @see #exist(String, String, String, String, String, String)
924 * @param type エラーチェãƒ?‚¯のタイãƒ?
925 * @param tblId ãƒ??ブルå�?
926 * @param ns カラãƒ?カンマ区åˆ?‚Š)
927 * @param vs 値(カンマ区åˆ?‚Š)
928 *
929 * @return エラーが発生したå?合ã?false、それ以外ã?true
930 */
931 final protected boolean exist( final String type, final String tblId, final String ns, final String vs ) {
932 // return exist( type, tblId, ns, vs, null, null );
933 return exist( type, tblId, ns, vs, null, null,true );
934 }
935
936 /**
937 * マスタチェãƒ?‚¯を行いますã?
938 *
939 * 引数にæŒ?®šされたãƒ??ブル名ã?及ã?条件句を生成するためã?カラãƒ??値から
940 * 件数を取得し、typeに応じて件数チェãƒ?‚¯を行いますã?
941 * (カラãƒ??値には、カンマ区åˆ?‚Šでè¤?•°æŒ?®šすることができまã�?
942 * type=true 存在する場å�?rue 存在しなã�??å�?alse
943 * type=false 存在する場å�?alse 存在しなã�??å�?rue
944 * type=one 1件以å†? true 2件以ä¸? false
945 *
946 * å¿??チェãƒ?‚¯の引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
947 *
948 * またã?固定å?カラãƒ??値にも条件となるカラãƒ?�Šび値を指定することができますがã€?
949 * ここでæŒ?®šされたカラãƒ??、エラーメãƒ?‚»ージ表示時にカラãƒ??値が画面に表示されませんã€?
950 *
951 * @og.rev 5.6.3.1 (2013/04/05) isErrThrow 引数を追åŠ?
952 *
953 * @param type エラーチェãƒ?‚¯のタイãƒ?
954 * @param tblId ãƒ??ブルå�?
955 * @param ns カラãƒ?カンマ区åˆ?‚Š)
956 * @param vs 値(カンマ区åˆ?‚Š)
957 * @param conNs 固定å?カラãƒ?カンマ区åˆ?‚Š)
958 * @param conVs 固定å?(カンマ区åˆ?‚Š)
959 *
960 * @return エラーが発生したå?合ã?false、それ以外ã?true
961 */
962 final protected boolean exist( final String type, final String tblId
963 , final String ns, final String vs, final String conNs, final String conVs ) {
964 return exist( type, tblId, ns, vs, conNs, conVs,true );
965 }
966
967 /**
968 * マスタチェãƒ?‚¯を行いますã?
969 * 引数にæŒ?®šされたãƒ??ブル名ã?及ã?条件句を生成するためã?カラãƒ??値から
970 * 件数を取得し、typeに応じて件数チェãƒ?‚¯を行いますã?
971 * (カラãƒ??値には、カンマ区åˆ?‚Šでè¤?•°æŒ?®šすることができまã�?
972 * type=true 存在する場å�?rue 存在しなã�??å�?alse
973 * type=false 存在する場å�?alse 存在しなã�??å�?rue
974 * type=one 1件以å†? true 2件以ä¸? false
975 *
976 * å¿??チェãƒ?‚¯の引数には、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
977 *
978 * またã?固定å?カラãƒ??値にも条件となるカラãƒ?�Šび値を指定することができますがã€?
979 * ここでæŒ?®šされたカラãƒ??、エラーメãƒ?‚»ージ表示時にカラãƒ??値が画面に表示されませんã€?
980 *
981 * isErrThrow は、エラーが発生したå?合に、エラーメãƒ?‚»ージ??rrorMessage?‰に書き込ã‚?�‹どã�?�‹を指定しますã?
982 * 基本は、互換性をè?慮しã?true(書き込ã‚?ですã?
983 * false にするケースは、存在??½ª?¯?¸を行い、あれã?更新、なければ追åŠ?など後続å?ç�?‚’行いたい場合に使ã�?�¾すã?
984 *
985 * @og.rev 5.6.3.1 (2013/04/05) isErrThrow 引数を追åŠ?
986 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
987 *
988 * @param type エラーチェãƒ?‚¯のタイãƒ?
989 * @param tblId ãƒ??ブルå�?
990 * @param ns カラãƒ?カンマ区åˆ?‚Š)
991 * @param vs 値(カンマ区åˆ?‚Š)
992 * @param conNs 固定å?カラãƒ?カンマ区åˆ?‚Š)
993 * @param conVs 固定å?(カンマ区åˆ?‚Š)
994 * @param isErrThrow 判定結果がfalseの場合に、error関数を呼ぶ場合ã?、true。呼ばなã�??合ã?、falseをセãƒ?ƒˆしますã?
995 *
996 * @return エラーが発生したå?合ã?false、それ以外ã?true
997 */
998 final protected boolean exist( final String type, final String tblId
999 , final String ns, final String vs, final String conNs, final String conVs, final boolean isErrThrow ) {
1000 if( ns == null || ns.length() == 0 || vs == null || vs.length() == 0 ) {
1001 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
1002 // throw new RuntimeException( "カラãƒ?�ˆは、å?にnullはæŒ?®šできません" );
1003 String errMsg = "カラãƒ?�ˆは、å?にnullはæŒ?®šできませんã€? + CR
1004 + " ns =[" + ns + "]"
1005 + " vs =[" + vs + "]" ;
1006 throw new RuntimeException( errMsg );
1007 }
1008
1009 String namesStr = ns + ( conNs == null || conNs.length() == 0 ? "" : "," + conNs );
1010 String[] namesArr = StringUtil.csv2Array( namesStr );
1011 String valsStr = vs + ( conVs == null || conVs.length() == 0 ? "" : "," + conVs );
1012 String[] valsArr = StringUtil.csv2Array( valsStr );
1013 if( namesArr.length != valsArr.length ) {
1014 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
1015 // throw new RuntimeException( "カラãƒ?�¨値の個数が異なりまã�? );
1016 String errMsg = "カラãƒ?�¨値の個数が異なりますã?" + CR
1017 + " names = [" + namesStr + "]" + CR
1018 + " vals = [" + valsStr + "]";
1019 throw new RuntimeException( errMsg );
1020 }
1021
1022 StringBuilder sb = new StringBuilder();
1023 sb.append( "select count(*) CNT from " ).append( tblId );
1024 for( int i=0 ;i<namesArr.length; i++ ) {
1025 if( i==0 ) { sb.append( " where " ); }
1026 else { sb.append( " and " ); }
1027 sb.append( namesArr[i] ).append( " = " ).append( valsArr[i] );
1028 }
1029
1030 int count = 0;
1031 ArrayTableModel tbl2 = execSQL( sb.toString(), row, table );
1032 if( tbl2 != null && tbl2.getRowCount() >= 0 ) {
1033 count = Integer.valueOf( tbl2.getValues( 0 )[0] );
1034 }
1035
1036 String repVals = replaceParam( vs );
1037 if( "true".equalsIgnoreCase( type ) ) {
1038 // ERR0025=ãƒ??タ未登録エラー。キー={0}、å?={1} のãƒ??タは、存在してã�?�¾せんã€?
1039 if( count <= 0 ) {
1040 if( isErrThrow ) { error( NG, "ERR0025", "{#" + ns + "}", repVals ); } // 5.6.3.1 (2013/04/05)
1041 return false;
1042 }
1043 }
1044 else if( "false".equalsIgnoreCase( type ) ) {
1045 // ERR0026=ãƒ??タ登録済みエラー。キー={0}、å?={1} のãƒ??タは、すでに存在してã�?�¾すã?
1046 if( count > 0 ) {
1047 if( isErrThrow ) { error( NG, "ERR0026", "{#" + ns + "}", repVals ); } // 5.6.3.1 (2013/04/05)
1048 return false;
1049 }
1050 }
1051 else if( "one".equalsIgnoreCase( type ) ) {
1052 // ERR0027=ãƒ??タ?’重登録エラー。キー={0}、å?={1} のãƒ??タはã€?‡�è¤?�—て存在してã�?�¾すã?
1053 if( count > 1 ) {
1054 if( isErrThrow ) { error( NG, "ERR0027", "{#" + ns + "}", repVals ); } // 5.6.3.1 (2013/04/05)
1055 return false;
1056 }
1057 }
1058 else {
1059 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
1060 // throw new RuntimeException( "typeは、true、false、oneのã�?�šれかでæŒ?®šするå¿?¦�がありまã�? );
1061 String errMsg = "typeは、true、false、oneのã�?�šれかでæŒ?®šするå¿?¦�がありますã?" + CR
1062 + " type = [" + type + "]";
1063 throw new RuntimeException( errMsg );
1064 }
1065 return true;
1066 }
1067
1068 /**
1069 * 引数にæŒ?®šされたキー、å?をã?ãƒ??形式に変換しますã?
1070 *
1071 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
1072 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
1073 */
1074 private void makeParamMap() {
1075 if( keys != null && vals != null ) {
1076 if( keys.length == vals.length ) {
1077 for( int i = 0; i < keys.length; i++ ) {
1078 paramKeysStr.append( keys[i] ).append( "|" );
1079 variableMap.put( keys[i], vals[i] );
1080 }
1081 }
1082 else {
1083 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
1084 // throw new RuntimeException( "keyとvalの個数が異なりまã�? );
1085 String errMsg = "keysとvalsの個数が異なりますã?" + CR
1086 + " keys =" + Arrays.toString( keys ) + CR
1087 + " vals =" + Arrays.toString( vals ) ;
1088 throw new RuntimeException( errMsg );
1089 }
1090 }
1091
1092 // DateFormat formatter = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN );
1093 // String ymdh = formatter.format( new Date() );
1094 String ymdh = HybsDateUtil.getDate( "yyyyMMddHHmmss" ); // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
1095 variableMap.put( "CON.YMDH", ymdh );
1096 variableMap.put( "CON.YMD", ymdh.substring( 0,8 ) );
1097 variableMap.put( "CON.HMS", ymdh.substring( 8 ) );
1098
1099 variableMap.put( "CON.PGID", this.getClass().getSimpleName() );
1100 }
1101
1102 /**
1103 * {@XXXX}形式及び[XXXX]形式ã?æ–?—å?の置き換えを行いますã?
1104 *
1105 * @param str 置き換え対象のæ–?—å?
1106 *
1107 * @return 置き換え結果のæ–?—å?
1108 */
1109 private String replaceParam( final String str ) {
1110 return replaceParam( str, row, table );
1111 }
1112
1113 /**
1114 * {@XXXX}形式及び[XXXX]形式ã?æ–?—å?の置き換えを行いますã?
1115 * isRepTableにfalseを指定したå?合ã?Formatterによる[XXXX]変換は行われませんã€?
1116 * (SQLの変換の場合ã?、PreparedStatementで処ç�?�•せるため、[XXXX]の変換は行わなã�??)
1117 *
1118 * @param str 置き換え対象のæ–?—å?
1119 * @param isRepTable Formatterによる[XXXX]変換を行うã�?
1120 *
1121 * @return 置き換え結果のæ–?—å?
1122 */
1123 private String replaceParam( final String str, final boolean isRepTable ) {
1124 return ( isRepTable ? replaceParam( str, row, table) : replaceParam( str, 0, null ) );
1125 }
1126
1127 /**
1128 * {@XXXX}形式及び[XXXX]形式ã?æ–?—å?の置き換えを行いますã?
1129 * [XXXX]形式ã?置き換えには、引数でæŒ?®šされた配å?型テーブルモãƒ?ƒ«、行番号(インãƒ?ƒƒクス)を使用しますã?
1130 *
1131 * @og.rev 5.1.8.0 (2010/07/01) 引数チェãƒ?‚¯漏れ対å¿?
1132 * @og.rev 5.3.9.0 (2011/09/01) nullがé?続するå?合にゼロストリングに置き換えられなã�?ƒ�グを修正
1133 *
1134 * @param str 置き換え対象のæ–?—å?
1135 * @param rw 行番号(インãƒ?ƒƒクス)
1136 * @param tbl 配å?型テーブルモãƒ?ƒ«
1137 *
1138 * @return 置き換え結果のæ–?—å?
1139 */
1140 private String replaceParam( final String str, final int rw, final ArrayTableModel tbl ) {
1141 // 5.1.8.0 (2010/07/01) 引数チェãƒ?‚¯漏れ対å¿?
1142 if( str == null || str.length() == 0 ) { return ""; }
1143
1144 String rtn = str;
1145
1146 // {@XXXX}の変換
1147 if( variableMap.size() > 0 && rtn.indexOf( "{@" ) >= 0 ) {
1148 SystemParameter sysParam = getSysParam( rtn );
1149 rtn = sysParam.replace( variableMap );
1150 }
1151
1152 // [XXXX]の変換
1153 if( tbl != null && rtn.indexOf( '[' ) >= 0 ) {
1154 Formatter format = getFormatter( rtn, tbl );
1155 rtn = format.getFormatString( rw );
1156 // 以ä¸?行ã?Formatterのバグを吸å�?値がnullの場合に"null"とã�?�†æ–?—å?で出力されてしまã�?
1157 // rtn = ',' + rtn + ',';
1158 // rtn = rtn.replace( ",null,", ",," );
1159 // rtn = rtn.substring( 1, rtn.length() - 1 );
1160 // 5.3.9.0 (2011/09/01) nullがé?続するå?合にゼロストリングに置き換えられなã�?ƒ�グを修正
1161 rtn = ',' + rtn;
1162 rtn = rtn.replace( ",null", "," );
1163 rtn = rtn.substring( 1 );
1164 }
1165
1166 return rtn;
1167 }
1168
1169 /**
1170 * {@XXXX}形式及び[XXXX]形式ã?æ–?—å?(配å?)の置き換えを行いますã?
1171 *
1172 * @param str 置き換え対象のæ–?—å?(配å?)
1173 *
1174 * @return 置き換え結果のæ–?—å?
1175 */
1176 private String[] replaceParam( final String[] str ) {
1177 return replaceParam( str, row, table );
1178 }
1179
1180 /**
1181 * {@XXXX}形式及び[XXXX]形式ã?æ–?—å?(配å?)の置き換えを行いますã?
1182 * [XXXX]形式ã?置き換えには、引数でæŒ?®šされた配å?型テーブルモãƒ?ƒ«、行番号(インãƒ?ƒƒクス)を使用しますã?
1183 *
1184 * @param str 置き換え対象のæ–?—å?(配å?)
1185 * @param rw 行番号(インãƒ?ƒƒクス)
1186 * @param tbl 配å?型テーブルモãƒ?ƒ«
1187 *
1188 * @return 置き換え結果のæ–?—å?
1189 */
1190 private String[] replaceParam( final String[] str, final int rw, final ArrayTableModel tbl ) {
1191 for( int i = 0; i < str.length; i++ ) {
1192 str[i] = replaceParam( str[i], rw, tbl );
1193 }
1194 return str;
1195 }
1196
1197 /**
1198 * [XXXX]変換を行うためのFormatterを取得しますã?
1199 *
1200 * @param str 変換æ–?—å?
1201 * @param tbl 配å?型テーブルモãƒ?ƒ«
1202 *
1203 * @return Formatterオブジェクãƒ?
1204 */
1205 private Formatter getFormatter( final String str, final ArrayTableModel tbl ) {
1206 Formatter format = formatMap.get( str + tbl.toString() );
1207 if( format == null ) {
1208 format = new Formatter( tbl );
1209 format.setFormat( str );
1210 formatMap.put( str + tbl.toString(), format );
1211 }
1212 return format;
1213 }
1214
1215 /**
1216 * {@XXXX}変換を行うためのSystemParameterオブジェクトを取得しますã?
1217 *
1218 * @param str 変換æ–?—å?
1219 *
1220 * @return SystemParameterオブジェクãƒ?
1221 */
1222 private SystemParameter getSysParam( final String str ) {
1223 SystemParameter sysParam = sysParamMap.get( str );
1224 if( sysParam == null ) {
1225 sysParam = new SystemParameter( str );
1226 sysParamMap.put( str, sysParam );
1227 }
1228 return sysParam;
1229 }
1230
1231 /**
1232 * 検索SQLを実行し、結果をé?列型ãƒ??ブルモãƒ?ƒ«として返しますã?
1233 * SQLæ–?�«は、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
1234 * またã?検索件数につã�?�¦は、var("SQL_ROWCOUNT")で取得することができますã?
1235 *
1236 * @param sq SQLæ–?
1237 *
1238 * @return 配å?型テーブルモãƒ?ƒ«
1239 */
1240 final protected ArrayTableModel createTableBySql( final String sq ) {
1241 return createTableBySql( sq, row, table );
1242 }
1243
1244 /**
1245 * 検索SQLを実行し、結果をé?列型ãƒ??ブルモãƒ?ƒ«として返しますã?
1246 * SQLæ–?�«は、{@XXXX}形式及び[XXXX]形式ã?変数を使用することができますã?
1247 * [XXXX]形式ã?変数の置き換えには、引数でæŒ?®šされた配å?型テーブルモãƒ?ƒ«の行が使用されますã?
1248 * またã?検索件数につã�?�¦は、var("SQL_ROWCOUNT")で取得することができますã?
1249 *
1250 * @param sq SQLæ–?
1251 * @param rw 行番号(インãƒ?ƒƒクス)
1252 * @param tbl 配å?型テーブルモãƒ?ƒ«
1253 *
1254 * @return 配å?型テーブルモãƒ?ƒ«
1255 */
1256 final protected ArrayTableModel createTableBySql( final String sq, final int rw, final ArrayTableModel tbl ) {
1257 return execSQL( sq, rw, tbl );
1258 }
1259 }