Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz in Query einfügen (https://www.delphipraxis.net/66089-datensatz-query-einfuegen.html)

BlueStarHH 24. Mär 2006 14:16

Datenbank: MySQL • Zugriff über: TZQuery

Datensatz in Query einfügen
 
Ich habe ein TQuery, das mit einem TUpdateSQL verbunden ist. Die Daten werden in einem Grid angezeigt.

Beim Hinzufügen eines neuen Datensatzes tritt folgendes Problem auf. Der Ablauf ist wie folgt:

1. AQuery.Insert;
2. Anwender füllt DBEdit-Felder aus
3. AQuery.Post;

Nun sind die Daten in der Datenbank. Jedoch zeigt das Grid nur die vom Anwender eingegebenen Daten. Daten die mit dem Query berechnet werden, werden nicht angezeigt. Also führe ich nach dem Post ein AQuery.Refresh aus. Nun werden aus die berechneten Daten angezeigt. Dadurch ergibt sich folgendes Problem:

Durch das AQuery.Refresh wird der letzte Datensatz im Query ausgewählt und im Grid selektiert. Dadurch werden in den DBEdit-Feldern die Daten dieses letzten Datensatzes angezeigt. Das ist sehr verwirrend für den Benutzer. Wenn er seien Daten eingibt und nach dem speichern (post) wird plötzlich ein anderer Datensatz angezeigt. Wie kann ich dies verhindern?

mkinzler 24. Mär 2006 15:29

Re: Datensatz in Query einfügen
 
Vor dem Post akteuelln Datensatz merken und nach dem Refresh diesen wieder zum aktuellen machen (ID des neuen Datensatz sollte reichen für Locate) oder verschiedene Objekte für Anzeige/Änderung.

BlueStarHH 24. Mär 2006 16:20

Re: Datensatz in Query einfügen
 
Der Datensatz hat ein Feld ID. Diese ist der Primärschlüssel. Diesen Feld könnte man sich merken und dann anspringen. ABER: Das Feld ist ein autoinc-Feld, wird also von der Datenbank automatisch um einen hochgezählt. Daher wird für dieses Feld kein Wert in meinem SQL-Insert-Statement angegeben und ich kenne diesen Wert auch nicht. Kann man den irgendwie abfragen? Er wird ja erst nach dem AQuery.Post erzeugt oder nicht? Wenn ich dann z.B. mit AQuery.FieldByName('ID').AsString den Wert abfragen möchte, bekomme ich eine leere ID da Delphi von den Änderungen in der DB noch nichts mitbekommen hat. Deswegen der Refresh im oberen Posting. Durch den Refresh wird aber der aktuelle Datensatz geändert. Wo wir wieder bei meinem Problem sind.

BlueStarHH 24. Mär 2006 16:20

Re: Datensatz in Query einfügen
 
Zitat:

Zitat von mkinzler
oder verschiedene Objekte für Anzeige/Änderung.

Was meinst Du damit? Danke.

mkinzler 24. Mär 2006 16:27

Re: Datensatz in Query einfügen
 
Zitat:

Zitat von BlueStarHH
Zitat:

Zitat von mkinzler
oder verschiedene Objekte für Anzeige/Änderung.

Was meinst Du damit? Danke.

2 verschiedene Queries für select und Insert/Update usw. Hilft dir in diesem fall aber nicht wirklich weiter. Vielleicht könnte es etwas bribgen, den Select-Befehl etwas zu modifizieren. z.b mit
SQL-Code:
... ORDER BY ID
dann ist sichergestellt, das der neue datensatz der Letzte ist und daher nach dem Refresh aktiv ist.

BlueStarHH 24. Mär 2006 16:34

Re: Datensatz in Query einfügen
 
Zitat:

Zitat von mkinzler
Vielleicht könnte es etwas bribgen, den Select-Befehl etwas zu modifizieren. z.b mit
SQL-Code:
... ORDER BY ID
dann ist sichergestellt, das der neue Datensatz der Letzte ist und daher nach dem Refresh aktiv ist.

Das geht leider auch nicht, weil das Grid nicht nach der ID sortiert sein muss. Außerdem wird die DB von mehreren Personen gleichzeitig genutzt. Es kann also sein, dass zwischen Post und Refresh noch ein anderer User seine Daten in die DB schreibt. Daher könnte dann der neue Datensatz, den der andere User angelegt hat, der letzte sein. Dieser würde dann fälschlicherweise angesprungen werden.

mkinzler 24. Mär 2006 16:39

Re: Datensatz in Query einfügen
 
Verwendest du schon, die neueste Version der ZeosLib? Dort gibt es die Möglichkeit mit Sequences zu arebeiten so das man vor dem Einfügen schon die ID, die verwendet wird, ermitteln kann. Ich habe aber keine Erfahrung damit.
Noch eine Möglichkeit, die allerdings alles andere als optimal ist, wäre es die ID durch vollständige Abfrage über den neu eingefügten Datensatz zu ermitteln.

BlueStarHH 24. Mär 2006 16:56

Re: Datensatz in Query einfügen
 
Zitat:

Zitat von mkinzler
Verwendest du schon, die neueste Version der ZeosLib? Dort gibt es die Möglichkeit mit Sequences zu arebeiten so das man vor dem Einfügen schon die ID, die verwendet wird, ermitteln kann. Ich habe aber keine Erfahrung damit.

Ich schaue es mir mal an. Aber das wird wohl auch ein Problem geben. Denn wenn ich die ID bereits vor dem Posten eines neuen Datensatz kenne und mich dann entscheide den neuen Datensatz doch nicht zu posten müsste die ID verbraucht werden. So hat man dann eine Lücke in der Nummerierung. Die ID müsste verbraucht werden, damit ein zweiter User der ebenfalls zur selben Zeit eine ID anfordert eine eindeutige andere bekommt.

Zitat:

Zitat von mkinzler
Noch eine Möglichkeit, die allerdings alles andere als optimal ist, wäre es die ID durch vollständige Abfrage über den neu eingefügten Datensatz zu ermitteln.

Auch keine gute Idee. Denn der Datensatz kann nur über die ID eindeutig identifiziert werden. Alle anderen Felder können z.B. in mehreren Datensätzen gleich sein.

mkinzler 24. Mär 2006 17:04

Re: Datensatz in Query einfügen
 
Sequences machen nur bei Datenbanken mit Transaktionen Sinn, was bei Mysql nicht immer sichergestellt ist. Ich würde aber den wert auch erst abfragen, wenn ich mir sicher bin das Post erfolgen soll, also wirklich direkt vor dem Insert.
Aber Mysql hat doch eine Funktion (zumindset in php; mysql_insert_id) um die id des eingefügten Datensatzes nach dem Insert zu ermitteln.

BlueStarHH 24. Mär 2006 17:09

Re: Datensatz in Query einfügen
 
Zitat:

Zitat von mkinzler
Aber Mysql hat doch eine Funktion (zumindset in php; mysql_insert_id) um die id des eingefügten Datensatzes nach dem Insert zu ermitteln.

Wie kann ich diese Funktion mit der ZeosLib/Delphi nutzen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz