# # # # get_breakdown_info() # # # include "templates.util.base_util"; include "templates.util.report_filters.create_filter_expression"; # Get the breakdown item from the given raw report element and create a filter expression # for the breakdown item including any additional string items in the given row. # Set the item name and filter_expression in the breakdown_info node. subroutine(get_breakdown_info( string session_id, bool is_root_admin, string profile_name, string raw_report_element_id, int raw_row_number, node breakdown_info), ( debug_message("\n\n#### get_breakdown_info START \n\n"); node raw_report_element = "profiles_cache." . profile_name . ".raw_report_elements." . raw_report_element_id; node query_fields = get_query_fields(session_id, is_root_admin, profile_name); node raw_header = raw_report_element{"header"}; # node active_raw_row_columns = raw_report_element . ".rows." . raw_row_number . ".columns"; int breakdown_column_number; # string breakdown_report_field_name; string breakdown_filter_item_value; string filter_item_value; node header_item; string column_type; string report_field_name; string column_number; string item_value; # string database_field_name; # string report_field_category; delete_node("v.breakdown_filter_items"); v.breakdown_filter_items = ""; node breakdown_filter_items = "v.breakdown_filter_items"; int filter_item_count = 0; # # We create a filter items node for the breakdown filter # and any other filter items in the given raw report element row # foreach header_item raw_header ( column_type = @header_item{"column_type"}; if ((column_type eq "text") or (column_type eq "breakdown")) then ( report_field_name = @header_item{"report_field_name"}; column_number = node_name(header_item); item_value = @(raw_report_element . ".rows." . raw_row_number . ".columns." . column_number); breakdown_filter_items . "." . filter_item_count . ".expression_type" = ""; breakdown_filter_items . "." . filter_item_count . ".field_name" = report_field_name; breakdown_filter_items . "." . filter_item_count . ".filter_type" = "field"; breakdown_filter_items . "." . filter_item_count . ".is_negated" = false; breakdown_filter_items . "." . filter_item_count . ".item_value" = item_value; if (column_type eq "breakdown") then ( breakdown_filter_item_value = item_value; string breakdown_database_field_name = @(query_fields . "." . report_field_name . ".database_field_name"); ); filter_item_count++; ); ); debug_message("#### breakdown_filter_item_value: " . breakdown_filter_item_value . "\n\n"); debug_message("\n\n" . node_as_string(breakdown_filter_items) . "\n\n"); # # Create the filter expression from breakdown_filter_items # node filter_expression_result = create_filter_expression(query_fields, breakdown_filter_items, false); string filter_expression = @filter_expression_result{"expression"}; # # Collect any additional filter item values so that we can display them next to the breakdown value # string additional_filter_item_values; if (num_subnodes(breakdown_filter_items) > 1) then ( node filter_item; foreach filter_item breakdown_filter_items ( if (@filter_item{"item_value"} ne breakdown_filter_item_value) then ( additional_filter_item_values .= @filter_item{"item_value"} . ", "; ); ); additional_filter_item_values = replace_last(additional_filter_item_values, ", ", ""); ); set_subnode_value(breakdown_info, "item_value", breakdown_filter_item_value); # required to set volatile.breakdown and for display! set_subnode_value(breakdown_info, "database_field", breakdown_database_field_name); # required to set volatile.breakdown! set_subnode_value(breakdown_info, "filter_expression", filter_expression); set_subnode_value(breakdown_info, "additional_filter_item_values", additional_filter_item_values); # required for display only! debug_message("\n" . node_as_string(breakdown_info) . "\n"); debug_message("\n#### get_breakdown_info END \n\n"); ));