AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TDBEdit, TDBLookupComboBox, TField und OnSetText-Event
Thema durchsuchen
Ansicht
Themen-Optionen

TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

Offene Frage von "r_kerber"
Ein Thema von r_kerber · begonnen am 22. Apr 2006 · letzter Beitrag vom 26. Apr 2006
Antwort Antwort
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#1

TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 22. Apr 2006, 08:55
Datenbank: Oracle, aber eigentlich egal • Version: 9, 10 • Zugriff über: BDE, aber ebenfalls egal
Moin moin,

ich habe folgendes Problem. Auf einer Eingabemaske befinden sich mehrere TDBEdit-Boxen und TDBLookupComboBoxen. Sobald in einem TBEdit ein Wert eingegeben/verändert wurde, wird in einem onValidate-Event-Handler eine Stored Procedure (für alle TFields wird dieselbe SP verwendet) auf gerufen, welche die anderen Feldwerte ermittelt. Diese werden dann in die entsprechenden DB-Felder geschrieben. Dadurch ändert sich natürlich auch der Wert der TField-Objekte und somit auch der Edit- und Comboboxen, was sofort wiederum ein neues onValidate für die TFields auslöst. Damit nun dadurch keine Endlosschleife ausgelöst wird, werden der Stored Procedure zwei zusätzliche Parameter übergeben, zum einen den Sender der das aktuelle onValidate ausgelöst und den "Initial_Sender", also das Object, welches das erste onValidate ausgelöst hat. Um diesen zu ermitteln wird zusätzlich das OnSetText-Event von TField abgefangen. Diese wird ausgelöst, unmittelbar nachdem man in einem TEdit einen Wert eingibt/ändert. Doch leider funktioniert das nur mit TDBEdit. Eine TDBLookupComboBox löst kein OnSetText-Ereignis aus, wenn ein anderer Eintrag ausgewählt wird. Ich suche nun eine Möglichkeit auch für eine LookupComboBox den "Initial_Sender" zu ermitteln, also etwas in der Art
  • Element in TDBLookupComboBox ändern
  • ComboBox verlassen
  • irgendein Event --> Zwischenspeichern des auslösenden Senders
  • OnValidateEvent --> Ermittel des aktuellen Senders, Starten der SP (mit den Parametern initial_sender und sender)
  • ...
Und dieses "irgendein Event darf nur einmal ausgelöst werden, nachdem sich der in der Combobox etwas geändert hat.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 22. Apr 2006, 12:46
Moin Rainer.

Das Problem mit Intra-Record-Abhängigkeiten hast du auch ohne eine Anbindung an eine Datenbank. Durch die Übermittlung von Sender und Initial Sender an die Stored Procedure schaffst du eine enge Kopplung zwischen GUI und Datenmodell. Ich würde versuchen die Steuerung vollständig im GUI zu belassen.

Für die einmalige Benachrichtigung darüber, dass der Inhalt eines Datenfeldes sich geändert hat, würde ich nicht auf das Ereignis OnSetText() der Field-Komponente, sondern auf das Ereignis OnDataChange() der DataSet-Komponente zurückgreifen.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#3

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 22. Apr 2006, 13:27
Moin Marabu,

Zitat von marabu:
Das Problem mit Intra-Record-Abhängigkeiten hast du auch ohne eine Anbindung an eine Datenbank. Durch die Übermittlung von Sender und Initial Sender an die Stored Procedure schaffst du eine enge Kopplung zwischen GUI und Datenmodell. Ich würde versuchen die Steuerung vollständig im GUI zu belassen.
Keine Chance. Das Programm arbeitet grundsätzlich so, daß die GUI tatsächlich nur zur Darstellung der DB-Inhalte und zur Steuerung des Ablaufes vorgesehen ist. Sämtlich Business-Logic ist in SQl und SP's in ie Datenbank ausgelagert.
Zitat von marabu:
Für die einmalige Benachrichtigung darüber, dass der Inhalt eines Datenfeldes sich geändert hat, würde ich nicht auf das Ereignis OnSetText() der Field-Komponente, sondern auf das Ereignis OnDataChange() der DataSet-Komponente zurückgreifen.
IMHO kommt TField.OnValidate vor TDataSource.OnDataChange, oder? Und damit wäre es zu spät.
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#4

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 23. Apr 2006, 16:08
Ich hole diesen Thread noch einmal nach oben.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 25. Apr 2006, 09:40
Hallo Rainer,

wenn du für dein Datenmodell ein GUI implementiert hast, welches auf datensensitiven Komponenten basiert, dann erschließt sich mir der Sinn der Stored Procedure nicht ohne weiteres. Kannst du das noch ein wenig aufhellen?


Zitat von r_kerber:
Zitat von marabu:
... Ich würde versuchen die Steuerung vollständig im GUI zu belassen.
Keine Chance. Das Programm arbeitet grundsätzlich so, daß die GUI ... zur Steuerung des Ablaufes vorgesehen ist.
Das nenne ich einen Widerspruch.

Zitat von r_kerber:
IMHO kommt TField.OnValidate vor TDataSource.OnDataChange, oder?
Das ist richtig.

Zitat von r_kerber:
Und damit wäre es zu spät.
Genau das wollte ich hinterfragen. Bei mir ist es oft die einzig richtige Stelle.

Freundliche Grüße

marabu
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#6

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 26. Apr 2006, 07:36
Moin marabu,

Zitat von marabu:
wenn du für dein Datenmodell ein GUI implementiert hast, welches auf datensensitiven Komponenten basiert, dann erschließt sich mir der Sinn der Stored Procedure nicht ohne weiteres. Kannst du das noch ein wenig aufhellen?
Ich will es versuchen. Das Stichwort heißt Flexibität und Wartbarkeit. Denke Dir mal folgendes Szenario:
Eine Artikelverwaltung ist bei unterschiedlichen Kunden im Einsatz. Für jeden Artikel wird z.B. der Verkaufspreis anders kalkuliert. Du hast jetzt die Möglichkeit, diese Berechnungen im Programm fest zu verdrahten. Was macht nun der Kunde, wenn er einen Artikel hinzufügen will? Er müßte jedesmal das Programm anpassen und die Berechnungen einbauen. Und die einzelnen Kunden haben nun auch noch völlig andere Artikel. Das Programm würde zum Moloch werden oder man arbeitet mit kundenspezifischen Versionen. Der Ansatz ist nun, das diese Berechnungen ausgelagert werden. Dafür bietet sich eine DB wie ORACLE kann. Alles was weitestgehend standard bzw. kundenneutral ist wird über SP in einem Standard-Schema abgehandelt. Alle kundenspezifischen Berechnungen und DB-Aktionen befinden sich in dem jeweiligen Kundenschema. Kommt also ein neuer Artikel hinzu, werden Preisberechnung und alles andere in einer SP durchgeführt und über reine Parametrisierung dem jeweiligen Artikel zugewiesen. Das ist eine Arbeit von wenigen Stunden bzw. Tagen. Und glaube mir, ich kenne vergleichbare Programme, da ist das Einfügen eines neuen Produkts ein Projekt, daß mindestens über mehrere Monate geht.
Zitat von marabu:
Zitat von r_kerber:
Zitat von marabu:
... Ich würde versuchen die Steuerung vollständig im GUI zu belassen.
Keine Chance. Das Programm arbeitet grundsätzlich so, daß die GUI ... zur Steuerung des Ablaufes vorgesehen ist.
Das nenne ich einen Widerspruch.
Sagen wir mal so, die GUI ist lediglich der Workflow. Alle erforderliche Aktionen (Business-Logik) wird nur angestoßen und in der DB ausgeführt.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 26. Apr 2006, 09:57
Danke für deine Erläuterungen, aber das bringt zumindest mich noch weiter weg von OnValidate(). Das Kalkulationsmodell eines Kunden per Customizing als SP zu hinterlegen ist sicher nicht das verkehrteste, aber warum muss das so eng an das GUI gekoppelt werden? Ich würde für diesen Zweck sogar das OnDataChange() fallen lassen und die SP in einem Before-Insert-Trigger aufrufen. Aber das ist eine grundsätzliche Design-Frage und du hattest ja eigentlich nur nach einem einmaligen OnChange-Event für eine TDBLookupComboBox gefragt. TField.OnChange() sollte bei dieser Komponente doch ausreichen?

Freundliche Grüße

marabu
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#8

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 26. Apr 2006, 14:17
Zitat von marabu:
Das Kalkulationsmodell eines Kunden per Customizing als SP zu hinterlegen ist sicher nicht das verkehrteste, aber warum muss das so eng an das GUI gekoppelt werden?
Das Programm ist nun mal so entwickelt worden und in dieser Form bei diversen Kunden im Einsatz. Und es wird nicht die die Business-Logik customized sondern auch welche GUI-Elemente wann angezeigt werden sollen und zum Teil auch welche (DBEdit, DBCombobox, ...). Das Erzeugen der GUI erfolgt somit im wesentlichen dynamisch zur Laufzeit. Dasselbe gilt für dir TStoredProc-Objekte.
Zitat von marabu:
Ich würde für diesen Zweck sogar das OnDataChange() fallen lassen und die SP in einem Before-Insert-Trigger aufrufen.
Die Berechnungen sollen ja schon vor dem Insert durchgeführt und dem Anwender in der GUI sofort angezeigt werden.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: TDBEdit, TDBLookupComboBox, TField und OnSetText-Event

  Alt 26. Apr 2006, 17:02
Hallo Rainer,

Zitat von marabu:
... du hattest ja eigentlich nur nach einem einmaligen OnChange-Event für eine TDBLookupComboBox gefragt. TField.OnChange() sollte bei dieser Komponente doch ausreichen?
für den Fall, dass du es übersehen hast - ich habe es auch schon getestet und es funktioniert.

marabu
  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 18:58 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