2016-06-10 12 views
1

Im Ereignis OnReconcileError für ein ClientDataSet, können Sie es an raMerge, die die Änderungen an das Delta speichert, bereit für eine andere Updates ohne Fehler zu aktualisieren. Gibt es eine Möglichkeit, dem Dataset mitzuteilen, das Delta sofort im OnReconcileError-Ereignis anzuwenden? Ich kann nur an einen verschachtelten Weg denken, um zu überprüfen, ob Fehler im AfterApplyUpdates Ereignis behoben wurden.ClientDataSet: Automatisches Anwenden des abgeglichenen Deltas?

+0

Ich versuchte den einfachen Ansatz der Änderung eines Datensatzes im OnReconcileError-Ereignis, aber Aufruf von .Post auf der CDS führt nur zu einer Ausnahme "Operation nicht anwendbar". Verwenden Sie das RecError-Formular (aus dem Object Repository) bereits in OnReconcileError? Wie auch immer, es wäre wahrscheinlich viel einfacher zu vermeiden, dass Fehler von vornherein so weit wie möglich auftreten, indem einige benutzerdefinierte Einschränkungen auf dem CDS gesetzt werden. – MartynA

+0

Ja, ich bin. Ich habe es optimiert, um nur Zusammenführen oder Aktualisieren zu ermöglichen. Die Aktualisierung ist großartig, aber merge nur die Hälfte von dem, was ich brauche. –

+0

Nun, ich denke, man sollte den Lesern genau erklären, was die "andere Hälfte" ist. Wenn ich Sie richtig verstehe, wäre das schwierigste Bit, in OnReconcileError (ohne menschliche Unterstützung) genau zu identifizieren, welche Änderungen an dem geänderten Datensatz vorgenommen werden müssen, um die Abgleichsfehler zu beheben. Wenn du das kannst. Ich hätte gedacht, dass das Ausführen der Änderungen bei einem späteren Aufruf von ApplyUpdates relativ trivial wäre. – MartynA

Antwort

1

Also hatte ich zentralen Code für die Anwendung der Updates, und ich erkannte schließlich, dass wahrscheinlich der beste Ort wäre, um zu überprüfen, ob der Benutzer eine Zusammenführung angefordert hat. Ich muss vielleicht noch etwas aufräumen, könnte aber eine Lösung für andere sein, die auf dieses Problem stoßen.

if(cds.ChangeCount > 0)then 
begin 
    fIsMerged := false; 
    errors := cds.ApplyUpdates(0); 
    if(errors = 0)then 
    begin 
    cds.Refresh; 
    end 
    //If there is a conflict, the user might try to merge. 
    //If they do, we need to reapply the update. 
    else if(fIsMerged)then 
    begin 
    errors := cds.ApplyUpdates(0); 
    if(errors = 0)then 
    begin 
     cds.Refresh; 
    end; 
    end; 
end; 

fIsMerged ist eine Klassenvariable, die ich in der auf versöhnt Handler gesetzt.

Verwandte Themen