![]() |
repeat - until abfrage
Hi, ich habe ein kleines Problem mit einer Abfrage. Hier ist erstmal der Quellcode:
Delphi-Quellcode:
diese Schleife funktioniert fast ohne Probleme. Wenn der "dm1.T_anschrift.Next" zeiger auf dem 20. Datensatz zeigt dann kommt eben eine Fehlermeldung: Allgemeiner SQL Fehler!. Bis zum 20. Datensatz läuft es ohne Probleme. Auch die "Wahr" Abfrage funktioniert bis dahin. Naja, wie gesagt, ab dem 20. DS passiert nix mehr ausser die Fehlermeldung.
dm1.T_anschrift.First;
repeat if idzumbearbeiten = dm1.T_anschrift.fieldbyname('ID_anschrift').asinteger then begin .... bearbeitenzaehler := idzumbearbeiten; end else begin dm1.T_anschrift.Next; bearbeitenzaehler := bearbeitenzaehler + 1; end; until idzumbearbeiten = bearbeitenzaehler; Woran kann das liegen?!?! mfg Snyderburn |
Re: repeat - until abfrage
Hallo Snyderburn,
ich bin ziemlich sicher, dass du Next aufrufst, obwohl die EOF Bedingung schon True ist und das geht dann schief :mrgreen: . |
Re: repeat - until abfrage
Es fehlt auf jeden Fall ein 'or EOF', könnte ja, daß die ID in der Tabelle nicht vorhanden ist.
|
Re: repeat - until abfrage
Ich habe da jetzt ein EOF bei der Until anweisung eingestellt, aber der Fehler kommt immer noch. Der Fehler ist nämlich bei der dm1.t_anschrift.NEXT anweisung und nicht beim Until.
|
Re: repeat - until abfrage
Hallo Snyderburn,
falls die EOF Bedingung schon beim Eintritt in die Schleife True wäre, erzeugst du auch eine exception. Und dass die exception bei dem Aufruf von Next ausgelöst wird, spricht dafür, dass die EOF Bedingung Schuld ist. |
Re: repeat - until abfrage
Für solche Fälle bevorzuge ich eine While-Scheife.
Delphi-Quellcode:
Musste mal testen. So schießt man sich nicht so leicht in den Fuß! :wink:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler) then
begin // ... end; |
Re: repeat - until abfrage
Hi!
EOF hat meiner Meinung nach nichts mit dem Fehler zu tun. Ich habe nämlich in der Datenbank gute 100 Datensätze drin und nach dem 20 Datensatz spricht er eine Fehlermeldung aus. Er liest also nicht den 21. Datensatz!!!!!! Ich habe es auch mit der while schleife gemacht, hier ist aber derselbe Fehler. |
Re: repeat - until abfrage
Kannst du die Zeile in der der Fehler kommt mal zeigen?
|
Re: repeat - until abfrage
ja sicher kann ich dir die Zeile zeigen:
Delphi-Quellcode:
Wenn Du dir oben den Code anguckst, den ich eingestellt habe, dort siehst Du die Zeile auch! Da kommt immer der Fehler.
dm1.T_anschrift.Next;
|
Re: repeat - until abfrage
@ Snyderburn
in deinem aufgeführten beispiel wird der satzzeiger ja nur auf den nächsten satz gestellt wenn die bedingung in den else-zweig geht. bei "then" wird er ja gar nicht weiter gestellt. ist das absicht? weil wenn der satzzeiger nicht weitergestellt wird dann greifst du ja immer auf den selben satz zu.
Delphi-Quellcode:
dm1.T_anschrift.First;
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler)do bgein if idzumbearbeiten = dm1.T_anschrift.fieldbyname('ID_anschrift').asinteger then begin .... bearbeitenzaehler := idzumbearbeiten; end else begin // dm1.T_anschrift.Next; glaube hier nicht bearbeitenzaehler := bearbeitenzaehler + 1; end; dm1.T_anschrift.Next; // glaube hier muss das hin end; {while}idzumbearbeiten = bearbeitenzaehler; |
Re: repeat - until abfrage
Das war absicht, dass der Satzzeiger nur bei der Else-Anweisung hochgezählt wird. Aber ich habe des dennoch mal so versucht, wie Du es gesagt (geschrieben) hast, es habt aber auch nichts genützt!!! Der Fehler ist immer noch da.
Ich bin hier echt schon am verzweifeln! |
Re: repeat - until abfrage
kannst du mal die fehlermeldung hierher posten?
vielleicht weiß jemand von uns anderen was damit anzufangen!? |
Re: repeat - until abfrage
Die Fehlermeldung lautet:
Im Projekt Infopool.exe ist eine Exception der Klasse EDBEngineError aufgetreten. Meldung: 'Allgemeiner SQL-Fehler [Easysoft][InterBase]Dynamic SQL Error, SQL error code = -504, Cursor unknown'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. |
Re: repeat - until abfrage
kann es sein das in deinem feld "ID_anschrift" alle werte i.o. sind !? ich meine das bis zum 20ten auch zahlen drin stehen und eben dieser 20te wert evtl. ein z.b. string ist. das da ein buchstabe oder so dirn steht.
die meldung "Cursor unknown" deute ich so, das der satzzeiger nicht mehr weiß wohin er zeigen soll. wieviel datensätze hast du denn insgesamt? sonst weiß ich auch nimmer weiter... :?: |
Re: repeat - until abfrage
probier mal was aus.
bisher war die abfrage so:
Delphi-Quellcode:
glaube die abfrage ist falsch.
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler) then
begin // ... end; die while schleife wird ja solange durchlaufen, solange das ende nicht erreicht (eof) und solange (idzumbearbeiten = bearbeitenzaehler). aber du willst ja die schleife beenden wenn idzumbearbeiten = bearbeitenzaehler dann müßte doch die abfrage so aussehen: idzumbearbeiten <> bearbeitenzaehler
Delphi-Quellcode:
:gruebel:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten <> bearbeitenzaehler) then
begin // ... end; in worten ausgedrückt: die schleife wird solange wiederholt, solange kein ende erreicht ist und solange die 2 variablen ungleich sind. sind beide variablen gleich, so wird die schleife verlassen. |
Re: repeat - until abfrage
Also, das Feld "ID_Anschrift" ist ein Integer und da stehen nur Zahlen drin, ich habe es eben noch mal überprüft. Ist 100% in Ordnung.
Insgesamt hat die Tabelle so um die 115 Datensätze. |
Re: repeat - until abfrage
Die Änderung hat leider auch nichts genützt!
Zitat:
|
Re: repeat - until abfrage
Was ich hierbei nicht verstehe, warum kommt ein SQL-Fehler hoch?
Mit First, next usw. bewegt man einen Zeiger in einer Datenmenge, da ist null und nothing mit SQL!!!! :gruebel: |
Re: repeat - until abfrage
aber vorneweg muss doch die querry mittels einen sql-befehl gefüllt werden...
auf diese gefüllte querry kannst du dann zugreifen.. |
Re: repeat - until abfrage
Es muss noch lange keine Query (in diesem ist es auch wohl keine) sein und selbst wenn, das SQL-Statement ist zu diesem Zeitpunkt schon lange Geschichte.
Der SQL-Fehler deutet auf ungültige Zeichen hin. Daß passt alles irgendwie nicht zusammen ... |
Re: repeat - until abfrage
Querys benutze ich bei mir im Prog. Aber @Touchdown, du hast recht, zu diesem Zeitpunkt werden die Querys nicht benutz, sondern nur das Table!
Hättet ihr sonst noch ne idee, woran das liegen könnte?????? |
Re: repeat - until abfrage
:wiejetzt:
glaube das wird so nix mehr.. wir wärs mit etwas mehr quellcode oderstellst bissl code zum download bereit, damit man sch das mal genauer ansehen kann? is nur ein vorschlag. |
Re: repeat - until abfrage
Hallo Snyderburn,
welche Datenbank nutzt du? |
Re: repeat - until abfrage
Hier ist der Quellcode der Prozedure. Ich habe nur ein paar Abfragen und Tabellen rausgenommen, da die sich ständig wieder holen.
Delphi-Quellcode:
procedure TImportblatt.Bearbeiten2Click(Sender: TObject);
var idzumbearbeiten, bearbeitenzaehler : integer; begin dbmemo7.visible := true; dblookupListbox1.Visible := false; Mainmenueanzeigentrue; //Anzeige des MainMenu MainMenu1.Items.Items[1].Items[1].enabled := false; //Eine Punkt im Menü auf enabled setzten bearbeitenzaehler := 0; idzumbearbeiten := 0; try idzumbearbeiten := dm1.q_extern.fieldbyname('Id_anschrift').asinteger; //q_extern ist eine Query. Wurde in einer If idzumbearbeiten = 0 then //Prozedure aufgerufen und gestartet. begin showmessage('Es können keine Daten bearbeitet werden!'); exit; end else begin dm1.q_anschrift.close; dm1.ds_anschrift.DataSet := dm1.T_anschrift; dm1.T_anschrift.First; repeat if idzumbearbeiten = dm1.T_anschrift.fieldbyname('ID_anschrift').asinteger then begin dm1.T_anschrift.edit; dm1.T_Zugehoerigkeit.edit; .... // Hier stehen noch mehr Tabellen drin. dm1.t_extern_freigabe.edit; dm1.q_Zugehoerigkeit.RequestLive := true; dm1.DS_Zugehoerigkeit.DataSet := dm1.q_Zugehoerigkeit; dm1.q_Zugehoerigkeit.Close; dm1.q_Zugehoerigkeit.SQL.Clear; dm1.q_Zugehoerigkeit.SQL.Add('select * from zugehoerigkeit where id_anschrift = '+inttostr(idzumbearbeiten)); dm1.q_Zugehoerigkeit.Open; // diese wiederholt sich für einige anderen Tabellen!! dbnavigator1.Visible := false; dbnavigator2.Visible := false; Importblatt.Caption := 'Interner Fragebogen - Bearbeiten'; Buttonreadonlyfalse; // setzt alle Buttons auf ReadOnly := false; Freigabe.Visible := false; //setzt den Button auf visible := false; neue_freigabe.Visible := false; //setzt den Button auf visible := false; groupbox1.Visible := false; //setzt die groupbox auf visible := false; dbcheckbox46.Visible := false; //setzt die dbcheckbox auf visible := false; dbcheckbox47.visible := false; //setzt die dbcheckbox auf visible := false; dbcheckbox48.visible := false; //setzt die dbcheckbox auf visible := false; neu.Visible := false; //setzt den Button auf visible := false; loeschen.visible := false; //setzt den Button auf visible := false; Speichern.visible := true; //setzt den Button auf visible := false; Speichern.Enabled := true; //setzt den Button auf visible := false; Klick := 10; //Nur eine Variable, wird später benötigt. bearbeitenzaehler := idzumbearbeiten; end else begin dm1.T_anschrift.Next; bearbeitenzaehler := bearbeitenzaehler + 1; end; until (idzumbearbeiten = bearbeitenzaehler) or (dm1.T_Anschrift.Eof); end; except showmessage('Es können keine Daten bearbeitet werden!'); end; end; |
Re: repeat - until abfrage
Zitat:
|
Re: repeat - until abfrage
Hallo Snyderburn,
da hat man die was Gutes vorgesetzt. Du benutzt eine Interbase / Firebird Datenbank. Da es sich dabei um eine C/S Datenbank handelt, die nur SQL versteht, werden deine Tabellenzugriffe in SQL Anfragen umgewandelt. Das erklärt, warum der Fehler mit SQL zu tun hat. |
Re: repeat - until abfrage
Zitat:
|
Re: repeat - until abfrage
Hallo Snyderburn,
deine Aussage: Zitat:
Ich gehe mal davon aus, dass da nur der Frust durchdringt, dass du nicht weiterkommst und will mal ein paar Kommentare zu deinem Code abegeben:
Delphi-Quellcode:
Was mir hier komisch vorkommt ist, dass du hier viele Tabellen in den Schreibmode versetzt!? Üblicherweise setzt man nur die Datei in den Schrebmodus, in der man den aktuellen Datensatz editieren möchte.
repeat
if idzumbearbeiten = dm1.T_anschrift.fieldbyname('ID_anschrift').asinteger then begin dm1.T_anschrift.edit; dm1.T_Zugehoerigkeit.edit; .... // Hier stehen noch mehr Tabellen drin. dm1.t_extern_freigabe.edit;
Delphi-Quellcode:
Wenn q_Zugehoerigkeit noch geöffnet ist, sollte eine Zuweisung an RequestLive entweder zu einer exception führen oder ignoriert werden. Ich würde erst das Close schreiben und dann die Eigenschaften ändern.[/delphi]dm1.q_Zugehoerigkeit.RequestLive := true; dm1.DS_Zugehoerigkeit.DataSet := dm1.q_Zugehoerigkeit; dm1.q_Zugehoerigkeit.Close;
Delphi-Quellcode:
Wenn der akzuelle Datensatz die Bedingung nicht erfüllt, wird der Datensatzzeiger ja durch den Aufruf von Next weitergeschoben. Dann setzt du aber alle Tabellen erneut in den Edit-Modus, aber in diesem sind sie ja noch!?
...
end else begin dm1.T_anschrift.Next; bearbeitenzaehler := bearbeitenzaehler + 1; end; until (idzumbearbeiten = bearbeitenzaehler) or (dm1.T_Anschrift.Eof); |
Re: repeat - until abfrage
@MrSpock ich wollte nicht, dass es zickig klingt, aber ich bin total verzweifelt, dass es nicht so funktioniert, wie ich das will!!!!
Wenn ich in der repeat-until schleife eine try-except bedingung einfüge, dann funktioniert das komischerweise.
Delphi-Quellcode:
Wieso funktioniert das jeztz??? kann mir das jemand erklären??? Aber zum Glück hat es nun funktioniert.
dm1.T_anschrift.First;
repeat try dm1.T_anschrift.Next; except showmessage('mhm...es gibt hier ein kleines Problem'); end; until dm1.T_Anschrift.Eof; @all Danke für die Hilfe! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz