Verständnis-Frage bzg. Constrains

03/02/2008 - 12:49 von Attila Krick | Report spam
Hi,

ich habe z.B. folgenden Sachverhalt:

Eine Form Rechnung.

Diese Rechnung besteht aus zwei Tabellen Rechnungen und Rechnungsposten,
beide sind in einem typisierten DataSet abgebildet.

die Tabelle Rechnungen ist an TextBoxen gebunden die Tabelle Positionen an
an DGV.

Die BindingSource Rechnungsposten ist über die Beziehung gebunden.

Die Form wir primàr zum Neuanlegen benutzt, d.h.
beim Load sage ich jetzt nur bsRechnung.AddNew().

Wenn ich jetzt als erstest die Positionen im DGV ausfülle und wechsel die
Zeile bekomme ich eine Invalidconstraintexception mit der Meldung das in
der Übergeordneten Tabelle die ID vorhanden sein muss.

Soweit so gut, die ID ist auf jedenfall in der ü.Tab. vorhanden, sonder es
eigentlich um die Tatsache das die Übergeordnete Tabelle.Row mit EndEdit
noch nicht abgeschlossen ist.
Das kann ich aber nicht tun, wenn die Pflichtfleder noch nicht ausgefüllt
sind.
Aber das kann es doch nicht sein, oder?

Wo ist mein Ansatz falsch? Der Benutzer soll ausfüllen wie er will und zum
Schluss soll geprüft und nicht erst den Rechnungskopf und dann die Posten!

Grüße

Attila
 

Lesen sie die antworten

#1 Peter Fleischer
03/02/2008 - 18:33 | Warnen spam
"Attila Krick" schrieb im Newsbeitrag
news:14hkeaq10p42z$

Die BindingSource Rechnungsposten ist über die Beziehung gebunden.

Die Form wir primàr zum Neuanlegen benutzt, d.h.
beim Load sage ich jetzt nur bsRechnung.AddNew().

Wenn ich jetzt als erstest die Positionen im DGV ausfülle und wechsel die
Zeile bekomme ich eine Invalidconstraintexception mit der Meldung das in
der Übergeordneten Tabelle die ID vorhanden sein muss.



Hi Attila,
solange du gebunden über Beziehung arbeitest, muss der Masterdatensatz
vorhanden sein. Mit dem Datensatzwechsel im Child wird der Child-Datensatz
abgelegt und die Constraint-Prüfung wird wirksam. Wenn zu diesem zeitpunkt
noch kein Master-datensatz abegelegt ist, gibt es einen Fehler.

Soweit so gut, die ID ist auf jedenfall in der ü.Tab. vorhanden,



Das stimmt nicht. Der Master-Datensatz ist vor EndCurrentEdit noch
"detached", d.h. nicht in der übergeordneten Tabelle vorhanden. Er existiert
nur als DataRowView in der Liste der DataRowViews im DataView.

sonder es
eigentlich um die Tatsache das die Übergeordnete Tabelle.Row mit EndEdit
noch nicht abgeschlossen ist.
Das kann ich aber nicht tun, wenn die Pflichtfleder noch nicht ausgefüllt
sind.
Aber das kann es doch nicht sein, oder?



Was du willst, geht auch im realen Leben nicht (ohne PC). Stell dir 2
Sachbearbeiter vor. Der erste Sachbearbeiter erstellt den Rechnungsrumpf und
legt, sobald er fertig ist, im Ordner einen Reiter dafür an. Bevor er
fertig ist, soll der andere Sachbearbeiter aber die Belege zu jeder Position
abheften. Da aber noch kein Reiter vorhanden ist, kann der zweite
Sachbearbeiter nichts abheften.

Löse dieses Problem erst einmal organisatorisch ohne PC und implementiere
die Lösung dann in deinem Programm.

Wo ist mein Ansatz falsch? Der Benutzer soll ausfüllen wie er will und zum
Schluss soll geprüft und nicht erst den Rechnungskopf und dann die Posten!



Wenn du obiges Szenario mit den beiden Sachbearbeitern betrachtest, dann
wàre eine Lösung die Nutzung von Schmierzetteln, die der 2. Sachbeabreiter
ausfüllt und dem ersten Sachbearbeiter übergibt, damit dieser die fehlenden
Aktivitàten ausführen kann, d.h. die Schnierzettel vervollstàndigen und dann
hinter dem dann angelegten Reiter ablegen kann.

Viele Gruesse

Peter

Ähnliche fragen