![]() |
Editieren eines records durch auswahl mit TDBLookUpComboBox
Hallo,
Ich habe ein TDBGrid diverse TDBEdit-Felder, ein TDBNavigator und eine TDBLookupComboBox auf meinem Formular. Per Grid oder Navigator lässt sich im Datenbestand navigieren. Die Daten des Grids und der Edit-Felder werden aus einer Query erzeugt. Für Die ComboBox kommt neben der ersten Query eine zweite hinzu (ist ja der Sinn der Sache). Das Problem: Alle Update-Funktionen laufen korrekt ab solange ich nicht mit der LookUpBox navigiere. Benutze ich diese und möchte anschliessend den im Grid angezeigten Datensatz mit Hilfe des Navigators löschen, wird immer nur der erste Datensatz aus der Tabelle entfernt. Beim Löschen habe ich mir den den zu löschenden Key ausgeben lassen. Dieser ist immer der gewünschte. Trotzdem wird aber immer nur der erste Eintrag in der Tabelle gelöscht. Für eine Hilfestellung wäre ich sehr dankbar, Arndt Korsus |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Hai barnti,
willkommen im Forum. Frage: Wie versuchst Du denn den Datensatz zu löschen? Über ein eigenes Query, über die Deletefunktion des Grids oder des DataSets?? |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Zitat:
|
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Hallo Sharky,
sobald ich die Auswahl in der DBLComboBox getätigt habe wird mir der Eintrag im Grid angezeigt. Löschen möchte ich diesen mit dem Navigator. Dazu folgendes: QueryKunden: Füllt das Grid, die EditFelder und ist ein Teil für die Generierung der Inhalte in der DBLComboBox QueryVertrag: Ist die zweite Query für die DBLComboBox. An den Queries hängen jeweils SQLUpdate-Queries. Alle Update-Funktionen auf dem KundenDataset laufen einwandfrei. Will ich einen Kunden löschen, so wird in BeforeDelete das Löschen Gecanceled uns statt dessen der Vertrag mit einem EndeDatum versehen. Dieses funktioniert auch solange ich den zu editierenden Datensatz nicht aus der LookupComboBox aufrufe, sondern nur über DBNavigator oder das Grid gehe. Es wird also kein wirkliches Delete ausgeführt. Ich benutze lediglich den Button des Navigators für die Update-Funktionen. Diese laufen dann über die Query des Kunden, bzw. die Query der Verträge. Ich hoffe das ist hinreichend beschrieben. Kann ich noch etwas dazu beitragen das Problem genauer zu beschreiben? Danke für Aufklärung, Arndt Korsus |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Zitat:
Irgendwie ist mir nicht so ganz klar was Du da machst :oops: |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Dazu folgendes:
In der ersten Tabelle stehen meine Kunden. Der PKey ist Kunde_ID. Inder zweiten Tabelle stehen die Verträge zu den Kunden. PKey ist ebenfalls Kunde_ID. Das Problem noch mal auf den Punkt: Das Löschen von Kunden soll nicht wirklich geschehen. Stattdessen wird der Vertrag des Kunden auf ein EndeDatum gesetzt. Der Vorgang gestaltet sich folgendermaßen: 1. Auswahl des zu "löschenden" Kundens durch entweder - DBNavigator - DBKundenGrid oder - DBLookupComboBox Die ersten beiden Möglichkeiten laufen wie folgt ab: Bei Auswahl des entsprechenden Kundens wird der Curser auf den Datensatz gesetzt. Direkt durch auswahl im Grid oder durch steppen mit dem DBNavigator. 2. Drücken des Navigator-Delete-Buttons. Dabei passiert folgendes. BeforePost: // Den Datensatz des Vertrags auf den Datensatz des aktuellen Kunden // aktuellen Kunden setzen messagedlg(QueryKunde.FieldByName('kunde_id').AsSt ring, mtInformation,mbOKCancel,0); if QueryVertrag.Locate('Kunde_ID',QueryKunde.FieldByN ame('Kunde_ID'). AsString,[]) then begin messagedlg(QueryVertrag.FieldByName('kunde_id').As String, mtInformation,mbOKCancel,1); // Anschließend Query1 mit dem Löschauftrag stornieren DMKundenForm.QueryVertrag.Edit; QueryKunde.cancel; // Query2 für die Änderung der Vertragsdaten ändern messagedlg(QueryVertrag.FieldByName('kunde_id'). AsString,mtInformation,mbOKCancel,1); DMKundenForm.QueryVertrag.FieldByName('EndeDatum') . AsString := DateTimeToStr(Date); DMKundenForm.QueryVertrag.Post; end else messagedlg('Datensatz konnte nicht gefunden werden', mtInformation,mbOKCancel,1); Diese Prozedur wird immer vor dem "Löschen" ausgeführt also auch, wenn ich den Datensatz im Grid direkt aussuche und anschließend mit dem Navigator.Delete-Button lösche. Die Ausgaben im Code sagen mir jeweils, dass der richtige (theoretisch) Datensatz aktiv ist. Das ganze funktioniert nur dann nicht, wenn ich den zu "löschenden" Datensatz in der DBLookupComboBox auswähle. 3. ApplyUpdates Die DBLookupComboBox hat folgende Eigenschaften: Datasource: Vertrag DataField: Kunde_ID ListSource: Kunde ListField: KundenName KeyField: Kunde_ID Die DBLComboBox zeigt also alle KundenNamen aus der Tabelle 'Kunden' an, die einen laufenden sprich Vertrag ohne EndeDatum haben. Wähle ich einen Eintrag aus der Box aus, so wird mir Im DBKundenGrid und auch in den DBEditFeldern der korrekte Datensatz angezeigt. 'Key_Value' ist ebenfalls korrekt. Mein Verdacht ist das zwar ein Korrekter Datensatz zum editieren angezeigt wird dieser aber aus irgentwelchen Gründen nicht der aktuell zu bearbeitende ist. Denn es wird ja wenn ich einen Eintrag der DBLComboBox auswähle immer nur der erste Eintrag in der Tabelle Vertrag geändert. Alles unklar?! Hope that helps?!?! Danke für das interesse, Arndt Korsus |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Zitat:
Wenn ich dich richtig verstanden habe möchtest du doch mit er Lookupcombobox nur Datensätze auswählen? Dann musst Du die Eigenschaften Datasource und DataField natürlich leer lassen!! |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Hallo Sharky,
damit hat sich das Problem auch schon gelöst! Ganz fantastisch schnelle Hilfe zu einem Problem, das ich mir nicht erklären konnte! Danke vielmals. Mir war nicht klar, das die Funktion der ComboBox so abläuft. Und ich glaube ich habe das auch noch nicht verstanden. Ich habe gedacht die DBLComboBox dient der Auswahl aus zwei Tabellen und die Navigation wird dadurch in jeder Komponente aktualisiert? Warum passiert diese aktualisierung der Kunde_ID, wei Du sie schilderst und warum funktioniert die DBLComboBox in dieser Weise? Habe ich da ein grundsätzliches Verständnisproblem? Na ja, das Problem an sich ist beseitigt! Vielen Dank noch mal! Schön, dass dieses Forum wirkliche Hilfe bietet. Habe sonst keine Lösungen gefunden... Danke und bis später vielleicht ;) Arndt Korsus |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Zitat:
Zitat:
Eine DBLookupComboBox hat die Aufgabe den Wert eines Feldes aus der Tabelle ListSource einem Feld in der Tabelle DataSource zuzuweisen. z.B.: Ich habe eine Tabelle mit den Namen und Kurzzeichen der Länder (Deutschland D , Niederlande NL, Spanien EP usw....) und jeder Eintrag hat eine eindeutige ID Nun habe ich eine Adress-Tabelle wo ich die ID des Landes eintragen möchte. Tabelle1 -> Laender ID-Feld -> Landes_id Tabelle2 -> Adressen Landes-Feld -> lkz Nun kann ich eine DBLComboBox mit diesen werten benutzen. DataSource - Adressen DataField - lkz ListSource - Laender ListFied - Landesname keyfield - Landes_id Wenn ich nun (z.B mit einem DB-Grid) durch meine Adressen wandere wird mir in der DBLComboBox immer der Name des Landes angezeigt. Wenn ich bei einer Adresse einen anderen Eintrag (Namem) aus der Combobox auswähle wird dem Feld lkz in der Tabelle Adressen der entsprechende wert (landes_id) aus der Tabelle Laender zugewiesen. Uff.. ich hoffe das ist halbwegs zu verstehen. "Naviegiert" wird hierbei immer nur in der Tabelle ListSource aber NIE in der Tabelle DataSource |
Re: Editieren eines records durch auswahl mit TDBLookUpCombo
Hallo Sharky,
jetzt blicke ich durch! Habe auch noch mal in meine Doku geschaut, da ist allerdings das ganze nicht so schön erklärt. Dank Deiner Hilfe habe ich jetzt aber verstanden und kann produktiv weiterarbeiten. Schönes Gefühl. Ich werde auch weiterhin versuchen meinen Beitrag in diesem Forum zu leisten. Schöne Grüße aus HH. Arndt Korsus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz