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.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.html.ViewCrossTableParam; 020 021import static org.opengion.fukurou.util.StringUtil.nval ; 022 023/** 024 * viewタグの viewFormType が HTMLCrossTable の場合にパラメータを設定します。 025 * 026 * クロス集計を行う、ViewForm_HTMLCrossTable クラスに対して、各種パラメータを 027 * 設定します。 028 * パラメータが設定されていない場合は、ViewCrossTableParam の初期値が使用されます。 029 * (パラメータを使用するには、viewタグのuseParam 属性をtrueに設定する必要があります。) 030 * 031 * SELECT文は、CROSS集計機能を利用して求めます。そのときのフォーマットは、 032 * ヘッダー1..N,縦,横,計1..N になります。 033 * ヘッダー部は、複数指定できますが、デフォルトではヘッダーNがキーブレイクすると 034 * 合計用のヘッダーが挿入されます。また、ヘッダーは、前段と同じ値の場合は、表示しません。 035 * 合計は、複数並べることができますが、sumNumber で指定しておく必要があります。 036 * 037 * 各属性は、{@XXXX} 変数が使用できます。 038 * これは、ServletRequest から、XXXX をキーに値を取り出し、この変数に割り当てます。 039 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。 040 * 041 * http://localhost/query.jsp?KEY1=VLA1&KEY2=VAL2 042 * 043 * のようなリクエストで、{@KEY1} とすれば、 VAL1 がセットされます。 044 * 045 * @og.formSample 046 * ●形式:<og:crossParam breakColumn="ZZZ" noGroupColumns="AAA,BBB" sumNumber="2" /> 047 * ●body:なし 048 * 049 * ●Tag定義: 050 * <og:crossParam 051 * cubeXColumn 【TAG】CUBE計算の1つ目(X)カラムを指定します 052 * cubeYColumn 【TAG】CUBE計算の2つ目(Y)カラムを指定します 053 * sumNumber 【TAG】合計値のカラム数を設定します 054 * breakColumn 【TAG】ブレークによりヘッダー部を出力させるカラム名をセットします(初期値:ヘッダーN) 055 * noGroupColumns 【TAG】カラム値を前段と比較して同じ場合でも表示させるカラム名をセットします 056 * shokeiLabel 【TAG】列小計のカラムに表示するラベルIDを指定します(初期値:空文字列) 057 * gokeiLabel 【TAG】列合計のカラムに表示するラベルIDを指定します(初期値:空文字列) 058 * cubeSortType 【TAG】CUBE Y の列ヘッダーのソート方式を指定します(初期値:LOAD) 059 * gokeiSortDir 【TAG】合計行のソート有無とその方向[true:正方向/false:逆方向/null:ソートしない]を指定します(初期値:null) 060 * useHeaderColumn 【TAG】ヘッダーカラムにレンデラー、エディターを適用するかを指定します(初期値:false) 061 * useClassAdd 【TAG】各列情報のclass属性に、カラム名などを付与するかどうかを指定します(初期値:false) 062 * firstClmGokei 【TAG】合計列をCUBEの先頭部分に出すかどうか[true/false]を指定します(初期値:false) 063 * saveTableId 【TAG】クロス集計結果の DBTableModel をセーブするセッションキーワードを指定します 064 * saveScope 【TAG】クロス集計結果の DBTableModel をセーブする scope を指定します 065 * useHeaderResource 【TAG】ヘッダー表示にラベルリソースを適用するかどうかを指定します(初期値:false) 066 * headerCodeColumn 【廃止】ヘッダー表示に利用するコードを持つカラムを指定します(初期値:空文字列) 7.0.1.5 (2018/12/10) 廃止 067 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 068 * /> 069 * 070 * ●使用例 071 * ViewFormTag の viewFormType が、HTMLCrossTable の場合に使用します。 072 * useParam 属性を設定しておかないと、使用されません。 073 * <og:view 074 * viewFormType = "HTMLCrossTable" 075 * command = "{@command}" 076 * startNo = "0" 077 * pageSize = "20" 078 * <b>useParam = "true"</b> 079 * > 080 * <og:crossParam 081 * breakColumn = "ZZZ" : ブレークによりヘッダー部を出力させるカラム名 082 * noGroupColumns = "AAA,BBB" : カラム値を前段と比較して同じ場合でも表示させるカラム名 083 * cubeXColumn = "CUBE_X" : CUBE計算の1つ目(X)カラムを指定 084 * cubeYColumn = "CUBE_Y" : CUBE計算の2つ目(Y)カラムを指定 085 * shokeiLabel = "SHOKEI" : 列小計のカラムに表示するラベルID(初期値:SHOKEI) 086 * gokeiLabel = "GOKEI" : 列合計のカラムに表示するラベルID(初期値:GOKEI) 087 * sumNumber = "2" : 合計値のカラム数(初期値1) 088 * cubeSortType = "NUMBER" : CUBE Y の列ヘッダーのソート方式を指定[STRING/NUMBER/LOAD] 089 * gokeiSortDir = "false" : 合計行のソート有無とその方向(正方向/逆方向)を指定[true/false/null] 090 * firstClmGokei = "true" : 合計列をCUBEの先頭部分に出すかどうかを指定[false/true/null] 091 * useHeaderColumn= "true" : ヘッダーカラムにレンデラー、エディターを適用するかどうかを指定[false/true/null] 092 * saveTableId = "DEFAULT" : クロス集計結果の DBTableModel をセーブするセッションキーワードを指定 093 * useClassAdd = "true" : String 各列情報のclass属性に、カラム名などを付与するかどうかを指定[false/true/null] 094 * /> 095 * </og:view > 096 * 097 * @og.group 画面表示 098 * 099 * @version 4.0 100 * @author Kazuhiko Hasegawa 101 * @since JDK5.0, 102 */ 103public class ViewCrossParamTag extends ViewParamImpl { 104 /** このプログラムのVERSION文字列を設定します。 {@value} */ 105 private static final String VERSION = "6.4.2.0 (2016/01/29)" ; 106 private static final long serialVersionUID = 642020160129L ; 107 108 /** 109 * デフォルトコンストラクター 110 * 111 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 112 */ 113 public ViewCrossParamTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 114 115 /** 116 * 【TAG】ブレークによりヘッダー部を出力させるカラム名をセットします(初期値:ヘッダーN)。 117 * 118 * @og.tag 119 * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。 120 * ヘッダー部は、複数指定できますが、デフォルトではヘッダーNがキーブレイクすると 121 * 合計用のヘッダーが挿入されます。 122 * このヘッダーNそのものが、集計フィールドでなく、単なる属性の場合は、 123 * キーブレイクして欲しくない為、breakColumn="ヘッダーN-1" を指定します。 124 * 初期値は、"ヘッダーN" です。 125 * 126 * @param clm ブレークカラム 127 */ 128 public void setBreakColumn( final String clm ) { 129 putParam( ViewCrossTableParam.BREAK_COLUMN_KEY, 130 nval( getRequestParameter( clm ),null ) ); 131 } 132 133 /** 134 * 【TAG】カラム値を前段と比較して同じ場合でも表示させるカラム名をセットします。 135 * 136 * @og.tag 137 * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。 138 * ヘッダー部は、キーブレイクする都度、ヘッダーを出力します。それまでは、 139 * 各ヘッダーの値が、前段(同一カラムの先の値)と同じ場合は、空白にします。 140 * こうする事で、値のグループ化が一目で判ります。(初期設定) 141 * このヘッダーが、集計フィールドでなく、単なる属性の場合は、 142 * 空白ではなく、値として表示したい為、グループ化しない事を指定します。 143 * 144 * @param clms 非グループ化カラム (CSV形式) 145 */ 146 public void setNoGroupColumns( final String clms ) { 147 putParam( ViewCrossTableParam.NO_GROUP_COLUMNS_KEY, 148 nval( getRequestParameter( clms ),null ) ); 149 } 150 151 /** 152 * 【TAG】合計値のカラム数を設定します(初期値:1)。 153 * 154 * @og.tag 155 * CROSS集計で求めたフォーマットは、『ヘッダー1..N,縦,横,計1..N 』です。 156 * 合計は、複数並べることができますが、sumNumber で指定しておく必要があります。 157 * 初期値は、1 です。 158 * 159 * @param no 合計値カラム数 (初期値1) 160 */ 161 public void setSumNumber( final String no ) { 162 putParam( ViewCrossTableParam.SUM_NUMBER_KEY, 163 nval( getRequestParameter( no ),"1" ) ); 164 } 165 166 /** 167 * 【TAG】列小計のカラムに表示するラベルIDを指定します(初期値:空文字列)。 168 * 169 * @og.tag 170 * 各列の小計のラベルIDを登録します。登録する文字列は、ラベルリソースに 171 * 定義しておいて下さい。 172 * 初期値は、空文字列("")です。 173 * 174 * @og.rev 3.7.1.1 (2005/05/31) 初期値を "SHOKEI" に設定します。 175 * 176 * @param id 小計ラベルID 177 */ 178 public void setShokeiLabel( final String id ) { 179 final String label = nval( getRequestParameter( id ),"SHOKEI" ); 180 putParam( ViewCrossTableParam.SHOKEI_LABEL_KEY, getLabel( label ) ); 181 } 182 183 /** 184 * 【TAG】列合計のカラムに表示するラベルIDを指定します(初期値:空文字列)。 185 * 186 * @og.tag 187 * 各列の合計のラベルIDを登録します。登録する文字列は、ラベルリソースに 188 * 定義しておいて下さい。 189 * 初期値は、空文字列("")です。 190 * 191 * @og.rev 3.7.1.1 (2005/05/31) 初期値を "GOKEI" に設定します。 192 * 193 * @param id 合計ラベルID 194 */ 195 public void setGokeiLabel( final String id ) { 196 final String label = nval( getRequestParameter( id ),"GOKEI" ); 197 putParam( ViewCrossTableParam.GOKEI_LABEL_KEY, getLabel( label ) ); 198 } 199 200 /** 201 * 【TAG】CUBE計算の1つ目(X)カラムを指定します。 202 * 203 * @og.tag 204 * 列方向のキーとなるカラム名を指定します。 205 * 初期値は、互換性の関係より、sumNumber より逆計算します。 206 * 207 * @og.rev 3.5.5.9 (2004/06/07) 新規追加 208 * 209 * @param cubeX 列(X)ラベルID 210 */ 211 public void setCubeXColumn( final String cubeX ) { 212 putParam( ViewCrossTableParam.CUBE_X_COLUMN_KEY, 213 nval( getRequestParameter( cubeX ),null ) ); 214 } 215 216 /** 217 * 【TAG】CUBE計算の2つ目(Y)カラムを指定します。 218 * 219 * @og.tag 220 * 行方向のキーとなるカラム名を指定します。 221 * 初期値は、互換性の関係より、sumNumber より逆計算します。 222 * 223 * @og.rev 3.5.5.9 (2004/06/07) 新規追加 224 * 225 * @param cubeY 行(Y)ラベルID 226 */ 227 public void setCubeYColumn( final String cubeY ) { 228 putParam( ViewCrossTableParam.CUBE_Y_COLUMN_KEY, 229 nval( getRequestParameter( cubeY ),null ) ); 230 } 231 232 /** 233 * 【TAG】CUBE Y の列ヘッダーのソート方式を指定します(初期値:LOAD)。 234 * 235 * @og.tag 236 * CUBEのヘッダーに対応するカラム列をソート表示する場合の方式を指定します。 237 * 種類として、[STRING/NUMBER/LOAD] があります。 238 * 初期値(指定無し)は、LOAD(取り込み順にセット)です。 239 * 240 * @og.rev 3.5.6.3 (2004/07/12) 新規追加 241 * 242 * @param cubeSortType 列ヘッダーソート方式 [STRING/NUMBER/LOAD] 243 */ 244 public void setCubeSortType( final String cubeSortType ) { 245 putParam( ViewCrossTableParam.CUBE_SORT_TYPE_KEY, 246 nval( getRequestParameter( cubeSortType ),null ) ); 247 } 248 249 /** 250 * 【TAG】合計行のソート有無とその方向[true:正方向/false:逆方向/null:ソートしない]を指定します(初期値:null)。 251 * 252 * @og.tag 253 * 最も最後の合計カラムにソートを行うかどうか、その時の方向を指定します。 254 * true/false 以外の文字列では、ソートを行いません。trueは、正方向(昇順)で、 255 * falseが逆方向(降順)になります。 256 * 初期値(指定無し)は、ソートしない(null)です。 257 * 258 * @og.rev 3.5.6.3 (2004/07/12) 新規追加 259 * 260 * @param gokeiSortDir 合計行ソート処理 [true:正方向/false:逆方向/null:ソートしない] 261 */ 262 public void setGokeiSortDir( final String gokeiSortDir ) { 263 putParam( ViewCrossTableParam.GOKEI_SORT_DIR_KEY, 264 nval( getRequestParameter( gokeiSortDir ),null ) ); 265 } 266 267 /** 268 * 【TAG】合計列をCUBEの先頭部分に出すかどうか[true/false]を指定します(初期値:false)。 269 * 270 * @og.tag 271 * 合計列を最終列に出力するか、CUBEの先頭列に出力するかを指定します。 272 * trueが指定された場合はCUBEの先頭列に出力します。 273 * 初期値(false)は合計列を最終列に出力します。 274 * 275 * @og.rev 5.0.0.3 (2009/09/22) 新規追加 276 * 277 * @param firstClmGokei 合計列の出力場所 [true:先頭列に出力/false:最終列に出力] 278 */ 279 public void setFirstClmGokei( final String firstClmGokei ) { 280 putParam( ViewCrossTableParam.FIRST_CLM_GOKEI_KEY, 281 nval( getRequestParameter( firstClmGokei ),"false" ) ); 282 } 283 284 /** 285 * 【TAG】ヘッダーカラムにレンデラー、エディターを適用するかを指定します(初期値:false)。 286 * 287 * @og.tag 288 * ヘッダーカラムにレンデラー、エディターを適用するかを指定します。 289 * trueが指定された場合は、ヘッダー部分の値そのものをカラム名として扱います。 290 * リソースが存在しない場合は、ラベルのみを各カラムの値で置き換えます。 291 * 初期値(指定無し)は、レンデラー、エディターを適用しない(false)です。 292 * 293 * @og.rev 4.0.0.0 (2007/11/27) 新規追加 294 * @og.rev 5.2.2.0 (2010/11/01) キーに、ViewCrossTableParam.USE_HEADER_COLUMN を使用するように修正 295 * 296 * @param useHeaderColumn 適用可否 [true:適用する/false:適用しない] 297 */ 298 public void setUseHeaderColumn( final String useHeaderColumn ) { 299 putParam( ViewCrossTableParam.USE_HEADER_COLUMN, 300 nval( getRequestParameter( useHeaderColumn ),"false" ) ); 301 } 302 303 /** 304 * 【TAG】各列情報のclass属性に、カラム名などを付与するかどうかを指定します(初期値:false)。 305 * 306 * @og.tag 307 * 列情報の集計列に対して、class 属性を付与するかどうかを指定します。 308 * class属性は、その列のオリジナルの属性名と、ラベル名の文字列を設定します。 309 * 例えば、集計行の計カラムが複数ある場合は、それぞれに色を指定して、ゼブラ模様を 310 * 設定できます。また、ラベル(表示ヘッダー)も設定されるので、特別な列のみ指定することも 311 * 可能になります。 312 * ※ 特殊対応:cssなどで指定できるIDやCLASS属性は、先頭文字が数字の場合は、 313 * 無効になります。(つまり、効きません。) 314 * 表示ヘッダーは、年月や、社員番号(数字)などのケースもあります。そこで、先頭が数字の 315 * 場合は、"x"(小文字のx)を自動的に頭に追加します。この処理は、ViewForm_HTMLCrossTable 316 * で行います。 317 * 318 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 319 * 320 * @param useClassAdd 付与するかどうか [true:する/false:しない] 321 */ 322 public void setUseClassAdd( final String useClassAdd ) { 323 putParam( ViewCrossTableParam.USE_CLASS_ADD, 324 nval( getRequestParameter( useClassAdd ),"false" ) ); 325 } 326 327 /** 328 * 【TAG】クロス集計結果の DBTableModel をセーブするセッションキーワードを指定します。 329 * 330 * @og.tag 331 * 検索のみの場合は、何も設定しません。EXCEL等外部にクロス集計の形で 332 * 取り出したい場合に、設定します。 333 * "DEFAULT" という文字列を指定すると、内部では、HybsSystem.TBL_MDL_KEY が 334 * 設定されます。(DEFAULT という文字列に設定されるわけではありません。) 335 * なお、DEFAULT を使用する場合は、検索結果の DBTbleModel をつぶすことになります 336 * ので、NEXT 等は使えません。DBTableModel のデータを利用した forward 等も 337 * 使用できませんので、十分ご注意ください。 338 * DEFAULT 以外の文字列の場合は、指定した文字列そのものがキーになります。 339 * 他のセッションキーと同じにすると動作が不安定になりますので、使用する場合は、 340 * "CROSS_TABLE_SAVE_KEY" を推奨致します。 341 * 指定しない場合は、セッションにセーブされません。(検索されたまま) 342 * 通常、EXCEL出力等を行う場合は、DBTableModel をセーブする必要がありますが、 343 * scope="session" にセーブすると、PREV,NEXT が使えなくなります。これは、 344 * クロス集計時に元のカラムが表形式の別のカラムに置き換えられるためです。 345 * scope="request" では、エラーは発生しなくなりますが、外部に取り出せなくなります。 346 * 347 * @og.rev 5.2.2.0 (2010/11/01) キーに、ViewCrossTableParam.SAVE_TABLEID_KEY を使用するように修正 348 * 349 * @param id セッション登録ID 350 */ 351 public void setSaveTableId( final String id ) { 352 String tableId = nval( getRequestParameter( id ),null ); 353 if( "DEFAULT".equals( tableId ) ) { 354 tableId = HybsSystem.TBL_MDL_KEY; 355 } 356 putParam( ViewCrossTableParam.SAVE_TABLEID_KEY , tableId ); 357 } 358 359 /** 360 * 【TAG】クロス集計結果の DBTableModel をセーブする scope を指定します。 361 * 362 * @og.tag 363 * スコープは (request,page,session,application) がありますが、request か session が 364 * 通常選択されます。 365 * また、この設定が有効になるには、saveTableId を指定する必要があります。 366 * saveTableId を指定しないと、そもそも書き出されないため、scope は無視されます。 367 * 368 * scope="session" にセーブすると、PREV,NEXT が使えなくなります。これは、 369 * クロス集計時に元のカラムが表形式の別のカラムに置き換えられるためです。 370 * scope="request" では、エラーは発生しなくなりますが、外部に取り出せなくなります。 371 * 何も指定しない場合は、viewタグに指定されたオリジナルのスコープに書き出されます。 372 * そうで無い場合は、指定のスコープに書き出されます。 373 * 374 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 375 * 376 * @param scope scope指定 [request/page/session/application] 377 * @see #setSaveTableId( String ) 378 */ 379 public void setSaveScope( final String scope ) { 380 putParam( ViewCrossTableParam.SAVE_SCOPE_KEY, 381 nval( getRequestParameter( scope ), null ) ); 382 } 383 384 /** 385 * 【TAG】ヘッダーカラムにラベルリソースを利用するかを指定します(初期値:false)。 386 * 387 * @og.tag 388 * HTMLCrossTableViewで、ヘッダーカラムの表示にラベルリソースを利用するかどうかを指定します。 389 * trueが指定された場合は、ヘッダー部の値のラベルで表示します。 390 * 初期値(指定無し)は、利用しない(false)です。 391 * 392 * @og.rev 5.5.5.0 (2012/07/28) 新規追加 393 * 394 * @param useHeaderResource リソース使用可否 [true:する/false:しない] 395 */ 396 public void setUseHeaderResource( final String useHeaderResource ) { 397 putParam( ViewCrossTableParam.USE_HEADER_RSC, 398 nval( getRequestParameter( useHeaderResource ),"false" ) ); 399 } 400 401// /** 402// * 【TAG】ヘッダーのラベルに利用するコードリソースを指定します。 403// * 404// * @og.tag 405// * この値を指定すると上部ヘッダーの表示を対象カラムのコードに対応するラベルで表示します。 406// * カラムリソースがMENUや、DBMENUのようにSelectionを返す形である必要があります。 407// * 初期値はnullです。 408// * 409// * @og.rev 5.5.5.0 (2012/07/28) 新規追加 410// * @og.rev 7.0.1.5 (2018/12/10) 廃止 411// * 412// * @param headerCode コードリソースのキー 413// */ 414// public void setHeaderCodeColumn( final String headerCode ) { 415// putParam( ViewCrossTableParam.HEADER_CODE_KEY, 416// nval( getRequestParameter( headerCode ),null ) ); 417// } 418 419 /** 420 * タグの名称を、返します。 421 * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。 422 * 423 * @og.rev 4.0.0.0 (2005/01/31) 新規追加 424 * 425 * @return タグの名称 426 * @og.rtnNotNull 427 */ 428 @Override 429 protected String getTagName() { 430 return "crossParam" ; 431 } 432}