4.8 Raport na podstawie danych przekazywanych w obiekcie typu DataTable

 

 

 

W przypadku gdy dane źródłowe raportu są przechowywane w bazie danych najwygodniejszym mechanizmem jest bezpośrednie wykorzystanie systemowej klasy DataTable. Przykładowy skrypt będzie tworzył prosty raport tabelaryczny na podstawie danych odczytywanych z bazy danych SQL.

 

 

 

 

 

Rys. Raport tabelaryczny na podstawie danych odczytywanych z bazy danych SQL.

 

 

 

 C#

 
using System;
		
using Askom.AsixEvo.Scripting;
		
using MigraDoc.DocumentObjectModel;
		
using MigraDoc.DocumentObjectModel.Shapes;
		
using MigraDoc.DocumentObjectModel.Shapes.Charts;
		
using System.Data;
		
using System.Data.SqlClient; 
		
 
public class DataTableRep : IScript
		
{
		
   public bool Initialize(string[] aParameters, IApplication aApplication)
		
   {
		
      try
		
      {
		
         string outputFile = aParameters[1]; 
		
 
         DataSet dataSet;
		
         using (SqlConnection connection = new SqlConnection(
		
                  "Data Source=(local);Initial Catalog=ReportTest;Integrated Security=SSPI"))
		
         {
		
            SqlDataAdapter adapter = new SqlDataAdapter();
		
            connection.Open();
		
            SqlCommand command =
		
                new SqlCommand("SELECT ProdID, Quality, Weight FROM ProdInfo", connection);
		
            adapter.SelectCommand = command;
		
            dataSet = new DataSet();
		
            adapter.Fill(dataSet);
		
         } 
		
 
         Report report = aApplication.CreateReport(); 
		
 
         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);
		
 
 
         ReportTable vt = report.AddVerticalTable(dataSet.Tables[0], true);
		
         vt.LeftIndent(20);
		
         vt.AddColumn("Produkt""ProdId", 25, nullnull);
		
         vt.AddColumn("Jakość""Quality", 25, nullnull);
		
         vt.AddColumn("Waga""Weight", 25, "f2"null); 
		
 
         vt.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan);
		
         report.Render(outputFile); 
		
 
         dataSet.Dispose();
		
      }
		
      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
		
Imports System.Data
		
Imports System.Data.SqlClient 
		
 
Public Class DataTableVb
		
    Implements IScript 
		
 
    Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _
		
                                    IApplication) As Boolean Implements IScript.Initialize 
		
 
        Try 
		
 
            Dim outputFile As String = aParameters(1) 
		
 
            Dim dataSet As DataSet
		
            Using connection As SqlConnection = New SqlConnection( _
		
                   "Data Source=(local);Initial Catalog=ReportTest;Integrated Security=SSPI"
		
 
                Dim adapter As SqlDataAdapter = New SqlDataAdapter()
		
                connection.Open()
		
                Dim command As SqlCommand = _
		
                   New SqlCommand("SELECT ProdID, Quality, Weight FROM ProdInfo", connection)
		
                adapter.SelectCommand = command
		
                dataSet = New DataSet()
		
                adapter.Fill(dataSet) 
		
 
            End Using 
		
 
 
 
            Dim report As Report = aApplication.CreateReport() 
		
 
            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)
		
 
 
            Dim vt As ReportTable = report.AddVerticalTable(dataSet.Tables(0), True)
		
            vt.LeftIndent(20)
		
            vt.AddColumn("Produkt""ProdId", 25, NothingNothing)
		
            vt.AddColumn("Jakość""Quality", 25, NothingNothing)
		
            vt.AddColumn("Waga""Weight", 25, "f2"Nothing
		
 
            vt.SetEdgeStyle(ReportTableEdgeType.Outline, Colors.Cyan)
		
            report.Render(outputFile) 
		
 
            dataSet.Dispose() 
		
 
        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
		

 

 

 

Poniższe wyjaśnienia dotyczą tylko elementów specyficznych dla raportów z danych obiektu DataTable.

 

Początkowy fragment skryptu jest standardowym kodem służącym do odczytu danych przy pomocy zapytania SQL z bazy danych. Rezultat zapytania zostaje zapamiętany w obiekcie klasy DataSet.

 

Dalsza część skryptu to właściwy kod tworzący raport zawierający pojedynczą tabelę pionową. W wywołaniu metody AddVerticalTable przekazywane jest odwołanie do obiektu DataTable, znajdującego się wewnątrz obiektu DataSet, wypełnionego danymi w początkowej fazie skryptu. Metoda SetQueryData w tym schemacie działania nie jest używana.

 

Kolejnym krokiem jest dodanie do tabeli zestawu kolumn, wykorzystując metodę AddColumn. W przypadku tabel korzystających z danych z obiektu DataTable znaczenie parametrów jest następujące: nazwa kolumny tabeli umieszczana w linii nagłówka, nazwa kolumny w obiekcie DataTable (nazwy te zależą od wykonanego zapytania SQL i struktury bazy danych), szerokość kolumny, sposób formatowania wartości (jeżeli nie zostanie podany, to nastąpi formatowanie standardowe zależne od typu wartości), funkcja tworzenia zawartości komórki (jej użycie jest identyczne jak dla tabel z wartościami historycznymi i zostało opisane w rozdziale Kontrola zawartości komórek).