Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi repeat - until abfrage (https://www.delphipraxis.net/11379-repeat-until-abfrage.html)

Snyderburn 5. Nov 2003 14:34


repeat - until abfrage
 
Hi, ich habe ein kleines Problem mit einer Abfrage. Hier ist erstmal der Quellcode:
Delphi-Quellcode:
        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;
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.
Woran kann das liegen?!?!

mfg
Snyderburn

MrSpock 5. Nov 2003 14:56

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: .

Touchdown 5. Nov 2003 14:59

Re: repeat - until abfrage
 
Es fehlt auf jeden Fall ein 'or EOF', könnte ja, daß die ID in der Tabelle nicht vorhanden ist.

Snyderburn 5. Nov 2003 15:05

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.

MrSpock 5. Nov 2003 15:49

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.

Touchdown 5. Nov 2003 16:47

Re: repeat - until abfrage
 
Für solche Fälle bevorzuge ich eine While-Scheife.

Delphi-Quellcode:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler) then
begin
  // ...
end;
Musste mal testen. So schießt man sich nicht so leicht in den Fuß! :wink:

Snyderburn 6. Nov 2003 08:42

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.

Memo 6. Nov 2003 12:58

Re: repeat - until abfrage
 
Kannst du die Zeile in der der Fehler kommt mal zeigen?

Snyderburn 6. Nov 2003 14:14

Re: repeat - until abfrage
 
ja sicher kann ich dir die Zeile zeigen:

Delphi-Quellcode:
dm1.T_anschrift.Next;
Wenn Du dir oben den Code anguckst, den ich eingestellt habe, dort siehst Du die Zeile auch! Da kommt immer der Fehler.

markon 6. Nov 2003 14:20

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;

Snyderburn 6. Nov 2003 14:30

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!

markon 6. Nov 2003 14:33

Re: repeat - until abfrage
 
kannst du mal die fehlermeldung hierher posten?
vielleicht weiß jemand von uns anderen was damit anzufangen!?

Snyderburn 6. Nov 2003 14:36

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.

markon 6. Nov 2003 14:50

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... :?:

markon 6. Nov 2003 15:00

Re: repeat - until abfrage
 
probier mal was aus.
bisher war die abfrage so:
Delphi-Quellcode:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler) then
begin
  // ...
end;
glaube die abfrage ist falsch.
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:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten <> bearbeitenzaehler) then
begin
  // ...
end;
:gruebel:
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.

Snyderburn 6. Nov 2003 15:04

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.

Snyderburn 6. Nov 2003 15:09

Re: repeat - until abfrage
 
Die Änderung hat leider auch nichts genützt!

Zitat:

Zitat von markon
probier mal was aus.
bisher war die abfrage so:
Delphi-Quellcode:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten = bearbeitenzaehler) then
begin
  // ...
end;
glaube die abfrage ist falsch.
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:
while (not dm1.T_anschrift.eof) and (idzumbearbeiten <> bearbeitenzaehler) then
begin
  // ...
end;
:gruebel:
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.


Touchdown 6. Nov 2003 15:14

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:

markon 6. Nov 2003 15:18

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..

Touchdown 6. Nov 2003 16:05

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 ...

Snyderburn 7. Nov 2003 10:22

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??????

markon 7. Nov 2003 10:33

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.

MrSpock 7. Nov 2003 10:48

Re: repeat - until abfrage
 
Hallo Snyderburn,

welche Datenbank nutzt du?

Snyderburn 7. Nov 2003 11:00

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;

Snyderburn 7. Nov 2003 11:02

Re: repeat - until abfrage
 
Zitat:

Zitat von MrSpock
Hallo Snyderburn,

welche Datenbank nutzt du?

Ich benutze eine *.gdb Datenbank. Mir sagt das nicht viel, aber mir wurde die einfach "vorgesetzt".

MrSpock 7. Nov 2003 11:49

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.

Snyderburn 7. Nov 2003 13:53

Re: repeat - until abfrage
 
Zitat:

Zitat von MrSpock
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.

Das ist dann ja schön zu hören, dass es daran liegt, dass der Fehler was mit SQL zu tun hat. Aber, das bringt mir ja auch nicht viel weiter. Den Fehler habe ich deswegen noch nicht beseitigt!!

MrSpock 8. Nov 2003 17:48

Re: repeat - until abfrage
 
Hallo Snyderburn,

deine Aussage:
Zitat:

Das ist dann ja schön zu hören, dass es daran liegt, dass der Fehler was mit SQL zu tun hat. Aber, das bringt mir ja auch nicht viel weiter. Den Fehler habe ich deswegen noch nicht beseitigt!!
hört sich ja ziemlich zickig an. Man hat ja fast das Gefühl, man müsste sich entschuldigen helfen zu wollen.

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:
 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;
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.
Delphi-Quellcode:

            dm1.q_Zugehoerigkeit.RequestLive := true;
            dm1.DS_Zugehoerigkeit.DataSet := dm1.q_Zugehoerigkeit;
            dm1.q_Zugehoerigkeit.Close;
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]

Delphi-Quellcode:
 ...          
          end
          else
          begin
           dm1.T_anschrift.Next;
           bearbeitenzaehler := bearbeitenzaehler + 1;
          end;
        until (idzumbearbeiten = bearbeitenzaehler) or (dm1.T_Anschrift.Eof);
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!?

Snyderburn 10. Nov 2003 11:07

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:
        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;
Wieso funktioniert das jeztz??? kann mir das jemand erklären??? Aber zum Glück hat es nun funktioniert.
@all Danke für die Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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