Table Of Contents

Previous topic

Form Widget API

Next topic

Dialog Boxes

This Page

Report Builder

The Report Builder structure is as follows:

+- Report Builder Container
   |
   +- Report Builder (DocType 1)
   |  |
   |  +- DataTable (Output grid)
   |
   +- Report Bulder (DocType 2)
   |
   ..
   ..

Search Criteria

Reports with selected columns and filters can be saved by clicking on the “Save” link on the top bar of the Report Builder. The report is saved in a record called Search Criteria. Client-side and server-side scripts can be plugged in by using the Search Criteria.

Customizing Filters

Customizing of filters is done by declaring the report.customize_filters method in the client side of the Search Critiera.

  • Individual filters in the Report Builder can be accessed by the filter_fields_dict. The filter_fields_dict returns a _f.Field object.
  • Filters can be added by using the add_filter method
  • The filters can be customized by setting properties on the df dictionary of the field object.

Custom properties of filter fields are

  • filter_hide - Hide this standard filter
  • in_first_page - Show this filter in the first page
  • report_default - Set the value as the default for the filter
  • insert_before - Insert this filter before the fieldname identified by this property
  • ignore - Ignore this field while building the query
  • custom - A property that indicates whether the filter is a custom filter (not a standard field)

Example:

report.customize_filters = function() {
  // hide exiting filters
  this.hide_all_filters();

  // add a new filter
  this.add_filter({fieldname:'show_group_balance', label:'Show Group Balance', fieldtype:'Select', options:NEWLINE+'Yes'+NEWLINE+'No',ignore : 1, parent:'Account'});

  // show a filter
  this.set_filter_properties('Account','Company',{filter_hide: 0});

  // remove limts - show all records
  this.dt.set_no_limit(1);

  // hide tabs
  $dh(this.mytabs.tabs['Select Columns'])

}

Scrubbing / modifying data from the query

The query can be scrubbed on the server side in Python before it. The result data is available as a list-in-a-list res. The output can be modified by updating res or declaring a new list-in-a-list out

Standard lists, dictionary that can be updated

  • col_idx - Index of columns by label
  • colwidths - list of column widths
  • colnames - list of column names
  • coltypes - list of column types
  • colwidths - list of column options
  • filter_values - dictionary containing values of all filters

Example - adding a column:

colnames.append('Total')
coltypes.append('Currency')
colwidths.append('120px')
coloptions.append('')

# set the index
col_idx[c[0]] = len(colnames)-1

Example - adding the column data:

sum = 0
for r in res:
  # get the total as sum of 2 columns
  t = r[col_idx['Val 1']] + r[col_idx['Val 2']]
  sum += t

  # add it to the record
  r.push(t)

Example - getting value from a filter:

if filter_values.get('Show sum')=='Yes':

  res.append(['','','', sum])

Adding style to the result

Style can be set on a row by declaring the beforerowprint method in the Client Script of the Search Criteria Example:

// Example 1: set foreground
report.beforerowprint = function(row){
  if(row.data[‘Amount’] > 20000) {
    row.style.color = ‘GREEN’;
  }
}

// Example 2: set background
report.beforerowprint = function(row){
  if(row.data[‘Amount’] < 1000) {
    row.style.backgroundColor = ‘#FDD’;
  }
}

Generating a query by script from client side

A query can be generated from a script from the client side like in Listing by declaring the get_query method. Note: Do not put ORDER BY and LIMIT as they would be appended by the Report Builder. There are 2 useful lists

  • report.selected_fields - list of selected fields in Table_Name.`field_name` format
  • report.filter_vals - dictionary of filter keys and values

Example:

report.get_query = function() {
      var query = 'SELECT ' + report.selected_fields.join(', ') +  'FROM `tab..` WHERE ...';
      return query;
}

Report Builder API

_r
Namespace for all objects related to Report Builder

Report Builder Container

The Report Builder Container is the object that contains ReportBuilder objects for each DocType. This object is managed automatically by the Framework

class _r.ReportBuilderContainer
rb_dict
Dictionary of all ReportBuilders. Key is the DocType

Report Builder Class

class _r.ReportBuilder
large_report
Flag indicating a report with many records as output. This will force the user to use “Export” only
filter_fields
List of all filter fields
filter_fields_dict
Dictionary of all filter fields. The key of this dictionary is the doctype + FILTER_SEP + label
dt
Reference to the _r.Datatable object of the Report Builder
mytabs

TabbedPage object representing the tabs of the Report Builder. This can be used to hide / show tabs from the Client Script in the report like:

$dh(this.mytabs.tabs['Select Columns'])
customize_filters(report)
The method is called when a new report or Search Criteria is loaded. The method (if exists) is usually used to customize filters as per the user requirments.
hide_all_filters()
Will set the df.`filter_hide` property and hide all filters
set_column(doctype, label, value)
Select / unselect a column. value must be 0 or 1
set_filter(doctype, label, value)
Set the value of a filter
set_filter_properties(doctype, label, property_dict)
Set field properties on a filter as specified in property dict
add_filter(f)
Add a filter in the by specifying the field properties in a dictionary.
get_filter(doctype, label)
Returns the Field object of that filter
run()
Execute the report

Datatable Class

class _r.Datatable(html_fieldname, dt, repname, hide_toolbar)

The datatable class represents a grid object to show the results with paging etc

add_sort_option(label, value)

Add a new field for sorting selection - value is the tablename.fieldname for the “ORDER BY” clause:

report.dt.add_sort_option('ID','`tabMyDT`.`name`');
set_sort_option_disabled(label, disabled)
Will enable / disable sort option by label. To disable, pass disabled = 1 or to enable pass disabled = 0
query
Query to be executed (the paging using LIMIT & sorting is managed by the datatable)
page_len
Length of a page (default 50)
set_no_limit(value)
Run the query without adding limits if value = 1, (if value=0) run as standard, with limits
run()
Execute the query