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.report; 017 018import org.opengion.fukurou.db.DBUtil; 019import org.opengion.fukurou.db.ApplicationInfo; 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.hayabusa.common.HybsSystem; 022import org.opengion.hayabusa.db.DBTableModel; 023import org.opengion.hayabusa.report2.QueueManager_DB.DBTableModelCreator; 024import org.opengion.hayabusa.resource.ResourceFactory; 025import org.opengion.hayabusa.resource.ResourceManager; 026 027import static org.opengion.fukurou.system.HybsConst.CR ; // 5.9.0.0 (2015/09/04) 028import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 6.4.2.1 (2016/02/05) 029 030/** 031 * 帳票システムでCSV出力をする際に、データを加工、プラグインの呼び出しを行うクラスです。 032 * 033 * @og.group 帳票システム 034 * 035 * @version 4.0 036 * @author Takahashi Masakazu 037 * @since JDK8.0, 038 */ 039public class CSVPrintRequest { 040 private final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ); // 6.4.2.1 (2016/02/05) 041 042 // DBTableModel に対して設定する情報 043 private ResourceManager resource ; 044 045 // 受け渡し変数 046 private final String SYSTEM_ID ; 047 private final String YKNO ; 048 private final String LISTID ; 049 private final String LANG ; 050 private final String FGRUN ; // G:CSV(print) H:CSV(Excel) I:CSV(PDF) 051 private final String PRTID ; 052 private final String PRGDIR ; 053 private final String PRGFILE ; 054 private final String OUTDIR ; 055 private final String FILENAME ; // 雛形ファイル名 056 private final boolean DEBUG ; 057 058 private final String GRPID ; // 5.9.2.2 (2015/11/20) 059 private final String DMNGRP ; // 5.9.2.2 (2015/11/20) 060 061// private String BASE_SYS_ID = "**" ; // 7.2.6.0 (2020/06/30) ベースシステムID 062 063 // オブジェクト変数 064 private boolean fgLOCAL ; 065 private String prtName ; 066 private String hostName ; 067 private String portnm ; 068 private String fgkan = GE50Access.FG_ERR2; // 初期値エラー 069 private String option ; // 5.9.3.0 (2015/12/04) 070 071 private int bodyCount ; // 5.9.2.7 (2015/11/27) bodyCount 追加 072 073 // GE54 の帳票定義情報を取得するSQL文です。 074 // 8.0.1.0 (2021/10/22) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止) 075 private static final String GE54_SELECT = 076// "SELECT BSQL,FGLOCAL,SYSTEM_ID,HSQL,FSQL" + // 8.0.1.0 (2021/10/22) Modify 077 "SELECT FGLOCAL,SYSTEM_ID" + 078 " ,OPTIONS,FGCUT" + // 5.9.3.0 (2015/12/04) 079 " FROM GE54" + 080 " WHERE FGJ = '1'" + 081 " AND SYSTEM_ID IN (?,'**')" + 082 " AND LISTID = ?" ; 083 084 // GE54 の帳票定義情報を取得するSQL文です。 085 // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 086 // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません 087// private static final String GE54_SELECT = 088// "SELECT BSQL,FGLOCAL,SYSTEM_ID,HSQL,FSQL,OPTIONS,FGCUT" 089// + " from (" 090// + " select 0 as SNO,B.* from GE54 B where SYSTEM_ID='**' and LISTID=? and FGJ='1'" // エンジン共通 091// + " union all" 092// + " select 1 as SNO,B.* from GE54 B where SYSTEM_ID=? and LISTID=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 093// + " union all" 094// + " select 2 as SNO,B.* from GE54 B where SYSTEM_ID=? and LISTID=? and FGJ='1'" // 最上位ののSYSTEM_ID 095// + " ) A" 096// + " order by SNO,SYSTEM_ID" ; 097 098// private static final int GE54_FGLOCAL = 1; // 8.0.1.0 (2021/10/22) Modify 099 private static final int GE54_FGLOCAL = 0; 100// private static final int GE54_SYSTEM_ID = 2; 101// private static final int GE54_OPTIONS = 5; // 5.9.3.0 (2015/12/04) 8.0.1.0 (2021/10/22) Modify 102 private static final int GE54_OPTIONS = 2; 103// private static final int GE54_FGCUT = 6; // 5.9.3.0 (2015/12/04) 104 105// // 5.4.4.0 (2012/02/01) 互換モード対応漏れ 106// // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 107// private static final String HOST = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "HOST" : "HOST_ID"; 108 109 // GE55 の出力先マスタ情報を取得するSQL文です。 110 // 5.1.0.0 (2009/11/04) HOST ⇒ HOST_ID 111 // 5.4.3.1 (2011/12/27) PORTNM 112 // 5.4.4.0 (2012/02/01) 互換モード 113 // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止 114 private static final String GE55_SELECT = 115 "SELECT PRTNM,HOST_ID,SYSTEM_ID,PORTNM" + 116 " FROM GE55" + 117 " WHERE FGJ = '1'" + 118 " AND SYSTEM_ID IN (?,'**')" + 119 " AND PRTID = ?" ; 120 121 // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 122 // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません 123// private static final String GE55_SELECT = 124// "SELECT PRTNM,HOST_ID,SYSTEM_ID,PORTNM" 125// + " from (" 126// + " select 0 as SNO,B.* from GE55 B where SYSTEM_ID='**' and PRTID=? and FGJ='1'" // エンジン共通 127// + " union all" 128// + " select 1 as SNO,B.* from GE55 B where SYSTEM_ID=? and PRTID=? and FGJ='1'" // RESOURCE_BASE_SYSTEM_ID 129// + " union all" 130// + " select 2 as SNO,B.* from GE55 B where SYSTEM_ID=? and PRTID=? and FGJ='1'" // 最上位ののSYSTEM_ID 131// + " ) A" 132// + " order by SNO,SYSTEM_ID" ; 133 134 private static final int GE55_PRTNM = 0; 135 private static final int GE55_HOST_ID = 1; 136// private static final int GE55_SYSTEM_ID = 2; 137 private static final int GE55_PORTNM = 3; 138 139 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 140 public static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 141 private final ApplicationInfo appInfo; 142 private final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 143 144 /** 145 * コンストラクター。 146 * 147 * 引数を受けとって、インスタンスを作成します。 148 * 149 * @og.rev 5.9.2.2 (2015/11/20) grpid,dmngrp 150 * 151 * @param systemId システムID 152 * @param ykno 要求番号 153 * @param listId 帳票ID 154 * @param lang 言語 155 * @param fgrun 実行方法 156 * @param prtid プリンタID 157 * @param prgdir プログラムディレクトリ 158 * @param prgfile プログラムファイル 159 * @param outdir 出力ディレクトリ 160 * @param filename 出力ファイル 161 * @param grpid グループID 162 * @param dmngrp デーモングループ 163 * @param isDebug デバッグフラグ 164 */ 165 public CSVPrintRequest( final String systemId, final String ykno 166 , final String listId, final String lang, final String fgrun, final String prtid 167 , final String prgdir, final String prgfile, final String outdir , final String filename 168 , final String grpid, final String dmngrp, final boolean isDebug ) { // 5.9.2.2 (2015/11/20) 169 SYSTEM_ID = systemId; 170 YKNO = ykno; 171 LISTID = listId; 172 LANG = lang; 173 FGRUN = fgrun; 174 PRTID = prtid; 175 PRGDIR = prgdir; 176 PRGFILE = prgfile; 177 OUTDIR = outdir; 178 FILENAME = filename; 179 GRPID = grpid; 180 DMNGRP = dmngrp; 181 DEBUG = isDebug; 182 183 // アクセスログ取得の為,ApplicationInfoオブジェクトを設定 184 if( USE_DB_APPLICATION_INFO ) { 185 appInfo = new ApplicationInfo(); 186 // ユーザーID,IPアドレス,ホスト名 187 appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 188 // 画面ID,操作,プログラムID 189 appInfo.setModuleInfo( "ReportConverter",YKNO,LISTID ); 190 } 191 else { 192 appInfo = null; 193 } 194 } 195 196 /** 197 * 初期データセットを行います。 198 * ここでは、GE54,GE55 テーブルより必要な情報を取得します。 199 * 200 * @og.rev 5.9.3.0 (2015/12/04) 201 * @og.rev 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 202 * @og.rev 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません 203 * @og.rev 8.0.1.0 (2021/10/22) 未使用のGE54_TRIGを廃止(HSQL,FSQL,BSQL廃止) 204 * 205 * @return 結果 [true:正常/false:異常] 206 */ 207 public boolean initialDataSet() { 208 // final String baseSystemId = HybsSystem.sys( "RESOURCE_BASE_SYSTEM_ID", false ); 209 // BASE_SYS_ID = StringUtil.isEmpty( baseSystemId ) ? "**" : baseSystemId ; 210 211 // ===== GE54 から帳票定義情報を取得します ========================================= 212 // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 213 final String[] args = new String[] { SYSTEM_ID,LISTID }; 214 // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません 215 // final String[] args = new String[] { LISTID,BASE_SYS_ID,LISTID,SYSTEM_ID,LISTID }; 216 final String[][] vals = DBUtil.dbExecute( GE54_SELECT,args,appInfo, DBID ); // 5.5.5.1 (2012/08/07) 217 if( vals == null || vals.length == 0 ) { 218 errMsg.append( "Data does not exist in GE54 table." ).append( CR ) 219 .append( "==============================" ).append( CR ) 220 .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , LISTID=[" ).append( LISTID ).append( ']' ) 221 .append( CR ); 222 return false; 223 } 224 225 // 検索結果が複数返ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。 226 // 7.2.6.1 (2020/07/17) 一番最後のデータを採用する。 227 final int row = vals.length; 228// int row = 0; 229// for( int i=0; i<vals.length; i++ ) { 230// if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE54_SYSTEM_ID] ) ) { row = i; break; } 231// } 232 233 // GE54のbSQLは廃止となっているので下方で別で取る 234 235 // ローカルリソースフラグ 236 final String localFlag = vals[row][GE54_FGLOCAL]; 237 fgLOCAL = localFlag != null && "1".equals( localFlag.trim() ) ; 238 239 option = vals[row][GE54_OPTIONS]; // 5.9.3.0 (2015/12/04) 240 241 // ===== GE55 から出力先マスタ情報を取得します ========================================= 242 // 7.2.6.1 (2020/07/17) "**"以外にベースとなるSYSTEM_ID(RESOURCE_BASE_SYSTEM_ID)設定の対応 243 final String[] argsGe55 = new String[] { SYSTEM_ID,PRTID }; 244 // 7.2.8.0 (2020/09/04) RESOURCE_BASE_SYSTEM_ID 対応で、帳票系は難しいので対応しません 245 // final String[] argsGe55 = new String[] { PRTID,BASE_SYS_ID,PRTID,SYSTEM_ID,PRTID }; 246 final String[][] valsGe55 = DBUtil.dbExecute( GE55_SELECT,argsGe55,appInfo, DBID ); 247 if( valsGe55 == null || valsGe55.length == 0 ) { 248 errMsg.append( "Data does not exist in GE55 table." ).append( CR ) 249 .append( "==============================" ).append( CR ) 250 .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , PRTID=[" ).append( PRTID ).append( ']' ) 251 .append( CR ); 252 return false; 253 } 254 255 // 検索結果が複数帰ったとき、SYSTEM_ID が 指定されている方のデータ(行)を採用する。 256 // 7.2.6.1 (2020/07/17) 一番最後のデータを採用する。 257 final int rowGe55 = valsGe55.length; 258// int rowGe55 = 0; 259// for( int i=0; i<vals.length; i++ ) { 260// if( SYSTEM_ID.equalsIgnoreCase( vals[i][GE55_SYSTEM_ID] ) ) { rowGe55 = i; break; } 261// } 262 263 prtName = valsGe55[rowGe55][GE55_PRTNM]; 264 hostName = valsGe55[rowGe55][GE55_HOST_ID]; 265 portnm = valsGe55[rowGe55][GE55_PORTNM]; 266 267 return true; 268 } 269 270 /** 271 * 発行用データを作成し、発行リクエストの処理を行います。 272 * 273 * @og.rev 5.4.3.0 (2011/12/26) _DEFAULT対応 274 * @og.rev 5.4.3.4 (2012/01/12) listid追加 275 * @og.rev 5.4.3.9 (2012/01/25) FILENAME追加 276 * @og.rev 5.9.2.2 (2015/11/20) GRPID,DEMGRP 277 * @og.rev 5.9.2.3 (2015/11/27) rowCount 278 * @og.rev 5.9.2.7 (2015/11/27) bodyCount 追加 279 * @og.rev 5.9.3.0 (2015/12/04) option 280 * 281 * @return 結果 [true:正常/false:異常] 282 */ 283 public boolean execute() { 284 System.out.print( "CSV RequestData Creating ... " ); 285 286 // FGLOCAL 指定時は、SYSTEM_ID を指定してリソース作成 287 if( fgLOCAL ) { 288 // ローカルリソース指定時は、SYSTEM_ID,LANG を使用します。先読みは、使用しません。 289 resource = ResourceFactory.newInstance( SYSTEM_ID,LANG,false ); 290 } 291 else { 292 // 従来と互換性のあるモード(ローカルリソースは使用しない。 293 resource = ResourceFactory.newInstance( LANG ); 294 } 295 296 // ボディー情報の取得 297 DBTableModelCreator tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "B", resource ); 298 final DBTableModel table = tmc.getTable(); 299 if( table.getRowCount() <= 0 ) { 300 errMsg.append( "Database Body row count is Zero." ).append( CR ) 301 .append( "==============================" ).append( CR ) 302 .append( "SYSTEM_ID=" ).append( SYSTEM_ID ) 303 .append( ",LISTID=" ).append( LISTID ) 304 .append( ",YKNO=" ).append( YKNO ) 305 .append( CR ); 306 return false; 307 } 308 // 検索時の最大件数での打ち切りをエラーとする。 309 if( table.isOverflow() ) { 310 errMsg.append( "Database is Overflow. [" ) 311 .append( table.getRowCount() ) 312 .append( ']' ).append( CR ).append( CR ) 313 .append( "==============================" ).append( CR ) 314 .append( "Check SystemParameter Data in DB_MAX_ROW_COUNT Overflow" ) 315 .append( CR ); 316 return false; 317 } 318 319 bodyCount = table.getRowCount(); // 5.9.2.3 (2015/11/27) 320 321 // ヘッダフッタも渡す 322 tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "H", resource ); 323 final DBTableModel tableH = tmc.getTable(); 324 tmc = new DBTableModelCreator( SYSTEM_ID, LISTID, YKNO, "F", resource ); 325 final DBTableModel tableF = tmc.getTable(); 326 327 // 発行用クラスを実行する。 328 CSVPrintPointService service = null; 329 try { 330 service = (CSVPrintPointService)StringUtil.newInstance( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) ); 331 service.setYkno( YKNO ); 332 service.setSystemId( SYSTEM_ID ); 333 service.setFgrun( FGRUN ); 334 service.setHostName( hostName ); 335 service.setPrinterName( prtName ); 336 service.setTable( table ); 337 service.setTableH( tableH ); 338 service.setTableF( tableF ); 339 service.setPrgDir( PRGDIR ); 340 service.setPrgFile( PRGFILE ); 341 service.setOutDir( OUTDIR ); 342 service.setPrtId( PRTID ); 343 service.setPortnm( portnm ); 344 service.setListId( LISTID ); 345 service.setModelname( FILENAME ); 346 service.setGrpId( GRPID ); // 5.9.2.2 (2015/11/20) 347 service.setDmnGrp( DMNGRP ); // 5.9.2.2 (2015/11/20) 348 service.setOption( option ); // 5.9.3.0 (2015/12/04) 349 350 final boolean flag = service.execute(); 351 352 fgkan = service.getFgkan(); 353 354 if( DEBUG ) { 355 System.out.println( service ); 356 } 357 358 if( ! flag ){ 359 errMsg.append( service.getErrMsg() ); 360 return false; 361 } 362 } 363 catch( final Throwable ex ) { 364 fgkan = GE50Access.FG_ERR2; // エラー時はアプリエラーにしておく 365 errMsg.append( "CSV Print Request Execution Error. " ).append( CR ) 366 .append( "==============================" ).append( CR ) 367 .append( "SYSTEM_ID=[" ).append( SYSTEM_ID ).append( "] , YKNO=[" ).append( YKNO ).append( ']' ).append( CR ) 368 .append( HybsSystem.sys( "REPORT_CSV_SERVICE_CLASS" ) ).append( CR ) 369 .append( ex.toString() ) 370 .append( CR ); 371 if( service != null ) { errMsg.append( service.getErrMsg() ); } // 5.5.2.6 (2012/05/25) findbugs対応 372 return false; 373 } 374 375 System.out.println( "End." ); 376 return true ; 377 } 378 379 /** 380 * エラーが存在した場合に、エラーメッセージを返します。 381 * 382 * @return エラーメッセージ String 383 */ 384 public String getErrMsg() { 385 return errMsg.toString(); 386 } 387 388 /** 389 * 完了フラグを返します。 390 * 391 * 392 * @return 完了フラグ String 393 */ 394 public String getFgkan() { 395 return fgkan; 396 } 397 398 /** 399 * 処理件数(bodyの件数)を返します。 400 * 401 * @og.rev 5.9.2.7 (2015/11/27) bodyCount 追加 402 * 403 * @return 処理件数 int 404 */ 405 public int getBodyCount() { 406 return bodyCount; 407 } 408}