Entwickler-Ecke

Datenbanken - Problem: Geschlossene Datenmenge


Cube - Mo 03.01.05 03:09
Titel: Problem: Geschlossene Datenmenge
Hallo,
hab wieder ein kleines Problem. Hier erstmal meine prozedure

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
 IF DataModule3.Person.Locate('PID',Edit17.Text,[]) THEN
 BEGIN
 Edit1.text := DataModule3.Person.Fields[1].asstring;
 Edit2.text := DataModule3.Person.Fields[2].asstring;
 Edit3.text := DataModule3.Person.Fields[3].asstring;
 Edit4.text := DataModule3.Person.Fields[4].asstring;
 Edit5.text := DataModule3.Person.Fields[5].asstring;
 Edit6.text := DataModule3.Person.Fields[6].asstring;
 Edit7.text := DataModule3.Person.Fields[7].asstring;
 Edit8.text := DataModule3.Person.Fields[8].asstring;
 Edit9.text := DataModule3.Person.Fields[9].asstring;
 Edit10.text := DataModule3.Person.Fields[10].asstring;
 Edit11.text := DataModule3.Person.Fields[11].asstring;
 Edit12.text := DataModule3.Person.Fields[12].asstring;
 END;
end;

Die Prozedur sucht nach dem Primärschlüssel in der Tabelle, der im Edit Feld angegeben wird. Klappt auch alles wunderbar, wenn das Programm zum ersten mal starten. Wenn ich den Datensatz aber vorher ändere, kommt der Fehler: 'Operation bei geschlossener bzw. offener Datenmenge nicht möglich'
Fehler bei Zeile 3 oben.
Die letzten Zeilen der Ändern-Prozedur sind diese hier:

Delphi-Quelltext
1:
2:
3:
4:
5:
DataModule3.Kunde.SQL.Clear;
  DataModule3.Kunde.sql.add('Select DISTINCT PID,Name,Vorname,Geburtsdatum,Straße,Hausnummer,PLZ,Ort,TelefonNr,PersonalausweisNr,Bank,KontoNr'
  +',BLZ,KID AS KundenID FROM Person P, Kunde K Where (P.PID = K.PID) Order By Name');
   DataModule3.Kunde.open;
  DataModule3.Kunde.active:=true;

Hat wahrscheinlich irgendwas mit open und active zu tun...!?
Hoffe, mir kann jemand helfen, Danke schonmal

Gruß,
Cube


bis11 - Mo 03.01.05 08:22

Wenn Du Aktive auf True setzt, musst Du dieses auch wieder auf False setzen. Das gleiche gilt für den Befehl Open. Dann musst Du auch wieder Close sagen.


jasocul - Mo 03.01.05 09:14

BTW:
Es reicht Open oder Active:=true.
So, wie es jetzt in deinem Source ist, öffnest du die Datenmenge zweimal. Bei kleinen Datenmengen kein Problem, bei großen schon sehr.


Cube - Mo 03.01.05 15:27

Ok, also ich hab jetzt nur den Befehl Open hinzugefügt und 'Actvie weggelasssen.
Trotzdem kommt immer noch die Fehlermedlung, wenn ich nach der Änderungsprozedur den Primärschlüssel suche, nämlich die, dass die Operation bei geschlossener Datenemenge nicht durchgeführt werden kann. :?:
Nun, soll ich jetzt die Datenbank noch einmal öffnen??

Hier nochmal die ganze Änderungs Prozedur:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 with DataModule3.Person Do BEGIN
  sql.clear;
  sql.add('Update Person SET Name = :Name, Vorname = :Vorname, Geburtsdatum = :Geburtsdatum, Straße = :Straße'
   + ',Hausnummer = :Hausnummer, PLZ = :PLZ, Ort = :Ort, TelefonNr = :TelefonNr, PersonalausweisNr = :PersonalausweisNr, Bank = :Bank, KontoNr = :KontoNr, BLZ = :BLZ WHERE PID = :PID');
  params[0].asstring := edit1.text;
  params[1].asstring := edit2.text;
  params[2].asdate := StrTodate(edit3.text);
  params[3].asstring := edit4.text;
  params[4].asstring := edit5.text;
  params[5].asstring := edit6.Text;
  params[6].asstring := edit7.Text;
  params[7].asstring := edit8.text;
  params[8].asstring := edit9.text;
  params[9].asstring := edit10.text;
  params[10].asstring := edit12.text;
  params[11].asstring := edit11.text;
  params[12].asinteger:= StrToInt(Edit17.Text);
  execsql;
  DataModule3.Gast.SQL.Clear;
  DataModule3.Gast.SQL.add('Select DISTINCT PID,Name,Vorname,Geburtsdatum,Straße,Hausnummer,PLZ,Ort,TelefonNr,PersonalausweisNr,Bank,KontoNr'
  +',BLZ,GastID FROM Person P, Gast G Where (P.PID = G.PID) Order By Name');
  DataModule3.Gast.Open;
  DataModule3.Kunde.SQL.Clear;
  DataModule3.Kunde.sql.add('Select DISTINCT PID,Name,Vorname,Geburtsdatum,Straße,Hausnummer,PLZ,Ort,TelefonNr,PersonalausweisNr,Bank,KontoNr'
  +',BLZ,KID AS KundenID FROM Person P, Kunde K Where (P.PID = K.PID) Order By Name');
  DataModule3.Kunde.Open;
 END;
end;


jasocul - Mo 03.01.05 15:33
Titel: Re: Problem: Geschlossene Datenmenge
Cube hat folgendes geschrieben:
Wenn ich den Datensatz aber vorher ändere, kommt der Fehler: 'Operation bei geschlossener bzw. offener Datenmenge nicht möglich'
Fehler bei Zeile 3 oben.

Vermutlich funktioniert Locate nur, wenn die Datenmenge im Status "Browse" ist. Hast du nach der Änderung den Datensatz auch gespeichert (-> Post !)?


Cube - Mo 03.01.05 15:35
Titel: Re: Problem: Geschlossene Datenmenge
jasocul hat folgendes geschrieben:
Cube hat folgendes geschrieben:
Wenn ich den Datensatz aber vorher ändere, kommt der Fehler: 'Operation bei geschlossener bzw. offener Datenmenge nicht möglich'
Fehler bei Zeile 3 oben.

Vermutlich funktioniert Locate nur, wenn die Datenmenge im Status "Browse" ist. Hast du nach der Änderung den Datensatz auch gespeichert (-> Post !)?

Ich weiß leider nicht, was du mit 'browse' und speichern meinst. Wie versetz ich das ganze in den Zustand?
Erst wird die Änderungs Prozedur aufgerufen, danach sofort bei Click die andere.


jasocul - Mo 03.01.05 15:39

Habe den Fehler gefunden.
Du machst ein ExecSQL. Das ist auch mit der Update-Anweisung korrekt. Danach ist deine Person-Tabelle aber geschlossen :!:
Dein Locate versucht aber diese Tabelle zu nutzen. Das wars. Operation geht natürlich nicht bei einer geschlossenen Datenmenge :wink:


jasocul - Mo 03.01.05 15:40
Titel: Re: Problem: Geschlossene Datenmenge
Cube hat folgendes geschrieben:
jasocul hat folgendes geschrieben:
Cube hat folgendes geschrieben:
Wenn ich den Datensatz aber vorher ändere, kommt der Fehler: 'Operation bei geschlossener bzw. offener Datenmenge nicht möglich'
Fehler bei Zeile 3 oben.

Vermutlich funktioniert Locate nur, wenn die Datenmenge im Status "Browse" ist. Hast du nach der Änderung den Datensatz auch gespeichert (-> Post !)?

Ich weiß leider nicht, was du mit 'browse' und speichern meinst. Wie versetz ich das ganze in den Zustand?
Erst wird die Änderungs Prozedur aufgerufen, danach sofort bei Click die andere.

Vergiss es. War der falsche Ansatz. Mit deinem zweiten Source konnte ich das Problem sehen.


Cube - Mo 03.01.05 15:45

Ah...ok...könntest du mir noch gerade sagen, wo ich den open befehl hinsetzen muss. Bekomme nämlich immer eine Cursor-Handle Fehlermedlung.


jasocul - Mo 03.01.05 15:57


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 with DataModule3.Person Do BEGIN
  sql.clear;
  sql.add('Update Person SET Name = :Name, Vorname = :Vorname, Geburtsdatum = :Geburtsdatum, Straße = :Straße'
   + ',Hausnummer = :Hausnummer, PLZ = :PLZ, Ort = :Ort, TelefonNr = :TelefonNr, PersonalausweisNr = :PersonalausweisNr, Bank = :Bank, KontoNr = :KontoNr, BLZ = :BLZ WHERE PID = :PID');
  params[0].asstring := edit1.text;
  params[1].asstring := edit2.text;
  params[2].asdate := StrTodate(edit3.text);
  params[3].asstring := edit4.text;
  params[4].asstring := edit5.text;
  params[5].asstring := edit6.Text;
  params[6].asstring := edit7.Text;
  params[7].asstring := edit8.text;
  params[8].asstring := edit9.text;
  params[9].asstring := edit10.text;
  params[10].asstring := edit12.text;
  params[11].asstring := edit11.text;
  params[12].asinteger:= StrToInt(Edit17.Text);
  execsql; // Hier führst du das Update aus. OK.
  // Jetzt fehlt noch, dass du Person.SQL mit der Select-Anweisung füllst.
  // Genauso, wie du es für Gast und Kunde machst. 
  // Dann kansst du auch wieder ein Open machen.
  DataModule3.Gast.SQL.Clear;
  DataModule3.Gast.SQL.add('Select DISTINCT PID,Name,Vorname,Geburtsdatum,Straße,Hausnummer,PLZ,Ort,TelefonNr,PersonalausweisNr,Bank,KontoNr'
  +',BLZ,GastID FROM Person P, Gast G Where (P.PID = G.PID) Order By Name');
  DataModule3.Gast.Open;
  DataModule3.Kunde.SQL.Clear;
  DataModule3.Kunde.sql.add('Select DISTINCT PID,Name,Vorname,Geburtsdatum,Straße,Hausnummer,PLZ,Ort,TelefonNr,PersonalausweisNr,Bank,KontoNr'
  +',BLZ,KID AS KundenID FROM Person P, Kunde K Where (P.PID = K.PID) Order By Name');
  DataModule3.Kunde.Open;
 END;
end;

Siehe Kommentar.


Cube - Mo 03.01.05 16:01

Vielen Dank, hat geklappt. Wusste nicht, dass ich noch eine Select Anweisung brauche. Also
Dankeschön :wink: