|
- 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 :class:`_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'});
-
- // add a "Company" filter
- this.filter_fields_dict['Account'+FILTER_SEP +'Company'].df.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
- ------------------
-
- .. data:: _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()
-
- .. data:: rb_dict
-
- Dictionary of all ReportBuilders. Key is the `DocType`
-
- Report Builder Class
- --------------------
-
- .. class:: _r.ReportBuilder
-
- .. data:: large_report
-
- Flag indicating a report with many records as output. This will force the user to use "Export" only
-
- .. data:: filter_fields
-
- List of all filter fields
-
- .. data:: filter_fields_dict
-
- Dictionary of all filter fields. The key of this dictionary is the doctype + `FILTER_SEP` + label
-
- .. data:: dt
-
- Reference to the :class:`_r.Datatable` object of the Report Builder
-
- .. data:: 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'])
-
- .. function:: 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.
-
- .. function:: hide_all_filters()
-
- Will set the `df`.`filter_hide` property and hide all filters
-
- .. function:: set_column(doctype, label, value)
-
- Select / unselect a column. `value` must be 0 or 1
-
- .. function:: set_filter(doctype, label, value)
-
- Set the value of a filter
-
- .. function:: add_filter(f)
-
- Add a filter in the by specifying the field properties in a dictionary.
-
- .. function:: 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
-
- .. function:: 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`');
-
- .. function:: set_sort_option_disabled(label, disabled)
-
- Will enable / disable sort option by label. To disable, pass disabled = 1 or to enable pass disabled = 0
-
- .. attribute:: query
-
- Query to be executed (the paging using `LIMIT` & sorting is managed by the datatable)
-
- .. attribute:: page_len
-
- Length of a page (default 50)
-
- .. method:: set_no_limit(value)
-
- Run the query without adding limits if value = 1, (if value=0) run as standard, with limits
-
- .. method:: run
-
- Execute the query
-
|