![]() |
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 |
Re: afterscoll wie in datenmodul anwenden??
Unsauber: Über Kreuzverbindung und Methode der Form nehmen
Sauber: Über DataSource auf der Form: DataSource.DataSet.on... |
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 |
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!
|
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 |
Re: afterscoll wie in datenmodul anwenden??
Aber wohl nicht auf einer Form, oder?
|
Re: afterscoll wie in datenmodul anwenden??
Zitat:
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". |
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 |
Re: afterscoll wie in datenmodul anwenden??
Zitat:
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:
Man verlagert diesen Code jetzt in das Datenmodul:
dm.TabelleAuftrag.Open;
dm.QueryAktiveBestellungen.Open; dm.QueryBestelltyp.Open; ...
Delphi-Quellcode:
Im Formular braucht man dann nur noch dm.OpenAllDatasets aufrufen.
procedure TMeinDatenModul.OpenAllDatasets;
begin TabelleAuftrag.Open; QueryAktiveBestellungen.Open; QueryBestelltyp.Open; ... end; 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. |
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 |
Re: afterscoll wie in datenmodul anwenden??
Zitat:
|
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 |
Re: afterscoll wie in datenmodul anwenden??
Hallo LingNeu,
darf ich mal fragen was für eine Anwendung Du programmierst? Bis bald Chemiker |
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 |
Re: afterscoll wie in datenmodul anwenden??
100 Tabellen? :shock: Oder 30 Abfargen (Table-Komponenetn) Warum 30 Datenbanken? Oder meinst du 30 Tabellen?
|
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 |
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? |
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 |
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 |
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 |
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:
Generell muss ich mich erstmal meinen Vorrednern anschliessen: 30 Datenbanken ?????!!!! Wer hat sich den "Sch..." ausgedacht ?
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 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 02:57 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-2025 by Thomas Breitkreuz