Autor Beitrag
Mandi Nice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

Win2K, XP, CE
Delphi 2006 Prof.
BeitragVerfasst: Mo 23.11.09 21:27 
Hallöchen

Ich stelle die Daten einer Access Datenbank in einem DB-Grid dar.
In dem DB-Grid kann der Anwender eingaben machen.
Die Eingaben werden sofort nach verlassen der Zelle in die Datenbank übernommen.

Ich möchte aber dass die Daten erst nach dem Klick auf einen DBNavigator-Button "nbPost" übernommen werden.
Oder durch klicken auf "nbCancel" alle gemachten eingaben verworfen werden.

Wie geht das ?

Vielen Dank für Eure Hilfe.

hmg
Mandi
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Di 24.11.09 12:06 
Hi,

beim Arbeiten mit Datenbanken wird in der Regel Zeilenorientiert vorgegangen, so auch hier. Wenn du die Zeile verlässt muss entweder geposted oder verworfen werden, standardmäßig wird geposted. Das hängt nicht zu Letzt mit den Locking zusammen. Grob gesprochen musst du immer davon ausgehen, dass so eine Tabelle von mehreren Nutzern gleichzeitig geöffnet sein könnte. Wenn einer dieser Benutzer einen Datensatz bearbeitet muss dieser für den anderen gesperrt werden (wenn mehrere Benutzer gleichzeitig den gleichen Datensatz ändern gibt es Probleme). Wenn es nun einem Nutzer möglich ist mehre Datensätze in der bearbeitung zu halten, kann er Theoretisch ganze Tabellen für andere Nutzer Blockieren. Da so etwas in der Regel nicht gewünscht ist, ist es üblich Änderungen an einer Zeile bei deren Verlassen zu Posten. Ich kenne auch kein Programm, das dies anders handhabt, daher solltest du dir überlegen, ob deines da Tatsächlich von der Norm abweichen möchte. Es gibt z.B. user für mich, die grundsätzlich durch ein ändern der Zeile im Grid posten, da sie dann nicht zur Maus greifen müssen um auf so ein Fitzelknöpfchen (oft werden die Navigator leisten ja irgendwo ziemlich klein integriert) zu klicken.

Wenn du es aber unbedingt anders haben möchtest, dann fällt mir kein anderer Weg ein als, eine Kopie der Daten im Speicher zu halten, die Änderungen an denen durchführen zu lassen und, sollte der user auf Post klicken, diese von Hand wieder in die DB zu schreiben. Das bringt aber viele Nachteile mit, so dürfte es z.B. bei großen Tabellen recht langsam werden, da du diese ja vor dem Anzeigen erst komplett einlesen musst.

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Di 24.11.09 12:59 
Moin,

Eine Alternative wären sogenannte disconnected recordsets. Diese benutze ich aber nur in anderen Sprachen, deswegen würde ich mal auf Google verweisen. Dabei werden die Daten gelesen und danach die Verbindung gekappt. Das Insert/Update muss man dann auch selber programmieren.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 24.11.09 13:14 
Ich würde es mit Transaktionen versuchen.
Dann kann selbst ein Post mit einem Commit Rollback aufgehoben werden.

Außerdem stehen die Daten nach dem Verlassen der Zelle noch nicht in der Datenbank, sondern erst mit dem Wechsel das Datensatzes, wird das implizite Post ausgeführt. Wenn also die Zelle innerhalb eines Datensatze gewechselt wird, stehen die Änderungen an der Zelle nur auf an dem Arbeitsplatz zur Verfügung.

Ist das so nicht gewollt, muss man Offline arbeiten. Also keine datenbanksensitiven Komponenten verwenden.


Zuletzt bearbeitet von jasocul am Di 24.11.09 15:12, insgesamt 1-mal bearbeitet
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Di 24.11.09 14:45 
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde es mit Transaktionen versuchen. [...]

Und das Konzept der Transaktionen vergewaltigen? Nein danke.

Zitat:
[...] Dann kann selbst ein Post mit einem Commit aufgehoben werden. [...]

Du meintest bestimmt Rollback, oder?

Zitat:
[...] Ist das so nicht gewollt, muss man Offline arbeiten. Also keine datenbanksensitiven Komponenten verwenden.

Wieso sollte man offline nicht mit datenbanksensitiven Komponenten arbeiten? Konzepte wie ClientDataset und Konsorten wären einen Blick wert.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 24.11.09 15:12 
Natürlich meinte ich Rollback. :roll:
Ja, ich habe mich nicht klar genug ausgedrückt. Es stimmt natürlich, dass man mit db-sensitiven Komponenten auch Offline arbeiten kann.

Und so eine Vergewaltigung des Transaktionskonzept ist es ja nun auch nicht. Zumal ja auch nicht eindeutig beschrieben ist, warum die Daten nicht sofort in der DB landen sollen. Es könnte sogar sein, dass eine Transaktion genau das ist, was gewollt und sinnvoll ist.
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: Di 24.11.09 16:35 
Hi,

Transaktionen währen natürlich eine Möglichkeit, aber bietet Access die an?

critter

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Di 24.11.09 16:45 
Ja, die gibts sogar da.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.