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             * 子ロジãƒ?‚¯に渡す引数には、{&#064;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             * 子ロジãƒ?‚¯に渡す引数には、{&#064;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æ–?�«は、{&#064;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æ–?�«は、{&#064;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             * エラーメãƒ?‚»ージの引数には、{&#064;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             * エラーメãƒ?‚»ージの引数には、{&#064;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             * å¿??チェãƒ?‚¯の引数には、{&#064;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             * å¿??チェãƒ?‚¯の引数には、{&#064;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             * {&#064;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             * {&#064;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             * {&#064;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             * {&#064;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             * {&#064;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             * {&#064;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æ–?�«は、{&#064;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æ–?�«は、{&#064;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    }