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.hayabusa.report2;
017    
018    import java.io.File;
019    import java.util.Arrays;
020    
021    import org.opengion.fukurou.db.DBFunctionName;
022    import org.opengion.fukurou.db.DBUtil;
023    import org.opengion.fukurou.mail.MailTX;
024    import org.opengion.fukurou.util.ApplicationInfo;
025    import org.opengion.fukurou.util.LogWriter;
026    import org.opengion.fukurou.util.StringUtil;
027    import org.opengion.hayabusa.common.HybsSystem;
028    import org.opengion.hayabusa.db.DBTableModel;
029    import org.opengion.hayabusa.db.DBTableModelUtil;
030    import org.opengion.hayabusa.resource.ResourceFactory;
031    import 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     */
049    public 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,操?プログラ?D
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             *
355             * @param       queue           ExecQueueオブジェク?
356             * @param       inErrMsg        エラーメ?ージ
357             */
358            private void sendMail( final ExecQueue queue, final String inErrMsg ) {
359    
360                    String   host = HybsSystem.sys( "COMMON_MAIL_SERVER" );
361                    String   from = HybsSystem.sys( "ERROR_MAIL_FROM_USER" );
362                    String[] to = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
363                    if( host != null && from != null && to.length > 0 ) {
364                            String subject = "SYSTEM_ID=[" + queue.getSystemId() + "] , YKNO=[" + queue.getYkno() + "] , "
365                                                       + "THREAD_ID=[" + queue.getThreadId() + "] , DMN_HOST=[" + HybsSystem.HOST_NAME + "]" ;
366                            try {
367                                    MailTX tx = new MailTX( host );
368                                    tx.setFrom( from );
369                                    tx.setTo( to );
370                                    tx.setSubject( "帳票エラー?? + subject );
371                                    tx.setMessage( inErrMsg );
372                                    tx.sendmail();
373                            }
374                            catch( Throwable ex ) {
375                                    String errMsg = "エラー時メール送信に失敗しました? + HybsSystem.CR
376                                                            + " SUBJECT:" + subject                                 + HybsSystem.CR
377                                                            + " HOST:" + host                                               + HybsSystem.CR
378                                                            + " FROM:" + from                                               + HybsSystem.CR
379                                                            + " TO:"   + Arrays.toString( to )              + HybsSystem.CR
380                                                            + ex.getMessage();              // 5.1.8.0 (2010/07/01) errMsg 修正
381                                    LogWriter.log( errMsg );
382                                    LogWriter.log( ex );
383                            }
384                    }
385            }
386    
387            /**
388             * 帳票明細??タを帳票レイアウトテーブルに従って?し?そ?結果をDBTableModelとして
389             * 生?します?
390             * ??タの?は、バイト数ベ?スで行われるため、エンコードを正しく?する?があります?
391             * エンコード指定?、シス?リソースのDB_ENCODEで?します?
392             *
393             * レイアウトテーブルが存在しな??合?又?、帳票??タが存在しな??合?DBTableModelは
394             * nullで返されます?
395             */
396            public static class DBTableModelCreator {
397                    // 5.2.0.0 (2010/09/01) Ver4互換モード対?
398                    private static final String CLM = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "COLUMN_NAME" : "CLM";
399                    private static final String TEXT_DATA = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "TEXT" : "TEXT_DATA";
400    
401                    // 5.2.0.0 (2010/09/01) Ver4互換モード対?
402                    // 5.4.4.3 (2012/02/09) FGUSE条件追??
403                    private static final String SQL_SELECT_GE52 =
404    //                      " select CLM, START_POS, USE_LENGTH"
405                            " select "+CLM+", START_POS, USE_LENGTH"
406                            + " from GE52"
407                            + " where SYSTEM_ID = ?"
408                            + " and LISTID = ?"
409                            + " and KBTEXT = ?"
410                            + " and FGJ = '1'"
411                            + " and FGUSE = '1'" // 5.4.4.3
412                            + " order by SEQ";
413    
414                    // 5.2.0.0 (2010/09/01) Ver4互換モード対?
415                    private static final String SQL_SELECT_GE51 =
416    //                      " select TEXT_DATA"
417                            " select "+TEXT_DATA
418                            + " from GE51"
419                            + " where SYSTEM_ID = ?"
420                            + " and YKNO = ?"
421                            + " and KBTEXT = ?"
422                            + " and FGJ = '1'";
423    
424                    private static final String ENCODE = HybsSystem.sys( "DB_ENCODE" );
425    
426                    private final String systemId;
427                    private final String listId;
428                    private final String ykno;
429                    private final String kbtext;
430                    private final ResourceManager resource;
431    
432                    private DBTableModel table = null;
433    
434                    /**
435                     * コンストラクタです?
436                     *
437                     * @param sid シス?ID
438                     * @param lid 帳票ID
439                     * @param yk 要?O
440                     * @param kt ?スト区?H:ヘッ?? F:フッター B:ボディー)
441                     * @param res リソースマネージャー
442                     */
443                    public DBTableModelCreator( final String sid, final String lid, final String yk, final String kt, final ResourceManager res ) {
444                            systemId = sid;
445                            listId = lid;
446                            ykno = yk;
447                            kbtext = kt;
448                            resource = res;
449                            create();
450                    }
451    
452                    /**
453                     * 帳票??タをレイアウト定義に従い?します?
454                     *
455                     * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対?
456                     */
457                    private void create() {
458                            String[] ge52Where = new String[] { systemId, listId, kbtext } ;
459    //                      String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo );
460                            String[][] ge52Vals = DBUtil.dbExecute( SQL_SELECT_GE52, ge52Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
461                            if( ge52Vals == null || ge52Vals.length == 0 ) {
462                                    return;
463                            }
464    
465                            String[] ge51Where = new String[] { systemId, ykno, kbtext } ;
466    //                      String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo );
467                            String[][] ge51Vals = DBUtil.dbExecute( SQL_SELECT_GE51, ge51Where, appInfo, DBID );    // 5.5.5.1 (2012/08/07)
468                            if( ge51Vals == null || ge51Vals.length == 0 ) {
469                                    return;
470                            }
471    
472                            String[] clms = new String[ge52Vals.length];
473                            for( int i=0; i<ge52Vals.length; i++ ) {
474                                    clms[i] = ge52Vals[i][0];
475                            }
476    
477                            String[][] vals = new String[ge51Vals.length][ge52Vals.length];
478                            for( int i=0; i<ge51Vals.length; i++ ) {
479                                    byte[] bytes = StringUtil.makeByte( ge51Vals[i][0], ENCODE );
480                                    for( int j=0; j<ge52Vals.length; j++ ) {
481                                            int strpos = Integer.valueOf( ge52Vals[j][1] ) - 1;
482                                            int len = Integer.valueOf( ge52Vals[j][2] );
483                                            if( strpos >= bytes.length ) {
484                                                    vals[i][j] = "";
485                                            }
486                                            else {
487                                                    if( strpos + len > bytes.length ) {
488                                                            len = bytes.length - strpos;
489                                                    }
490                                                    vals[i][j] = StringUtil.rTrim( StringUtil.makeString( bytes, strpos, len, ENCODE ) );
491                                            }
492                                    }
493                            }
494                            table = DBTableModelUtil.makeDBTable( clms, vals, resource );
495                    }
496    
497                    /**
498                     * ?後?DBTableModelを返します?
499                     *
500                     * @return ?後?DBTableModel
501                     */
502                    public DBTableModel getTable() {
503                            return table;
504                    }
505            }
506    }