Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi afterscoll wie in datenmodul anwenden?? (https://www.delphipraxis.net/150222-afterscoll-wie-datenmodul-anwenden.html)

LingNeu 10. Apr 2010 14:50

Datenbank: dataweb TurboDB • Zugriff über: über Datasource

afterscoll wie in datenmodul anwenden??
 
Hallo delphifreunde,

habe ein Datenmodul (dm), indem sich meine Datenbanken und die Tabellen, sowie andere Komponenten befinden.

Im Hauptprogramm kann ich sehr einfach darauf zurückgreifen.
z.B.
dm.Tabelle.Edit;
dm.Tabelle.Post; usw..

Nun benötige ich unbedingt ein Ereignis auf eine Tabelle und zwar Tabelle.AfterScroll()
Diese kann ich zwar jetzt im Datenmodul (dm.) erstellen aber die notwendigen Aktionen müssen im Hauptprogramm stattfinden
z.B. aktualisieren einer Änderung in Feldern. Ich kann nicht auf eine Aktion in der Datenbank reagieren, außer die üblichen Dinge, wie Append, Insert, Delete usw über einen DBNavigator

Wie schaffe ich das jetzt, das ich auf ein DB-Ereignis reagieren kann, oder muss ich doch wieder alle Hundert Komponenten aus dem Datenmodul in das Hauptprogramm verfrachten
Vielleicht kann mir jemand helfen.
Ich kann mir auch nicht vorstellen, das ich nur dieses Problem habe. Leider konnte ich aber über die Suche keine passenden Infos bekommen.
Danke für JEDEN Hinweis!
ciao
LingNeu

mkinzler 10. Apr 2010 14:57

Re: afterscoll wie in datenmodul anwenden??
 
Unsauber: Über Kreuzverbindung und Methode der Form nehmen
Sauber: Über DataSource auf der Form:

DataSource.DataSet.on...

LingNeu 10. Apr 2010 15:24

Re: afterscoll wie in datenmodul anwenden??
 
hallo mkinzler,
danke für Deine Info. Du hast sicherlich in gewisser Weise Recht.
Ich frage mich nur, warum gibt es dann das Datamodul. Man kann die Sache nur dann verwenden, wenn man keine Ereignisse von Komponenten verwenden will und der Nutzen einer Modulisierung ist futsch.
Wahrscheinlich ist diese Sache auch deshalb so unbeliebt - oder täusche ich mich da.
Schade, nun kann ich doch wieder die vielen Compos auf die Hauptform legen - das wars wohl - oder?

Schöne Grüsse
LingNeu

mkinzler 10. Apr 2010 15:25

Re: afterscoll wie in datenmodul anwenden??
 
Die DataSource gehört auch auf das Formular und nicht auf das Datenmodul. Und damit kannst du es ja machen!

LingNeu 10. Apr 2010 15:44

Re: afterscoll wie in datenmodul anwenden??
 
Danke nochmals. Das mache ich jetzt auch so. Andere Lösungen scheint es nicht zu geben um Code und Componenten leicht auszulagern. Die Funktionen habe ich alle schon in einer eigenen Unit.
Leider habe ich allerdings insgesamt über 100 solcher Datasources und Tabellen - uff
ciao
LingNeu

mkinzler 10. Apr 2010 15:51

Re: afterscoll wie in datenmodul anwenden??
 
Aber wohl nicht auf einer Form, oder?

omata 10. Apr 2010 15:54

Re: afterscoll wie in datenmodul anwenden??
 
Zitat:

Zitat von LingNeu
...Leider habe ich allerdings insgesamt über 100 solcher Datasources und Tabellen...

Und da willst du uns was von Übersichtlichkeit erzählen, wunderbar.

Was bringt es, wenn man alles schön in einem Datamodul zusammenfasst, dieses aber aus allen Nähten platzt?

Eine andere Möglichkeit wäre das Modularisieren von Formularinhalten über Frames. Dann sind zwar die Datenbankkomponenten wieder mit auf dem Formular bzw. Frame aber jedes Frame enthält nur das, was es benötigt. So kann dann eine wirkliche Übersichtlichkeit entstehen. Will man das jetzt noch datenbankunabhängig machen, muss man eben noch eine Zwischenschicht mehr einführen. Aber ich halte nichts von diesem "ich lagere alles in ein Datenmodul aus".

LingNeu 10. Apr 2010 18:18

Re: afterscoll wie in datenmodul anwenden??
 
@omata,
du hast mir das "Leben" gerettet!!
Eine superidee. Da sieht man halt die Profis. Ich bin noch immer am Delphi-Lernen. Aber das mit dem Frame - da wäre ich nicht draufgekommen.
DANKE !!!
ciao
LingNeu

sx2008 10. Apr 2010 18:20

Re: afterscoll wie in datenmodul anwenden??
 
Zitat:

Zitat von LingNeu
Leider habe ich allerdings insgesamt über 100 solcher Datasources und Tabellen - uff

Das ist natürlich ganz schlecht.
Du kannst aber die Tabellen (hoffentlich hast du auch Queries) nach Themen geordnet auf mehrere Datenmodule verteilen.
Man sollte auch Programmcode vom Formular in die Datenmodule verlagern.
Beispiel, im Formular steht häufig Code wie dieser:
Delphi-Quellcode:
dm.TabelleAuftrag.Open;
dm.QueryAktiveBestellungen.Open;
dm.QueryBestelltyp.Open;
...
Man verlagert diesen Code jetzt in das Datenmodul:
Delphi-Quellcode:
procedure TMeinDatenModul.OpenAllDatasets;
begin
  TabelleAuftrag.Open;
  QueryAktiveBestellungen.Open;
  QueryBestelltyp.Open;
  ...
end;
Im Formular braucht man dann nur noch dm.OpenAllDatasets aufrufen.
Beim Schliesen gilt natürlich das Gleiche.
Das ist aber erst der Anfang.
Man sollte versuchen einen grossen Teil der "Bussiness-Logik" in die Datenbankmodule zu verschieben.

LingNeu 10. Apr 2010 18:31

Re: afterscoll wie in datenmodul anwenden??
 
@sx2008
danke für deine Hinweise.
Genauso habe ich das auch mit dem Datenmodul gemacht und dort die grundsätzlichen DB-Sachen durchgeführt. Leider schaffte ich aber keinen Event (z.B. AfterScroll) abzufragen und diesen Event dann im Hauptprogramm zu benutzen
Nun habe ich eine Lösung mit den Frames. Der Hammer ist die Möglichkeit, im Frame und in der Hauptform Ereignisse abzufragen
ciao
LingNeu

Hansa 10. Apr 2010 22:59

Re: afterscoll wie in datenmodul anwenden??
 
Zitat:

Zitat von LingNeu
Der Hammer ist die Möglichkeit, im Frame und in der Hauptform Ereignisse abzufragen

Wo hängt denn da jetzt der Hammer ? :shock: Die Datenmodule sind dafür gedacht, dass eben (fast) alles was visuell ist, da aussen vor bleibt : in ein Datenmodul kriegt man keinen Button etc. rein. Du kannst auch gleich locker eine Form als nachgebautes DataModule verwenden, oder Frame oder was weiss ich. Dann schön alles verrühren, damit ENDLICH !! der Spaghetticode rauskommt. :mrgreen:

LingNeu 14. Apr 2010 19:17

Re: afterscoll wie in datenmodul anwenden??
 
@Hansa,
du hast natürlich in gewisser Art Recht. (wobei ich liebe Spagetti - und ich liebe Codes :P )
Leider habe ich viele DB-Komponenten auf einer Form
Die Sache mit dem Frame ist leider bei mir der Schuss nach einigen Tagen nach hinten abgegangen.
Leider gibt es trotzdem Schwierigkeiten mit den DBs, es kommt zu Fehlermeldungen, da die DB-Komponente auf dem Frame den gleichen DB-Namen hat wie auf der Hauptform. Die Tabellen und die Datensources machen keine Probleme
Irgendwie habe ich die Sache dann doch zum laufen gebracht, aber das ist wirklich eine Spagetti-Programmierung
Nach einem DB-Update vor 1 Tag ging dann diese Sache auch nicht mehr
ALSO
Ich bin immer noch auf der Suche nach einer Möglichkeit, meine non-visuellen DB-Komponenten zu ordnen und zu gruppieren.
Momentan arbeite ich mit folgender Lösung
Hauptform größer machen, als sie später genötigt wird und dann automatisch auf die richtige Größe beim Starten einstellen. Leider hat auch diese Sache einen Nachteil, da ich einen Resizer verwende und der will bereits vor dem Compilieren die richtige Startgröße
Gruß
LingNeu

Chemiker 14. Apr 2010 19:36

Re: afterscoll wie in datenmodul anwenden??
 
Hallo LingNeu,

darf ich mal fragen was für eine Anwendung Du programmierst?

Bis bald Chemiker

LingNeu 14. Apr 2010 20:51

Re: afterscoll wie in datenmodul anwenden??
 
Hallo chemiker,
das ist eine medizinische Datenverwaltung mit insgesamt hundertausenden verschiedenen Krankheiten, Symptomen und noch mehr Medikamenten, Bilderdatenbanken.
Es sind alleine knapp 100 Tabellen mit ebensovielen Datasources. Datenbanken sind es insgesamt knapp über 30
Dabei sind jeweils alle Datenbanken mehrmals vorhanden, da diese für 6 verschiedene Länder erstellt wurden.
Momentan kann ich die verschiedenen LänderDBs nur mit eigenen Applikationen verwalten.

Da ist man natürlich auf der Suche nach einer besseren Übersicht.

Gruß
LingNeu

mkinzler 14. Apr 2010 21:00

Re: afterscoll wie in datenmodul anwenden??
 
100 Tabellen? :shock: Oder 30 Abfargen (Table-Komponenetn) Warum 30 Datenbanken? Oder meinst du 30 Tabellen?

LingNeu 14. Apr 2010 21:13

Re: afterscoll wie in datenmodul anwenden??
 
@mkinzler,
es sind mehr als 30 Datenbanken (TurbDB - SingleFileDatabase) die jeweils mehrere Tabellen enthalten, die Indizes gar nicht gerechnet.
Somit kommt man auf über 100 Tabellen. Leider muss man für jede Tabelle und die dazugehörige Datasource eine eigene Komponente verwenden. Damit habe ich alleine durch die Datenbanken und deren Tabellen einen Wust an Komponenten auf der Hauptform.
Wie schon gesagt, bis jetzt habe ich noch keine perfekte Lösung für die Übersicht.

Gruß
LingNeu

mkinzler 14. Apr 2010 21:16

Re: afterscoll wie in datenmodul anwenden??
 
Warum mehrere Datenbanken? Auch die Anzahl der Tabellen erscheint mir etwas hoch.
Waruum Table-Kompos und keine Query/DataSet?

LingNeu 14. Apr 2010 21:31

Re: afterscoll wie in datenmodul anwenden??
 
Viele DBs sind read-only und andere dürfen die Anwender verändern. Daher auch der Chaos und die vielen DBs.
Die ganze Sache habe ich "geerbt" von einem Vorgänger. Nun soll ich die Sache weiterführen
Die vielen DBs sind von unterschiedlichen Leuten erstellt worden und später korrigiert und zusammengefügt worden.
Es sind viele unterschiedliche Bereiche - leider aber wieder read-only - die werden ausgeliefert so wie sie sind. Dann gibt es eben noch die anderen, die können die Anwender erweitern, exportieren und importieren.
Leider ist die Aufarbeitung sehr langwierig und ermüdend. Ausserdem fehlt die Zeit für einen Neuanfang und Neustrukturierung.
Gruß
LingNeu

Chemiker 14. Apr 2010 21:40

Re: afterscoll wie in datenmodul anwenden??
 
Hallo LingNeu,

man kann doch in einer Datenbank über 200 Tabellen unterbringen, warum also 30 Datenbanken?

Zudem denke ich wird ein Zugriff auf alle 100 Tabellen nicht gleichzeitig erfolgen so könnte man die Komponenten erstellen wenn man sie braucht und anschließend wieder freigeben oder mit anderen Parametern versehen.

Bis bald Chemiker

LingNeu 15. Apr 2010 07:18

Re: afterscoll wie in datenmodul anwenden??
 
Hallo Chemiker,
die Idee mit dem Erstellen bei Bedarf finde ich gut. Da muss ich mir mal Gedanken dazu machen, wie ich die Sache angehe. Damit hätte ich zumindestens nicht mehr soviele Komponenten auf der Hauptform.
Leider sind ja noch die anderen Kompoenten da und das sind ja auch noch jede Menge.
Durch die vielen verschiedenen Anwender und den unterschiedlichen Rechten ist es momentan kaum möglich hier eine Entlastung zu kreiern.
Manchmal denke ich, es wäre am Besten das komplette System neu zu beginnen. Vielleicht würde man sich sogar Zeit sparen.
Es ist schon ein Drama, nach jemandem nachzuarbeiten. Man kennt ja seine damaligen Gedankengänge nicht.

Gestern habe ich noch das Tool CNPack kennengelernt, da kann man vielleicht auch noch einiges strukturieren und verbessern.
Gruß LingNeu

DataCool 15. Apr 2010 08:25

Re: afterscoll wie in datenmodul anwenden??
 
Nochmal zur Ursprungsfrage zurück!

Warum geht Du im Datenmodul nicht hin und definierst ein Event z.B.:

Delphi-Quellcode:
private
  FTblXyzAfterScroll : TNotifyEvent;
public
  property TblXyzAfterScroll : TNotifyEvent read FTblXyzAfterScroll write FTblXyzAfterScroll;

// .....
FTblXyzAfterScroll := nil; // im Create des Moduls oder im Initialization-teil
// ......
// Im wirklichen Afterscroll-Event des TablesXyz sagst Du dann:
if Assigned(TblXyzAfterScroll) then
  TblXyzAfterScroll(Sender);

// dann gehst Du in Form wo du das Event brauchst hin und definierst eine procedure z.B. so:
procedure CatchTblXyzAfterScrollEvent(Sender : TObject);
// .....
// Und nach erzeugen des Datenmoduls weist Du einfach die Events zu:
myDM.TblXyzAfterScroll := CatchTblXyzAfterScroll;
// Ab jetzt sollte beim Eintreten des AfterScroll-Events bei Dir in der Form die procedure CatchTblYxzAfterScroll aufgerufen werden
Generell muss ich mich erstmal meinen Vorrednern anschliessen: 30 Datenbanken ?????!!!! Wer hat sich den "Sch..." ausgedacht ?
Es muss eine DB mit XY Tabellen sein.

Und auf jeden Fall sollten immer nur die Tabellen geöffnet sein die gerade gebraucht werden!
Noch bessere es werden immer nur die Querys/Tables dynamisch erzeugt und wieder freigegeben die gerade gebraucht werden.

Ich persönlich habe mir zu diesem Zweck eine Klasse geschrieben, die für mich sämtliche DB-Aktionen kapselt und
für jedliche Datenzugriffe die entsprechenden Objekte dynamisch erzeugt, Informationen zur Verfügung stellt und wieder zerstört.

Greetz Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 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