Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DBLookup und Insert / Append (https://www.delphipraxis.net/214202-dblookup-und-insert-append.html)

rokli 3. Dez 2023 09:23

Datenbank: MSSQL • Version: 2022 • Zugriff über: FireDAC

DBLookup und Insert / Append
 
Moin,
ich habe seid ewigen Zeit mal wieder einige DBLookUpComboBoxen auf einer Form verwendet, um Daten aus einer Tabelle mit Schlüsseln aus einer anderen Tabelle anzuzeigen.

Beispiel:
Als Beispiel dient eine mini Adressverwaltung

Tabelle tAdresse:
Name
Vorname
Strasse
Plz

tAdresse enthält das (Schlüssel-)Feld PLZ

Tabelle tPlzOrt
Plz
Ortsname

tPLZOrt.Plz ist die Referenz auf tAdresse.Plz

Über die DBLookUpComboBox wird aufgrund des PLZ Feldes auf der Maske der Ort korrekt angezeigt.
Die anderen (Edit-)Felder werden aus tAdresse gefüllt.


Problem:
Wenn ich einen neuen Datensatz in tAdresse einfügen möchte, leere ich die Edit-Felder. Wenn dann in der DbComboLookUpComboBox die zugehörige PLZ für den neuen Datensatz ausgewählt wird, wird (quasi rückwärts) der Satzzeiger der tAdresse verändert und damit ist die Neueingabe in den Feldern weg, da die Edit-Felder mit den Inhalten des "gefunden" Datensatzes gefüllt werden.

Kann man das Verhalten abschalten, oder ist TDbComboLookupBox dafür nicht geeignet?

Uwe Raabe 3. Dez 2023 10:27

AW: DBLookup und Insert / Append
 
Zitat:

Zitat von rokli (Beitrag 1530344)
Wenn dann in der DbComboLookUpComboBox die zugehörige PLZ für den neuen Datensatz ausgewählt wird, wird (quasi rückwärts) der Satzzeiger der tAdresse verändert

Das sollte nicht sein und ist es in der Regel auch nicht. Kannst du ein kleines Beispiel deiner Controls und ihrer Eigenschaften erstellen, aus dem die Eigenschaften und Verlinkungen der Controls ersichtlich sind?

rokli 3. Dez 2023 10:44

AW: DBLookup und Insert / Append
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist mal einer der Objektinspektoren in der Anlage.

Besser wird es, wenn ich beim Insert die Verbindung zur Tabelle tAdresse im DBLookupComboBox trenne:

tAdresse.DataSource := nil;

Dann kann ich den INSERT durchführen und trotzdem aus den DBLookupComboboxen die ID über nehmen und durchs INSERT in den neuen Satz eintragen.
Danach mit

tAdresse.DataSource := dsqAdresse;

wieder einschalten.

Uwe Raabe 3. Dez 2023 11:13

AW: DBLookup und Insert / Append
 
Heißen das verknüpfende Feld in beiden Tabelle iKtoArt?

Hast du noch irgendwelche Events in den DataSets verdrahtet?

Solche Probleme sind in der Regel nicht zu analysieren, wenn man die vermeintliche Ursache (hier TDBLookupComboBox) isoliert betrachtet. Meistens liegt es an irgendwas drumherum. Deswegen meine immer wiederkehrenden Fragen nach mehr Kontext.

Neumann 3. Dez 2023 11:48

AW: DBLookup und Insert / Append
 
PLZ Ort ist auch nie eine eindeutige Beziehung. Viele Orte haben mehrere PLZ; auch gibt es dann noch eine Plz für mehrere Orte. Vielleicht wird bei Lookup dann ein schon vorhandener Datensatz aktiviert?

rokli 5. Dez 2023 11:06

AW: DBLookup und Insert / Append
 
Hallo und sorry, dass ich jetzt erst schreibe .. war viel zu tun.

Die Referenzen in den Tabellen bekommen immer gleiche Namen. iKtoArt (Ertragkonto = 1, Aufwandskonto = 2 und Neutralkonto =3) wird sowohl in der Tabelle tKtoArt (Kontoarten-Tabelle) und tKonto (Konto-Tabelle) verwendet.

Auf der Form:
Es gibt neben den DBLookUpComboBoxen noch ein Grid, was den Inhalt von tAdressen (um beim Beispiel zu bleiben) anzeigt. Daneben gits einige Edit-Felder, die DB-Inhalte anzeigen und über Buttons <neuer Satz>, <speichern> und <löschen> die Software bedienbar machen.
(Ja ich programmiere noch einzelne Daten-Edit-Felder und keine Universal-Grids, in den alles abgewickelt wird.)

Also im DataSource.OnDataChange der Tabelle tAdressen wird das füllen der Edit-Felder ausgelöst. Damit erreiche ich ja, wenn der Satzzeiger im DbGrid bewegt wird, dass die Edit-Felder auf der Maske aktualisiert werden; der Inhalt der DBComboLookUpBoxen kommen ja "von selbst".

@Neumann: Keine DB-Tabelle sieht bei mir tatsächlich wie in tAdresse und tPLZOrt beschrieben aus. Das Beispiel mit PLZ würde ich so, in real, nie ausführen. Daher Beispiel.

Uwe Raabe 5. Dez 2023 11:38

AW: DBLookup und Insert / Append
 
Wie schon gesagt, das passiert in der Regel nicht. Ich kann aber anhand der bisherigen Informationen so nicht sehen, was der Auslöser dafür ist.

Zitat:

Zitat von rokli (Beitrag 1530426)
Also im DataSource.OnDataChange der Tabelle tAdressen wird das füllen der Edit-Felder ausgelöst.

Sind das denn keine datensensitiven Controls? Bei denen wäre das ja nicht nötig.

rokli 5. Dez 2023 11:57

AW: DBLookup und Insert / Append
 
das ist korrekt, dass sind TEdit Felder, die über eine Procedure mit Edit1.Text := qryAdressen.FieldByName('Name').AsString z. B. gefüllt werden.

Ich werde das mal auf TDbEdit Felder umbauen und ausprobieren.

Danke, Uwe.

Uwe Raabe 5. Dez 2023 12:01

AW: DBLookup und Insert / Append
 
Ich glaube aber nicht, dass das irgendwas mit dem Problem zu tun hat. War nur eine generelle Frage.

Jumpy 5. Dez 2023 13:26

AW: DBLookup und Insert / Append
 
Zitat:

Zitat von rokli (Beitrag 1530429)
das ist korrekt, dass sind TEdit Felder, die über eine Procedure mit Edit1.Text := qryAdressen.FieldByName('Name').AsString z. B. gefüllt werden.

Ich werde das mal auf TDbEdit Felder umbauen und ausprobieren.

Wäre es nicht sinnvoller die TDBLookupCombobox in eine gewöhnliche umzubauen oder so?

Uwe Raabe 5. Dez 2023 15:29

AW: DBLookup und Insert / Append
 
Zitat:

Zitat von Jumpy (Beitrag 1530433)
Wäre es nicht sinnvoller die TDBLookupCombobox in eine gewöhnliche umzubauen oder so?

Was soll daran sinnvoller sein? Ich wäre wesentlich interessierter daran, die Ursache zu finden und zu beheben, als an einem Symptom rumzudoktorn.

rokli 6. Dez 2023 09:38

AW: DBLookup und Insert / Append
 
Moin,

ich habe jetzt eine neue, eigenständige Anwendung mit einer MainForm und 2 Fenster geschrieben, die auf zwei kleine Test-Tabellen gehen.

Fenster 1: Ein DBGrid mit der Anzeige der Tabellendaten. Dazu ein DB-Edit-Feld bei dem die Bereitstellung der Daten automatisch durch die Komponente erfolgt. Die DBLookUpComboBox wird über den Mechanismus innerhalb der im Objektinspektor eingestellten Werte automatisch versorgt. Die Steuerung erfolgt über einen DBNavigator, der mit der Tabelle, die auch das DBGrid füllt, verbunden ist.

Ergebnis: Im Prinzip alles ok!
Beim Anlegen eines neuen Datensatz über plus (+) im Navigator werden alle Felder gelöscht. Klickt man in das Edit-Feld werden allerdings fälschlicherweise die Daten des aktiven Datensatzes eingetragen. Erst beim zweiten Kick auf das Plus-Zeichen im DBNavigator, erhält man eine neue Satz-ID und kann den Satz tatsächlich eintragen - inklusive richtiger Verarbeitung der Daten der DBLookUpComboBox.

Fenster 2: Ein DBGrid mit der Anzeige der Tabellendaten. Dann ein Editfeld und die DBLookUPComboBox wie oben. Hinzu kommen ein Button für Neu-Anlage und ein Button für Speichern. Über eine boolsche Variable wird gesteuert, das es sich um einen neuen Satz handelt. Diese Variable wird beim Speichern ausgewertet, ob ein INSERT oder ein UPDATE benötigt wird.

Ergebnis: Der ursprüngliche Fehler tritt wieder auf. Offensichtlich wird beim neuen Datensatz das Verhalten der DBLookUpComboBox, über die Einstellung im DataSource.OnDataChange, negativ beeinflusst.

Anschließend habe ich die Aktualisierung der Daten aus der DataSource.OnDataChange herausgenommen und die Aktualisierung auf einen DbGrid.OnCellClick gelegt.Fehler weg!

Nicht so schön mit der Aktualisierung, aber das Grundproblem ist damit weg!

Fals jemand das Coding haben will, kann ich das gerne, inkl. der Testdatentabellen, bereitstellen.

Uwe Raabe 6. Dez 2023 11:16

AW: DBLookup und Insert / Append
 
Zitat:

Zitat von rokli (Beitrag 1530463)
Fals jemand das Coding haben will, kann ich das gerne, inkl. der Testdatentabellen, bereitstellen.

Ja, ich wäre interessiert - und sei es nur um die eigentliche Ursache zu ergründen.

rokli 6. Dez 2023 11:30

AW: DBLookup und Insert / Append
 
Hey,

stelle ich erst Morgenfrüh bereit, da ich heute Nachmittag Termine habe.
Danke!

Jumpy 6. Dez 2023 15:38

AW: DBLookup und Insert / Append
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1530440)
Zitat:

Zitat von Jumpy (Beitrag 1530433)
Wäre es nicht sinnvoller die TDBLookupCombobox in eine gewöhnliche umzubauen oder so?

Was soll daran sinnvoller sein? Ich wäre wesentlich interessierter daran, die Ursache zu finden und zu beheben, als an einem Symptom rumzudoktorn.

Ich hatte das so verstanden, dass bisher nicht mit den DB-sensitiven Controls gearbeitet wird sondern mit einfachen TEdits usw. und hab nicht verstanden, wieso für einen Aspekt nun eine TDB-Control hinzukommen sollte. Ging mir nicht um das eigentliche Problem.

Ohne Code zu sehen, allein von der Beschreibung hätte ich halt durch den Mischmasch sowas befürchtet wie das die nicht DB-Controls geleert werden um einen neuen Datensatz eingeben zu können. Die Datasource aber nicht parallel in den Insert-Mode gestellt wird und noch auf dem alten Datensatz verweilt und in dem DB-Control halt daher noch am alten Datensatz gearbeitet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.

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