Für die Abarbeitung der Datensätze aus OrmTempSelectedRecords und damit der Selektierten steht TemporaryRecordMassWorkItem<T> zur Verfügung. Diese Basisklasse bietet folgendes Verhalten:

  • Gesicherte Abarbeitung der temporären Einträge aus dem Igniter ().
  • Transaktion für die Abarbeitung jedes Datensatzes. Bei Ausnahmen wird der Datensatz übersprungen und OnError aufgerufen.
  • Transparente Paketierung der Abarbeitung. Dadurch steigt die Serverlast nicht, wenn eine größere Menge an Einträgen selektiert sind. Die Standardgröße ist 200 und kann im Konstruktor ChunkSize angepasst werden.
  • Zähler für aufgetretene Ausnahmen
  • Events
    • BeforeProcessing(bool resume) Optional
    • ProcessSingleOrm(T orm)
    • AfterProcessing(Exception exception) Optional
    • OnUserCancelled() Optional
    • BeforeSuspend() Optional
    • OnError(T orm, Exception exception) Optional.

Beispiel

Einfachste Implementierung für das Setzen eines Datenfeldes.

public class MyMassWorker : TemporaryRecordMassWorkItem<MyDataTable>
{
    public string MyProperty { get; set; }

    protected override void ProcessSingleOrm(MyDataTable myData)
    {
        myData.TextField = MyProperty;
    }
}

Optionale Übergabe der Anzahl der Datensätze

Ist die Anzahl der Datensätze bekannt, können diese dem TemporaryRecordMassWorkItem übergeben werden. Beispielsweise kann die Anzahl aus OperationOverSelectedRecordsIgniterBase.RecordCount nach dem Erstellen der temporären Datensätze ausgelesen werden. In diesem Fall, muss man einen entsprechenden Konstruktor anlegen.

public MyMassWorker (int count) : base()
{
    MaxProgress = count;
}

Dadurch muss der Worker keine Count() Abfrage durchführen.

BeforeProcessing

An dieser Stelle kann man typischerweise erste Informationen in das Anwendungsprotokoll schreiben.

protected override void BeforeProcessing(bool resume)
{
    if (NumberOfStarts == 1)
        Logger.AddInfo("Prozess Start");
    else
        Logger.AddInfo("Neustart des Prozesses");
}

ProcessSingleOrm

Die Verarbeitung der einzelnen Datensätze findet in dieser Methode statt. Daher muss diese implementiert werden.

AfterProcessing

Wird am Ende der Verarbeitung aufgerufen.

protected override void AfterProcessing(Exception exception)
{
    Logger.AddInfo("Datensätze geändert: " + CurrentProgress);
}

OnUserCancelled

Wenn der Benutzer in der UI den Prozess abbrechen können soll, muss im Konstruktor IsCancellable = true; gesetzt werden. Wenn dann der Benutzer dies tut, wird diese Methode aufgerufen,

protected override void OnUserCancelled()
{
    Logger.AddInfo("Abbruch durch Benutzer.", CurrentProgress);
}

BeforeSuspend

Wenn der Prozess seine maximale Laufzeit überschritten hat wird er von System beendet und später neu gestartet,falls die Anzahl der maximalen Neustarts nicht überschritten ist.

protected override void BeforeSuspend()
{
    Logger.AddInfo("Prozesslaufzeit überschritten", CurrentProgress);
}

OnError

Dieses Event wird aufgrufen, wenn ein Laufzeitfehler bei der Verarbeitung auftritt. Die Standardimplementierung schreibt Protokolleinträge in das Anwendungsprotokoll, falls es vorhanden ist, und in das Server Log.

Bei einem Fehler bei der Verarbeitung, beispielsweise fehlende Bearbeitungsrechte oder der Datensatz ist nicht valide, werden die Protokolleinträge geschrieben und der Datensatz übersprungen. Möchte man stattdessen den Prozess abbrechen und später neu versuchen, muss an dieser Stelle eine Ausnahme geworfen werden.

protected override void OnError(MyDataTable orm, Exception exception)
{
    throw new Exception("Bei der Verarbeitung ist ein Fehler aufgetreten: " + exception.Message);
}