N'Abend,
ich hab schon ganz schartige Zähne vom In-den-Tisch-beißen
Folgendes Problem:
Haupttabelle "Buchungen" wird in einer Form angezeigt/geändert usw. Detailtabellen zu der Haupttabelle werden in derselben Form in DataGridViews mitgeführt. Das ganze ist mit einem typisierten DataSet realisiert, die Verbindung läuft über BindingSources (DataMember ist dann natürlich die Relation zwischen "Buchungen" und der jeweiligen Detailtabelle). Soweit, so gut.
Es kann aber vorkommen, dass durch Änderungen an den Werten einer Buchung ganze Datensätze in der Detailtabelle nicht mehr gültig sind und gelöscht werden müssen (hängt damit zusammen, zu welchen Terminen eine Buchung ausgeführt werden soll... wenn ich diese Termine ändere, können Detaildatensätze "verwaisen"). Da das nix mit Löschweitergabe und so zu tun hat, sondern nur von der Geschäftslogik abhängig ist, habe ich mir eine Funktion geschrieben, die vor dem Speichern der Buchungen nach solchen verwaisten Datensätzen sucht. Auch das funktioniert prima und ich bekomme eine Löschliste als ListOfInteger, die die ID's der zu löschenden Datensätze enthält und die ich abarbeiten kann.
So nu muss ich eigentlich nur noch diese Datensätze löschen. Und daran ruiniere ich mir das Gebiss :pinch:
Zuerst wollte ich das auf die Harte löschen: Connection, CommandObjekt, ExecuteNonQuery. Hat mich VB bei BindingSource.EndEdit angemeckert, weil ich damit praktisch ums DataSet herumgelöscht habe und BindingSource und Datenbank nicht mehr stimmig waren. Okay, sehe ich ein.
Also über die BindingSource löschen. Wollte ich in einem ersten Schritt über BindingsSource.Find jeweils nach der ID des zu löschenden Datensatzes suchen und dann über BindingSource.RemoveAt diesen Datensatz löschen.
Und jetzt meckert mich der Debugger an, dass die BindingSource kein ID-Feld enthält. Ich raff es einfach net. Vielleicht hab ich ja auch einen völlig falschen Ansatz gewählt. Ich füg mal den Codeausschnitt an und ein Bild von der Fehlermeldung. Ich schwöre euch, dass die der BindingSource zugrunde liegende Tabelle ein ID-Feld hat, das auch so heißt. Aber gut, DataMember ist ja nicht die Tabelle, sondern die Relation. Doch die Relation stellt die Beziehung im DataSet doch auch über die ID her. Also was für ein Problem könnte VB hier haben? Oder kann ich die Datensätze doch über eine Connection löschen (hat wenigstens problemlos gefunzt), aber dann müsste ich hinterher iwie die BindingSource aktualisieren.
Bitte! Hilfe!
ich hab schon ganz schartige Zähne vom In-den-Tisch-beißen
Folgendes Problem:
Haupttabelle "Buchungen" wird in einer Form angezeigt/geändert usw. Detailtabellen zu der Haupttabelle werden in derselben Form in DataGridViews mitgeführt. Das ganze ist mit einem typisierten DataSet realisiert, die Verbindung läuft über BindingSources (DataMember ist dann natürlich die Relation zwischen "Buchungen" und der jeweiligen Detailtabelle). Soweit, so gut.
Es kann aber vorkommen, dass durch Änderungen an den Werten einer Buchung ganze Datensätze in der Detailtabelle nicht mehr gültig sind und gelöscht werden müssen (hängt damit zusammen, zu welchen Terminen eine Buchung ausgeführt werden soll... wenn ich diese Termine ändere, können Detaildatensätze "verwaisen"). Da das nix mit Löschweitergabe und so zu tun hat, sondern nur von der Geschäftslogik abhängig ist, habe ich mir eine Funktion geschrieben, die vor dem Speichern der Buchungen nach solchen verwaisten Datensätzen sucht. Auch das funktioniert prima und ich bekomme eine Löschliste als ListOfInteger, die die ID's der zu löschenden Datensätze enthält und die ich abarbeiten kann.
So nu muss ich eigentlich nur noch diese Datensätze löschen. Und daran ruiniere ich mir das Gebiss :pinch:
Zuerst wollte ich das auf die Harte löschen: Connection, CommandObjekt, ExecuteNonQuery. Hat mich VB bei BindingSource.EndEdit angemeckert, weil ich damit praktisch ums DataSet herumgelöscht habe und BindingSource und Datenbank nicht mehr stimmig waren. Okay, sehe ich ein.
Also über die BindingSource löschen. Wollte ich in einem ersten Schritt über BindingsSource.Find jeweils nach der ID des zu löschenden Datensatzes suchen und dann über BindingSource.RemoveAt diesen Datensatz löschen.
Und jetzt meckert mich der Debugger an, dass die BindingSource kein ID-Feld enthält. Ich raff es einfach net. Vielleicht hab ich ja auch einen völlig falschen Ansatz gewählt. Ich füg mal den Codeausschnitt an und ein Bild von der Fehlermeldung. Ich schwöre euch, dass die der BindingSource zugrunde liegende Tabelle ein ID-Feld hat, das auch so heißt. Aber gut, DataMember ist ja nicht die Tabelle, sondern die Relation. Doch die Relation stellt die Beziehung im DataSet doch auch über die ID her. Also was für ein Problem könnte VB hier haben? Oder kann ich die Datensätze doch über eine Connection löschen (hat wenigstens problemlos gefunzt), aber dann müsste ich hinterher iwie die BindingSource aktualisieren.
Bitte! Hilfe!
Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss