Autor |
Beitrag |
Cube
      
Beiträge: 18
|
Verfasst: Mo 03.01.05 03:09
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
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 03.01.05 15:57
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; 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 
      
Beiträge: 18
|
Verfasst: Mo 03.01.05 16:01
Vielen Dank, hat geklappt. Wusste nicht, dass ich noch eine Select Anweisung brauche. Also
Dankeschön 
|
|
|