Zum Hauptinhalt springen

C# Scripting

Bitte beachten

Es wird vorrausgesetzt das Sie C# Programmierkenntnisse haben.

Im Berichts Generator können C# Skripte auf Basis .NET verwendet werden. Der Skripting Editor verfügt über ein einfaches Auto Complete und Fehleranalyse.

Wenn Sie im Script Editor auf "Beispiel Quelltext" klicken sehen Sie Beispiel wie sie mit der API arbeiten können.

Bitte beachten
  • Der Skriptcode wird immer auf dem MapEdit Web Server ausgeführt, nicht auf dem Client!. Mahen Sie also keine Zugriffe auf lokale Dateien.
  • Verwechseln die Report API nicht mit der Map Edit Client API (Beschrieben im Kapitel API) Funktionen der MapEdit Client API wie Mum.Geo.DataAccess etc können hier nicht verwendet werden!!
  • Zur Abfrage von Daten wird empfohlen immer die mit der Report API mitgelieferten Funktionen die Sie in den Beispielen sehen zu verwenden und nicht direkt mittels anderen Methoden auf die Daten zu zugreifen auch wenn dies möglich ist.

Hinweis

Starten Sie wenn Sie sehr viele Tests und Änderungen an Berichten mit Scripten durchführen den IIS einmal pro Woche neu. Dies gibt Speicher frei.

Anlegen einer eigenen Funktion

Drücken Sie im Berichsdesigner auf "C# Script"

Es wird ihnen ein Grundgerüst erzeugt.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XSystem;
using Mum.Geo.ReportDesigner;

namespace Report
{
public class MyReportPlugIn : ReportPlugIn
{
public MyReportPlugIn(IReportApiHost host) : base(host)
{
//
}

}
}

Fügen Sie nun Ihre eigenen Funktionen, Im Bespiel unten MyFunction1 und MyFunction2 hinzu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XSystem;
using Mum.Geo.ReportDesigner;

namespace Report
{
public class MyReportPlugIn : ReportPlugIn
{
public MyReportPlugIn(IReportApiHost host) : base(host)
{
//
}

public string MyFunction1(string value)
{
return "Name=" + value.ToUpper();
}

public string MyFunction2(string value)
{
return "Name=" + value.ToLower();
}

}
}
Hinweis

Beispiel Funktionen sehen Sie wenn den Knopf Bespiel Quelltext aktivieren.

Um eine im Script vorhandene Funktion im Bericht zu verwenden klicken Sie im Bericht auf den Script Funktion Knopf.

Sie Syntax ist folgende:

{Fun. + Name der Funktion + ()}

Beispiel:

{Fun.MyFunction1()}

Funktionen können auch Parameter enthalten die an die Funktion übergeben werden können. Parameter statische Texte oder auch Feldnamen in geschweiften Klammern sein. Werden Feldnamen angegeben dann wird der Inhalt des Feldes an di Funktion übergeben.

Beispiele:

{Fun.MyFunction1("Rot")}
{Fun.MyFunction1("{A.NAME}")}

Komplexe Berichte

Ab Version 24.1.97

Wenn Sie Berichte haben die Sie nicht direkt mittels SQL erzeugen können sondern die mittels Programmierung vorverarbeitet müssen, dann können Sie folgendermaßen vorgehen:

Erzeugen Sie eine Hilfestabelle. Fügen Sie eine Spalte mit dem Namen "PRINT_TASK_ID" vom Typ Text mit der Länge 40 hinzu.

In dieser Tabelle erzeugen Sie dann mittels der Funktion "BeforePrinting" vor dem Drucken die Daten die im Berichts ausgegeben werden sollen. Und löschen Sie dann diese Datensätze in der Funktion "AfterPrinting" wieder.

Da mehrere Anwender gleichzeitig Drucken könnten wird die PRINT_TASK_ID benötigt. Geben Sie allen Datensätzen diese ID mit in dem Sie diese im Feld PRINT_TASK_ID speichern. Mit dieser ID hat jeder Druck Auftrag seine eigenen Werte.

Legen Sie im Bericht einen Parameter mit dem Namen "PrintTaskId" und dem Wert 0 ein.

Legen Sie einen Datenbereich an der der die Hilfstabelle ausgibt.

select WERT1,WERT2 from PRINT_TEMP where PRINT_TASK_ID='{Parameter.PrintTaskId}'

Der Parameter "PrintTaskId" wird dann zur Laufzeit im Code gesetzt. Siehe unten.

Beispiel Code:


private string _taskId = "";

public override void BeforePrinting()
{

string filter = this.Report.GetParameter("Filter");

//Erzeuge eindeutige ID und merke sie dir
_taskId = System.Guid.NewGuid().ToString();

//PrintTaskId an den Bericht geben damit der SQL diesen benuzten kann.
this.Report.SetParameter("PrintTaskId", _taskId);

//Werte per Code erzeugen und in Hilfstabelle schreiben
for(int i=1;i<20;i++)
{
string wert1="Wert a"+i;
string wert2="Wert b"+i;
string sql = "insert into PRINT_TEMP (PRINT_TASK_ID,WERT1,WERT2) values ('" + _taskId + "','" + wert1 + "','" + wert2 + "')";
this.Report.SqlExecute(sql);
}

}

public override void AfterPrinting()
{
//Werte der Hilfstabelle wieder entfernen
string sql = "delete from PRINT_TEMP where PRINT_TASK_ID='" + _taskId + "'";
this.Report.SqlExecute(sql);
}

Verwendung einer .NET DLL (plugin) statt Skript Code.

Verfügbar ab Version 24.1.100

Im Skripting können Sie wahlweise auch eigene .NET Framework DLLs einbinden die z.B. mit Visual Studio erzeugt wurden.

Die bietet unter anderem den Vorteil das Sie den Code debuggen können. Bedenken Sie immer das die DLL auf dem MapEdit Web server ausgeführt werden und nicht auf dem Client.

Erzeugen Sie mit Visual Studio eine DLL vom Typ "Class Library .NET Framework". Sie müssen .NET Framework 4.8 verwenden und die Target Platform muss auf "x64" gesetzt sein.

Erzeugen Sie dann eine Klasse mit dem Namen MyReportPlugIn die von ReportPlugIn ableitet.

Hier das Grundgerüst der Klasse. Diese Grundgerüst ist 1:1 wie im Skripting.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XSystem;
using Mum.Geo.ReportDesigner;

namespace MeinBericht
{
public class MyReportPlugIn : ReportPlugIn
{
public MyReportPlugIn(IReportApiHost host) : base(host)
{
//
}

}
}

Ihre fertige DLL muss auf dem MapEdit Server unter:

C:\inetpub\wwwroot\MumGeoData_Preview\Repositories\Default\Plugins\ReportDesigner\

abgelegt werden.

Zum testen sollten Sie den MapEdit Server lokal auf dem gleichen Rechner installiert haben wo Sie mit Visual Studio entwickeln.

Richten Sie im Visual Studio Projekt eine "Post-build event command line" ein. Dies kopiert bei jedem kompilieren ihre DLL in das Repository.

copy  $(TargetDir)$(TargetName).dll "C:\inetpub\wwwroot\MumGeoData_Preview\Repositories\Default\Plugins\ReportDesigner\$(TargetName).dll"
copy $(TargetDir)$(TargetName).pdb "C:\inetpub\wwwroot\MumGeoData_Preview\Repositories\Default\Plugins\ReportDesigner\$(TargetName).pdb"

Um ihre DLL Klasse zu laden muss im Skripting Edit der Report Designers (nicht in Visual Studio) im Konstruktor folgendes angegeben werden:

public MyReportPlugIn(IReportApiHost host) : base(host)
{
//MAPEDIT_REGISTER_FUNCTION "MyFunction1(value)"
//MAPEDIT_REGISTER_FUNCTION "MyFunction2(value1,value2)"
_plugin = this.Report.LoadReportPlugIn("MeineFirma.MeinBeispiel1", host);
}

public string MyFunction1(string value)
{
return "Name=" + value.ToUpper();
}

public string MyFunction2(string value1, string value2)
{
return value1 + value2
}

Der Befehl LoadReportPlugIn läd ihre DLL, erzeugt eine instanz ihrer Klasse und verbindet diese mit dem Bericht. Wobei bei "MeineFirma.MeinBeispiel1" der Name ihrer DLL ohne die Endung ".dll" und ohne Pfadangabe stehen muss.

Die "Kommentare"

//MAPEDIT_REGISTER_FUNCTION "Ihr Funktinonsname()"   

Teilen der Berichts Designer UI mit welche Funktionen im Berichtsdesigner in der Auswahlliste angezeigt werden sollen. Damit kann der Anwender diese aus der Liste wählen. Die muss im Skripting gemacht werden, nicht in der DLL!

Zum debuggen der DLL ist zu beachten das Visual Studio mit Windows Admin Rechten ausgeführt werden muss!! Dies ist wichtig!!

Desweiteren muss in der gleichen Visual Studio Solution ein Projekt vom Typ
"ASP.NET Web Application(.NET Framework)" angelegt werden. Diese Projekt dient nur zum starten des Debuggens via Start "Local IIS(Google Chrome)"

Bei den Visual Studio Optionen diesen Projektes geben Sie bei "STARt URL" die URL des Berichtes an.

Die URL bekommen Sie im Berichtsdesigner mit dem Knopf "Get Report URL".

Beispiel URL:

http://localhost/mum.geo.services_Preview/../Mum.Geo.Server.Report/CreatePdf.ashx?ReportName=LASVEGAS_STRASSEN&Format=Pdf&Parameter=Filter%3D(1%253D1)%2Blimit%2B5%26ReportId%3D0%26%2524LOGIN_USERNAME%2524%3DADMINISTRATOR%26%2524LOGIN_USERCOMMENT%2524%3DHalloooooooo%26

Fügen Sie für das Debuggen der DLL am Ende dieser URL folgendes hinzu:

&Debug=True

Dies ist wichtig, ansonsten wird beim ändern der DLL diese nicht neu geladen und die bereits geladene DLL im Speicher befindliche DLL verwendet.

Warnung

Verwenden Sie "&Debug=True" immer nur für das Testen mit dem Debugger und nie im Echt Berieb. Ansonsten geht Performance des Berichtes verloren und der Speicher wird schnell verbraucht! Für das Testen/Debuggen wird immer eine neue Instanz der DLL geladen und alte Instanzen werden erst beim Neustart des IIS entladen!

Vor dem ausführen des debuggens sollten sie immer neu kompilieren!

Mit

this.Report.DebugMode

können Sie im Code prüfen ob der Bericht im Debug Modus ausgeführt wird bzw ob der Bericht mit "&Debug=True" aufgerufen wuirde.