AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Editieren eines records durch auswahl mit TDBLookUpComboBox
Thema durchsuchen
Ansicht
Themen-Optionen

Editieren eines records durch auswahl mit TDBLookUpComboBox

Ein Thema von barnti · begonnen am 15. Aug 2003 · letzter Beitrag vom 15. Aug 2003
Antwort Antwort
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#1

Editieren eines records durch auswahl mit TDBLookUpComboBox

  Alt 15. Aug 2003, 08:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 09:15
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??
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 09:31
Zitat von barnti:
...Für Die ComboBox kommt neben der ersten Query eine zweite hinzu (ist ja der Sinn der Sache)...
Ups, das habe ich überlesen. Warum hast Du eine zweite Query für die comboBox? Wenn du mit ihr nur navigieren möchtest musst Du entweder die selbe Query verwenden oder nach dem auswählen eines Eintrages aus deiner Combobox im Grid zu dem Datensatz springen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 09:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 09:46
Zitat von barnti:
... Will ich einen Kunden löschen, so wird in BeforeDelete das Löschen Gecanceled uns statt dessen der Vertrag mit einem EndeDatum versehen....
Sind die Verträge in einer eigenen Tabelle? Wie sehen denn deine beiden Querys und dein "lösch"-Query aus?

Irgendwie ist mir nicht so ganz klar was Du da machst
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 10:08
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 10:19
Zitat von barnti:
...
Die DBLookupComboBox hat folgende Eigenschaften:

Datasource: Vertrag

DataField: Kunde_ID

ListSource: Kunde

ListField: KundenName

KeyField: Kunde_ID
...
Ähmm.... Du weiss was passiert wenn Du nur einen Kunden aus der Lookupcombobox auswählst? Du weist dem aktiven Datensatz der Datasource [Vertrag] die Kunden_ID des ausgewählten Kunden der Datasource Kunde zu.

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!!
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 10:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 10:51
Zitat von barnti:
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.
Freut mich das ich dir helfen konnte und hoffe Du beteiligst dich auch in zukunft an diesem Forum.


Zitat:
Ich habe gedacht die DBLComboBox dient der Auswahl aus zwei Tabellen und die Navigation wird dadurch in jeder Komponente aktualisiert?
Nöp

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
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Editieren eines records durch auswahl mit TDBLookUpCombo

  Alt 15. Aug 2003, 11:13
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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