4.5 Kontrola zawartości komórek

 

 

 

W niektórych przypadkach konieczna jest dodatkowa kontrola nad zawartością komórek, np. potrzeba wykrywania przekroczenia wartości granicznych, niestandardowa reakcja na niepoprawne wartości, potrzeba nietypowej generacji treści komórki. W takim przypadku można zastosować mechanizm funkcji generacji treści komórek, który zostanie omówiony w tym rozdziale. Celem przykładowego skryptu jest uzyskanie poniższej tabeli, w której przekroczenie wartości granicznej jest sygnalizowane dodaniem do wartości znaku ! oraz zmianą koloru komórki.

 

 

 

 

 

Rys. Tabela z kontrolą zawartości komórek.

 

 

 

 

 

 

 

 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,
                
                         true, true, ParagraphAlignment.Center, Colors.LightYellow);
                
         report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue,
                
                         false, false, ParagraphAlignment.Right, Colors.Gray);
                
         report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10, Colors.Blue,
                
                         false, false, ParagraphAlignment.Right, Colors.DarkGray);
                
         report.SetStyle("OverLimit", "Calibri", 10, Colors.Red, false, false,
                
                         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, CheckLimit);
                
         vt.AddColumn("V1 minimum", "sym01", "min", 30, "f2",
                
                      ReportTableCellErrorBehavior.Empty, null);
                
         vt.AddColumn("V1 maksimum", "sym01", "max", 30, "f2",
                
                      ReportTableCellErrorBehavior.Empty, null);
                
         vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan);
                
         vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H"); 
                
 
         report.Render(outputFile);
                
      }
                
      catch (Exception e)
                
      {
                
         aApplication.ReportMessage(EvoMessageType.Error,
                
                                         "Error generating report: " + e.ToString());
                
      }
                
 
       return true;
                
   } 
                
 
   bool CheckLimit(ReportTableCell c)
                
   {
                
      if ((c.ValueStatus & Askom.Ascent.StatusOpc.QualityMask) == 
                
                                                    Askom.Ascent.StatusOpc.Good &&
                
          c.RawValue != null && (double)c.RawValue >= 24)
                
      {
                
         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 String, ByVal 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,_
                
                            True, True, ParagraphAlignment.Center, Colors.LightYellow)
                
            report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue,_
                
                            False, False, ParagraphAlignment.Right, Colors.Gray)
                
            report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10, Colors.Blue,_
                
                            False, False, ParagraphAlignment.Right, Colors.DarkGray)
                
            report.SetStyle("OverLimit", "Calibri", 10, Colors.Red, False, False, _
                
                            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, AddressOf CheckLimit)
                
            vt.AddColumn("V1 minimum", "sym01", "min", 30, "f2", _
                
                         ReportTableCellErrorBehavior.Empty, Nothing)
                
            vt.AddColumn("V1 maksimum", "sym01", "max", 30, "f2", _
                
                         ReportTableCellErrorBehavior.Empty, Nothing) 
                
 
            vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan)
                
            vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H") 
                
 
            report.Render(outputFile) 
                
 
        Catch e As Exception 
                
 
            aApplication.ReportMessage(EvoMessageType.Error, _
                
                               "Error generating report: " + e.ToString())
                
 
 
        End Try 
                
 
        Return True 
                
 
    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) >= 24) 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 to modyfikacja skryptu generującego tabelę pionową. Zmienione fragmenty zostały oznaczone wytłuszczoną czcionką.

 

Pierwszy nowy element to dodanie stylu OverLimit, który będzie używany w komórkach z przekroczoną wartością. Druga nowość to użycie w jednym z wywołań metody AddColumn odwołania do funkcji CheckLimit.

 

Najważniejszą częścią skryptu jest treść funkcji CheckLimit. Funkcja ta jest wywoływana dla każdej komórki kolumny, a w wywołaniu przekazywany jest jej obiekt klasy ReportTableCell. Poprzez ten obiekt funkcja uzyskuje dostęp do danych opisujących komórkę. Obiekt służy także do zmiany zawartości komórki.

 

W typowych scenariuszach funkcja kontroli zawartości komórki używa pól ValueStatus i RawValue obiektu ReportTableCell do podjęcia decyzji dotyczącej ewentualnej ingerencji w zawartość komórki. Pola te przechowują status wartości i oryginalną wartość numeryczną komórki (w tym przypadku pochodzącą z zapytania o dane archiwalne). W przypadku gdy zachodzi konieczność zmiany zawartości komórki, można to wykonać przez ustawienie w polu Style nowej nazwy stylu i w polu Content nowej tekstowej treści komórki. Pole Content w momencie wywołania funkcji jest ustawione na treść, która byłaby umieszczona w komórce, gdyby nie była użyta funkcja kontroli. W przykładowym kodzie wykorzystano to, żeby wyświetlić standardową zawartość z dodanym znakiem wykrzyknika. Zwrócenie wartości false oznacza, że system generacji ma wygenerować treść komórki w sposób normalny, ale z ewentualnym wykorzystaniem zmienionych pól Content i Style.

 

Bardziej zaawansowaną metodą zmiany treści komórki jest własna generacja kompletnej zawartości, wykorzystując obiekt bazowy komórki (dostępny poprzez właściwość MigraCell) oraz jego metody. Ten tryb pozwala na większy wpływ na postać komórki (np. dodanie obrazka), ale wymaga działania bezpośrednio na obiektach i metodach biblioteki MigraDoc. Jeżeli funkcja kontroli zawartości komórki tworzy treść bezpośrednio, to musi ona zwrócić wartość true.