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.plugin.table; 017 018import org.opengion.fukurou.util.StringUtil; 019import org.opengion.hayabusa.db.AbstractTableFilter; 020import org.opengion.hayabusa.db.DBTableModel; 021 022/** 023 * TableFilter_SEQRESET は、TableFilter インターフェースを継承した、DBTableModel 処理用の 024 * 実装クラスです。 025 * 026 * ここでは、テーブルモデルのシーケンス項目の値を再セットしています。 027 * シーケンスの値は、通常10ずつ増加しますが、BREAK_CLMが指定されており、 028 * かつ、その項目の値がブレイクした場合は、100増加させます。 029 * また、CLEAR_CLMが指定されている場合、そのカラムの値がキーブレイクした場合は、 030 * シーケンス値を初期化(10)にします。 031 * 032 * ※ 7.4.1.0 (2021/04/23) 033 * SUB_CLM を追加しました。 034 * SUB_CLMは、SEQ_CLM の補助番号の扱いで、SUB_CLMの値が増加している間は、SEQ_CLM を増分しません。 035 * 例えば、行番号と列番号のような関係です。 036 * 037 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。 038 * 【パラメータ】 039 * { 040 * SEQ_CLM : シーケンス項目 041 * SUB_CLM : 補助番号項目 7.4.1.0 (2021/04/23) 042 * BREAK_CLM : キーブレイク項目 (任意) 043 * CLEAR_CLM : シーケンス初期化項目 044 * INCREMENT : シーケンスの増分 (初期値:10) 045 * START_NO : シーケンスの初期値 (初期値:0) 046 * SYSTEM_ID : SYSTEM_IDが「**」の場合 SEQに 9990000 を加算する (任意) 7.3.2.0 (2021/03/19) 047 * } 048 * 049 * @og.formSample 050 * ●形式: 051 * ① <og:tableFilter classId="SEQRESET" keys="SEQ_CLM,BREAK_CLM" vals="SEQNO,DAIBNRUI" /> 052 * 053 * ② <og:tableFilter classId="SEQRESET" > 054 * { 055 * SEQ_CLM : SEQNO ; 056 * BREAK_CLM : DAIBNRUI ; 057 * } 058 * </og:tableFilter> 059 * 060 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加 061 * 062 * @version 0.9.0 2000/10/17 063 * @author Hiroki Nakamura 064 * @since JDK1.1, 065 */ 066public class TableFilter_SEQRESET extends AbstractTableFilter { 067 /** このプログラムのVERSION文字列を設定します。 {@value} */ 068 private static final String VERSION = "7.4.1.0 (2021/04/23)" ; 069 070 /** 071 * デフォルトコンストラクター 072 * 073 * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。 074 */ 075 public TableFilter_SEQRESET() { 076 super(); 077 initSet( "SEQ_CLM" , "シーケンス項目" ); 078 initSet( "SUB_CLM" , "補助番号項目" ); // 7.4.1.0 (2021/04/23) 079 initSet( "BREAK_CLM" , "キーブレイク項目" ); 080 initSet( "CLEAR_CLM" , "シーケンス初期化項目" ); 081 initSet( "INCREMENT" , "シーケンスの増分(初期値:10)" ); 082 initSet( "START_NO" , "シーケンスの初期値(初期値:0)" ); 083 initSet( "SYSTEM_ID" , "SYSTEM_IDが「**」の場合 SEQに 9990000 を加算する (任意)" ); // 7.3.2.0 (2021/03/19) 084 } 085 086 /** 087 * DBTableModel処理を実行します。 088 * 089 * @og.rev 4.3.7.0 (2009/06/01) 新規追加 090 * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更 091 * @og.rev 7.3.2.0 (2021/03/19) SYSTEM_IDが「**」の場合 SEQに 9990000 を加算する (任意) 092 * @og.rev 7.4.1.0 (2021/04/23) SUB_CLM を追加(SUB_CLMの値が増加している間は、SEQ_CLM を増分しません)。 093 * 094 * @return 処理後のテーブルモデル 095 */ 096 public DBTableModel execute() { 097 final DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加 098 099 // 6.3.9.1 (2015/11/27) A method should have only one exit point, and that should be the last statement in the method.(PMD) 100 final int seqNo = table.getColumnNo( getValue( "SEQ_CLM" ),false ); 101 if( seqNo >= 0 ) { 102 final int subNo = table.getColumnNo( getValue( "SUB_CLM" ),false ); // 7.4.1.0 (2021/04/23) 103 final int breakNo = table.getColumnNo( getValue( "BREAK_CLM" ),false ); 104 final int clearNo = table.getColumnNo( getValue( "CLEAR_CLM" ),false ); 105 final int incNo = StringUtil.nval( getValue( "INCREMENT" ), 10 ); 106 final int startNo = StringUtil.nval( getValue( "START_NO" ), 0 ); 107 final int sysIdNo = table.getColumnNo( getValue( "SYSTEM_ID" ),false ); // 7.3.2.0 (2021/03/19) 108 109 int seq = startNo; 110 int bkSub = Integer.MAX_VALUE; // 7.4.1.0 (2021/04/23) 過去データの初期値は整数の最大値 111 String preKey = ""; 112 String cleKey = ""; 113 for( final int row : getParameterRows() ) { // 6.3.9.1 (2015/11/27) final int[] rowNo の処理 114 final String[] data = table.getValues( row ); // ※ 副作用で処理しているので、改善が必要。 115 116 if( clearNo >= 0 && cleKey != null && cleKey.length() > 0 && !cleKey.equals( data[clearNo] ) ) { 117 seq = startNo; 118 } 119 120 if( breakNo >= 0 && preKey != null && preKey.length() > 0 && !preKey.equals( data[breakNo] ) ) { 121 seq += incNo * 10; 122 } 123 else { 124 // 7.4.1.0 (2021/04/23) SUB_CLM が未定義か、前の値が今回の値より大きい(戻った)か同じなら、加算する。 125// seq += incNo; 126 if( subNo < 0 ) { seq += incNo; } // SUB_CLM が未定義なら、加算 127 else { 128 final int nowSub = Integer.parseInt( data[subNo] ) ; // 現在の値を取得 129 if( bkSub >= nowSub ) { seq += incNo; } // 現在値が過去より小さいか同じなら、加算する 130 bkSub = nowSub; 131 } 132 } 133 134 // 7.3.2.0 (2021/03/19) SYSTEM_IDが「**」の場合 SEQに 9990000 を加算する (任意) 135 if( sysIdNo >= 0 && "**".equals( data[sysIdNo] ) ) { 136 data[seqNo] = String.valueOf( seq + 9990000 ); 137 } 138 else { 139 data[seqNo] = String.valueOf( seq ); 140 } 141 142// data[seqNo] = String.valueOf( seq ); 143 144 if( breakNo >= 0 ) { 145 preKey = data[breakNo]; 146 } 147 148 if( clearNo >= 0 ) { 149 cleKey = data[clearNo]; 150 } 151 } 152 } 153 return table; 154 } 155}