Einzelnen Beitrag anzeigen

FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#1

ClientDataSet; Datenmenge wird ungewollt zur aktuellen hinzugefügt, warum?

  Alt 28. Jun 2014, 10:59
Datenbank: Dbase • Version: 4 • Zugriff über: TClientDataSet
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?
  Mit Zitat antworten Zitat