Gelöst Data Edit Element aktualisieren mittels Datenstruktur / Datenservice

Bei einem Data Edit Element wird eine Datenstruktur verwendet. Ein Datensatz soll dann via C# "public override DataActionResult<DataContainer> Update(DataActionRequest<DataContainer> request)" aktualisiert werden.

********
Soweit kommt es allerdings nicht, im Tracelog wird eine System.ArgumentException: key ausgelöst:

System.ArgumentException: key
bei Sagede.Shared.ControlCenter.SDataClient.ServiceAdapter.Update[T](SDataContract service, DataActionRequest`1 request, ApplicationContext context, Boolean withPartialPayload)
bei Sagede.Shared.ControlCenter.SDataClient.ClientCore.<>c__DisplayClass123_0.<UpdateRecord>b__0(SDataContract s)
bei Sagede.Shared.ControlCenter.SDataClient.ClientContext.<>c__DisplayClass24_0`1.<Execute>b__2(SDataContract service)
bei Sagede.Shared.ControlCenter.SDataClient.ServiceExecutionContext.<<ExecuteRequestAsync>b__9_0>d.MoveNext()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
bei Sagede.Shared.ControlCenter.SDataClient.ServiceExecutionContext.<ExecuteRequestAsync>d__11.MoveNext()
=> ExecuteRequestAsync in ServiceExecutionContext.cs(line 155)
=> ExecuteRequestAsync in ServiceExecutionContext.cs

********

Dies obwohl der Schlüssel vordefiniert ist:

public override void PrepareMetadata(DataObjectBase rawMetadata)
{
DataStructure dataStructure = rawMetadata as DataStructure;
if ((dataStructure != null))
{
if (!string.IsNullOrEmpty(KeyField1))
{
DataFieldObjectBase field1 = dataStructure.Fields.TryGetItem(KeyField1);
if ((field1 != null))
{
dataStructure.PrimaryKeyField1 = KeyField1;
dataStructure.PrimaryKeyType1 = Enumerations.PrimaryKeyType.Variable;
}
}


}
}

*******

Was habe ich hier denn übersehen?
 
Die Schlüsselfelder einer Datenstruktur kann man jetzt in den Metadaten setzten und muss das nicht mehr über PrepareMetadata machen.
Der Fehler, der hier geworfen wird, sagt dass die Schlüssel nicht in den Daten für das Update übergeben wurden. Passt die Schlüssel-Zuordnung im DataEdit-Element auf die Datenstruktur?
 
Das habe ich auch vermutet - allerdings:
1. In der 9.04 habe ich den Schlüssel in der Struktur gesetzt (ganz konkret ist es die Artikelnummer als "string")
2. Der Schlüssel zwischen Datenstrukur und DataEdit-Element ist auch gemappt, auch in der Liste (Datenquelle basiert auf einem Geschäftsprozess) sind Schreibweisen und Datentypen exakt identisch.

Was ich noch nicht getan habe, ist in der 9.04 auf PrepareMetadata zu verzichten. Dies werde ich einmal testen und Feedback geben.
 
Ich habe die Sektion "PrepareMetadata" entfernt. Das Ergebnis bleibt dasselbe.

Fehlerfrei geht es, wenn ich mittels Makro/Kontektmenüaufruf eine DataServiceExecute Funktion aufrufe, da wird in den Dataservice das gesamte Objekt mit den zu ändernden Werten geliefert. Das entspricht aber nicht der vorgesehene Update Methode der Klasse "DataServiceBase"
 
Zuletzt bearbeitet:
Beim Update werden nur die geänderten Felder gesendet, aber der Schlüssel sollte in der Eigenschaft "KeyValue" des DataContainers stehen.
Semikolon separiert und Base64 kodiert.
 
Es ist ja so, dass es gar nicht erst zum Aufrufen der Methode Update kommt, zumindest steigt der Visual Studio Debugger nicht in den Code für die Methode "Update" ein. Bei der Methode "GetItem" und "Exceute" sehr wohl. Die Eigenschaft "KeyValue" ist eine geerbte Eigenschaft, sie steht somit immer zur Verfügung. Das scheint nicht das Problem zu sein oder verstehe dies möglicherweise falsch?
 
Das kann aus meiner Sicht nur vorkommen, wenn der DialogState Edit ist, es sich aber um einen neuen Datensatz handelt.
Für neue Datensätze kann man kein "Update" aufrufen.
Wenn der Datensatz vom Server kam, ist "KeyValue" immer gefüllt.
Stellt sich die Frage, warum ist in einem bestehenden Datensatz der KeyValue leer.
Was sagt denn Fiddler beim zurück gelieferten Datensatz?
Oder war er noch nie gespeichert?
Wird das Update aus einem Datensatz-Makro (UpdateDataRecord) ausgelöst, muss der Schlüssel ebenfalls vollständig angegeben werden.
Es wird jetzt schwierig zu analysieren, was noch fehlen könnte, ohne den Code der Anpassung zu kennen.
 
Danke, Fiddler hat geholfen: ich bin damit auf den Thread im Forum "https://www.sage-forum.de/threads/f...ich-aber-nicht-in-der-abfrage-enthalten.2505/" aufmerksam geworden.

Darauf hat sich dann ergeben, dass ich in der GetItem Methode den KeyValue und den VersionStamp setzen muss. Ist das geschehen, wird auch in die Update Methode eingestiegen...

Mit dem Abholen der Daten als Geschäftsprozess und dem Speichern der Daten als Datenstruktur hat man im Ergebnis mächtige Möglichkeiten, vielleicht hilft dies hier nun dem einen oder anderen. Wünschenswert wäre, dass im Kochbuch die Lösungen umfassender dargestellt werden, es fehlt immer ein wenig :)

Somit: danke für die Tipps, Problem gelöst.
 
Zurück
Oben