4.2 Szkielet kodu generacji raportu

 

 

 

Jeżeli skrypt raportowy został utworzony w oknie konfiguracji raportów skryptowych (lub została wybrana opcja skryptu raportowego w standardowym oknie tworzenia skryptu), to został dla niego zbudowany typowy szkielet kodu generującego raport. Kod ten pokazuje typowy sposób generacji raportu tabelarycznego dla danych archiwalnych zmiennych procesowych. Praktycznie każdy skrypt raportowy opiera się na poniższym schemacie działania.

 

 

 C#

 
using System;
		
using Askom.AsixEvo.Scripting;
		
using MigraDoc.DocumentObjectModel;
		
using MigraDoc.DocumentObjectModel.Shapes;
		
using MigraDoc.DocumentObjectModel.Shapes.Charts; 
		
 
public class ReportTemplate : IScript
		
{
		
   public bool Initialize(string[] aParameters, IApplication aApplication)
		
   {
		
      try
		
      {
		
         DateTime reportDate = DateTime.Parse(aParameters[0]).Date;
		
         string outputFile = aParameters[1];
		
 
 
         // Create report
		
         Report report = aApplication.CreateReport();
		
         report.SetPageSetup(false, PageFormat.A4);
		
 
 
         // Define standard and custom styles
		
         report.SetStyle(ReportStyleStandardNames.Normal, "Arial", 10, Colors.Black, false,
		
                         false, ParagraphAlignment.Left, Color.Empty);
		
         report.SetStyle(ReportStyleStandardNames.Header, "Arial", 10, Colors.SeaGreen, false,
		
                         false, ParagraphAlignment.Left, Color.Empty);
		
         report.SetStyle(ReportStyleStandardNames.Footer, "Arial", 10, Colors.SeaGreen, false,
		
                         false, ParagraphAlignment.Left, Color.Empty).
		
                         AddTabStop(150, TabAlignment.Right);
		
         report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12, Colors.Blue,
		
                         truetrue, ParagraphAlignment.Center, Colors.LightYellow);
		
         report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue, false,
		
                         false, ParagraphAlignment.Left, Color.Empty);
		
         report.SetStyle("Title""Arial", 14, Colors.DarkBlue, falsefalse,
		
                         ParagraphAlignment.Center, Color.Empty);
		
 
         // Define header
		
         report.Header.AddParagraph("Header text");
		
 
 
         // Define footer
		
         report.Footer.AddParagraph("Report generated ").
		
            AddText(DateTime.Now.ToString()).AddText("\tPage ").AddPageField().
		
                                                         AddText("/").AddNumPagesField();
		
 
 
         // Add title line
		
         report.AddParagraph("Example report for date " + reportDate.ToString(), "Title");
		
         report.AddParagraph("");
		
 
 
         // Vertical table example
		
         ReportTable vt = report.AddVerticalTable(true);
		
         vt.LeftIndent(20);
		
         vt.AddColumn("Start Time", ReportTable.StartTimeColumn, null, 40, null,
		
                      ReportTableCellErrorBehavior.Normal, null);
		
         vt.AddColumn("End Time", ReportTable.EndTimeColumn, null, 40, null,
		
                      ReportTableCellErrorBehavior.Normal, null);
		
         vt.AddColumn("Var1 Value""Var1""average", 25, "f2",
		
                      ReportTableCellErrorBehavior.Empty, null);
		
         vt.AddColumn("Var2 Value""Var2""average", 25, "f2",
		
                      ReportTableCellErrorBehavior.Empty, null);
		
         vt.SetQueryData(reportDate, reportDate.AddDays(1), "1H"TimeSpan.FromHours(1));
		
         vt.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan);
		
 
 
         // Horizontal table example
		
         //ReportTable ht = report.AddHorizontalTable(true, 30, 25, "Signals", "HH:mm");
		
         //ht.AddRow("Var1 Value", "Var1", "average", "f2", 
		
         //           ReportTableCellErrorBehavior.Empty, null);
		
         //ht.AddRow("Var2 Value", "Var2", "average", "f2",
		
         //           ReportTableCellErrorBehavior.Empty, null);
		
         //ht.AddRow("Var3 Value", "Var3", "average", "f2", 
		
         //           ReportTableCellErrorBehavior.Empty, null);
		
         //ht.SetQueryData(reportDate, reportDate.AddDays(1), "1H"TimeSpan.FromHours(4));
		
         //ht.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan);
		
 
         report.Render(outputFile);
		
      }
		
      catch (Exception e)
		
      {
		
         aApplication.ReportMessage(EvoMessageType.Error, "Error generating report: " + 
		
              e.ToString());
		
      }
		
 
      return true;
		
   }
		
 
   public void FinalizeScript()
		
   {
		
   }
		
}
		
 
 

 

 

 VB

 
Imports System
		
Imports Askom.AsixEvo.Scripting
		
Imports MigraDoc.DocumentObjectModel
		
Imports MigraDoc.DocumentObjectModel.Shapes
		
Imports MigraDoc.DocumentObjectModel.Shapes.Charts
		
 
Public Class ReportTemplateVB
		
    Implements IScript
		
 
    Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _
		
                               IApplicationAs Boolean Implements IScript.Initialize
		
        Try
		
 
 
            Dim reportDate As DateTime = DateTime.Parse(aParameters(0)).Date
		
            Dim outputFile As String = aParameters(1)
		
 
            ' Create report
		
            Dim report As Report = aApplication.CreateReport()
		
            report.SetPageSetup(FalsePageFormat.A4)
		
 
            ' Define standard and custom styles
		
            report.SetStyle(ReportStyleStandardNames.Normal, "Arial", 10, Colors.Black, _
		
                            FalseFalseParagraphAlignment.Left, Color.Empty)
		
            report.SetStyle(ReportStyleStandardNames.Header, "Arial", 10, Colors.SeaGreen, _
		
                            FalseFalseParagraphAlignment.Left, Color.Empty)
		
            report.SetStyle(ReportStyleStandardNames.Footer, "Arial", 10, Colors.SeaGreen, _
		
                            FalseFalseParagraphAlignment.Left, Color.Empty). _
		
                            AddTabStop(150, TabAlignment.Right)
		
            report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12, Colors.Blue,_
		
 
                  TrueTrueParagraphAlignment.Center, Colors.LightYellow)
		
            report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue, _
		
                            FalseFalseParagraphAlignment.Left, Color.Empty)
		
            report.SetStyle("Title""Arial", 14, Colors.DarkBlue, _
		
                            FalseFalseParagraphAlignment.Center, Color.Empty)
		
 
 
            ' Define header
		
            report.Header.AddParagraph("Header text")
		
 
 
            ' Define footer
		
            report.Footer.AddParagraph("Report generated "). _
		
             AddText(DateTime.Now.ToString()).AddText("\tPage ").AddPageField().AddText("/")._
		
             AddNumPagesField()
		
 
 
            ' Add title line
		
            report.AddParagraph("Example report for date " + reportDate.ToString(), "Title")
		
            report.AddParagraph("")
		
 
 
            ' Vertical table example
		
            Dim vt As ReportTable = report.AddVerticalTable(True)
		
            vt.LeftIndent(20)
		
            vt.AddColumn("Start Time"ReportTable.StartTimeColumn, Nothing, 40, Nothing,_
		
                         ReportTableCellErrorBehavior.Normal, Nothing)
		
            vt.AddColumn("End Time"ReportTable.EndTimeColumn, Nothing, 40, Nothing,_
		
                         ReportTableCellErrorBehavior.Normal, Nothing)
		
            vt.AddColumn("Var1 Value""Var1""average", 25, "f2",_
		
                         ReportTableCellErrorBehavior.Empty, Nothing)
		
            vt.AddColumn("Var2 Value""Var2""average", 25, "f2",_
		
                         ReportTableCellErrorBehavior.Empty, Nothing)
		
            vt.SetQueryData(reportDate, reportDate.AddDays(1), "1H"TimeSpan.FromHours(1))
		
            vt.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan)
		
 
 
            ' Horizontal table example
		
            'Dim ht As ReportTable = report.AddHorizontalTable(true, 30, 25, "Signals", _
		
            '                                                  "HH:mm")
		
            'ht.AddRow("Var1 Value", "Var1", "average", "f2", _
		
            '          ReportTableCellErrorBehavior.Empty, Nothing)
		
            'ht.AddRow("Var2 Value", "Var2", "average", "f2", _
		
            '          ReportTableCellErrorBehavior.Empty, Nothing)
		
            'ht.AddRow("Var3 Value", "Var3", "average", "f2", _
		
            '          ReportTableCellErrorBehavior.Empty, Nothing)
		
            'ht.SetQueryData(reportDate, reportDate.AddDays(1), "1H"TimeSpan.FromHours(4))
		
            'ht.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan)
		
 
            report.Render(outputFile)
		
 
        Catch e As Exception
		
 
 
            aApplication.ReportMessage(EvoMessageType.Error,_
		
                                             "Error generating report: " + e.ToString())
		
 
 
        End Try
		
 
        Return True
		
 
    End Function
		
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
		
    End Sub
		
 
End Class
		

 

 

 

 

 

 

Całość kodu generującego raport ujęta została w bloku try catch. Jest to zalecana konstrukcja, ponieważ w przypadku wystąpienia błędów w trakcie generacji raportu, zostaną one zgłoszone za pośrednictwem wyjątków. Blok try catch pozwala na kontrolowanie poprawności wykonania skryptu.

 

Pierwszą operacją skryptu jest pobranie parametrów uruchomienia skryptu i umieszczeniu ich w pomocniczych zmiennych reportDate i outputFile. Do skryptu raportowego przekazywane są zawsze dwa parametry. Pierwszy określa datę, dla której raport ma być wygenerowany, a drugi nazwę pliku wynikowego. Jeżeli w konfiguracji raportu skryptowego były zdefiniowane dodatkowe parametry, to zostaną one przekazane do skrypty jako kolejne, po parametrze nazwy pliku wynikowego.

 

Kolejnym krokiem, obowiązkowym w każdym skrypcie raportowym, jest utworzenie obiektu klasy Report poprzez wywołanie metody CreateReport obiektu aApplication. Dalsze operacje związane z generowaniem treści raportu będą wykorzystywały utworzony obiekt.

 

Opcjonalne wywołanie  metody SetPageSetup służy do określenia parametrów strony wydruku. W szczególności pierwszy parametr ustawiony na true pozwala przełączyć układ strony na poziomy. Istnieje też alternatywna wersja metody SetPageSetup pozwalająca na ustawienie wielkości marginesów.

 

Kolejna sekcja skryptu służy do zdefiniowania stylów. Style służą do określenia wyglądu raportu (głównie tekstów). Definiują one takie parametry jak kształt i wielkość czcionki, jej kolor oraz kolor tła.  Każdy styl posiada nazwę. Istnieje pewien zestaw nazw standardowych (zdefiniowanych w klasie ReportStyleStandardNames). Style o takich nazwach są używane w sposób automatyczny, np. styl ReportStyleStandardNames.Normal jest domyślnym stylem dla wszystkich elementów, dla których styl nie został w żaden sposób określony. Możliwe jest definiowanie stylów o nazwach własnych, ale wtedy do ich użycia konieczna jest jawna deklaracja stylu w metodach tworzących elementy raportu.

 

Po zdefiniowaniu stylów, skrypt przechodzi do tworzenia treści nagłówka i stopki raportu. Nie są to elementy obowiązkowe, ale zazwyczaj są stosowane. Zawartość nagłówka i stopki jest wypełniana przy pomocy uniwersalnej metody AddParagraph służącej do wstawiania tekstu do treści raportu. W przypadku stopki tekst jest wieloelementowy, złożony z części tekstowych oraz pól specjalnych: numeru bieżącej strony i sumarycznej liczby stron. Wygląd nagłówka i stopki zależy od standardowych stylów ReportStyleStandardNames.Header i ReportStyleStandardNames.Footer.

 

Kolejnym krokiem jest wstawienie opcjonalnego tytułu raportu. W tym przypadku zastosowany jest wariant metody AddParagraph z jawnym określeniem nazwy stylu. W definicji użytego stylu zostało zadeklarowane wyrównywanie typu ParagraphAlignment.Center - powoduje to, że treść tytułu zostanie umieszczona na środku wiersza.

 

W sposób podobny do wstawiania tekstów, do raportu mogą być też wstawione elementy graficzne przy pomocy metody AddImage.

 

Kolejna sekcja skryptu, rozpoczęta użyciem metody AddVerticalTable, odpowiada za umieszczenie w raporcie tabeli wartości archiwalnych zmiennych procesowych. Po utworzeniu tabeli należy do niej jeszcze dodać zestaw kolumn (wywołanie metody AddColumn), określić parametry czasowe odpytania o dane (metoda SetQueryData), oraz opcjonalnie określić sposób rysowania krawędzi komórek tabeli (metoda SetEdgeStyle). Należy zwrócić uwagę, że w wywołaniu metody SetQueryData wykorzystano zmienną reportDate, zawierającą datę wykonania raportu, przekazaną w parametrach uruchomienia skryptu.

 

Poniżej kodu generującego tabelę pionową znajduje się zakomentowany szkielet kodu dla tabeli poziomej. Podstawowa różnica to użycie metody  AddRow zamiast AddColumn.

 

Praca skryptu obowiązkowo kończona jest wywołaniem metody Render z przekazaniem nazwy pliku wynikowego, podanego w parametrach uruchomienia skryptu. Dopiera ta metoda wykonuje generację wynikowego pliku PDF, na podstawie wcześniej wykonanych operacji i odczytanych danych archiwalnych.