Пример #1
0
        }//End getFlatSection class

        //  =================================================================================
        /// <summary>
        /// This class obtains the maximun coloum span for this section.
        /// Usually is the amount of colums of the detail of the report.
        /// </summary>
        /// <param name="section">EvReportSection: a report section</param>
        /// <returns>integer: a maximum column span number</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Validate whether the column details is not null
        ///
        /// 2. Iterate over all of the detail columns,
        ///
        /// 3. Only add the not hidden columns to the span value.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private static int getMaxColSpan(EvReportSection section)
        {
            int span = 0;

            //
            // Since the report is on big table, the upper sections should
            // span to the number of columns in the detail.
            //
            if (section.DetailColumnsList != null)
            {
                //
                // Iterate over all of the detail columns,
                // but only add the not hidden columns to the span value.
                //
                for (int i = 0; i < section.DetailColumnsList.Count; i++)
                {
                    EvReportColumn column = (EvReportColumn)section.DetailColumnsList [i];

                    if (column.DataType != EvReport.DataTypes.Hidden)
                    {
                        span++;
                    }
                }
            }
            return(span);
        }//End getMaxColSpan class
Пример #2
0
        } //END getsection method

        //===================================================================================
        /// <summary>
        /// This class paints the section in a flat format.
        /// </summary>
        /// <param name="section">EvReportSection: a section to be painted</param>
        /// <returns>string: a flate section</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a csv string and a columnlist array.
        ///
        /// 2. Go through all of the columns of this report.
        ///
        /// 3. Format the current column with header, separator and format text
        ///
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private string getFlatSection(EvReportSection section)
        {
            //
            // Initialize a csv string and a columnlist array.
            //
            String    stCsv      = String.Empty;
            ArrayList columnList = section.ColumnList;

            stCsv += "\n";

            //
            // Go through all of the columns of this report.
            //
            for (int i = 0; i < columnList.Count; i++)
            {
                //
                // Format the current column with header, separator and format text
                //
                EvReportColumn currentColumn = (EvReportColumn)columnList [i];
                stCsv += getTextCSV(currentColumn.HeaderText)
                         + _separator
                         + formatText((string)section.ColumnValuesByHeaderText [currentColumn.HeaderText], currentColumn.DataType)
                         + "\n";
            }

            return(stCsv);
        } //END getflatsection method.
Пример #3
0
        /// <summary>
        /// This class obtains the section header. The hader depends of the type of the section.
        /// AFC 6 nov 2009
        /// </summary>
        /// <param name="section">EvReportSection: section</param>
        /// <returns>String: a section tabular header</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Loop through the columnlist of the section and validate a hidden column
        ///
        /// 2. Generate header cells
        /// </remarks>
        private String getSectionHeader(EvReportSection section)
        {
            this.writeDebugLogMethod("getSectionHeader method.");
            string stHtml = String.Empty;

            if (section.Layout == EvReportSection.LayoutTypes.Tabular)
            {
                stHtml = "<tr>";

                //
                // Loop through the columnlist of the section and validate a hidden column
                //
                for (int i = 0; i < section.ColumnList.Count; i++)
                {
                    EvReportColumn currentColumn = (EvReportColumn)section.ColumnList [i];

                    //
                    // If the column is hiddent don't process it at all.
                    //
                    if (currentColumn.DataType == EvReport.DataTypes.Hidden)
                    {
                        continue;
                    }

                    //
                    // Generate the header cells
                    //
                    String headerCell = "<td class='Rpt_Header' ";

                    if (currentColumn.StyleWidth != String.Empty)
                    {
                        headerCell += "style='width:" + currentColumn.StyleWidth + "'";
                    }

                    headerCell += ">" + currentColumn.HeaderText + "</td>\r\n";

                    //
                    // If the headers are only for totals, and the grouping type is none, then dont show the header.
                    //
                    if (section.OnlyShowHeadersForTotalColumns == true)
                    {
                        if (currentColumn.GroupingType == EvReport.GroupingTypes.None)
                        {
                            headerCell = "<td>&nbsp;</td>";
                        }
                    }

                    stHtml += headerCell;
                }

                stHtml += "</tr>\n\r";
            }

            return(stHtml);
        }//END getSectionHeader method.
Пример #4
0
        }//End getTabulatedSection method

        //===================================================================================
        /// <summary>
        /// This class obtains the section header. The hader depends of the type of the section.
        /// Andres Castano 9 nov 2009
        /// </summary>
        /// <param name="section">EvReportSection: a report section</param>
        /// <returns>String: a section header</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a csv string
        ///
        /// 2. Creates the header for a tabular section.
        ///
        /// 3. Iterate over all of the columns until the datatype is not hidden.
        ///
        /// 4. If the headers are totals, and the grouping type is none,
        /// then dont show the header.
        ///
        /// 5. If this is the last value, dont add the separator.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private String getSectionHeader(EvReportSection section)
        {
            //
            // Initialize a csv string
            //
            string stCsv = String.Empty;

            //
            // Creates the header for a tabular section.
            //
            if (section.Layout == EvReportSection.LayoutTypes.Tabular)
            {
                //
                // Iterate over all of the columns until the datatype is not hidden.
                //
                for (int i = 0; i < section.ColumnList.Count; i++)
                {
                    EvReportColumn currentColumn = (EvReportColumn)section.ColumnList [i];

                    if (currentColumn.DataType == EvReport.DataTypes.Hidden)
                    {
                        continue;
                    }

                    String headerText = getTextCSV(currentColumn.HeaderText);

                    //
                    // If the headers are totals, and the grouping type is none,
                    // then dont show the header.
                    //
                    if (section.OnlyShowHeadersForTotalColumns == true)
                    {
                        if (currentColumn.GroupingType == EvReport.GroupingTypes.None)
                        {
                            headerText = String.Empty;
                        }
                    }

                    stCsv += headerText;

                    //
                    // If this is the last value, dont add the separator.
                    //
                    if (i < section.ColumnList.Count - 1)
                    {
                        stCsv += _separator;
                    }
                }// End of headers loop

                stCsv += "\n";
            }// End of if it is tabular

            return(stCsv);
        }//End getSectionHeader method
Пример #5
0
        }     //End getFormattedValue class

        //  =================================================================================
        /// <summary>
        /// This method paints the section in a flat format.
        /// </summary>
        /// <param name="section">EvReportSection: a section to be painted</param>
        /// <returns>string: a flat section of the report</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a html string, a columnlist array and a span number
        ///
        /// 2. Go through all of the columns of this report.
        ///
        /// 3. If it is the first row, then open a new table row
        ///
        /// 4. Append a span class to the html string
        ///
        /// 5. If it is not the last row, then break line, else close table row.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private string getFlatSection(EvReportSection section)
        {
            this.writeDebugLogMethod("getFlatSection method.");
            //
            // Initialize a html string, a columnlist array and a span number
            //
            String    stHtml     = String.Empty;
            ArrayList columnList = section.ColumnList;
            int       span       = getMaxColSpan(section);

            //
            // Go through all of the columns of this report.
            //
            for (int i = 0; i < columnList.Count; i++)
            {
                //
                // If it is the first row, then open a new table row
                //
                if (i == 0)
                {
                    stHtml += "<tr>\n\r"
                              + "<td colspan='" + span + "' class='" + getClassNameForFlatRow(section.SectionLevel) + "'>";
                }

                EvReportColumn currentColumn = (EvReportColumn)columnList [i];

                //
                // Append a span class to the html string
                //
                stHtml += "<span class='Flat_Rpt_Field_Name'>" + currentColumn.HeaderText + ": </span><span class='Flat_Rpt_Field_Value'> "
                          + formatUsingMask((String)section.ColumnValuesByHeaderText [currentColumn.HeaderText], currentColumn)
                          + "</span>";

                //
                // If it is not the last row, then break line, else close table row.
                //
                if (i != columnList.Count - 1)
                {
                    stHtml += "<br>";
                }
                else
                {
                    stHtml += "</td></tr>\n\r";
                }
            }

            return(stHtml);
        }//End getFlatSection class
Пример #6
0
        }//End getMaxColSpan class

        //  =================================================================================
        /// <summary>
        /// This class formats the string value using the pattern
        /// </summary>
        /// <param name="value">String: value to be formatted in its string representation</param>
        /// <param name="column">EvReportColumn: a column object</param>
        /// <returns>string: a string format using mask</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a pattern string
        ///
        /// 2. Validate whether the pattern is not null and empty
        ///
        /// 3. Switch the datatype of column and update the numberic value defining by the datatypes.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private string formatUsingMask(String value, EvReportColumn column)
        {
            //
            // Initialize a pattern string
            //
            String pattern = column.ValueFormatingString;

            //
            // Validate whether the pattern is not null and empty
            //
            if (pattern == null || pattern.Equals(String.Empty))
            {
                return(value);
            }

            //
            // Switch the datatype of column and update the numberic value defining by the datatypes.
            //
            switch (column.DataType)
            {
            case EvReport.DataTypes.Currency:
            case EvReport.DataTypes.Float:
            case EvReport.DataTypes.Integer:
            {
                return(EvcStatics.formatDoubleString(value, pattern));
            }

            case EvReport.DataTypes.Date:
            {
                return(EvcStatics.formatDateString(value, pattern));
            }

            default:
            {
                return(value);
            }
            } //END switch
        }     //END formatUsingMask class
Пример #7
0
        } //END getflatsection method.

        //  ================================================================================
        /// <summary>
        /// This class returns the section in a tabulated format.
        /// </summary>
        /// <param name="section">EvReportSection: a section to be painted</param>
        /// <returns>String: a tabulated section</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a csv string and a columnlist array
        ///
        /// 2. Loop through the columnlist array until data type is not hidden
        ///
        /// 3. Convert the csv string into a tabulated format
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private String getTabulatedSection(EvReportSection section)
        {
            //
            // Initialize a csv string and a columnlist array
            //
            String    stCsv      = String.Empty;
            ArrayList columnList = section.ColumnList;

            //
            // Loop through the columnlist array until data type is not hidden
            //
            for (int j = 0; j < columnList.Count; j++)
            {
                EvReportColumn currentColumn = (EvReportColumn)columnList [j];

                if (currentColumn.DataType == EvReport.DataTypes.Hidden)
                {
                    continue;
                }

                //
                // Convert the csv string into a tabulated format
                //
                stCsv += formatText((string)section.ColumnValuesByHeaderText [currentColumn.HeaderText], currentColumn.DataType);

                //
                // If this is the last value, dont add the separator.
                //
                if (j < columnList.Count - 1)
                {
                    stCsv += _separator;
                }
            }//End of columns loop

            stCsv += "\n";
            return(stCsv);
        }//End getTabulatedSection method
Пример #8
0
        // ==================================================================================
        /// <summary>
        /// This is the method who will return the actual text of the report.
        /// Depending on the implementation, it will return an html report,
        /// an xml report a csv report and so on.
        /// </summary>
        /// <returns>string: a report text</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Loads the herarchy model of Section of Objects.
        ///
        /// 2. If there is no data then do not build the report
        ///
        /// 3. Generates the report header. This includes the titles and the queries.
        ///
        /// 4. Generates the grouped report. To pain a flat report,
        /// only the detail should be specified.
        ///
        /// 5. Return the report content formatted as Csv.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        public override string getReportData( )
        {
            this.LogMethod("getReportData method.");
            //
            // Define the methods variables and objects.
            //
            StringBuilder stCsv = new StringBuilder( );

            //
            // If there is no data then do not build the report
            //
            if (this._report == null)
            {
                this.LogValue("No Data.");
                return(String.Empty);
            }

            //
            // Add the query name to the output data.
            //
            String QueryData  = String.Empty;
            int    queryCount = 0;

            foreach (EvReportQuery query in this._report.Queries)
            {
                if (query == null)
                {
                    continue;
                }

                if (query.FieldName != String.Empty)
                {
                    if (queryCount > 0)
                    {
                        QueryData += this._separator;
                    }
                    QueryData += this.getTextCSV("Q:" + query.FieldName);
                }
                queryCount++;
            }//END query header iteration loop.

            if (QueryData != String.Empty)
            {
                stCsv.Append(QueryData);
                stCsv.Append(this._separator);
            }

            //
            // Output the report column header.
            //
            for (int col = 0; col < this._report.Columns.Count; col++)
            {
                EvReportColumn column = this._report.Columns [col];
                if (col > 0)
                {
                    stCsv.Append(this._separator);
                }
                if (column.ColumnId == String.Empty)
                {
                    stCsv.Append(this.getTextCSV(column.SourceField));
                }
                else
                {
                    stCsv.Append(this.getTextCSV(column.ColumnId));
                }
            }
            stCsv.AppendLine("");



            //
            // Add the query values to the output data.
            //
            QueryData  = String.Empty;
            queryCount = 0;
            foreach (EvReportQuery query in this._report.Queries)
            {
                if (query == null)
                {
                    continue;
                }

                if (query.FieldName != String.Empty)
                {
                    if (queryCount > 0)
                    {
                        QueryData += this._separator;
                    }
                    QueryData += this.getTextCSV(query.Value);
                }
                queryCount++;
            }//END query value iteration loop.

            //
            // Output the report data.
            //
            for (int row = 0; row < this._report.DataRecords.Count; row++)
            {
                if (QueryData != String.Empty)
                {
                    stCsv.Append(QueryData);
                    stCsv.Append(this._separator);
                }

                //
                // the row of data.
                //
                EvReportRow rowData = this._report.DataRecords [row];

                //
                // column interation loop.
                //
                for (int col = 0; col < rowData.ColumnValues.Length; col++)
                {
                    if (col > 0)
                    {
                        stCsv.Append(this._separator);
                    }

                    stCsv.Append(this.getTextCSV(rowData.ColumnValues [col]));
                }//END column interation loop.

                stCsv.AppendLine("");
            }//END row interation loop

            //
            // Return the report content formatted as Csv.
            //
            this.LogMethodEnd("getReportData");
            return(stCsv.ToString());
        }//End getReportData class
Пример #9
0
        }//End getSectionHeader method

        //===================================================================================
        /// <summary>
        /// This class adds the total row after a section.
        /// </summary>
        /// <param name="section">EvReportSection: a report section</param>
        /// <returns>String: a total string</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a csv string and a tempRow string.
        ///
        /// 2. Validate whether this section has totals.
        ///
        /// 3. Iterate over all of the details columns.
        ///
        /// 4. If title does not exist, continue loop and
        /// place the total label in this column.
        ///
        /// 5. If the title is already set, then paint the totals.
        ///
        /// 6. If this is the last value, dont add the separator.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private String addTotal(EvReportSection section)
        {
            //
            // Initialize a csv string and a tempRow string.
            //
            string stCsv   = String.Empty;
            string tempRow = String.Empty;

            //
            // Validate whether this section has totals.
            //
            if (section.DetailColumnsList != null && section.Acumulator != null)
            {
                //
                // The title should be set one column before the first total, and should span from the first column to this.
                //
                bool isTitleSet = false;

                //
                // Iterate over all of the details columns.
                //
                for (int j = 0; j < section.DetailColumnsList.Count; j++)
                {
                    //
                    // If there is no title yet and we are not at the end of the array
                    //
                    if (!isTitleSet && (j + 1) < section.DetailColumnsList.Count)
                    {
                        EvReportColumn nextColumn = (EvReportColumn)section.DetailColumnsList [j + 1];

                        //
                        // Obtains the acumulated value for the next column.
                        //
                        String nextValue = (String)section.Acumulator [nextColumn.HeaderText];

                        //
                        // If the accumulated value for the next column is not empty, then place the total label in this column.
                        //
                        if (nextValue != null && nextValue != String.Empty)
                        {
                            if (nextColumn.GroupingType == EvReport.GroupingTypes.Total)
                            {
                                tempRow += getTextCSV("Total " + section.GroupingColumnValue + ":");
                            }
                            else if (nextColumn.GroupingType == EvReport.GroupingTypes.Count)
                            {
                                tempRow += getTextCSV(section.GroupingColumnValue + " total quantity:");
                            }

                            isTitleSet = true;
                        }
                    }

                    //
                    // If the title is already set, then paint the totals.
                    //
                    else
                    {
                        EvReportColumn currentColumn = (EvReportColumn)section.DetailColumnsList [j];
                        String         value         = (String)section.Acumulator [currentColumn.HeaderText];

                        if (value != null)
                        {
                            tempRow += formatText(value, currentColumn.DataType);
                        }
                    }//end if is title set

                    //
                    // If this is the last value, dont add the separator.
                    //
                    if (j < section.DetailColumnsList.Count - 1)
                    {
                        tempRow += _separator;
                    }
                }// end of detail column iteration.

                if (isTitleSet)
                {
                    stCsv = tempRow + "\n";
                }
            }

            return(stCsv);
        }//End Add total
Пример #10
0
        }//End getTabulatedSection class

        //  =================================================================================
        /// <summary>
        /// This class obtains the formatted value of the column. It can be a currency, or a check box etc.
        /// </summary>
        /// <param name="section">EvReportSection: a report section</param>
        /// <param name="column">EvReportColumn: a section column</param>
        /// <returns>string: a formatted value string</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a html string, column value string and column pattern string.
        ///
        /// 2. If a pattern string is not empty, return a formatted value column
        ///
        /// 3. Switch column datatype and update the html string with value defining by datatypes
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private string getFormattedValue(EvReportSection section, EvReportColumn column)
        {
            this.writeDebugLogMethod("getFormattedValue method.");
            //
            // Initialize a html string, column value string and column pattern string.
            //
            String stHtml       = String.Empty;
            string currentValue = (string)section.ColumnValuesByHeaderText [column.HeaderText];
            String pattern      = column.ValueFormatingString == null ? String.Empty : column.ValueFormatingString.Trim( );

            //
            // If a pattern string is not empty, return a formatted value column
            //
            if (pattern != String.Empty)
            {
                String retVal = formatUsingMask(currentValue, column);

                if (retVal.Trim( ) == String.Empty)
                {
                    return("&nbsp;");
                }

                return(retVal);
            }

            //
            // Switch column datatype and update the html string with value defining by datatypes
            //
            switch (column.DataType)
            {
            case EvReport.DataTypes.Bool:
                stHtml += "<input type='checkbox' id='" + column.HeaderText + "-" + section.RowNumber + "' ";
                stHtml += parseBoolean(currentValue) ? "CHECKED " : "";
                stHtml += _report.SelectionOn ? "" : "DISABLED ";
                stHtml += "/>";
                return(stHtml);

            case EvReport.DataTypes.Text:
                stHtml = currentValue;
                stHtml = stHtml.Replace("[[br]]", "[[BR]]");
                stHtml = stHtml.Replace("[[BR]]", "<br/>");
                stHtml = stHtml.Replace("\b", "<br/>");
                return(stHtml);

            case EvReport.DataTypes.Currency:
                return(EvcStatics.formatDoubleString(currentValue, "$###,##0"));

            case EvReport.DataTypes.Date:
                return(EvcStatics.formatDateString(currentValue, "dd/MM/yyyy"));

            case EvReport.DataTypes.Percent:
                try
                {
                    double dVal = double.Parse(currentValue);
                    dVal = dVal / 100;
                    return(dVal.ToString("p1"));
                }
                catch (Exception)
                {
                    return(currentValue);
                }

            default:
                return(currentValue);
            } //END switch
        }     //End getFormattedValue class
Пример #11
0
        }//End addTotal method

        //  =================================================================================
        /// <summary>
        /// This class paints the section in a tabulated format.
        /// </summary>
        /// <param name="section">EvReportSection: a section to be painted</param>
        /// <param name="recordNumber">Integer: a number of the record</param>
        /// <returns>String: a tabulated section of the report</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize a html string and a columnlist array
        ///
        /// 2. Add a row to a html string.
        ///
        /// 3. Iterate through the columnlist of the row
        ///
        /// 4. Validate whether the column is not hiddent
        ///
        /// 5. Add a column to a html string.
        ///
        /// 6. If numeric, move to the right but if not, move to center
        /// </remarks>
        //  ---------------------------------------------------------------------------------
        private String getTabulatedSection(EvReportSection section, int recordNumber)
        {
            this.writeDebugLogMethod("getTabulatedSection method.");
            //
            // Initialize a html string and a columnlist array
            //
            String    stHtml     = String.Empty;
            ArrayList columnList = section.ColumnList;

            //
            // Add a row to a html string.
            //
            stHtml += "<tr class='" + getClassNameForDetail(recordNumber) + "'>\n\r";

            //
            // Iterate through the columnlist of the row
            //
            for (int j = 0; j < columnList.Count; j++)
            {
                EvReportColumn currentColumn = (EvReportColumn)columnList [j];

                //
                // If the column is hidden, do nothing.
                //
                if (currentColumn.DataType == EvReport.DataTypes.Hidden)
                {
                    continue;
                }

                //
                // Add a column to Html string
                //
                stHtml += "<td class='" + getClassNameForDetail(recordNumber) + "' ";

                //
                // If the coulmn is numeric, align to the right.
                //
                if (currentColumn.DataType == EvReport.DataTypes.Integer ||
                    currentColumn.DataType == EvReport.DataTypes.Float ||
                    currentColumn.DataType == EvReport.DataTypes.Currency)
                {
                    stHtml += "style='text-align:right' ";
                }
                else if (currentColumn.DataType == EvReport.DataTypes.Bool ||
                         currentColumn.DataType == EvReport.DataTypes.Date ||
                         currentColumn.DataType == EvReport.DataTypes.Percent)
                {
                    stHtml += "style='text-align:center' ";
                }

                //
                // Close the column
                //
                stHtml += ">"
                          + this.getFormattedValue(section, currentColumn)
                          + "</td>\r\n";
            }

            //
            // Close the row
            //
            stHtml += "</tr>\n\r";
            return(stHtml);
        }//End getTabulatedSection class
Пример #12
0
        }//END getSection method.

        //===================================================================================
        /// <summary>
        /// This class adds the total row after a section.
        /// </summary>
        /// <param name="section">EvReportSection: a report section</param>
        /// <returns>String: a total string</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Validate the secion is not null and empty
        ///
        /// 2. Paint a new table row for total value
        ///
        /// 3. Loop through the detail columns of the row.
        ///
        /// 4. If title does not exists, paint title and add total value
        ///
        /// 5. If title exists, add total value.
        /// </remarks>
        // ----------------------------------------------------------------------------------
        private String addTotal(EvReportSection section)
        {
            this.writeDebugLogMethod("addTotal method.");
            int    span   = getMaxColSpan(section);
            string stHtml = String.Empty;

            //
            // If this section is not null.
            //
            if (section.DetailColumnsList == null &&
                section.Acumulator == null)
            {
                return(String.Empty);
            }

            //
            // If this section is not empty.
            //
            if (section.DetailColumnsList.Count > 0 &&
                section.Acumulator.Count > 0)
            {
                //
                // Paint total new table row
                //
                stHtml += "<tr class='Rpt_Alt'>\n\r";
                //stHtml += "<tr class='" + getClassNameForDetail ( recordNumber + 1 ) + "'>\n\r";

                //
                // The title should be set one column before the first total,
                // and should span from the first column to this.
                //
                bool isTitleSet = false;

                //
                // Iterate over all of the details columns.
                //
                for (int j = 0; j < section.DetailColumnsList.Count; j++)
                {
                    String cell = null;

                    //
                    // If there is no title yet and we are not at the end of the array
                    //
                    if (!isTitleSet && (j + 1) < section.DetailColumnsList.Count)
                    {
                        EvReportColumn nextColumn = (EvReportColumn)section.DetailColumnsList [j + 1];

                        //
                        // Obtains the acumulated value for the next column.
                        //
                        String nextValue = (String)section.Acumulator [nextColumn.HeaderText];

                        //
                        // If the accumulated value for the next column is not empty, then place the total label in this column.
                        //
                        if (nextValue != null && nextValue != String.Empty)
                        {
                            int spanValue = j + 1;

                            if (nextColumn.GroupingType == EvReport.GroupingTypes.Total)
                            {
                                cell = "<td colspan='" + spanValue + "' class='Rpt_Total' style='background-color: white' ><strong>Total "
                                       + section.GroupingColumnValue + ":</strong></td>\r\n";
                            }
                            else if (nextColumn.GroupingType == EvReport.GroupingTypes.Count)
                            {
                                cell = "<td colspan='" + spanValue + "' class='Rpt_Total' style='background-color: white' ><strong>" +
                                       section.GroupingColumnValue + " total quantity:</strong></td>\r\n";
                            }

                            isTitleSet = true;
                        }
                    }

                    //
                    // If the title is already set, then paint the totals.
                    //
                    else
                    {
                        EvReportColumn currentColumn = (EvReportColumn)section.DetailColumnsList [j];
                        String         value         = (String)section.Acumulator [currentColumn.HeaderText];

                        if (value != null)
                        {
                            cell = "<td class='Rpt_Total'><strong>"
                                   + EvcStatics.formatDoubleString(value, currentColumn.ValueFormatingString)
                                   + "</strong></td>\r\n";
                        }
                    }


                    if (cell != null && cell != String.Empty)
                    {
                        stHtml += cell;
                    }
                    else if (isTitleSet)
                    {
                        stHtml += "<td class='Rpt_Item'></td>\r\n";
                    }
                }

                stHtml += "</tr>\n\r<tr><td class='Rpt_Item' colspan='" + span + "' style='width:100%'>&nbsp</td></tr>";
            }

            return(stHtml);
        }//End addTotal method
        //===================================================================================
        /// <summary>
        /// This class loads the EvReportSection model from the flat table given in this report object.
        /// The model is a herarchy of EvReportSection Objects.
        /// AFC 6 nov 2009
        /// </summary>
        /// <returns>EvReportSection: a report section model</returns>
        /// <remarks>
        /// This method consists of the following steps:
        ///
        /// 1. Initialize report section properties: top section, section, detail, low section
        ///
        /// 2. Iterate through the report data records.
        ///
        /// 3. Iterate through the columns.
        ///
        /// 4. If column is not a detail column, use detail column functionality
        ///
        /// 5. If not a detail column, use non-detail column functionality
        /// </remarks>
        // ----------------------------------------------------------------------------------
        public EvReportSection loadModel(EvReport report)
        {
            this.writeDebugLogMethod("loadModel method.");
            //
            // This is the main section and contains the whole report.
            // It has some special characteristichs such as the level and the column values.
            //
            EvReportSection wholeReport = getTopSection( );

            //
            // Stores group column value for each level in the report.
            // This value is used to determine when a group value has changed, to then close that group and
            // all child groups including the detailed group.
            //
            String [] lastIndexValue = new String [5];

            //
            // Define a section for each level in the report.
            //
            EvReportSection [] sections = new EvReportSection [5];

            //
            // Define the detailed section separately as it treated separately.
            //
            EvReportSection detail = null;

            //
            // This stores the lower section before the detail. Is used since this section
            // has a specialized format.
            //
            EvReportSection lowerSection = null;

            //
            // True if the section has changed in this row.
            // This is used for initialize sections when iterating trhough columns.
            //
            bool [] sectionHasChangedInThisRow = new bool [5];

            //
            // Iterate through the report data records.
            //
            for (int record = 0; record < report.DataRecords.Count; record++)
            {
                //
                // Get a data report row
                //
                EvReportRow row = report.DataRecords [record];

                //
                // Iterate through the columns.
                //
                for (int column = 0; column < row.ColumnValues.Length; column++)
                {
                    //
                    // Retrieve the curren column
                    //
                    EvReportColumn currentColumn = report.Columns [column];

                    if (currentColumn.HeaderText == String.Empty)
                    {
                        continue;
                    }

                    //
                    // Extract the value of the current column
                    //
                    String currentValue = row.ColumnValues [column];

                    this.writeDebugLogLine("CurrentValue: " + currentValue);

                    int sectionLvl = currentColumn.SectionLvl;

                    //
                    // If the column is not the detail level, then this must be a group column
                    //
                    // So process the column using group column functionality.
                    //
                    if (sectionLvl != EvReportSection.Detail_Level)
                    {
                        //
                        // Test whether the group index has changed its value.
                        //
                        if (currentColumn.GroupingIndex &&
                            lastIndexValue [currentColumn.SectionLvl] != currentValue)
                        {
                            //
                            // Resets all the lower levels.
                            //
                            for (int level = currentColumn.SectionLvl; level < 5; level++)
                            {
                                lastIndexValue [level] = null;
                            }

                            //
                            // Open a new level.
                            //
                            lastIndexValue [currentColumn.SectionLvl] = currentValue;
                            sections [sectionLvl] = new EvReportSection( );

                            sections [sectionLvl].RowNumber = record;
                            //
                            // Stores the parent. If the previous level is the detail, then the parent is the
                            // whole report. If not, the parent is the previous section
                            //
                            sections [sectionLvl].Parent = sectionLvl - 1 == EvReportSection.Detail_Level ? wholeReport : sections [sectionLvl - 1];

                            sections [sectionLvl].SectionLevel        = sectionLvl;
                            sections [sectionLvl].Layout              = EvReportSection.LayoutTypes.Flat;
                            sections [sectionLvl].GroupingColumnValue = currentValue;
                            sectionHasChangedInThisRow [sectionLvl]   = true;
                            if (sections [sectionLvl].Parent == null)
                            {
                                sections [sectionLvl].Parent = new EvReportSection( );
                            }
                            sections [sectionLvl].Parent.ChildrenList.Add(sections [sectionLvl]);
                        }//END Group index has changed.

                        if (sectionHasChangedInThisRow [sectionLvl])
                        {
                            sections [sectionLvl].ColumnValuesByHeaderText.Add(currentColumn.HeaderText, currentValue);
                            sections [sectionLvl].ColumnList.Add(currentColumn);
                        }

                        //
                        // If the lower section has a level less than the current section level,
                        // then the current become the lower section.
                        //
                        if (lowerSection == null || lowerSection.SectionLevel < currentColumn.SectionLvl)
                        {
                            lowerSection = sections [sectionLvl];
                        }
                    }
                    else
                    {
                        //
                        // This is the section lvl 0 ("Detail").
                        // This assumes that the sections are coninuously enumerated.
                        //
                        if (lastIndexValue [currentColumn.SectionLvl] != ("" + record))
                        {
                            if (lowerSection == null)
                            {
                                lowerSection = wholeReport;
                            }

                            lastIndexValue [currentColumn.SectionLvl] = "" + record;

                            detail           = new EvReportSection( );
                            detail.RowNumber = record;
                            detail.Layout    = EvReportSection.LayoutTypes.Tabular;
                            detail.Parent    = lowerSection;

                            if (report.IsAggregated == true)
                            {
                                //
                                // Is the report is aggregated, then the detail is not visible.
                                //
                                detail.Visible = false;

                                detail.OnlyShowHeadersForTotalColumns = true;
                            }//End if is aggregated.

                            //
                            // Process: If the site header of the report is not empty, and the value of this site
                            // is different to the user organization, then dont show the detail.
                            //
                            else if (report.IsUserSiteFiltered == true)
                            {
                                String detailOrganizationId = detail.searchValueByHeaderText(report.SiteColumnHeaderText, true);

                                //
                                // If the user is not site staff, or site trial coordinator, or site principal investigator
                                // dont show the details.
                                //
                            }//End if it is site filtered.
                            else
                            {
                                detail.Visible = true;
                                detail.OnlyShowHeadersForTotalColumns = false;
                            }

                            lowerSection.ChildrenList.Add(detail);
                            lowerSection.DetailColumnsList = detail.ColumnList;
                        }

                        detail.ColumnValuesByHeaderText.Add(
                            currentColumn.HeaderText,
                            currentValue);

                        detail.ColumnList.Add(currentColumn);

                        if (currentColumn.GroupingType == EvReport.GroupingTypes.Total)
                        {
                            detail.addToAcumulator(currentColumn.HeaderText, currentValue);
                        }

                        //
                        // If the grouping type is count, then add 1 to the acumulator
                        // if the value is not empty.
                        //
                        if (currentColumn.GroupingType == EvReport.GroupingTypes.Count)
                        {
                            if (currentValue.Trim( ) != String.Empty)
                            {
                                detail.addToAcumulator(currentColumn.HeaderText, "1");
                            }
                        }
                    }
                }

                for (int i = 0; i < sectionHasChangedInThisRow.Length; i++)
                {
                    sectionHasChangedInThisRow [i] = false;
                }
                lowerSection = null;
            }

            return(wholeReport);
        }//End loadModel method.