...cannot be performed on an active dataset

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

...cannot be performed on an active dataset

Beitrag von Joachim Raap »

Hallo, ich hatte den Fehler schon einmal weiß aber leider nicht mehr, woran es gelegen hat. Er tritt in diesem Fall dann auf, wenn das Update in der Tabelle konten gemacht werden soll (unten).

Code: Alles auswählen

if EDTGrpNr.Text<>''
                then begin
                      //in StrGrpNr kann wg eines numerischen Feldes nur 0 bis 9 sein
                      FMMenu.SQLQuery1.Clear;
                      FMMenu.SQLQuery1.SQL.Text:='update gruppen SET Bez='''+EDTGrpBez.Text+''' WHERE ID='+(EDTGrpID.Text)+';';
                      FMMenu.SQLQuery1.execsql;
                      FMMenu.SQLTransaction1.Commit;
                      FMMenu.SQLQuery1.close;
                      //UpDate der neuen Bezeichnung in der DB
                      StrGrpBezAlt:=EdtGrpNr.Text+' = '+StrGrpBezAlt;
                      FMMenu.SQLQuery1.Clear;
                      FMMenu.SQLQuery1.SQL.Text:='select ID,Grp from konten where Grp='''+StrGrpBezAlt+''' order by nr;';
                      FMMenu.SQLQuery1.open;
                      while not FMMenu.SQLQuery1.EOF do
                       begin
                        StrKtoID:=FMMenu.SQLQuery1.FieldByName('ID').AsString;
                        StrKtoGrp:=FMMenu.SQLQuery1.FieldByName('Grp').AsString;
                        FMMenu.SQLQuery1.clear;
                        if StrKtoGrp=StrGrpBezAlt
                         then begin
                                  FMMenu.SQLQuery1.SQL.Text:='update konten SET Grp='''+EDTGrpBez.Text+''' WHERE ID='+(StrKtoID)+';';
                                  FMMenu.SQLQuery1.execsql;
                                end
                         else FMMenu.SQLQuery1.next;
                       end;
                      FMMenu.SQLQuery1.Close;      
Außerdem verstehe ich nicht, warum ich Stringvariablen mal mit '''+EDTGrpBez.Text+''' und mal mit '+(StrKtoID)+' schreiben muß. Wenn ich EDTGrpBez.Text wie die andere Variable schreibe, gibt es einen Syntaxfehler......

Joh
Lazarusforum e. V.
Beiträge: 178
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: ...cannot be performed on an active dataset

Beitrag von Joh »

Code: Alles auswählen

while not FMMenu.SQLQuery1.EOF do
begin
...
  FMMenu.SQLQuery1.SQL.Text:='update konten SET Grp='''+EDTGrpBez.Text+''' WHERE ID='+(StrKtoID)+';';
  FMMenu.SQLQuery1.execsql;
ich hab' den Fehler mal eingekreist; finden solltest diu ihn selber

Joh
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ...cannot be performed on an active dataset

Beitrag von af0815 »

Es sind genaugenommen 2 Kardinalfehler, die Joh eingekreist hat.

Noch dazu:
Außerdem verstehe ich nicht, warum ich Stringvariablen mal mit '''+EDTGrpBez.Text+''' und mal mit '+(StrKtoID)+' schreiben muß. Wenn ich EDTGrpBez.Text wie die andere Variable schreibe, gibt es einen Syntaxfehler......
Dann solltest du dir mal überlegen, was genau EDTGrpBez.Text ist und was du mit '+(StrKtoID)+' machst. Ich will gar nicht darauf eingehen, sonst werde ich wieder als Oberlehrer gesehen. Vielleich mal die alten Posts von dir suchen und die Antworten nochmals lesen.

Übrigends ist bei der Art der Programmierung besser, die Queries die du benötigst zur Laufzeit zu erzeugen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: ...cannot be performed on an active dataset

Beitrag von Soner »

Du musst vor dem Ändern des SQL-Testes "inactive" machen:
FMMenu.SQLQuery1.Active:=false;
FMMenu.SQLQuery1.SQL.Text:='update konten SET Grp='''+EDTGrpBez.Text+''' WHERE ID='+(StrKtoID)+';';

Viel schlimmerer Fehler ist, dass du in der Schleife Query1, welche du für Schleife verwendest, änderst, danach ist in diesem Fall alles Käse. Erstelle für Update zweite Query.;
while not FMMenu.SQLQuery1.EOF do begin
if StrKtoGrp=StrGrpBezAlt then begin
FMMenu.SQLQuery1.SQL.Text:='update konten SET Grp='''+EDTGrpBez.Text+''' WHERE ID='+(StrKtoID)+';';
FMMenu.SQLQuery1.execsql;
end
else FMMenu.SQLQuery1.next;
end;

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ...cannot be performed on an active dataset

Beitrag von Joachim Raap »

#joh Danke sehr - aber das daher der Fehler erzeugt wird, habe ich schon bemerkt. Warum er (der Rechner) rummault, weiß ich allerdings noch immer nicht.....
#af0815 tja, Deine Antworten kenne ich nun schon; sie sind für mich (zur Erinnerung: Anfänger) nicht oder nur schwer zu verstehen zumal ich sie nur als zarte Andeutungen erkenne; weil sie eben wenig bis gar nicht konkret sind. So z.B. die Bermerkung "Es sind genaugenommen 2 Kardinalfehler"; ah ja - welche denn (ich möchte nicht ganz doof sterben)? Und wie man eine Query zur Laufzeit erzeugt verstehe ich auch nicht........

Vielleicht sollte ich doch lieber mit Puppen spielen oder in die Politik gehen

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: ...cannot be performed on an active dataset

Beitrag von theo »

Joachim Raap hat geschrieben:
Sa 10. Dez 2022, 15:55
Vielleicht sollte ich doch lieber mit Puppen spielen oder in die Politik gehen
In die Politik geht man erst, wenn man sich nicht mehr zu helfen weiss....
So schlimm kann es ja noch nicht sein? :lol:

Eine andere Frage: Wie lange kann man eigentlich die Anfänger-Karte ausspielen?
Angemeldet hast du dich hier vor bald drei Jahren.

Ist nicht böse gemeint. :wink:

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ...cannot be performed on an active dataset

Beitrag von Joachim Raap »

ja theo. das heißt aber nicht, daß ich 3 Jahre von morgens bis abends programmiert habe. Zwischendurch gab es eine längere Krankheit und ein berufliches Engagement, was mir nicht wirklich Zeit für dieses Hobby ließ.
Mir macht es schon Spaß, irgendeine fiktive Aufgabe mit einem Programm zu lösen; dazu gehört aber auch, eingestaubte Pascalkenntnisse aufzufrischen oder Lazarus zu lernen (ich habe noch keine Seite gefunden auf der man nachlesen kann, mit welchem Symbol man was machen kann oder welche deren Eigenschaften was bedeuten). Daneben gibt es Black Boxes wie Datenbanken wobei mir ist klar, daß ich den Meisten nicht das Wasser reichen kann - will ich aber auch gar nicht.....
Dennoch denke ich, daß ich schon relativ weit gekommen bin und einiges zu Stande bekomme über das zumindest ich mich freue.

Das schreibe ich alles nur deswegen, weil ich manchmal den Eindruck habe, daß die "Könner" mitunter vergessen, daß sich nicht jedem alles sofort erschließt und nicht jeder sofort alles kann (ist eben auch eine Frage von Zeit, Ausbildung (für mich eine autodidactische Angelegenheit)) Ich wüsche mir also (ist ja gerade Weihnachten) mehr Verständnis von Euch (ich rede jetzt nicht nur von mir - denn manche Kommentare die ich lese sind schon heftig)

Ist auch nicht böse gemeint!!!

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: ...cannot be performed on an active dataset

Beitrag von Sieben »

Das Problem mit der genannten Fehlermeldung ist, dass du der geöffneten SQLQuery1 innerhalb der while-not-eof-Schleife ein neues SQL-Statement verpassen willst. Selbst wenn das ginge - und die Fehlermeldung besagt ja recht eindeutig, dass das bei einem aktiven Dataset eben nicht geht - würdest du dir damit die Grundlage für die Schleife unter den Füßen wegziehen. Da wäre nach einem Update nämlich schlicht nix mehr drin von den ursprünglichen Daten. Du musst dir also eine weitere Instanz von TSQLQuery auf's Form packen - SQLQuery2 - um damit dann das Update durchzuführen. Die könntest du dir auch - wie hier schon angemerkt - zur Laufzeit erstellen, aber so ist vermutlich erstmal einfacher.

Deine Kommentare sind übrigens auch nicht immer ohne...

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ...cannot be performed on an active dataset

Beitrag von Joachim Raap »

#sieben - ja, liest sich so war aber eher "lustig" gemeint. Ich gebe zu, das es immer schwierig ist etwas so zu verstehen, wie es gemeint war; dazu ist die persönliche Entwicklung und Erfahrung jedes Einzelnen zu unterschiedlich. Geht mir im Zweifel genauso.....

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: ...cannot be performed on an active dataset

Beitrag von charlytango »

Joachim Raap hat geschrieben:
Sa 10. Dez 2022, 18:50
ich habe noch keine Seite gefunden auf der man nachlesen kann, mit welchem Symbol man was machen kann oder welche deren Eigenschaften was bedeuten
Hm....
Woher hast du Lazarus eigentlich herunter geladen?
Liege ich richtig wenn ich https://www.lazarus-ide.org/ vermute ?
Da sehe ich in der Mitte der Seite zB das aktuelle Lazarus Buch.
und noch weiter unten zahlreiche Links als Ausgangsbasis für weitere Informationen.
zB https://wiki.freepascal.org/Lazarus_Documentation
und viele andere.
https://wiki.freepascal.org/Pascal_and_ ... _Magazines
Joachim Raap hat geschrieben:
Sa 10. Dez 2022, 18:50
Das schreibe ich alles nur deswegen, weil ich manchmal den Eindruck habe, daß die "Könner" mitunter vergessen, daß sich nicht jedem alles sofort erschließt und nicht jeder sofort alles kann (ist eben auch eine Frage von Zeit, Ausbildung (für mich eine autodidactische Angelegenheit)) Ich wüsche mir also (ist ja gerade Weihnachten) mehr Verständnis von Euch (ich rede jetzt nicht nur von mir - denn manche Kommentare die ich lese sind schon heftig)
Ja, als Autodidakt wird man nie gestreichelt und betüdelt.. Willkommen im Klub. Dieses Spiel spiele ich seit 45 Jahren und das auf den unterschiedlichsten Spielbrettern.
Ich bin jetzt keiner der genannten Könner, bin eher der Generalist aber eines wünsche ich mir auch weil gerade Weihnachtszeit ist.
Nämlich dass ein Fragesteller sich mit einer Empfehlung auch auseinandersetzt die von jemandem mit mehreren Dekaden Erfahrung gratis gegeben wird.

kleines Beispiel:
af0815 gab dir hier den Tip dich mit Parametern bei SQL-Statements zu beschäftigen und hat dir ein komplettes Beispiel mit Fehlerbehandling in den Schoß gelegt. Gratis. Ein solches Beispiel hätte mir in meinen Anfängertagen wohl mehrere Manntage Probleme erspart. Auch wenn man es nicht gleich ganz versteht kann man es kopieren und anpassen.
Du negierst das beharrlich und kommst mit einem Problem das durch Benutzung von Parametern und dem Beispiel schon vermieden wäre.

- die Query wurde geschlossen bevor sie verändert wird.
- die Parameter würden verhindern dass du Zeichen und Zahlen mischt und Probleme bekommst mit der Verkettung
-die klare Schreibweise hilft beim debuggen
-und das Exception Handling zeigt dir auch Fehler wenn sie passieren.

All das war in deinem Code nicht zu finden.

Und dein Lapus mit der Schleife war ebenfalls ein Fehler den jemand der schonmal stundenlang danach gesucht hat wie der Teufel das Weihwasser meidet.
Und du HAST Programmierkenntnisse, sonst würdest du nicht mit Pointern rumjonglieren wollen. Eine Schleifenvariable innerhalb der Schleife zu ändern tut man sich nur in Ausnahmefällen an. Egal ob die jetzt ein Objekt (also die Query) oder nur eine simple Bedingung ist. Aber ok, shit happenz.

eine kleine Internetsuche hat übrigens nach drei sekunden folgende Links gebracht zum Thema 'wie man eine Query zur Laufzeit erzeugt':

https://www.delphi-treff.de/tipps-trick ... -erzeugen/
https://entwickler-ecke.de/topic_Querie ... 193,0.html

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ...cannot be performed on an active dataset

Beitrag von Joachim Raap »

Ja charlytango, af0815 hat eine Routine geschrieben die ich auch zu übernehmen bereit bin. Problem ist nur, daß sie bei mir zu Fehlermeldungen führen, die ich wegen Nichtwissen derzeit noch nicht beheben kann. Z.B - Identifier not found "sqoAutoApplyUpdaten" oder "identifier idents no member "Text" etc. Daher ist die Routine noch nicht eingebaut. Ich hatte af0815 zugesagt, daß ich mich um Parameter kümmern werde; tue ich auch.

Nein charlytango, Du liegst falsch in der Annahme, ich hätte Lazarus von der genannten Seite runtergeladen. Selbst wenn, dann käme das Buch nicht in Frage weil es in englisch geschrieben ist. Nur ist das keine Sprache, die für mich in Frage kommt. Und in deutsch habe ich zwei bestellt; sind aber noch nicht da....

Mehr will ich gar nicht sagen, daß würde nur zu offenem Streit führen weil Du eben mich betreffend 0 Hintergründe kennst und einfach mal so aus der Versenkung auftauchst und Kommentare abgibst, die unzutreffend sind......
Führt jetzt nur dazu, daß ich mich hier wohl deutlich zurückziehen werde.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: ...cannot be performed on an active dataset

Beitrag von theo »

Joachim Raap hat geschrieben:
Mo 12. Dez 2022, 11:39
Problem ist nur, daß sie bei mir zu Fehlermeldungen führen, die ich wegen Nichtwissen derzeit noch nicht beheben kann. Z.B - Identifier not found "sqoAutoApplyUpdaten" oder "identifier idents no member "Text" etc.
Da haben sich ein Paar Fehler eingeschlichen.
Soll wohl heissen:
"sqoAutoApplyUpdates" mit s statt n am Schluss und
SQLQuery1.SQL.Text:=

Antworten