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