4.6 Kolumny i wiersze wyliczane

 

 

W tym rozdziale przedstawiony zostanie sposób dodania do tabe raportowych wierszy i kolumn wyliczających podsumowania danych. Pokazany dalej skrypt tworzy typową tabelę pionową uzupełnioną o trzy dodatkowe wiersze wyliczane. Wygląd generowanej tabeli pokazuje ilustracja.

 

 

 

Rys. Tabela pionowa dla danych archiwalnych z wierszami wyliczanymi.

 

 

Dwa pierwsze wiersze wyliczane służą do pokazania wartości minimalnej i maksymalnej w poszczególnych kolumnach tabeli. W trzecim wierszu pokazywana jest liczba przekroczeń wartości 25 w kolumnie V1 Maksimum.

 

 

 

 C#

 

 using System;

 using Askom.AsixEvo.Scripting;

 using MigraDoc.DocumentObjectModel;

 using MigraDoc.DocumentObjectModel.Shapes;

 using MigraDoc.DocumentObjectModel.Shapes.Charts;

  

 public class VertTable : IScript

 {

    public bool Initialize(string[] aParameters, IApplication aApplication)

    {

       try

       {

          DateTime reportDate = DateTime.Parse(aParameters[0]).Date;

          string outputFile = aParameters[1];

  

          Report report = aApplication.CreateReport();

  

          // Define standard and custom styles

          report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12, Colors.Blue,

                          truetrue, ParagraphAlignment.Center, Colors.LightYellow);

          report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue,

                          falsefalse, ParagraphAlignment.Right, Colors.Gray);

          report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10, Colors.Blue,

                          falsefalse, ParagraphAlignment.Right, Colors.DarkGray);

          report.SetStyle("OverLimit""Calibri", 10, Colors.Red, falsefalse,

                          ParagraphAlignment.Right, Colors.Yellow);

  

          // Build table

          ReportTable vt = report.AddVerticalTable(true);

          vt.LeftIndent(10);

          vt.AddColumn("Godzina", ReportTable.StartTimeColumn, null, 40, null,

                       ReportTableCellErrorBehavior.Normal, null);

          vt.AddColumn("V1 średnia""sym01""average", 30, "f2",

                       ReportTableCellErrorBehavior.Empty, null);

          vt.AddColumn("V1 minimum""sym01""min", 30, "f2",

                       ReportTableCellErrorBehavior.Empty, null);

          vt.AddColumn("V1 maksimum""sym01""max", 30, "f2",

                       ReportTableCellErrorBehavior.Empty, CheckLimit);

  

          vt.AddCalculatedRow("Minimum", CalculationType.Min, "f2"null);

          vt.AddCalculatedRow("Maksimum", CalculationType.Max, "f2"null);

          vt.AddCalculatedRow("Przekroczenia", CalculationType.Custom, "f2", OverLimit);

  

          vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H");

          vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan);

  

          report.Render(outputFile);

       }

       catch (Exception e)

       {

          aApplication.ReportMessage(EvoMessageType.Error,

                                     "Error generating report: " + e.ToString());

       }

  

       return true;

    }

  

    bool OverLimit(ReportTableCell c)

    {

       int overCount = 0;

       if (c.Index == 3)

       {

          foreach (CellValue v in c.SourceValues)

          {

             if ((v.Status & Askom.Ascent.StatusOpc.QualityMask) ==

                      Askom.Ascent.StatusOpc.Good && v.Value != null && (double)v.Value >= 25)

  

                overCount++;

          }

          c.Content = overCount.ToString();

       }

       return false;

    }

  

    bool CheckLimit(ReportTableCell c)

    {

  

       if ((c.ValueStatus & Askom.Ascent.StatusOpc.QualityMask) ==

                Askom.Ascent.StatusOpc.Good && c.RawValue != null && (double)c.RawValue >= 25)

       {

          c.Content = "! " + c.Content;

          c.Style = "OverLimit";

       }

       return false;

    }

  

    public void FinalizeScript()

    {

 

   }

}

 

 

 

 VB

 

 Imports System

 Imports Askom.AsixEvo.Scripting

 Imports MigraDoc.DocumentObjectModel

 Imports MigraDoc.DocumentObjectModel.Shapes

 Imports MigraDoc.DocumentObjectModel.Shapes.Charts

  

 Public Class VertTableVb

     Implements IScript

  

     Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

                                      IApplication) As Boolean Implements IScript.Initialize

         Try

  

             Dim reportDate As DateTime = DateTime.Parse(aParameters(0)).Date

             Dim outputFile As String = aParameters(1)

  

             Dim report As Report = aApplication.CreateReport()

  

             ' Define standard And custom styles

             report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12,Colors.Blue, _

                TrueTrue, ParagraphAlignment.Center, Colors.LightYellow)

             report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue, _

                FalseFalse, ParagraphAlignment.Right, Colors.Gray)

             report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10,Colors.Blue, _

                FalseFalse, ParagraphAlignment.Right, Colors.DarkGray)

             report.SetStyle("OverLimit""Calibri", 10, Colors.Red, FalseFalse, _

                ParagraphAlignment.Right, Colors.Yellow)

  

             ' Build table

             Dim vt As ReportTable = report.AddVerticalTable(True)

             vt.LeftIndent(10)

             vt.AddColumn("Godzina", ReportTable.StartTimeColumn, Nothing, 40, Nothing, _

                          ReportTableCellErrorBehavior.Normal, Nothing)

             vt.AddColumn("V1 średnia""sym01""average", 30, "f2", _

                          ReportTableCellErrorBehavior.Empty, Nothing)

             vt.AddColumn("V1 minimum""sym01""min", 30, "f2", _

                          ReportTableCellErrorBehavior.Empty, Nothing)

             vt.AddColumn("V1 maksimum""sym01""max", 30, "f2", _

                          ReportTableCellErrorBehavior.Empty, AddressOf CheckLimit)

  

             vt.AddCalculatedRow("Minimum", CalculationType.Min, "f2"Nothing)

             vt.AddCalculatedRow("Maksimum", CalculationType.Max, "f2"Nothing)

             vt.AddCalculatedRow("Przekroczenia", CalculationType.Custom, "f2", _

                                 AddressOf OverLimit)

  

             vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H")

             vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan)

  

             report.Render(outputFile)

  

         Catch e As Exception

  

             aApplication.ReportMessage(EvoMessageType.Error, _

                                        "Error generating report: " + e.ToString())

  

         End Try

  

         Return True

  

     End Function

  

     Function OverLimit(c As ReportTableCell) As Boolean

  

         Dim overCount As Integer = 0

         Dim v As CellValue

         If c.Index = 3 Then

 

             For Each v In c.SourceValues

                 If ((v.Status And Askom.Ascent.StatusOpc.QualityMask) = _

                          Askom.Ascent.StatusOpc.Good And _

                          v.Value IsNot Nothing And CType(v.Value, Double) >= 25) Then

  

                     overCount = overCount + 1

  

                 End If

             Next

             c.Content = overCount

  

         End If

  

         Return False

  

     End Function

  

     Function CheckLimit(c As ReportTableCell) As Boolean

  

         If ((c.ValueStatus And Askom.Ascent.StatusOpc.QualityMask) = _

                       Askom.Ascent.StatusOpc.Good And _

                       c.RawValue IsNot Nothing And CType(c.RawValue, Double) >= 25) Then

  

             c.Content = "! " + c.Content

             c.Style = "OverLimit"

  

         End If

 

         Return False

 

     End Function

  

  

     Public Sub FinalizeScript() Implements IScript.FinalizeScript

  

     End Sub

 

End Class

 
 

 

 

Przykładowy kod tworzy w standardowy sposób tabelę pionową. Wiersze wyliczane dodawane są do tabeli przy pomocy wywołań metody AddCalculatedRow. Nie ma ograniczenia na liczbę wierszy wyliczanych. W podobny sposób można by dodać kolumny wyliczane przy pomocy metody AddCalculatedColumn. Wiersze i kolumny wyliczane mogą być dodawane do tabel dowolnego typu.

 

Dwa pierwsze użycia AddCalculatedRow dodają standardowe wiersze wyliczane, służące do pokazanie wartości minimalnej i maksymalnej w poszczególnych kolumnach tabeli. Trzeci wiersz jest wyliczany niestandardowo. W tym celu w parametrach wywołania przekazywany jest typ wyliczenia Custom oraz adres funkcji OverLimit, wykonującej wyliczenie wartości komórek wiersza.

 

Funkcja OverLimit sprawdza indeks kolumny, której dotyczy wywołanie. Wyłącznie dla kolumny wartości maksymalnych, wyliczana jest liczba przekroczeń wartości 25. Dostęp do wartości wszystkich komórek kolumny odbywa się za pośrednictwem właściwości SourceValues  komórki wyliczanej.