|  | 1 | = Trac Reports = | 
          
            |  | 2 | [[TracGuideToc]] | 
          
            |  | 3 |  | 
          
            |  | 4 | The Trac reports module provides a simple, yet powerful reporting facility | 
          
            |  | 5 | to present information about tickets in the Trac database. | 
          
            |  | 6 |  | 
          
            |  | 7 | Rather than have its own report definition format, TracReports relies on standard SQL | 
          
            |  | 8 | SELECT statements for custom report definition. | 
          
            |  | 9 |  | 
          
            |  | 10 | A report consists of these basic parts: | 
          
            |  | 11 | * ID -- Unique (sequential) identifier | 
          
            |  | 12 | * Title  -- Descriptive title | 
          
            |  | 13 | * Description  -- A brief description of the report, in WikiFormatting text. | 
          
            |  | 14 | * Report Body -- List of results from report query, formatted according to the methods described below. | 
          
            |  | 15 | * Footer -- Links to alternative download formats for this report. | 
          
            |  | 16 |  | 
          
            |  | 17 |  | 
          
            |  | 18 | == Changing Sort Order == | 
          
            |  | 19 | Simple reports - ungrouped reports to be specific - can be changed to be sorted by any column simply by clicking the column header. | 
          
            |  | 20 |  | 
          
            |  | 21 | If a column header is a hyperlink (red), click the column you would like to sort by. Clicking the same header again reverses the order. | 
          
            |  | 22 |  | 
          
            |  | 23 |  | 
          
            |  | 24 | == Alternate Download Formats == | 
          
            |  | 25 | Aside from the default HTML view, reports can also be exported in a number of alternate formats. | 
          
            |  | 26 | At the bottom of the report page, you will find a list of available data formats. Click the desired link to | 
          
            |  | 27 | download the alternate report format. | 
          
            |  | 28 |  | 
          
            |  | 29 | === Comma-delimited - CSV (Comma Separated Values) === | 
          
            |  | 30 | Export the report as plain text, each row on its own line, columns separated by a single comma (','). | 
          
            |  | 31 | '''Note:''' Column data is stripped from carriage returns, line feeds and commas to preserve structure. | 
          
            |  | 32 |  | 
          
            |  | 33 | === Tab-delimited === | 
          
            |  | 34 | Like above, but uses tabs (\t) instead of comma. | 
          
            |  | 35 |  | 
          
            |  | 36 | === RSS - XML Content Syndication === | 
          
            |  | 37 | All reports support syndication using XML/RSS 2.0. To subscribe to a , click the the orange 'XML' icon at the bottom of the page. See TracRss for general information on RSS support in Trac. | 
          
            |  | 38 |  | 
          
            |  | 39 | ---- | 
          
            |  | 40 | == Creating Custom Reports == | 
          
            |  | 41 |  | 
          
            |  | 42 | ''Creating a custom report requires a comfortable knowledge of SQL.'' | 
          
            |  | 43 |  | 
          
            |  | 44 | A report is basically a single named SQL query, executed and presented by | 
          
            |  | 45 | Trac.  Reports can be viewed and created from a custom SQL expression directly | 
          
            |  | 46 | in from the web interface. | 
          
            |  | 47 |  | 
          
            |  | 48 | Typically, a report consists of a SELECT-expression from the 'ticket' table, | 
          
            |  | 49 | using the available columns and sorting the way you want it. | 
          
            |  | 50 |  | 
          
            |  | 51 | == Ticket columns == | 
          
            |  | 52 | The ''ticket'' table has the following columns: | 
          
            |  | 53 | * id | 
          
            |  | 54 | * time | 
          
            |  | 55 | * changetime | 
          
            |  | 56 | * component | 
          
            |  | 57 | * severity | 
          
            |  | 58 | * priority | 
          
            |  | 59 | * owner | 
          
            |  | 60 | * reporter | 
          
            |  | 61 | * cc | 
          
            |  | 62 | * url | 
          
            |  | 63 | * version | 
          
            |  | 64 | * milestone | 
          
            |  | 65 | * status | 
          
            |  | 66 | * resolution | 
          
            |  | 67 | * summary | 
          
            |  | 68 | * description | 
          
            |  | 69 |  | 
          
            |  | 70 | See TracTickets for a detailed description of the column fields. | 
          
            |  | 71 |  | 
          
            |  | 72 | '''all active tickets, sorted by priority and time''' | 
          
            |  | 73 |  | 
          
            |  | 74 | '''Example:''' ''All active tickets, sorted by priority and time'' | 
          
            |  | 75 | {{{ | 
          
            |  | 76 | SELECT id AS ticket, status, severity, priority, owner, | 
          
            |  | 77 | time as created, summary FROM ticket | 
          
            |  | 78 | WHERE status IN ('new', 'assigned', 'reopened') | 
          
            |  | 79 | ORDER BY priority, time | 
          
            |  | 80 | }}} | 
          
            |  | 81 |  | 
          
            |  | 82 |  | 
          
            |  | 83 | ---- | 
          
            |  | 84 |  | 
          
            |  | 85 |  | 
          
            |  | 86 | == Advanced Reports: Dynamic Variables == | 
          
            |  | 87 | For more flexible reports, Trac supports the use of ''dynamic variables'' in report SQL statements. | 
          
            |  | 88 | In short, dynamic variables are ''special'' strings that are replaced by custom data before query execution. | 
          
            |  | 89 |  | 
          
            |  | 90 | === Using Variables in a Query === | 
          
            |  | 91 | The syntax for dynamic variables is simple, any upper case word beginning with '$' is considered a variable. | 
          
            |  | 92 |  | 
          
            |  | 93 | Example: | 
          
            |  | 94 | {{{ | 
          
            |  | 95 | SELECT id AS ticket,summary FROM ticket WHERE priority='$PRIORITY' | 
          
            |  | 96 | }}} | 
          
            |  | 97 |  | 
          
            |  | 98 | To assign a value to $PRIORITY when viewing the report, you must define it as an argument in the report URL, leaving out the the leading '$'. | 
          
            |  | 99 |  | 
          
            |  | 100 | Example: | 
          
            |  | 101 | {{{ | 
          
            |  | 102 | http://projects.edgewall.com/trac/reports/14?PRIORITY=high | 
          
            |  | 103 | }}} | 
          
            |  | 104 |  | 
          
            |  | 105 |  | 
          
            |  | 106 | === Special/Constant Variables === | 
          
            |  | 107 | There is one ''magic'' dynamic variable to allow practical reports, its value automatically set without having to change the URL. | 
          
            |  | 108 |  | 
          
            |  | 109 | * $USER -- Username of logged in user. | 
          
            |  | 110 |  | 
          
            |  | 111 | Example (''List all tickets assigned to me''): | 
          
            |  | 112 | {{{ | 
          
            |  | 113 | SELECT id AS ticket,summary FROM ticket WHERE owner='$USER' | 
          
            |  | 114 | }}} | 
          
            |  | 115 |  | 
          
            |  | 116 |  | 
          
            |  | 117 | ---- | 
          
            |  | 118 |  | 
          
            |  | 119 |  | 
          
            |  | 120 | == Advanced Reports: Custom Formatting == | 
          
            |  | 121 | Trac is also capable of more advanced reports, including custom layouts, | 
          
            |  | 122 | result grouping and user-defined CSS styles. To create such reports, we'll use | 
          
            |  | 123 | specialized SQL statements to control the output of the Trac report engine. | 
          
            |  | 124 |  | 
          
            |  | 125 | == Special Columns == | 
          
            |  | 126 | To format reports, TracReports looks for 'magic' column names in the query | 
          
            |  | 127 | result. These 'magic' names are processed and affect the layout and style of the | 
          
            |  | 128 | final report. | 
          
            |  | 129 |  | 
          
            |  | 130 | === Automatically formatted columns === | 
          
            |  | 131 | * '''ticket''' -- Ticket ID number. Becomes a hyperlink to that ticket. | 
          
            |  | 132 | * '''created, modified, date, time''' -- Format cell as a date and/or time. | 
          
            |  | 133 |  | 
          
            |  | 134 | * '''description''' -- Ticket description field, parsed through the wiki engine. | 
          
            |  | 135 |  | 
          
            |  | 136 | '''Example:''' | 
          
            |  | 137 | {{{ | 
          
            |  | 138 | SELECT id as ticket, created, status, summary FROM ticket | 
          
            |  | 139 | }}} | 
          
            |  | 140 |  | 
          
            |  | 141 | === Custom formatting columns === | 
          
            |  | 142 | Columns whose names begin and end with 2 underscores (Example: '''_''''''_color_''''''_''') are | 
          
            |  | 143 | assumed to be ''formatting hints'', affecting the appearance of the row. | 
          
            |  | 144 |  | 
          
            |  | 145 | * '''_''''''_group_''''''_''' -- Group results based on values in this column. Each group will have its own header and table. | 
          
            |  | 146 | * '''_''''''_color_''''''_''' -- Should be a numeric value ranging from 1 to 5 to select a pre-defined row color. Typically used to color rows by issue priority. | 
          
            |  | 147 | * '''_''''''_style_''''''_''' -- A custom CSS style expression to use for the current row. | 
          
            |  | 148 |  | 
          
            |  | 149 | '''Example:''' ''List active tickets, grouped by milestone, colored by priority'' | 
          
            |  | 150 | {{{ | 
          
            |  | 151 | SELECT p.value AS __color__, | 
          
            |  | 152 | t.milestone AS __group__, | 
          
            |  | 153 | (CASE owner WHEN 'daniel' THEN 'font-weight: bold; background: red;' ELSE '' END) AS __style__, | 
          
            |  | 154 | t.id AS ticket, summary | 
          
            |  | 155 | FROM ticket t,enum p | 
          
            |  | 156 | WHERE t.status IN ('new', 'assigned', 'reopened') | 
          
            |  | 157 | AND p.name=t.priority AND p.type='priority' | 
          
            |  | 158 | ORDER BY t.milestone, p.value, t.severity, t.time | 
          
            |  | 159 | }}} | 
          
            |  | 160 |  | 
          
            |  | 161 | '''Note:''' A table join is used to match ''ticket'' priorities with their | 
          
            |  | 162 | numeric representation from the ''enum'' table. | 
          
            |  | 163 |  | 
          
            |  | 164 | === Changing layout of report rows === | 
          
            |  | 165 | By default, all columns on each row are display on a single row in the HTML | 
          
            |  | 166 | report, possibly formatted according to the descriptions above. However, it's | 
          
            |  | 167 | also possible to create multi-line report entries. | 
          
            |  | 168 |  | 
          
            |  | 169 | * '''column_''' -- ''Break row after this''. By appending an underscore ('_') to the column name, the remaining columns will be be continued on a second line. | 
          
            |  | 170 |  | 
          
            |  | 171 | * '''_column_''' -- ''Full row''. By adding an underscore ('_') both at the beginning and the end of a column name, the data will be shown on a separate row. | 
          
            |  | 172 |  | 
          
            |  | 173 | * '''_column'''  --  ''Hide data''. Prepending an underscore ('_') to a column name instructs Trac to hide the contents from the HTML output. This is useful for information to be visible only if downloaded in other formats (like CSV or RSS/XML). | 
          
            |  | 174 |  | 
          
            |  | 175 | '''Example:''' ''List active tickets, grouped by milestone, colored by priority, with  description and multi-line layout'' | 
          
            |  | 176 |  | 
          
            |  | 177 | {{{ | 
          
            |  | 178 | SELECT p.value AS __color__, | 
          
            |  | 179 | t.milestone AS __group__, | 
          
            |  | 180 | (CASE owner | 
          
            |  | 181 | WHEN 'daniel' THEN 'font-weight: bold; background: red;' | 
          
            |  | 182 | ELSE '' END) AS __style__, | 
          
            |  | 183 | t.id AS ticket, summary AS summary_,             -- ## Break line here | 
          
            |  | 184 | component,version, severity, milestone, status, owner, | 
          
            |  | 185 | time AS created, changetime AS modified,         -- ## Dates are formatted | 
          
            |  | 186 | description AS _description_,                    -- ## Uses a full row | 
          
            |  | 187 | changetime AS _changetime, reporter AS _reporter -- ## Hidden from HTML output | 
          
            |  | 188 | FROM ticket t,enum p | 
          
            |  | 189 | WHERE t.status IN ('new', 'assigned', 'reopened') | 
          
            |  | 190 | AND p.name=t.priority AND p.type='priority' | 
          
            |  | 191 | ORDER BY t.milestone, p.value, t.severity, t.time | 
          
            |  | 192 | }}} | 
          
            |  | 193 |  | 
          
            |  | 194 |  | 
          
            |  | 195 | ---- | 
          
            |  | 196 | See also: TracTickets, TracQuery, TracGuide |