Announcement

Collapse
No announcement yet.

TIBDataSet (4.52) und Locate

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TIBDataSet (4.52) und Locate

    und schon wieder ich...

    Folgendes Problem:
    In einer Datenmenge die von einer IBDataSet verwaltet wird (ca. 1400 Datensätze) gibt es die Spalten ID und Firmenname. Die Datenmenge wird in einem DBGrid angezeigt, sortiert nach dem Namen. Wenn ich versuchen mit dem Befehl

    DM.Grid.Locate('ID',1397,[]);

    auf diesen Datensatz zu springen, passiert nix, der Rückgabewert von Locate ist false. Der Datensatz existiert, befindet sich aber irgendwo im letzten Drittel der Datenmenge.

    Wenn ich eine ID auswähle, die sich unter den ersten 20-30 Datensätze befindet, funktioniert der Locate-Aufruf.

    Woher kommt dieses Verhalten und wie kann ich es abstellen?

    Wolfgang

  • #2
    Hallo,

    dieses Problem hat direkt mit dem Unterschied zwischen der Ergebnismenge auf der Server-Seite (Result Set der SELECT-Abfrage) und der lokal vom Client zwischengespeicherten Datenmenge zu tun. Die beiden Datenmengen sind nur dann identisch, wenn der Client über die TIBDataSet-Methode <B>FetchAll</b> auch wirklich <b>alle</b> Datensätze des Result Sets vom InterBase abfordert.

    Da <b>Locate</b> nur lokal die zwischengespeicherten Datensätze durchsucht, werden nur die Treffer gefunden, die bereits vom InterBase abgeholt und auf der Client-Seite im Cache liegen. Das gleiche Prinzip könnte man auch so abbilden:
    <pre>
    ...
    // zuletzt ausgewählte Publikation wieder aktivieren
    with IBQBeitragPublikation do
    begin
    Active := True;
    DisableControls;
    try
    while (IBQBeitragPublikationREIHEID.Value <> FCurrentPublikationID) and
    (not EOF) do
    Next;
    finally
    EnableControls;
    end;
    end;
    </pre>
    In diesem Fall fordert der Client über den Aufruf von <b>Next</b> vom InterBase-Server solange die Datensätze aus der Ergebnismenge ab, bis der gesuchte Wert gefunden wurde. Immer dann, wenn viele Datensätze zu durchsuchen sind, hat dieser direkte Weg Vorteile, da auf FetchAll und dem sich daraus ergebenden Laden aller Datensätze verzichtet werden kann.

    &#10

    Comment


    • #3
      Vielen Dank Andreas

      Comment


      • #4
        Hallo Andreas,

        Dem entnehme ich, dass eine Datenmenge bei der ChachedUpdates aktiviert ist, mit einem Cache des Caches arbeitet ???

        Ist doch n' Scherz oder ???

        Gruß Gesin

        Comment


        • #5
          Hallo,

          welchen Namen das Teil bekommt ist eigentlich egal ;-) <br>
          Die vom InterBase eingelesen Datensätze werden lokal auf der Clientseite im Arbeitsspeicher vorgehalten (Cache A). Wenn man dann noch CachedUpdates aktiviert, muss IBX zusätzliche Informationen speichern: <br>
          a) Wie sah der original eingelesene Datensatz aus? <br>
          b) Welche neuen Werte wurden im CachedUpdate-Zeitraum zugewiesen?<br>
          Es liegt auf der Hand, dass diese beiden Informationen irgendwo zwischengespeichert werden müssen. Die BDE hat dazu temp. Paradox-Tabellen angelegt, aber da IBX auf die BDE verzichten muss, bleibt nur der RAM übrig.

          Comment

          Working...
          X