![]() |
Datenbank: ADO >> MS ACCESS MDB • Version: ? • Zugriff über: Microsoft Jet OLEDB 4.0
Generelle Frage zur Verteilung von Datenbankkomponenten
Entschuldigt die schlechte und sicher falsche Einordnung der Datenbank und Zugriffsart, aber ich weiß nicht was ich da angeben soll ^^ Hab mit Datenbanken nicht so viel zu tun.
Hintergrund: Ich arbeite gerade an einer kleinen Kunden und Rechnungsverwaltung. Diese besteht aus den Tabellen Kunden, Rechnungen und Leistungen. Jede Leistung hat eine RNr und ist somit einer Rechnung zuordenbar und jede Rechnung wiederum hat eine KNr für die Identifikation zum Kunden. Ich habe schon Beim Programmieren viele Kapitel von Büchern und Tutorials über Datenbankeneinstieg gelesen, aber immer wenn ich dann selbst mal eine Anwendung mit DBs schreibe, stellen sich mir nun einige Fragen: Zitat:
Zitat:
Zitat:
Zitat:
Mein Bestreben ist eben eine Modularisierung der einzelnen Formulare (Kundendaten, Rechnung+Leistungen) damit alles übersichtlich bleibt und man zur Not mal etwas ganz neues mit einem alten Tauschen kann. Ich mag nicht, wenn alles mit einander endlos verstrickt ist. [EDIT]Tippfehler in Titel geändert |
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Zitat:
|
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Tja es gibt für vieles verschiedenen Herangehensweisen:
Meine Variante ist die Transaktionen und Queries im Datamodule zu halten. Die DataSources lege ich aber auf die Forms, da ich ab und an auf das DataSourceOnChage-Ereignis regieren muß. Diese Routine brauche ich aber im Formular, da damit Anzeigeeinstellungen verändert werden. Grüße // Martin |
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Nun gut, aber nehmen wir mal an, ich habe ein Formular für die Kundendaten. Wenn ich dieses jetzt mehrmals erzeuge um mehrere Kunden gleichzeitig anzuzeigen bzw. zu bearbeiten (manchmal möchte man vlt von einem etwas übernehmen, also einer bearbeiten den anderen nur so offen), wie würde ich da heran gehen?
Wenn alle Formulare auf Table und Datasource im Datenmodul zugreifen, verstellt doch das eine Formular immer den Datensatz vom andern mit oder? Und wenn ich von allen Formularen die etwas mit den Kundendaten zu tun haben gleichzeitig verschiedene Kunden öffnen möchte? dann komme ich um ein zweites oder drittes Paar Table und DataSource Komponenten nicht herum oder? Sonst würde mir doch auch immer wieder die Ansicht verstellt? |
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Hallo F.W.
ich verstehe, was Du möchtest. ich kenne dieses Verhalten unter SAP als Arbeiten mit mehreren Modi (Fenstern). Also z.B. Kunde X anzeigen lassen und in einem weiteren Fenster Kunde y ändern. Ich habe für mich nur die Möglichkeit gefunden, meine Querie für jedes Fenster dynamisch zu erzeugen, eine dynamisch erzeugte Transaktion zu verwenden und die SQL-Befehle zu übergeben. Mit statisch eingebundenen DB-Komponenten konnte ich das gewünschte Verhalten nicht realisieren. Ich hätte zuviele Komponenten prophylaktisch anlegen müssen und hätte sicher irgendwann die Übersicht verloren. Falls jemand einen besseren Vorschlag hat, wäre ich auch glücklich.... Gruß, echtet |
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Zitat:
Aber ich weiß eben nicht, was das für Vor-/Nachteile mit sich bringt. Sicher kann ich die Datenanbindung jetzt auf Vor- und Nachteile unsersuchen, aber ungewiss ist, ob ich beim Weiterentwickeln dann mit dieser Aufspaltungstechnik/Modularisierung Probleme bekomme. Und um das zu prognostizieren habe ich zu wenig Erfahrung. |
Re: Gennerelle frage zur Verteilung der Datenbankkomponenten
Hallo F.W.
Vielleicht hilft Dir folgender Quellcode beim Testen, ob dies Deinen Vorstellungen entspricht: Annahme, IBX-Komponenten, aber die anderen Kompos funktionieren analog. Ich werfe keine DB-Komponenten auf die Formulare (Ausnahme: Im DataModule die Komponente IBDatabase. In den Formularen rufe ich z.B. folgende Routine auf:
Delphi-Quellcode:
Viele Grüße,
procedure NotizErfassen;
var i, AnzahlNotizen : integer; Query:TIBQUERY; Transaktion : TIBTransaction; SQL : string; begin hLog.Add(''); hLog.Add(DateTimetoStr(now) + ': ' + '***** Notiz erfassen *****'); AnzahlNotizen := frmMain.AdvCodeListNotizen.CodeBlocks.Count; frmMain.AdvCodeListNotizen.CodeBlocks.Add(DateTimeToStr(Now)); for i := 0 to frmMain.MemoNotizen.Lines.Count do begin frmMain.AdvCodeListNotizen.CodeBlocks.Items[AnzahlNotizen].Code.Add(frmMain.MemoNotizen.Lines[i]); end; //sichern der Notizen in Tabelle TBLNOTIZEN //Queryobjekt unbd Transaktion erzeugen Query := TIBQUERY.create(nil); Query.Database := DataModule1.IBDatabase; //Datenbank zuordnen Transaktion := TIBTransaction.Create(NIL); //Transaktion dyn. erzeugen Transaktion.DefaultDatabase := DataModule1.IBDatabase; //Datenbank zuordnen Transaktion.AllowAutoStart := False; //Transaktionen müssen explizit gestartet werden Query.Transaction := Transaktion; //Transaktion zuordnen Transaktion.StartTransaction; //Transaktionsbeginn if Length(frmMain.MemoNotizen.Text) > 0 then begin SQL := 'insert into tblnotizen (id, notiz) ' + 'values (gen_id( gen_tblnotizen_id,1),' + ':Memo' + ')'; Query.sql.Text := SQL; Query.ParamByName('Memo').asBlob := frmMain.MemoNotizen.Text; //Query ausführen Try Try Query.ExecSQL; //Abfrage ausführen Finally end; //Finally EXCEPT on E:Exception do begin StatusMeldung(rot, 'Fehler beim Anlegen der Notizen! (Ausführen der Abfrage fehlerhaft)'); hLog.Add(DateTimetoStr(now) + ': ' + 'SQL-Befehl: ' + SQL); Transaktion.Rollback; Raise; end; END; //Except //Query und Transaktion beenden Try Try Transaktion.Commit; StatusMeldung(gruen, 'Notiz wurde erfolgreich gesichert'); Finally frmMain.MemoNotizen.Clear; //Anschließend löschen Query.free; Transaktion.Free; Screen.Cursor := crDefault; end; //Finally EXCEPT on E:Exception do begin StatusMeldung(rot, 'Sicherung der Notiz nicht möglich -> Rollback der Transaktion!'); Transaktion.Rollback; Raise; end; END; //Except end //if Length(MemoNotizen.Text) > 0 then else begin if Length(frmMain.MemoNotizen.Text) = 0 then begin StatusMeldung(rot, 'Notiz darf nicht leer sein!'); end; end; //else NotizenLesen; //zum Aktualisieren end; Echtet |
Re: Generelle Frage zur Verteilung von Datenbankkomponenten
Zitat:
Aber dann habe ich eben das "Problem", dass ich mich um die Aktualisierung in allen anderen Datenbankansichten selbst kümmern muss oder? Außerdem habe ich dieses Mal voll auf die Nutzung der Datensensitiven Steuerelemente gebaut. Um mir eben etwas Tipparbeit zu ersparen und den Datenbankkomfort nutzen zu können. Ein Beispiel: Jede Rechnung ist ein Eintrag in der RechnungenDB und in der LeistungenDB stehen alle Leistungen. Mit einander verknüpft durch Leistungen.RechnungsNr. Legt der Nutzer eine neue Rechnung an, muss er ja die Rechnungsnummer vergeben und die Rechnung fest ins System eintragen, sonst können die Leistungen ja nicht auf diese Rechnung (Rechnungsnummer) erstellt werden. Wie kann man das lösen? Wenn ich nicht gerade eine eigene Klasse schreiben möchte, die die Leistungen-Felder hat, an z.B. ListView-Einträge angehangen wird und dann mit Rechnug alles auf einmal eingetragen wird? Ich meine, wenn ich eine eigene Klasse schreibe kann ich mir die Datenbanken ja gleich sparen, oder sehe ich das falsch? |
Re: Generelle Frage zur Verteilung von Datenbankkomponenten
Wenn du unbedingt öchtest kannst du ja mit verteilten Datenmodulen arbeiten. Die Frage ist nur ob diese dann mehr Probleme schaffen, als sie 1. Moment zu lösen scheinen.
|
Re: Generelle Frage zur Verteilung von Datenbankkomponenten
tja, das ist wieder mal eine richtig schöne, klassische Philosophiefrage, auf die es einfach keine einfache Antwort gibt.
Ich mache es meistens so, dass ich die eigentliche Verbindung zur Datenbank im für alle zentralen Datenmodul aufbaue. Ebenfalls dorthin kommen diejenigen Komponenten, die nur so ne Art temporäre Bedeutung haben, aber für alle vorhanden sein sollten. Beispielsweise Tabellen zum schnellen Nachschlagen. Da ich normalerweise nicht gleichzeitig an verschiedenen Datensätzen der selben Tabelle arbeite, stelle ich auch noch jeweils einen Table in der normalerweise verwendeten Sortierung dort hinein. Wenn ich dann unterwegs mal was in der selben Tabelle nachschauen muss, verwende ich eine formulareigene Komponente dafür. Damit behalte ich meine aktuelle Position bei und habe trotzdem Zugriff auf das, was ich benötige. Und die Übersicht versuche ich eher durch sprechende Namen herzustellen. Aber wie du schon richtig sagtest, musst du, falls du in mehreren Fenstern an der selben Tabelle rumbastelst, die zugehörigen Tables bzw. Queries natürlich jeweils im Formular mitführen, da sich ja sonst beispielsweise die aktuelle Satznr. ständig ändern würde. Was Änderungen angeht, müsste es dann eigentlich langen, ab und zu mal Application.ProcessMessages aufzurufen (z.B. beim Activate), um die letzten Änderungen auch mitzubekommen. Fazit: kommt halt wie immer wieder drauf an, was du eigentlich willst! :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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