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.Itemsenthä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.Itemsenthalten.
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.