| 1 | ** Note: このページは、Tracのバージョン1.0を文書化しています、旧バージョンが必要であれば、[[0.12/TracReports]]を参照してください ** |
| 2 | = レポート = #TracReports |
| 3 | [[TracGuideToc]] |
| 4 | |
| 5 | レポートモジュールは、簡単かつ強力なレポーティング機能を提供します。 |
| 6 | この機能によって、 Trac データベースのチケット情報を取得することができます。 |
| 7 | |
| 8 | TracReports ではレポートの形式を定義するための方法として、独自フォーマットではなく、 |
| 9 | SQL の `SELECT` 文を使用することにしました。 |
| 10 | |
| 11 | '''Note:''' ''現在の形式のレポートモジュールは、 Trac 開発チームでデータベースのスキーマにあわせる作業が必要になるという深刻な制限事項があるため、段階的に廃止します。より柔軟性に富みユーザビリティに優れた [wiki:TracQuery クエリモジュール] が代替手段として提供されます。どこかの時点でレポートモジュールを完全に削除することが出来るように、クエリモジュールで実現できないレポートがある間は、私たちはクエリモジュールを強化していくつもりです。また、これはレポートモジュールへの重要な機能追加は行わないことを意味します。'' |
| 12 | |
| 13 | ''以下の [wiki:TracIni trac.ini] のように無効化するだけで、レポートモジュールをクエリモジュールで完全に置き換えることができます:'' |
| 14 | {{{ |
| 15 | [components] |
| 16 | trac.ticket.report.* = disabled |
| 17 | }}} |
| 18 | ''これによって、ナビゲーションバーの "チケットを見る" (英語版では "View Tickets") でのデフォルトのハンドラがクエリモジュールになります。もし可能ならば、この設定を有効にして、レポート機能がなくなることによって生じる不都合を報告してください。'' |
| 19 | |
| 20 | レポートは以下の基本的なパーツから構成されます: |
| 21 | * '''ID''' — ユニークな (連番の) 識別子 |
| 22 | * '''レポート名 (Title)''' — レポートのタイトル |
| 23 | * '''説明 (Description)''' — WikiFormatting で記述された、レポートの説明 |
| 24 | * '''レポート本体 (Report Body)''' — 後に述べるフォーマットで規定された、レポートクエリの結果 |
| 25 | * '''フッタ (Footer)''' — レポート本体を異なる形式でダウンロードするためのリンク |
| 26 | |
| 27 | == ソートの並び順変更 == #ChangingSortOrder |
| 28 | 単純なレポート (特にグループ化されていないもの) では、カラムのヘッダをクリックすれば、そのカラムでソートすることが出来ます。 |
| 29 | |
| 30 | カラムのヘッダがハイパーリンク (赤) になっていれば、クリックすることでそのカラムでのソートができます。並び順を逆にするには、もう一度クリックします。 |
| 31 | |
| 32 | == レポートの番号を変更する == #ChangingReportNumbering |
| 33 | レポートの ID を変更する必要がある場合があるかもしれませんが、おそらくレポート自体を編集する方がベターです。というのも Trac のデータベースを変更する必要があるからです。 ''report'' 表は以下のようなスキーマとなっています ''(0.10 以降)'': |
| 34 | * id integer PRIMARY KEY |
| 35 | * author text |
| 36 | * title text |
| 37 | * query text |
| 38 | * description text |
| 39 | ID を変更すると ''レポート一覧 (Available Reports)'' での表示順と番号、レポートのパーマリンクが変更されます。以下のような SQL を実行すると ID が変更されます: |
| 40 | {{{ |
| 41 | update report set id=5 where id=3; |
| 42 | }}} |
| 43 | メンテナンス結果、データベースの一貫性を保つ必要があることに留意してください (例えば ID はユニークでなければなりませんし、 SQLite などデータベースの上限値を超えることはできません)。 |
| 44 | |
| 45 | 保存されたレポートやクエリのレポート番号も更新したり削除したりする必要があるでしょう。 |
| 46 | |
| 47 | == チケットをナビゲート == #NavigatingTickets |
| 48 | レポートクエリ結果の 1 チケットをクリックするとそのチケットが表示されるでしょう。表示されたチケットのメインメニューバーのすぐ下にある ''次のチケット'' (英語版では ''Next Ticket'') または ''前のチケット'' (英語版では ''Previous Ticket'') リンクをクリックすることによって他のチケットに移動するか、''レポートに戻る'' (英語版では ''Back to Report'') リンクをクリックしてレポートページに戻ることができます。 |
| 49 | |
| 50 | あなたは安全にチケットを編集することができます。またチケットの編集結果を保存した後で、 ''次のチケット/前のチケット/レポートに戻る'' (英語版では ''!Next/Previous/Back to Report'') のリンクを使用して結果を行き来することが可能です。しかし、あなたがチケットへの操作を終えてレポートに戻るときに、どのチケットが変更されたかのヒントは表示されません。この動作はカスタムクエリの動作とは異なります。 (カスタムクエリについては TracQuery#NavigatingTickets を参照して下さい) 。 ''(0.11 以降 )'' |
| 51 | |
| 52 | == ダウンロードできるフォーマット == #AlternativeDownloadFormats |
| 53 | 通常表示される HTML でのビューの加え、レポートはいろいろな形式で使用することができます。 |
| 54 | レポートページの一番下に、利用可能なデータ形式の一覧があります。望む形式のリンクをクリックすれば、 |
| 55 | その形式でのレポートをダウンロードすることができます。 |
| 56 | |
| 57 | === カンマ区切りテキスト - CSV (Comma Separated Values) === #Comma-delimited-CSVCommaSeparatedValues |
| 58 | 1 レコードを 1 行として、各カラムをカンマ (',') で区切ったプレーンテキストとしてダウンロードできます。 |
| 59 | '''Note:''' 各カラムのデータに改行文字やカンマがある場合、エスケープされて出力されます。 |
| 60 | |
| 61 | === タブ区切り === #Tab-delimited |
| 62 | CSV と似ていますが、水平タブ文字 (\t) で区切られる点が違います。 |
| 63 | |
| 64 | === RSS - XML コンテンツ配信 === #RSS-XMLContentSyndication |
| 65 | 全てのレポートは、 XML/RSS 2.0 での配信が可能です。 RSS フィードを購読するにはページ下部にある、オレンジ色の 'XML' アイコンをクリックしてください。 Trac での RSS 対応についての一般的な情報は、 TracRss に記述しています。 |
| 66 | |
| 67 | ---- |
| 68 | |
| 69 | == カスタムレポートを作成する == #CreatingCustomReports |
| 70 | |
| 71 | ''カスタムレポートを作成するためには、 SQL を楽に書ける程度の知識が必要です。'' |
| 72 | |
| 73 | '''Note: レポートの追加、編集ボタンを表示させるためには [TracPermissions#Reports permissions] をセットアップする必要があります。''' |
| 74 | |
| 75 | レポートは基本的に、 Trac が実行できる形式の、名前がついた特定 SQL です。 |
| 76 | レポートに指定された SQL は、直接 Web インタフェースから閲覧したり、 |
| 77 | 作成したりできます。 |
| 78 | |
| 79 | 通常のレポートは、 'ticket' 表に対する、カラムの選択や、ソート指定を伴った |
| 80 | SELECT 文となります。 |
| 81 | |
| 82 | == Ticket 表のカラム == #Ticketcolumns |
| 83 | ''ticket'' 表は、以下のカラムを持ちます: |
| 84 | * id -- チケットID |
| 85 | * type -- チケット分類 |
| 86 | * time -- 登録日時 |
| 87 | * changetime -- 最終更新日時 |
| 88 | * component -- コンポーネント |
| 89 | * severity -- 重要度 |
| 90 | * priority -- 優先度 |
| 91 | * owner -- 担当者 |
| 92 | * reporter -- 報告者 |
| 93 | * cc -- 関係者 |
| 94 | * version -- バージョン |
| 95 | * milestone -- マイルストーン |
| 96 | * status -- ステータス |
| 97 | * resolution -- 解決方法 |
| 98 | * summary -- チケットの概要 |
| 99 | * description -- チケットについての完全な説明 |
| 100 | * keywords -- キーワード |
| 101 | |
| 102 | 各カラムに対応する属性の詳細な説明は、 TracTickets に記述しています。 |
| 103 | |
| 104 | 例: '''優先度順、登録日時順の全未解決チケット''' |
| 105 | {{{ |
| 106 | SELECT id AS ticket, status, severity, priority, owner, |
| 107 | time AS created, summary FROM ticket |
| 108 | WHERE status IN ('new', 'assigned', 'reopened') |
| 109 | ORDER BY priority, time |
| 110 | }}} |
| 111 | |
| 112 | |
| 113 | == 上級トピック: 動的変数の使用 == #AdvancedReports:DynamicVariables |
| 114 | レポートに汎用性を持たせる手段として、 ''動的変数'' をレポート SQL で使用する方法があります。 |
| 115 | 簡単に言うと、動的変数とは、クエリを実行する前に置き換えられる ''特別な'' 文字列のことです。 |
| 116 | |
| 117 | === クエリで動的変数を使う方法 === #UsingVariablesinaQuery |
| 118 | 動的変数を使うためのシンタックスは単純です。 '$' に続いて、大文字で変数名となる語を挿入してください。 |
| 119 | |
| 120 | 例: |
| 121 | {{{ |
| 122 | SELECT id AS ticket,summary FROM ticket WHERE priority=$PRIORITY |
| 123 | }}} |
| 124 | |
| 125 | レポート閲覧時、 $PRIORITY に値を当てはめるためには、レポートの URL に引数として変数を与えてください。この変数名に '$' を入れてはいけません。 |
| 126 | |
| 127 | 例: |
| 128 | {{{ |
| 129 | http://trac.edgewall.org/reports/14?PRIORITY=high |
| 130 | }}} |
| 131 | |
| 132 | 複数の値を使用する場合、各値を '&' で区切ります。 |
| 133 | |
| 134 | 例: |
| 135 | {{{ |
| 136 | http://trac.edgewall.org/reports/14?PRIORITY=high&SEVERITY=critical |
| 137 | }}} |
| 138 | |
| 139 | |
| 140 | === 特殊な定数 === #SpecialConstantVariables |
| 141 | 実用的なレポートにするために、自動的に値が設定される動的変数が用意されています。(URL で指定されると上書かれます) |
| 142 | |
| 143 | * $USER -- ログインに使用したユーザ名 |
| 144 | |
| 145 | 例 (''私が担当になっているチケット一覧''): |
| 146 | {{{ |
| 147 | SELECT id AS ticket,summary FROM ticket WHERE owner=$USER |
| 148 | }}} |
| 149 | |
| 150 | |
| 151 | |
| 152 | == 上級トピック: 表示形式のカスタマイズ == #AdvancedReports:CustomFormatting |
| 153 | Trac には、レイアウトのカスタマイズや、グルーピング、ユーザ定義の CSS 利用などによる |
| 154 | もっと複雑なレポートの作成も可能です。このようなレポートを作成するには、 |
| 155 | Trac のレポートエンジンが出力を制御するためのステートメントを含む、特別な SQL を使用します。 |
| 156 | |
| 157 | === 特別なカラム === #SpecialColumns |
| 158 | レポートを整形するため、 TracReports はクエリの結果から '特定の' カラム名を |
| 159 | 探します。このような '特定の' 名前で、最終的なレポートのレイアウトやスタイルが |
| 160 | 処理され、変更されます。 |
| 161 | |
| 162 | === 自動的に整形されるカラム名 === #Automaticallyformattedcolumns |
| 163 | * '''ticket''' — チケットの ID が入っているカラムで使用します。該当する ID のカラムにハイパーリンクされます (訳注: `summary` というカラム名もチケットにハイパーリンクされます。日本語版では `概要` でもリンクします) |
| 164 | * '''id''' — '''realm''' が指定されない場合は、 '''ticket''' と同じです |
| 165 | * '''realm''' — '''id''' と同時に使用します。チケット以外のリソースにリンクを行う場合に使用します(e.g. ''wiki'' のレルムに ''id'' としてページ名を組み合わせると、 Wiki ページへのリンクを生成します) |
| 166 | * '''created, modified, date, time''' — 日付や時刻に整形されます (訳注: `datetime` という列名にすると日時で整形されます。日本語版では `時刻` で終わるカラムは `time` に、 `日付` で終わるカラムは `date` に、 `日時` で終わるカラムは `datetime` に、それぞれ整形されます) |
| 167 | * '''description''' — チケットの説明が入っているカラムで使用します。 Wiki エンジンで処理されます (訳注: 日本語版では `説明` でも整形されます) |
| 168 | |
| 169 | '''例:''' |
| 170 | {{{ |
| 171 | SELECT id AS ticket, created, status, summary FROM ticket |
| 172 | }}} |
| 173 | |
| 174 | これらのカラムは定義しても非表示にすることができます。方法は [#column-syntax 下記] を参照してください。 |
| 175 | |
| 176 | ''ticket'' 以外のレルムに対するレポートの作成方法については [trac:CookBook/Configuration/Reports CookBook/Configuration/Reports] を参照してください。 |
| 177 | |
| 178 | '''訳注''': Trac-0.11.1.ja1 以降のバージョンで作成した Environment では、デフォルトのレポートに日本語での整形ルールが適用されています。このような Environment を本家版 Trac で使用したい場合は各レポートの SQL を編集し、上記の日本語のカラム別名を英語に変更してください。 |
| 179 | |
| 180 | === 整形されるカラムのカスタマイズ === #Customformattingcolumns |
| 181 | カラム名の前後に 2 つのアンダースコアがついている場合 (例: '''`__color__`''') は、 |
| 182 | ''整形用のヒント'' として扱われ、レコードの整形が行われます。 |
| 183 | |
| 184 | * '''`__group__`''' — 指定されたカラムで、表示がグループ化されます。各グループは、それぞれセクションヘッダとクエリ結果の表を持ちます |
| 185 | * '''`__grouplink__`''' — グループ化した場合の各グループのヘッダで生成するリンク先の URL を指定します。この URL は各グループの最初の行にだけ付与されます |
| 186 | * '''`__color__`''' — 1 から 5 の数値である必要があります。値によって、あらかじめ定義された色付けが行われます。一般的な使用法は、優先度別の色付けです |
| 187 | {{{ |
| 188 | #!html |
| 189 | <div style="margin-left:7.5em">デフォルトの色付け: |
| 190 | <span style="border: none; color: #333; background: transparent; font-size: 85%; background: #fdc; border-color: #e88; color: #a22">Color 1</span> |
| 191 | <span style="border: none; color: #333; background: transparent; font-size: 85%; background: #ffb; border-color: #eea; color: #880">Color 2</span> |
| 192 | <span style="border: none; color: #333; background: transparent; font-size: 85%; background: #fbfbfb; border-color: #ddd; color: #444">Color 3</span> |
| 193 | <span style="border: none; color: #333; background: transparent; font-size: 85%; background: #e7ffff; border-color: #cee; color: #099">Color 4</span> |
| 194 | <span style="border: none; color: #333; background: transparent; font-size: 85%; background: #e7eeff; border-color: #cde; color: #469">Color 5</span> |
| 195 | </div> |
| 196 | }}} |
| 197 | * '''`__style__`''' — `<tr>` 要素を使用して CSS 形式でレコードを整形できます |
| 198 | * '''`__class__`''' — `<tr>` 要素でセットされた0以上の空白で区切られた CSS のクラス名です。これらのクラスは `__color__` に由来するクラス名と偶数/奇数の指標に追加されます |
| 199 | |
| 200 | '''例:''' ''マイルストーン別未解決チケット (優先度別色付け, グループのヘッダでマイルストーンにリンク)'' |
| 201 | {{{ |
| 202 | SELECT p.value AS __color__, |
| 203 | t.milestone AS __group__, |
| 204 | '../milestone/' || t.milestone AS __grouplink__, |
| 205 | (CASE owner WHEN 'daniel' THEN 'font-weight: bold; background: red;' ELSE '' END) AS __style__, |
| 206 | t.id AS ticket, summary |
| 207 | FROM ticket t,enum p |
| 208 | WHERE t.status IN ('new', 'assigned', 'reopened') |
| 209 | AND p.name=t.priority AND p.type='priority' |
| 210 | ORDER BY t.milestone, p.value, t.severity, t.time |
| 211 | }}} |
| 212 | |
| 213 | '''Note:''' ''ticket'' 表の優先度に対応する数値は、 ''enum'' 表を結合することで |
| 214 | 取り出しています。 |
| 215 | |
| 216 | === 行単位のレイアウト変更 === #column-syntax |
| 217 | デフォルトでは、全てのカラムで1行を使い、上記の指定がされていれば、 |
| 218 | フォーマットされた形式で HTML に表示されます。それだけでなく、 |
| 219 | これから挙げる指定によって、複数行にわたってのレイアウトを行うことができます。 |
| 220 | |
| 221 | * '''`column_`''' — ''改行''。 カラム名の語尾にアンダースコア ('_') を付与した場合、以降のカラムは次の行で表示されます |
| 222 | |
| 223 | * '''`_column_`''' — ''全行表示''。 カラム名の前後にアンダースコア ('_') を付与した場合、そのカラムは続く行で全てのカラム幅を使って表示されます |
| 224 | |
| 225 | * '''`_column`''' — ''データを非表示にする''。 カラム名の語頭にアンダースコア ('_') を付与した場合、 HTML 出力では非表示になります。これは (CSV や RSS のような) 別フォーマットでのダウンロード時にだけ見たい情報であるときに使います |
| 226 | この機能ではあらゆるカラムを非表示にできます。リソースの特定などで他のカラムが異存しているような場合に有用です。たとえば `id as _id` とすることで、 '''Id''' カラムは非表示となりますが、チケットへのリンクは正しく生成されます |
| 227 | |
| 228 | '''例:''' ''アクティブなチケットを、マイルストーンでグループ化し、優先度で色付け、チケットの説明を multi-line レイアウトでリスト表示する'' |
| 229 | |
| 230 | {{{ |
| 231 | SELECT p.value AS __color__, |
| 232 | t.milestone AS __group__, |
| 233 | (CASE owner |
| 234 | WHEN 'daniel' THEN 'font-weight: bold; background: red;' |
| 235 | ELSE '' END) AS __style__, |
| 236 | t.id AS ticket, summary AS summary_, -- ## ここで改行する |
| 237 | component,version, severity, milestone, status, owner, |
| 238 | time AS created, changetime AS modified, -- ## 日付形式で整形 |
| 239 | description AS _description_, -- ## 全行を使用して表示 |
| 240 | changetime AS _changetime, reporter AS _reporter -- ## HTML 出力では表示しない |
| 241 | FROM ticket t,enum p |
| 242 | WHERE t.status IN ('new', 'assigned', 'reopened') |
| 243 | AND p.name=t.priority AND p.type='priority' |
| 244 | ORDER BY t.milestone, p.value, t.severity, t.time |
| 245 | }}} |
| 246 | |
| 247 | === カスタムフィールドをレポートで使用する === #Reportingoncustomfields |
| 248 | |
| 249 | チケットにカスタムフィールドを追加した場合(バージョン 0.8 以降の機能。 TracTicketsCustomFields 参照)、カスタムフィールドを含む SQL クエリを書くことができます。 ticket_custom テーブルを join をする必要がありますが、これは取り立てて簡単というわけではありません。 |
| 250 | |
| 251 | 追加のフィールドを trac.ini に宣言する ''前に'' 、チケットがデータベースに存在する場合、 ticket_custom テーブルには関連するデータを持たないことになります。これに起因する問題を回避するためには SQL の "LEFT OUTER JOIN" 節を使用してください。 |
| 252 | |
| 253 | === SQLの書き換えについて #rewriting |
| 254 | 動的変数の比較的些細な変更によって、SQL クエリもレポートの2つの特徴のサポートのために変更されます: |
| 255 | 1. [#sort-order ソート順の変更] |
| 256 | 2. ページネーションのサポート (各ページの表示結果の行数の制約) |
| 257 | 一つ目の特徴をサポートするために、__group__`カラムが指定される場合にはソートカラムは `ORDER BY` 節の中の先頭位置か二番目の位置に挿入されます(必要に応じて `ORDER BY` 節は作成されます)。 ページネーションをサポートするために、 `LIMIT ... OFFSET ...` 節が追加されます。 |
| 258 | クエリは自動書き換えの機能が正常に働くには複雑すぎて、クエリは間違った結果になるかもしれません。この場合、手動で下記のトークンを挿入することにより、書き直しがどのように行われるか正確にコントロールできる可能性があります: |
| 259 | - `@SORT_COLUMN@`, ソートしたいカラム名です, |
| 260 | - `@LIMIT_OFFSET@`, ページネーションのサポートの節です |
| 261 | Note: もしSQLコメント `--` の後に記述すると、意図したとおりの書き換えが事実上不可能になります! |
| 262 | |
| 263 | SQL query の例: |
| 264 | {{{ |
| 265 | -- ## 4: 担当者がアサインしたアクティブなチケット ## -- |
| 266 | |
| 267 | -- |
| 268 | -- アサインされたチケットのリスト、チケットの担当者によるグループ化、優先度によるソート |
| 269 | -- |
| 270 | |
| 271 | SELECT p.value AS __color__, |
| 272 | owner AS __group__, |
| 273 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 274 | changetime AS _changetime, description AS _description, |
| 275 | reporter AS _reporter |
| 276 | FROM ticket t,enum p |
| 277 | WHERE status = 'assigned' |
| 278 | AND p.name=t.priority AND p.type='priority' |
| 279 | ORDER BY __group__, p.value, severity, time |
| 280 | }}} |
| 281 | |
| 282 | 自動書き換えの例(1ページにつき4行、2ページ、`component` によるソート): |
| 283 | {{{ |
| 284 | SELECT p.value AS __color__, |
| 285 | owner AS __group__, |
| 286 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 287 | changetime AS _changetime, description AS _description, |
| 288 | reporter AS _reporter |
| 289 | FROM ticket t,enum p |
| 290 | WHERE status = 'assigned' |
| 291 | AND p.name=t.priority AND p.type='priority' |
| 292 | ORDER BY __group__ ASC, `component` ASC, __group__, p.value, severity, time |
| 293 | LIMIT 4 OFFSET 4 |
| 294 | }}} |
| 295 | |
| 296 | 書き換えのトークンと等しいSQLクエリの例: |
| 297 | {{{ |
| 298 | SELECT p.value AS __color__, |
| 299 | owner AS __group__, |
| 300 | id AS ticket, summary, component, milestone, t.type AS type, severity, time AS created, |
| 301 | changetime AS _changetime, description AS _description, |
| 302 | reporter AS _reporter |
| 303 | FROM ticket t,enum p |
| 304 | WHERE status = 'assigned' |
| 305 | AND p.name=t.priority AND p.type='priority' |
| 306 | ORDER BY __group__, @SORT_COLUMN@, p.value, severity, time |
| 307 | @LIMIT_OFFSET@ |
| 308 | }}} |
| 309 | |
| 310 | もし、最初に常に優先度によるソートを、そしてその次にユーザが選択したカラムによるソートを希望するならば、シンプルに下記のように `ORDER BY` 節を使用してください: |
| 311 | {{{ |
| 312 | ORDER BY __group__, p.value, @SORT_COLUMN@, severity, time |
| 313 | }}} |
| 314 | |
| 315 | ---- |
| 316 | See also: TracTickets, TracQuery, TracGuide, [http://www.sqlite.org/lang_expr.html Query Language Understood by SQLite] |