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 */
016package org.opengion.hayabusa.report2;
017
018import java.io.File;
019import java.util.Arrays;
020
021import org.opengion.fukurou.db.DBFunctionName;
022import org.opengion.fukurou.db.DBUtil;
023import org.opengion.fukurou.mail.MailTX;
024import org.opengion.fukurou.util.ApplicationInfo;
025import org.opengion.fukurou.util.LogWriter;
026import org.opengion.fukurou.util.StringUtil;
027import org.opengion.hayabusa.common.HybsSystem;
028import org.opengion.hayabusa.db.DBTableModel;
029import org.opengion.hayabusa.db.DBTableModelUtil;
030import org.opengion.hayabusa.resource.ResourceFactory;
031import org.opengion.hayabusa.resource.ResourceManager;
032
033/**
034 * DBからキューを作成するためのクラスです。
035 * キューはGE5xテーブルから作成されます。
036 *
037 * キュー生成時点(処理スレッドにスタックした時点)では、帳票データのテーブルモデルは作成されません。
038 * 帳票データは、各スレッドからset()メソッドを呼び出したタイミングで生成されます。
039 *
040 * 処理開始及び、完了のステータスは、GE50の完成フラグに更新されます。
041 * また、エラー発生時のメッセージは、GE56に更新されます。
042 *
043 * @og.group 帳票システム
044 *
045 * @version  4.0
046 * @author   Hiroki.Nakamura
047 * @since    JDK1.6
048 */
049public final class QueueManager_DB implements QueueManager {
050
051        /** コネクションにアプリケーション情報を追記するかどうか指定 */
052        private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
053
054        /** アプリケーション情報 */
055        private static final ApplicationInfo appInfo;
056        static {
057                if( USE_DB_APPLICATION_INFO ) {
058                        appInfo = new ApplicationInfo();
059                        // ユーザーID,IPアドレス,ホスト名
060                        appInfo.setClientInfo( "ReportDaemon", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME );
061                        // 画面ID,操作,プログラムID
062                        appInfo.setModuleInfo( "ReportDaemon", "QueueManager", "QueueManager" );
063                }
064                else {
065                        appInfo = null;
066                }
067        }
068
069        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );           // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
070
071//      private static final String SQL_SELECT_GE50 =
072//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
073//              + ", B.LANG, B.FGRUN, B.DMN_GRP "
074//              + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
075//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
076//              + "WHERE A.FGKAN='1' "
077//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
078//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
079//              + "AND B.SYSTEM_ID = D.SYSTEM_ID AND B.PRTID = D.PRTID ORDER BY"
080//              + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
081
082        // 4.3.0.0 (2008/07/18) PDF出力時に出力先マスタは不要のためGE55は外部結合に変更
083//      private static final String SQL_SELECT_GE50 =
084//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
085//              + ", B.LANG, B.FGRUN, B.DMN_GRP "
086//              + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
087//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
088//              + "WHERE A.FGKAN='1' "
089//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
090//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
091//              + "AND B.SYSTEM_ID = D.SYSTEM_ID(+) AND B.PRTID = D.PRTID(+) ORDER BY"
092//              + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
093
094        // 4.3.7.0 (2009/06/01) HSQLDB対応
095//      private static final String CON = DBFunctionName.getFunctionName( "CON", ConnectionFactory.getDBFullName( null ) );
096        // 5.1.4.0 (2010/03/01) データベース名 でなく、DBID名で検索するように変更します。
097        private static final String CON = DBFunctionName.getFunctionName( "CON", null );
098
099        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
100        private static final String OUT_FILE = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTFILE" : "OUT_FILE";
101        private static final String OUT_DIR = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "OUTDIR" : "OUT_DIR";
102
103        // 4.3.3.6 (2008/11/15) マルチサーバ対応追加(GE12から処理対象デーモングループ取得)
104        // 4.3.7.0 (2009/06/01) HSQLDB対応
105        // 5.2.0.0 (2010/09/01) Ver4互換モード対応
106        // 5.4.2.0 (2011/12/26) PRTID,PRGDIR,PRGFILE取得
107        private static final String SQL_SELECT_GE50 =
108//              "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A.OUT_DIR, A.OUT_FILE, A.PDF_PASSWD"
109                "SELECT A.SYSTEM_ID, A.YKNO, A.LISTID, A."+OUT_DIR+", A."+OUT_FILE+", A.PDF_PASSWD"
110                + ", B.LANG, B.FGRUN, B.DMN_GRP "
111                + ", C.MODELDIR, C.MODELFILE, D.PRTNM, C.FGLOCAL, C.FGCUT, C.BSQL, C.HSQL, C.FSQL "
112                + " ,B.PRTID, B.PRGDIR, B.PRGFILE "
113//              + "FROM GE50 A, GE53 B, GE54 C, GE55 D "
114                + "FROM GE50 A "
115                + "INNER JOIN GE53 B "
116                + "ON A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
117                + "INNER JOIN GE54 C "
118                + "ON A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
119                + "LEFT OUTER JOIN GE55 D "
120                + "ON B.SYSTEM_ID = D.SYSTEM_ID AND B.PRTID = D.PRTID "
121                + "WHERE A.FGKAN='1' "
122                + "AND EXISTS ( SELECT 'X' FROM GE12 E "
123                +                               "WHERE  E.FGJ                           ='1' "
124                +                               "AND            E.SYSTEM_ID     = '"
125                +                               HybsSystem.sys( "SYSTEM_ID" )
126                +                               "' "
127                +                               "AND            E.CONTXT_PATH   = '"
128                +                               HybsSystem.sys( "HOST_URL" )
129                +                               "' "
130                +                               "AND            E.PARAM_ID              LIKE 'REPORT2_HANDLE_DAEMON_%' "
131                +                               "AND            E.PARAM                 = 'RUN_'" + CON + "A.SYSTEM_ID" + CON + "'_'" + CON + "B.DMN_GRP"
132                +                       ") "
133//              + "AND A.SYSTEM_ID = B.SYSTEM_ID AND A.JOKEN = B.JOKEN "
134//              + "AND A.SYSTEM_ID = C.SYSTEM_ID AND A.LISTID = C.LISTID "
135//              + "AND B.SYSTEM_ID = D.SYSTEM_ID(+) AND B.PRTID = D.PRTID(+) ORDER BY"
136                + "ORDER BY "
137                + HybsSystem.sys( "REPORT_DAEMON_ORDER_BY" );
138
139        // 5.1.2.0 (2010/01/01) ページ数、データ数をGE50に更新する。
140        private static final String SQL_UPDATE_GE50 =
141//              "UPDATE GE50 SET FGKAN = ?, DMN_NAME = ?, DMN_HOST = ? ,DYUPD = ? WHERE SYSTEM_ID = ? AND YKNO = ?";
142                "UPDATE GE50 SET FGKAN = ?, DMN_NAME = ?, DMN_HOST = ?, SUDATA = ?, SUPAGE = ?, DYUPD = ? WHERE SYSTEM_ID = ? AND YKNO = ?";
143
144        private static final String SQL_INSERT_GE56 =
145                "INSERT INTO GE56 ( FGJ, SYSTEM_ID, YKNO, ERRMSG, DYSET, DYUPD, USRSET, USRUPD, PGUPD ) "
146                + " VALUES ( '1', ?, ? ,? ,? ,? ,? ,? ,? )" ;
147
148        private static final int STATUS_COMPLETE        = 2;
149        private static final int STATUS_EXECUTE         = 3;
150        private static final int STATUS_ERROR           = 8;
151
152        private static QueueManager manager = new QueueManager_DB();
153
154        /**
155         * インスタンスの生成を禁止します。
156         */
157        private QueueManager_DB() {}
158
159        /**
160         * インスタンスを返します。
161         *
162         * @return      帳票処理キューの管理マネージャ
163         */
164        public static QueueManager getInstance() {
165                return manager;
166        }
167
168        /**
169         * 帳票処理キューを作成します。
170         *
171         * @og.rev 4.3.0.0 (2008/07/15) スレッドIDにシステムIDを付加します。
172         * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割)
173         * @og.rev 5.4.3.0 (2011/12/26) PRTIDの取得
174         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
175         */
176        public synchronized void create() {
177                // キューをスタックするまでの例外は、ScheduleTagでcatchされデーモンがスリープする。
178//              String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, new String[0], appInfo );
179                String[][] ge50vals = DBUtil.dbExecute( SQL_SELECT_GE50, new String[0], appInfo, DBID );        // 5.5.5.1 (2012/08/07)
180
181                for( int i=0; i<ge50vals.length; i++ ) {
182                        ExecQueue queue = new ExecQueue();
183                        queue.setSystemId( ge50vals[i][0] );
184                        queue.setYkno( ge50vals[i][1] );
185                        queue.setListId( ge50vals[i][2] );
186                        // queue.setOutputName( new File( ge50vals[i][3] ).getAbsolutePath() + File.separator + ge50vals[i][4] );
187                        queue.setOutputName( new File( ge50vals[i][3] ).getAbsolutePath() , ge50vals[i][4] , ge50vals[i][7] , ge50vals[i][1] ); // 4.3.0.0 (2008/07/18) 要求番号を出力ファイル名に利用
188                        queue.setPdfPasswd( ge50vals[i][5] );
189                        queue.setLang( ge50vals[i][6] );
190                        queue.setOutputType( ge50vals[i][7] );
191                        // queue.setThreadId( StringUtil.nval( ge50vals[i][8] , "_DEFALUT_" ) );
192                        queue.setThreadId( ge50vals[i][0] + "_" + StringUtil.nval( ge50vals[i][8] , "_DEFALUT_" ) ); // 4.3.0.0 (2008/07/15)
193                        queue.setTemplateName( new File( ge50vals[i][9] ).getAbsolutePath() + File.separator + ge50vals[i][10] );
194                        queue.setPrinterName( ge50vals[i][11] );
195                        queue.setFglocal( "1".equals( ge50vals[i][12] ) );
196                        queue.setFgcut( "1".equals( ge50vals[i][13] ) );
197
198//                      queue.setBsql( ge50vals[i][14] );
199//                      queue.setHsql( ge50vals[i][15] );
200//                      queue.setFsql( ge50vals[i][16] );
201
202                        queue.setPrtId( ge50vals[i][17] );              // 5.4.3.0
203                        queue.setPrgDir( ge50vals[i][18] );     // 5.4.3.0
204                        queue.setPrgFile( ge50vals[i][19] );    // 5.4.3.0
205
206                        queue.setManager( this );
207
208                        ExecThreadManager.insertQueue( queue );
209                }
210        }
211
212        /**
213         * 帳票処理データをキューにセットします。
214         *
215         * @og.rev 5.1.2.0 (2010/01/01) HSQL,FSQL,BSQLのセットを廃止します。(このクラス内でデータを直接分割)
216         *
217         * @param       queue   ExecQueueオブジェクト
218         */
219        public void set( final ExecQueue queue ) {
220
221                ResourceManager resource = null;
222                if( queue.isFglocal() ) {
223                        resource = ResourceFactory.newInstance( queue.getSystemId(), queue.getLang(), false );
224                }
225                else {
226                        resource = ResourceFactory.newInstance( queue.getLang() );
227                }
228//              String[] where = new String[] { queue.getSystemId() , queue.getYkno() } ;
229
230                // ヘッダー情報の取得
231//              DBTableModel header = DBTableModelUtil.makeDBTable( queue.getHsql(), where, resource, appInfo );
232                DBTableModel header
233                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "H", resource )).getTable();
234                if( header != null && header.getRowCount() > 0 ) {
235                        queue.setHeader( header );
236                }
237
238                // フッター情報の取得
239//              DBTableModel footer = DBTableModelUtil.makeDBTable( queue.getFsql(), where, resource, appInfo );
240                DBTableModel footer
241                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "F", resource )).getTable();
242                if( footer != null && footer.getRowCount() > 0 ) {
243                        queue.setFooter( footer );
244                }
245
246                // ボディー情報の取得
247//              DBTableModel body = DBTableModelUtil.makeDBTable( queue.getBsql(), where, resource, appInfo );
248                DBTableModel body
249                        = (new DBTableModelCreator( queue.getSystemId(), queue.getListId(), queue.getYkno(), "B", resource )).getTable();
250                // レイアウトテーブルがないと固定長を分割するSQL文が設定されず、DBTableModelがnullになる
251                if( body == null ) {
252                        queue.addMsg( "[ERROR] DBTableModel doesn't exists! maybe Layout-Table(GE52) is not configured..." + HybsSystem.CR );
253                        queue.setError();
254                        throw new RuntimeException();
255                }
256                if( body.getRowCount() <= 0 ) {
257                        queue.addMsg( "[ERROR] Database Body row count is Zero." + queue.getYkno() + HybsSystem.CR );
258                        queue.setError();
259                        throw new RuntimeException();
260                }
261                if( body.isOverflow() ) {
262                        queue.addMsg( "[ERROR]Database is Overflow. [" + body.getRowCount() + "]" + HybsSystem.CR );
263                        queue.addMsg( "[ERROR]Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" + HybsSystem.CR  );
264                        queue.setError();
265                        throw new RuntimeException();
266                }
267                queue.setBody( body );
268        }
269
270        /**
271         * キューを実行中の状態に更新します。
272         *
273         * @param       queue   ExecQueueオブジェクト
274         */
275        public void execute( final ExecQueue queue ) {
276                status( queue, STATUS_EXECUTE );
277        }
278
279        /**
280         * キューを完了済の状態に更新します。
281         *
282         * @param       queue   ExecQueueオブジェクト
283         */
284        public void complete( final ExecQueue queue ) {
285                status( queue, STATUS_COMPLETE );
286        }
287
288        /**
289         * キューをエラーの状態に更新します。
290         *
291         * @param       queue   ExecQueueオブジェクト
292         */
293        public void error( final ExecQueue queue ) {
294                status( queue, STATUS_ERROR );
295                insertErrorMsg( queue );
296        }
297
298        /**
299         * GE50の状況Cを更新します。
300         *
301         * @og.rev 4.2.4.1 (2008/07/09) 更新日時をセット
302         * @og.rev 5.1.2.0 (2010/01/01) 行数、ページ数も更新する
303         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
304         *
305         * @param       queue   ExecQueueオブジェクト
306         * @param       status  状況C
307         */
308        private void status( final ExecQueue queue, final int status ) {
309
310                String dyupd = HybsSystem.getDate( "yyyyMMddHHmmss" ) ;
311
312                String[] args
313                = new String[]{ String.valueOf( status ), queue.getThreadId(), HybsSystem.sys( "HOST_NAME" )
314                                , String.valueOf( queue.getExecRowCnt() ), String.valueOf( queue.getExecPagesCnt() )
315                                , dyupd , queue.getSystemId(), queue.getYkno() };
316
317//              DBUtil.dbExecute( SQL_UPDATE_GE50, args, appInfo );
318                DBUtil.dbExecute( SQL_UPDATE_GE50, args, appInfo, DBID );       // 5.5.5.1 (2012/08/07)
319        }
320
321        /**
322         * GE56にエラーメッセージを出力します。
323         *
324         * @og.rev 4.4.0.1 (2009/08/08) エラーメッセージ機能追加
325         * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
326         *
327         * @param       queue   ExecQueueオブジェクト
328         */
329        private void insertErrorMsg( final ExecQueue queue ) {
330                String errmsg = queue.getMsg();
331                if( errmsg.length() > 1300 ) {
332                        errmsg = errmsg.substring( errmsg.length() - 1300, errmsg.length() );
333                }
334
335                String dyset = HybsSystem.getDate( "yyyyMMddHHmmss" ) ;
336
337                String[] args
338                = new String[]{ queue.getSystemId(), queue.getYkno(), errmsg
339                                , dyset, dyset, "UNKNOWN", "UNKNOWN", "UNKNOWN" };
340
341//              DBUtil.dbExecute( SQL_INSERT_GE56, args, appInfo );
342                DBUtil.dbExecute( SQL_INSERT_GE56, args, appInfo, DBID );       // 5.5.5.1 (2012/08/07)
343
344                sendMail( queue, errmsg ); // 4.4.0.1 (2009/08/08)
345        }
346
347        /**
348         * エラー情報のメール送信を行います。
349         * エラーメールは、システムパラメータ の COMMON_MAIL_SERVER(メールサーバー)と
350         * ERROR_MAIL_FROM_USER(エラーメール発信元)と、ERROR_MAIL_TO_USERS(エラーメール受信者)
351         * がすべて設定されている場合に、送信されます。
352         *
353         * @og.rev 4.4.0.1 (2009/08/08) 追加
354         * @og.rev 5.7.0.4 (2013/11/29) listIdの絞込み
355         *
356         * @param       queue           ExecQueueオブジェクト
357         * @param       inErrMsg        エラーメッセージ
358         */
359        private void sendMail( final ExecQueue queue, final String inErrMsg ) {
360
361                String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
362                String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
363                String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
364                String   match_txt = HybsSystem.sys( "REPORT_ERRMAIL_REGEX" ); // 5.7.0.4 (2013/11/29) 
365                if( host != null && from != null && to.length > 0 ) {
366                        if( match_txt == null || match_txt.length() == 0 
367                                        || queue.getListId() == null || queue.getListId().length() == 0
368                                        || queue.getListId().matches( match_txt )){     // 5.7.0.4 (2013/11/29)
369                                // 5.7.0.4 (2013/11/29) listid追加
370                                String subject = "SYSTEM_ID=[" + queue.getSystemId() + "] , YKNO=[" + queue.getYkno() + "] , "
371                                                           + "THREAD_ID=[" + queue.getThreadId() + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" 
372                                                           + "LISTID=["+ queue.getListId() + "]";
373                                try {
374                                        MailTX tx = new MailTX( host );
375                                        tx.setFrom( from );
376                                        tx.setTo( to );
377                                        tx.setSubject( "帳票エラー:" + subject );
378                                        tx.setMessage( inErrMsg );
379                                        tx.sendmail();
380                                }
381                                catch( Throwable ex ) {
382                                        String errMsg = "エラー時メール送信に失敗しました。" + HybsSystem.CR
383                                                                + " SUBJECT:" + subject                                 + HybsSystem.CR
384                                                                + " HOST:" + host                                               + HybsSystem.CR
385                                                                + " FROM:" + from                                               + HybsSystem.CR
386                                                                + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
387                                                                + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
388                                        LogWriter.log( errMsg );
389                                        LogWriter.log( ex );
390                                }
391                        }
392                }
393        }
394
395        /**
396         * 帳票明細データを帳票レイアウトテーブルに従って分割し、その結果をDBTableModelとして
397         * 生成します。
398         * データの分割は、バイト数ベースで行われるため、エンコードを正しく指定する必要があります。
399         * エンコード指定は、システムリソースのDB_ENCODEで指定します。
400         *
401         * レイアウトテーブルが存在しない場合、又は、帳票データが存在しない場合、DBTableModelは
402         * nullで返されます。
403         */
404        public static class DBTableModelCreator {
405                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
406                private static final String CLM = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "COLUMN_NAME" : "CLM";
407                private static final String TEXT_DATA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "TEXT" : "TEXT_DATA";
408
409                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
410                // 5.4.4.3 (2012/02/09) FGUSE条件追加対応
411                private static final String SQL_SELECT_GE52 =
412//                      " select CLM, START_POS, USE_LENGTH"
413                        " select "+CLM+", START_POS, USE_LENGTH"
414                        + " from GE52"
415                        + " where SYSTEM_ID = ?"
416                        + " and LISTID = ?"
417                        + " and KBTEXT = ?"
418                        + " and FGJ = '1'"
419                        + " and FGUSE = '1'" // 5.4.4.3
420                        + " order by SEQ";
421
422                // 5.2.0.0 (2010/09/01) Ver4互換モード対応
423                private static final String SQL_SELECT_GE51 =
424//                      " select TEXT_DATA"
425                        " select "+TEXT_DATA
426                        + " from GE51"
427                        + " where SYSTEM_ID = ?"
428                        + " and YKNO = ?"
429                        + " and KBTEXT = ?"
430                        + " and FGJ = '1'";
431
432                private static final String ENCODE = HybsSystem.sys( "DB_ENCODE" );
433
434                private final String systemId;
435                private final String listId;
436                private final String ykno;
437                private final String kbtext;
438                private final ResourceManager resource;
439
440                private DBTableModel table = null;
441
442                /**
443                 * コンストラクタです。
444                 *
445                 * @param sid システムID
446                 * @param lid 帳票ID
447                 * @param yk 要求NO
448                 * @param kt テキスト区分(H:ヘッダー F:フッター B:ボディー)
449                 * @param res リソースマネージャー
450                 */
451                public DBTableModelCreator( final String sid, final String lid, final String yk, final String kt, final ResourceManager res ) {
452                        systemId = sid;
453                        listId = lid;
454                        ykno = yk;
455                        kbtext = kt;
456                        resource = res;
457                        create();
458                }
459
460                /**
461                 * 帳票データをレイアウト定義に従い分割します。
462                 *
463                 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
464                 */
465                private void create() {
466                        String[] ge52Where = new String[] { systemId, listId, kbtext } ;
467//                      String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo );
468                        String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
469                        if( ge52Vals == null || ge52Vals.length == 0 ) {
470                                return;
471                        }
472
473                        String[] ge51Where = new String[] { systemId, ykno, kbtext } ;
474//                      String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo );
475                        String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
476                        if( ge51Vals == null || ge51Vals.length == 0 ) {
477                                return;
478                        }
479
480                        String[] clms = new String[ge52Vals.length];
481                        for( int i=0; i<ge52Vals.length; i++ ) {
482                                clms[i] = ge52Vals[i][0];
483                        }
484
485                        String[][] vals = new String[ge51Vals.length][ge52Vals.length];
486                        for( int i=0; i<ge51Vals.length; i++ ) {
487                                byte[] bytes = StringUtil.makeByte( ge51Vals[i][0], ENCODE );
488                                for( int j=0; j<ge52Vals.length; j++ ) {
489                                        int strpos = Integer.valueOf( ge52Vals[j][1] ) - 1;
490                                        int len = Integer.valueOf( ge52Vals[j][2] );
491                                        if( strpos >= bytes.length ) {
492                                                vals[i][j] = "";
493                                        }
494                                        else {
495                                                if( strpos + len > bytes.length ) {
496                                                        len = bytes.length - strpos;
497                                                }
498                                                vals[i][j] = StringUtil.rTrim( StringUtil.makeString( bytes, strpos, len, ENCODE ) );
499                                        }
500                                }
501                        }
502                        table = DBTableModelUtil.makeDBTable( clms, vals, resource );
503                }
504
505                /**
506                 * 分割後のDBTableModelを返します。
507                 *
508                 * @return 分割後のDBTableModel
509                 */
510                public DBTableModel getTable() {
511                        return table;
512                }
513        }
514}