Autor Beitrag
Cube
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mo 03.01.05 03:09 
Hallo,
hab wieder ein kleines Problem. Hier erstmal meine prozedure
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 03.01.05 15:33 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mo 03.01.05 15:35 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 03.01.05 15:40 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 03.01.05 15:57 
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



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