Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Sperren: Exeption wenn auf letztem Datensatz (https://www.delphipraxis.net/5326-sperren-exeption-wenn-auf-letztem-datensatz.html)

Gambit 1. Jun 2003 23:29


Sperren: Exeption wenn auf letztem Datensatz
 
Hallo,

meine Datenbank öffnet schreibgeschützt, also nichts ist editierbar. Nun habe ich eine Routine eingebaut, die den Schreibschutz aufhebt, damit sich ZB DBEdits editieren lassen:

Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
var pos: TBookmark; // Lesezeichen
begin
  pos:= Query1.GetBookmark; // Position merken
  Query1.Active:= false;
  if CheckBox1.Checked= true then Query1.RequestLive := false //sperren
  else Query1.RequestLive := true; // Sperre aufheben
  Query1.Active:= true;
  Query1.GotoBookmark(pos); // Position wiederherstellen
end;
Das funzt soweit auch ganz gut, es sei denn, ich stehe gerade auf dem letzten Datensatz. Wenn ich dann sperren oder entsperren will bekomme ich ein Exeption mit der Fehlermeldung:

Gitternetz außerhalb des zulässigen Bereichs.

Wie kommt denn das und wie kann man dem abhelfen?

Gruß

Gambit

Neo2084 1. Jun 2003 23:33

Hi,

ich glaube nicht das Bookmarks überhaupt ein schließen der Tabelle überleben.
Wenn deine Tabelle einen Primärindex auf einem Feld hat, dann merke dir doch einfach den Primärkey und nach dem öffnen machst du einfach ein Query.Locate ...
Wenn locate keine übereinstimmmung findet, geht es einfach zum nächsten Datensatz.

Gruß Neo

Hansa 1. Jun 2003 23:41

ist das etwa eine CD?

Gambit 1. Jun 2003 23:46

Also anfangs hatte ich das Ganze mit ner TTable gemacht, da klappte das mit den Bookmarks. Obs mit der Query noch klappt probier ich morgen. Aber die Exeption kam auch bei der TTable schon. Möcht bloß wissen wieso?

Gambit

P.S was meinst du denn mit CD?

Gambit 1. Jun 2003 23:48

Achso, ohne Bookmarks kam die Exeption auch...

Gambit

Neo2084 1. Jun 2003 23:53

Hi,

wie lautet die Exception ?
Wenn du eine Query über mehrere Tabellen machst, kann man diese nicht editieren und dann führt RequestLive zu einer Exeption.

Und noch was, Bookmarks müssen mit Free wieder freigegeben werden, sonst hast du ein Speicherleck !

Poste doch mal die Komplette Funktion ohne Bookmark ...

Gruß Neo

Gambit 2. Jun 2003 07:20

Moin!

Was meinst du denn mit schick mal die ganze Funktion? Das ist doch die ganze Methode. Also ich glaube auch, RequestLive hat da unmittelbar gar nichts mit zu tun, es passiert ja auch, wenn ich Table1.ReadOnly:=False bei einer Table statt einer Query benutze.

Die Exeption ist eine der Klasse EInvalidGridOperation die Fehlermeldung hatte ich ja schon gepostet.

Und, es ist nur eine Tabelle.

Könntest du mir denn etwas genauer erklären, wie ich mir ich mir den Primärindex merken kann, dann probier ich das mal?

Gruß

Gambit

Gambit 2. Jun 2003 18:56

Jetzt raff ich gar nix mehr...mach die DBGrid von der Breite her kleiner, klappt alles ohne Probs. Mach ich sie breiter kommt die Exeption.

Das soll mal wer schnallen...

Gambit

Neo2084 2. Jun 2003 20:05

Hallo,

mach das Grid unsichtbar (visible=false),
dann schließ die Tabelle und öffne sie erneut,
dann Grid wieder einschalten. Scheinbar stimmt die Anzahl der Spalten nicht mehr nach dem erneuten öffnen.

Alternativ vorher noch Grid.Dataset :=nil
und anschließend neu zuweisen.

sag mal Bescheid ob das hilft...

Gruß Neo

Gambit 2. Jun 2003 21:11

Wie meinst du das jetzt genau? In die oben genannte Routine einbauen?

Ich bin im Moment völlig confused...

Gambit

P.S

Vielleicht könntest du das in die Routine oben mal reinschreiben? :oops:

Neo2084 2. Jun 2003 21:52

Hallo,

och mann..... :lol:

Code:
procedure TForm1.CheckBox1Click(Sender: TObject);
var //pos: TBookmark; // Lesezeichen
    id : Integer;
begin
  //pos:= Query1.GetBookmark; // Position merken
  id :=Query1Feld1.AsInteger; // wenn du z.B. ein Feld mit einem Qunique-ID Index hast
  Query1.Active:= false;
  Grid.Visible :=False;
  Application.ProcessMessages;
  Grid1.Datasource :=nil;
  Application.ProcessMessages;
  try
     if CheckBox1.Checked= true then Query1.RequestLive := false //sperren
    else Query1.RequestLive := true; // Sperre aufheben
    Query1.Active:= true;
  finally
     //Query1.GotoBookmark(pos); // Position wiederherstellen
     Grid1.Datasource :=Query1DS; // oder wi auch immer das Dataset heißt ;-)
     Grid1.Visible :=True;
     try
        query1.locate ('FELD1',Variant(id),[]); // Position wiederherstellen
     except
        // hier Fehlermeldung
     end;
  end;
end;
so, das ganze ist aber ungetestet, F1 ist aber dein Freind ;-)

Gruß Neo, der jetzt essen geht :wink: , mist dafür gibt es keinen Smiley !

Gambit 3. Jun 2003 08:27

Ich hab mal ne ganz neue Form basierend auf der Tabelle gemacht und der Fehler ist weg. Wer weiß warum...
@Neo: Vielen Dank für deine Mühe. Könntest du mir noch sagen, wie und wo genau ich die Free Methode anwenden muss?

Gruß

Gambit

Neo2084 3. Jun 2003 08:49

Hallo,

hier mal ein Codeschnipsel von mir ...

Code:
procedure TMakeEKReForm.PosTabAfterDelete(DataSet: TDataSet);
var bm : tBookmark;
    p : Integer;
begin
     PosTab.DisableControls;
     BM :=PosTab.GetBookmark;
     try
        p :=0;
        postab.first;
        while not postab.eof do
        begin
          inc(p);
          postab.edit;
          try
             postabposition.asinteger :=p;
             postab.post;
          except
             // Hier Fehlermeldung
          end;
          postab.next;
        end;

        PosTab.GotoBookmark (BM);
     finally
        PosTab.FreeBookmark (BM);
     end;
     PosTab.EnableControls;
end;
Noch ein le. Tip, du solltest dich unbedingt mit Schutzblöcken
- try finally end
- try except end
mal auseinandersetzen, so was ist sehr wichtig, wenn man guten Code schreiben will.

Gruß Neo

Gambit 3. Jun 2003 10:28

also Try except ist mir aus Java, was wir in der Schule, lernen gut bekannt. Was Try Finally angeht, das kenn ich noch nicht, werde aber deinen Rat befolgen und mich damit beschäftigen.

Und wahrscheinlich muss man alle Komponenten vom Typ Pointer wieder freigeben? Also wie in C++? Oder schmeiß ich da nu wieder was durcheinander?

Gruß

Gambit


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz