Table of Contents

OnChanged: auf Datenänderungen reagieren

[OnChanged] überwacht einen Datenbestand in microtech ERP und startet die Action, sobald sich dieser ändert:

[Action("adressen-geaendert", Display = "Adressänderungen protokollieren")]
[OnChanged]
public int AdressAenderungenProtokollieren(
    ChangedSet<Adressen> changes,
    CancellationToken cancellationToken)
{
    foreach (var adresse in changes.Items)
    {
        cancellationToken.ThrowIfCancellationRequested();
        logger.LogInformation("Adresse {AdrNr} geändert", adresse.AdrNr);
    }

    return changes.Items.Count;
}

ChangedSet<T> legt den Datenbestand fest und enthält die erkannten Änderungen:

  • changes.Items enthält ausschließlich neue oder geänderte Datensätze, nie den ganzen Bestand.
  • Den Verarbeitungsstand führt die Runtime automatisch fort.
  • Größere Änderungsmengen werden auf mehrere Aufrufe verteilt.
  • Nach einem Fehler kann derselbe Batch erneut eintreffen. Verarbeiten Sie Wiederholungen ohne doppelte fachliche Änderungen.
  • Gelöschte Datensätze sind nicht in changes.Items enthalten.

Prüfintervall und Rückblick konfigurieren Sie in den Studio-Einstellungen zur Datenüberwachung.

Änderungen in eine eigene Datenbank übernehmen

Das Beispiel verwendet GraphQL und EF Core, um den bisherigen Export einer geänderten Adresse durch ihren aktuellen Stand zu ersetzen:

public sealed class AdressenExportModule(
    IBpQlSession session,
    ExportDbContext db) : BpModule
{
    public override string ModuleName => "Adressen-Änderungsexport";
    public override string ModuleVersion => "1.1.0";
    public override string ModuleDescription => "Exportiert geänderte Adressen in eine SQLite-Datenbank.";

    [Action("export-changed", Display = "Geänderte Adressen exportieren")]
    [OnChanged]
    public async Task<int> ExportChangedAsync(ChangedSet<Addresses> changes, CancellationToken cancellationToken)
    {
        foreach (var adresse in changes.Items)
        {
            var anschriften = session.QueryDataSet<PostalAddresses>()
                .Where(item => item.AdrNr == adresse.AdrNr)
                .Include(item => item.ContactPeople)
                .ToList();

            // Eine geänderte Adresse ersetzt ihren vorherigen Export vollständig.
            var previous = await db.Adressen
                .Where(row => row.AdrNr == adresse.AdrNr)
                .ToListAsync(cancellationToken).ConfigureAwait(false);
            db.Adressen.RemoveRange(previous);
            db.Adressen.Add(MapExportRow(adresse, anschriften));
        }

        await db.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
        return changes.Items.Count;
    }
}

Den Datenbankkontext registrieren Sie über ConfigureServices.