Hallo,
ich stehe vor demProblem, das ich eine CD-, Video und PC-Datenträgerverwaltung bauen will, die folgendes leistet:
ich gebe in einer Masterdatei mit den Feldern
MEDIAID, zB. CD0001 oder DVD0002
MEDIAKIND und evtl noch zB. music, video oder software
FILENAME zb. MusikCDs.dbf oder Videos.dbf oder SoftwBackups.dbf
eine Datenmenge vor, die mit den Detaildatenbanken wie MusikCds.dbf, ... verknüpft ist und mir bei Auswahl einer MEDIAID den Inhalt des jeweiligen Datentägers anzeigt. Später will ich mit dem Programm auch gezielt nach einemTitel suchen können und die Bezeichnung des Speichermediums als Ergebnis der Abfrage haben.
Die Motivation hierzu ergibt sich aus dem Umstand das ich oft schon SOftwarebibliotheken, heruntergeladene Quelltexte, ... nach langer Zeit mal wieder benutzen will und dann nicht mehr weiß, auf welchem Medium und in welchem Ordner auf diesem Medium ich denn nun das Zeug gespeichert habe.
Mein derzeitiger Ansatz:
Delphi-Quellcode:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ADODB,
DB, ExtCtrls, DBCtrls, Grids, DBGrids, dbf, Provider,
DBClient;
type
TForm1 =
class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Login1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
DBGrid1: TDBGrid;
//Masterdaten anzeigen
DBNavigator1: TDBNavigator;
Dbf1: TDbf;
//Zugriff auf Masterdaten
DataSource1: TDataSource;
//Datenquelle Masterdaten
DataSource2: TDataSource;
//Datenquelle Detaildaten, zB. MusikCds
Dbf2: TDbf;
//Zugriff auf Detaildaten
Dbf3: TDbf;
//Vorläufiger Zugriff auf Detaildaten einer weiteren Tabelle (***)
DataSource3: TDataSource;
//Datenquelle dieser Detaildaten
DBNavigator2: TDBNavigator;
DBGrid2: TDBGrid;
//Detaildaten anzeigen
ClientDataSet1: TClientDataSet;
//Weil Master/Detail mit TDBF nicht funktioniert
DataSetProvider1: TDataSetProvider;
//mit Dbf2, meiner ersten Detailtabelle verbunden
DataSource4: TDataSource;
//Die Datnquelle hierzu zum Anzeigen in DBGrid3
DBNavigator3: TDBNavigator;
DBGrid3: TDBGrid;
//Hier ist es
procedure Exit1Click(Sender: TObject);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var RefField, ResField: WideString;
begin
RefField := TDataSource(Sender).DataSet.Fields.FieldByName('
MEDIAID').AsString;
//dbf2.Locate(RefField, Field.CurValue, [loCaseInsensitive]); //Hier wird Exception geworfen
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Application.Terminate();
end;
end.
Mein Problem ist jetzt, das, wenn ich zB. CD0001 anwähle, dann ist die Anzeige korrekt, wenn ich aber dann CD0002 anwähle, ist die Anzeige zunächst auch korrekt, wenn ich dann aber zurück auf CD0001 gehe, wird mir die zugehörige Detaildatenmenge 2 Mal angezeigt. Wenn ich dann auf den dritten Masterdatensatz gehe und danach zurück, erscheint die datenmenge 3 Mal. Ich will sie natürlich in jedem Fall nur einmal sehen.
EDataBaseError: Operation bei geschlossener Datenmenge nicht ausführbar.
Wenn ich jedoch alles im Objektinsprktor einstelle, auch DataSet.Active = true, dann ist doch die Datenmenge geöffnet?
Warum kann ich das dann nicht voraussetzen, wenn ich jetzt Quelltext schreibe, um in meinm Fall auf Änderungen in einer Datenmenge, hier Satznummer in den Masterdaten, zu reagieren?
Was muss ich dazu noch einstellen?