[gelöst] Markedonly ist zu langsam

11. April 2007 18:22

Hallo,

mit folgender Funktion möchte ich die Tabelle Debitor durchsuchen.

Abhängig vom eingegebenem Text (Input) wird sowohl das Feld "Name" als auch "Name 2" durchsucht und ggf. markiert.

Dann wird die Form 22 geöffnet und es werden mit Hilfe von Markedonly nur die markierten Datensätze angezeigt.

Code:
WITH Debitor DO BEGIN
   RESET;
   SETCURRENTKEY(Name,"Name 2",Ort);
   IF FIND('-') THEN BEGIN
      REPEAT
         MARK := (STRPOS(Name, UPPERCASE(Input)) <> 0) OR (STRPOS("Name 2", UPPERCASE(Input)) <> 0);
      UNTIL NEXT = 0;
   END;
   MARKEDONLY := TRUE;
   IF FIND('-') THEN BEGIN
      IF FORM.RUNMODAL(22,Debitor) = ACTION::LookupOK THEN
         Nr := Debitor."Nr."
      ELSE
         Nr := '';
   END;
END;

Theoretisch läuft´s, aber leider nur sehr langsam. Lasse ich Markedonly weg, ist die Form auch wieder gewohnt schnell, sie zeigt dann natürlich halt alle Datensätze, die markierten und die nicht markierten.
Also kann es nur an der Zeile Markedonly liegen.

Hat jemand einen Tip, wie ich meine Idee umsetzen kann? Sprich nur die markierten Datesätze schneller anzeigen lassen kann?

Eine Alternative hab ich auch probiert:

Ich habe die gefunden Datensätze temporär gespeichert und dann die Temp.Tabelle anzeigen lassen.

Damit hab ich keine Geschwindigkeitsprobleme, aber ich kann leider auch später nicht alle Datensätze anzeigen lassen und ggf. neue Filter setzten, indem ich den Filter auflöse. Ist auch logisch, denn die Temp.Tabelle hat ja auch nicht alle Datensätze der Debitortabelle.

Also beide Varianten haben entscheidene Nachteile, die ich alleine scheinbar nicht lösen kann. Optimal wäre die Lösung mit Markedonly.

Danke im Voraus für eure Hilfe.
Zuletzt geändert von Dune am 12. April 2007 08:32, insgesamt 1-mal geändert.

11. April 2007 18:40

Läuft das Ganze unter SQL Server? Die Verwendung von MARK ist hier extrem problematisch, da hier Abfragen generiert werden, die meistens zu Clustered Index Scans - Tabellen Scans - führen, die äußerst langwierig sind ...
Falls die Client-Version >= 4.00 ist, dann kann man den Schaden begrenzen, indem statt des FIND('-') ein FINDSET verwendet wird.

Und: Wieviele Datensätze sind denn in der Kunden-Tabelle? Ist es 'ne Option, alle DS in die temporäre Tabelle zu laden, also die ganze Tabelle client-seitig abzulegen?

11. April 2007 19:32

Bei MARKEDONLY sollte immer der Primärkey verwendet werden, dann ist es wesentlich schneller.

12. April 2007 08:32

Guten Morgen,

danke für eure Hilfe. Besonderen Dank an Stryk, die Idee, alle Ds in die temp. Tabelle hätte ich auch selber haben können.

Ich mach jetzt einfach beides: erst schreibe ich alle Ds in die temp. Tabelle und dann setzte ich meinen Mark auf die temp. Tabelle.
Und schon läuft´s klasse!

Danke noch mal und bis dann.