Table of Contents

Abfrage- und Schreiboptionen

WithOptions ergänzt eine Abfrage um GraphQlQueryOptions<T>; Save und Remove nehmen Optionen für den jeweiligen Schreibaufruf entgegen.

Abfrageoptionen

Option Wirkung
NearestMatch() nächsten passenden Indexeintrag suchen
ModifyLsn(wert) erwarteten Änderungsstand angeben
UseCurrent() aktuellen Datensatz des API-Kontexts lesen
UseContext() Datensatz aus dem API-Kontext lesen
KeyFilter Schlüssel der gewählten Sortierung einschränken
SortBy<TIndex>() Sortierfolge des Servers über den Indextyp wählen

NearestMatch, ModifyLsn und die Kontextauswahl verwenden Einzelabfragen mit First oder FirstOrDefault. Für NearestMatch und KeyFilter muss ein passender Index verfügbar sein.

var artikel = qlApp.QueryDataSet<Products>(includes: ["ArtNr", "SuchBeg"])
    .Where(p => p.ArtNr == "10000")
    .WithOptions(o =>
    {
        o.NearestMatch();
        o.KeyFilter.Eq(p => p.ArtNr, "10000");
    })
    .FirstOrDefault();

Sortierfolge wählen

Der Server sortiert nach festen Sortierfolgen. SortBy<TIndex>() wählt sie über den Indextyp, weil mehrere Sortierfolgen dieselben Schlüsselfelder haben können: ProductsNrIdx sortiert ArtNr als Text, ProductsNrNumIdx numerisch.

var artikel = qlApp.QueryDataSet<Products>(includes: ["ArtNr", "LagNr"])
    .WithOptions(o => o.SortBy<ProductsNrNumIdx>())
    .Where(p => p.LagNr != null)
    .Take(100)
    .ToList();

Der Server sortiert ausschließlich aufsteigend und paginiert nur vorwärts. OrderBy und OrderByDescending sortieren weiterhin im Arbeitsspeicher und bleiben davon unberührt.

Schränkt die Abfrage bereits einen Indexbereich ein, gilt dessen Sortierfolge. Eine abweichende Auswahl mit SortBy wirft eine InvalidOperationException, ebenso die Kombination mit NearestMatch oder einer Einzelabfrage über First beziehungsweise FirstOrDefault.

Nur anlegen, wenn noch nicht vorhanden

var artikel = qlApp.AddDataSet<Products>();
artikel.ArtNr = "TEST123";
artikel.SuchBeg = "Testartikel";

artikel.Save(o => o.IfNotExists(p => p.ArtNr == "TEST123"));

Die Bedingung unterstützt Gleichheit und Kombinationen mit &&. Ohne Bedingung leitet IfNotExists() den Schlüssel aus den Modellwerten ab.

Änderungsstand prüfen

Mit ModifyLsn übergeben Sie bei Abfragen, Änderungen oder Löschungen den zuvor gelesenen LSN-Wert. Verwenden Sie den tatsächlichen Änderungsstand des Datensatzes.

artikel.Save(o => o.ModifyLsn(erwarteteModifyLsn));

Sperren anfordern

artikel.Save(o =>
{
    o.Locks.ForWritingSelf();
    o.Locks.ForReading<Users>();
});

ForWriting<T>() und ForReading<T>() beziehen sich auf den angegebenen Datensatztyp, ForWritingSelf() auf den geschriebenen Datensatz.

Zuweisungen beim Speichern

Assign überträgt Werte aus Adresse, Artikel oder Benutzer in die angegebenen Felder.

var vorgang = qlApp.AddDataSet<Transactions>();
vorgang.Art = 70;
vorgang.AdrNr = "10000";

vorgang.Save(o =>
{
    o.Assign.Address(v => v.AdrNr, "10000");
    o.Assign.User(v => v.Bez, "Erstellt per API");
});

Bedingungen serverseitig prüfen

If prüft die Bedingung auf dem Server; Raise bricht den Schreibvorgang mit einer Meldung ab.

artikel.Save(o =>
{
    o.If(a => a.SuchBeg == "Gesperrt", regel =>
        regel.Raise("Dieser Artikel darf nicht geändert werden."));
});

Mit IfThenElse können Sie zusätzlich einen zweiten Zweig angeben:

artikel.Save(o => o.IfThenElse(
    a => a.Vk0Preis > 0,
    dann => dann.Raise("Preis ist bereits gesetzt."),
    sonst => sonst.Raise("Preis fehlt.")));