AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Eingabe in Edit langsam nach suche in Netzwerk Datenbank
Thema durchsuchen
Ansicht
Themen-Optionen

Eingabe in Edit langsam nach suche in Netzwerk Datenbank

Ein Thema von GoTo0815 · begonnen am 8. Nov 2006 · letzter Beitrag vom 10. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#1

Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 8. Nov 2006, 17:18
Datenbank: Paradox • Version: 7 • Zugriff über: Query
Hallo,

1. Ich habe auf einem Formular 14 Editfelder für verschiedene Suchkriterien.
1 Query
1 Datasource
1 DBGrid
2. In der Create von diesem Formular setze ich folgendes:
Delphi-Quellcode:
session.PrivateDir := Label23.Caption;
           session.NetFileDir := Memo6.Lines[0];
3. Im OnKeyPress Ereigniss dieser Editfelder steht folgendes:

Delphi-Quellcode:
procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
var pruefEingabe: integer;
    s: string;
begin

    pruefEingabe:=ord(key);
    if (pruefEingabe=13) or (Sender = DBEdit20) then //Enter-Taste gedrückt??
    begin
      FindSQL(sender); // Hier wird der SQL String zusammengesetzt
     with Query_Suchen do
     begin
      active := false;
      sql.clear;
      sql.add(sqlmerker);
      ParamCheck := true;
      if Edit5.Text <>'then
      begin
        s := '%'+ Edit5.Text + '%';
        ParamByName ('retnr').AsString := s;
      end;
      if Edit6.Text <>'then
      begin
        s := '%'+Edit6.Text + '%';
        ParamByName ('lieferant').AsString := s;
      end;
      if Edit7.Text <>'then
      begin
        s := '%'+Edit7.Text + '%';
        ParamByName ('kunde').AsString := s;
      end;
      if Edit8.Text <>'then
      begin
        s := '%'+Edit8.Text + '%';
        ParamByName ('artikel').AsString := s;
      end;
      if Edit9.Text <>'then
      begin
        s := '%'+Edit9.Text + '%';
        ParamByName ('artikelnr').AsString := s;
      end;
      if Edit10.Text <>'then
      begin
        s := '%'+Edit10.Text + '%';
        ParamByName ('fehler').AsString := s;
      end;
      if Edit11.Text <>'then
      begin
        s := '%'+Edit11.Text + '%';
        ParamByName ('fehlernr').AsString := s;
      end;
      if Edit12.Text <>'then
      begin
        s := '%'+Edit12.Text + '%';
        ParamByName ('status').AsString := s;
      end;
      if Edit13.Text <>'then
      begin
        if (Edit13.Text = 'True') or (Edit13.Text = 'true') or (Edit13.Text = 'ja') or (Edit13.Text = 'Ja') then ParamByName ('getauscht').AsBoolean := True;
        if (Edit13.Text = 'False') or (Edit13.Text = 'false') or (Edit13.Text = 'nein') or (Edit13.Text = 'Nein') then ParamByName ('getauscht').AsBoolean := False;
      end;
      if Edit14.Text <>'then
      begin
        ParamByName ('datum').AsDate := StrToDate(Edit14.Text);
      end;
      if Edit15.Text <>'then
      begin
        ParamByName ('datum').AsDate := StrToDate(Edit15.Text);
      end;
      if Edit16.Text <>'then
      begin
        s := '%'+Edit16.Text + '%';
        ParamByName ('RMANr').AsString := s;
      end;
      if Edit17.Text <>'then
      begin
        s := '%'+Edit17.Text + '%';
        ParamByName ('seriennr').AsString := s;
      end;
      if Edit18.Text <>'then
      begin
        ParamByName ('datum').AsDate := StrToDate(Edit18.Text);
      end;
      active := true;
      open;
     end;
    end;
  end;

Nun mein Problem:

Diese Routine lief immer sauber ohne Probleme. Als ich die Anwendung nun auf Netzwerkbetrieb umstellte passierte es, dass die Suchfunktion nach Eingabe der Werte zwar immer noch einwandfrei und schnell läuft, allerdings nach Präsentation dere Suchergebnisse in der DBGrid, kann man erneute Eingaben in den Editfeldern nur noch extrem stark verzögert eingeben. (Also die Buchstaben kommen erst 1-2 Sekunden nach dem Drücken der Tasten). Wenn ich dann die Suchkriterien wieder alle lösche und die Datenbank erneut ohne Suchkriterien öffne, dann läuft alles wieder einwandfrei und man kann erneut suchen.

Ich vermute also, dass nach der Lieferung des Ergebnisses irgendetwas freigegeben werden muss, ich weiß aber nicht was.

Für Eure Hilfe bedanke ich mich im Voraus.

Gruß

Hendrik
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
Benutzerbild von h0ppsen
h0ppsen

Registriert seit: 23. Okt 2006
2 Beiträge
 
#2

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 8. Nov 2006, 18:09
Wenn ich mich nicht irre (und ich irre mich gerne mal) ist das Problem, dass dein "Query_Suchen" mit open die Datenmenge öffnet. Bau mal in dein Programm ein, dass die Datenmenge des Query's mit close wieder geschlossen wird.
_
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 8. Nov 2006, 20:02
Hallo Hendrik,

der Code in deinem event handler für OnKeyPress() ist sehr umfangreich und zeitaufwendig. Kannst du dir vorstellen was passiert, wenn du schneller tippst als der Code abgearbeitet werden kann?

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 8. Nov 2006, 20:41
Hallo,

wie sieht denn der SQL-Text aus.
Sieht ja aus wie LIKE.
Dann wird die gesamte Tabelle (oder noch mehr) übers Netz gesaugt).
Du hast halt die falsche DB.
Wenn du nicht wechseln willst,
solltest du auf TTable umstellen,
einen der Felder mit SetKey (SetRange) suchen,
den Rest lokale filtern und ein normales Stringgrid benutzten
-> also DB wechseln

Mach mal nen traffic check mit
http://delphi.about.com/od/fullcodep.../aa112903a.htm


Heiko
Heiko
  Mit Zitat antworten Zitat
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 15:10
Hallo @ all,


@hoppsen: Wo sollte ich denn ein Close einbauen? Dann zeigt mein Grid doch nichts mehr an, oder?

@marabu: Ich verstehe Deinen Einwand, allerdings wird die Routine ja immer durchlaufen, ob nun der SQL Text = Select * From DATABASE lautet oder der SQL TEXT wesentlich länger ist.
Die Verlangsamung der Eingabe geschieht erst dann, wenn eine Abfrage mit Where gemacht wurde. Was doch eigentlich mit meiner ONKEYPRESS Routine nichts zu tun hat, da die ja nur dann etwas ausführt, wenn Enter gedrückt wurde.

@hoika:
Delphi-Quellcode:
procedure TForm1.FindSQL(Sender: TObject);
var setzmerker :boolean;
begin
 setzmerker:= False;
 sqlmerker := 'SELECT * FROM retouren ';
 if Edit5.Text <>'then
  begin
    Sqlmerker := sqlmerker + 'WHERE (Retourennummer LIKE :retnr) ';
    setzmerker := True;
  end;
 if Edit6.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER(Lieferant) LIKE UPPER (:lieferant) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER(Lieferant) LIKE UPPER (:lieferant) ';
      setzmerker := True;
    end;
  end;
  if Edit7.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER (Kunde) LIKE UPPER (:kunde) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER (Kunde) LIKE UPPER (:kunde) ';
      setzmerker := True;
    end;
  end;
  if Edit8.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER(Artikelbezeichnung) LIKE UPPER (:artikel) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER (Artikelbezeichnung) LIKE UPPER(:artikel) ';
      setzmerker := True;
    end;
  end;
  if Edit9.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Artikelnummer LIKE :artikelnr) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Artikelnummer LIKE :artikelnr) ';
      setzmerker := True;
    end;
  end;
  if Edit10.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER (Fehlerbeschreibung) LIKE UPPER (:fehler) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER (Fehlerbeschreibung) LIKE UPPER (:fehler) ';
      setzmerker := True;
    end;
  end;
  if Edit11.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Fehlernummer LIKE :fehlernr) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Fehlernummer LIKE :fehlernr) ';
      setzmerker := True;
    end;
  end;
  if Edit12.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Status LIKE :status) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Status LIKE :status) ';
      setzmerker := True;
    end;
  end;
  if (Edit13.Text = 'True') or (Edit13.Text = 'true') or (Edit13.Text = 'ja') or (Edit13.Text = 'Ja')
      or (Edit13.Text = 'False') or (Edit13.Text = 'false') or (Edit13.Text = 'nein') or (Edit13.Text = 'Nein') then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Getauscht = :getauscht) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Getauscht = :getauscht) ';
      setzmerker := True;
    end;
  end;
  if Edit14.Text <>'then
  begin
    Edit15.Text :='';
    Edit18.Text :='';
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Datum <= :datum) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Datum <= :datum) ';
      setzmerker := True;
    end;
  end;
  if Edit15.Text <>'then
  begin
    Edit18.Text := '';
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Datum >= :datum) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Datum >= :datum) ';
      setzmerker := True;
    end;
  end;
  if Edit16.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER (RMANummer) LIKE UPPER (:RMANr) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER (RMANummer) LIKE UPPER (:RMANr) ';
      setzmerker := True;
    end;
  end;
  if Edit17.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND UPPER (Seriennummer) LIKE UPPER (:seriennr) else
    begin
      sqlmerker := sqlmerker + 'WHERE UPPER(Seriennummer) LIKE UPPER (:seriennr) ';
      setzmerker := True;
    end;
  end;
  if Edit18.Text <>'then
  begin
    if setzmerker then Sqlmerker := sqlmerker + 'AND (Datum = :datum) else
    begin
      sqlmerker := sqlmerker + 'WHERE (Datum = :datum) ';
      setzmerker := True;
    end;
  end;
end;

Der Fehler tritt aber bereits nach einer einzigen Eingabe in ein Editfeld (nach dem ENTER) auf.
Dann lautet der SQL TEXT nur:
Select * From retouren WHERE UPPER (Kunde) LIKE UPPER (:kunde)

Drücke ich dann auf einen Button der mir wieder die SQL = 'Select * From retouren ' setzt, dann geht auch die Eingabe wieder schnell.

Meiner Meinung läuft da etwas im Hintergrund was durch die eingeschränkte Suche ausgelöst wird.
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 15:27
Also,
ich setz jetzt mal nen Breakpoint
und das suchen wird immer aufgerufen ....

or (Sender = DBEdit20)

Was soll das DBEdit20 ??
schlecht, wenn das DBEdit beim Füllen das Füllen noch mal aufruft.

Ausserdem,

warum schreibst du direkt in die KeyPress ein ?

procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);


Ich würde mal ein MessageBeep(0) einbauen,
was bei jedem Select * from aufgerufen wird


Ünrigens:
Die Tatsache, dass es lokal schnell lief, hat damit zu tun,
das die BDE eine Menge lokal cacht,
im Netz geht das dann nicht mehr.

Wass passiert eigentlich,
wenn du das ganze Zusammenstöpseln der Query
mal weglässt, und z.B. ein einfaches
select * from retouren where upper kunden dingens
erzeugst und statt dem select * from aufrufst ?


Heiko
Heiko
  Mit Zitat antworten Zitat
GoTo0815

Registriert seit: 18. Mai 2004
148 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 18:13
Also am DBEDIT20 kann es nicht liegen, da die Routine nur aufgerufen wird im OnExit des DBEDIT20 welches nichts mit der Datasource zu dieser Query zu tun hat.

Aber mit dem MessageBeep hast Du mich etwas weiter gebracht.

Es piept nämlich zweimal statt einmal. (Liegt aber nicht an dem 'or Sender = DBEDIT20')
Falls ich mal ein "DANKE" vergesse, hier schon mal eins im Voraus: Danke für Eure Zeit!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 19:18
Hallo,

und warum setzt du keinen Breakpoint und debuggst das mal ?
Was macht die Netzbelstung (traffic monitor) ?


Heiko
Heiko
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 19:43
Zitat von HendrikSturm:
Diese Routine lief immer sauber ohne Probleme. Als ich die Anwendung nun auf Netzwerkbetrieb umstellte passierte es, dass die Suchfunktion nach Eingabe der Werte zwar immer noch einwandfrei und schnell läuft, allerdings nach Präsentation dere Suchergebnisse in der DBGrid, kann man erneute Eingaben in den Editfeldern nur noch extrem stark verzögert eingeben.
Das ist leicht zu erklären:
Ist die Paradox-Tabelle lokal auf deinem Rechner ist die Zugriffsgeschwindigkeit
um Faktor 10 bis 100 höher, als wenn die Datei auf einem Netzlaufwerk liegt.
Bei einer lokalen Datei kann Windows seinen Datei-Cache ausspielen; im Netzwerk geht das nicht oder nur sehr begrenzt.
Wenn die (sehr langsame, da Wildcards enthaltende) Where-Bedingung zum Zuge kommt, muss die BDE ständig ALLE Daten auf den Client ziehen und zwar bei jedem Tastendruck.
Die Idee, bei jedem Tastendruck sofort einen neuen Filter zu setzen ist so einfach nicht mehr machbar!!
Der Benutzer soll halt alle Filterkriterien eingeben und muss dann auf einen Knopf drücken.
Du könntest auch bei jeden Tastendruck einen Timer mit 0,8 Sekunden starten;
falls der Timer abläuft, wird der neue Filter gesetzt
falls der Benutzer vor 0,8 Sekunden eine neue Taste drückt, wird der Timer gestoppt und neu gestartet.
Andreas
  Mit Zitat antworten Zitat
hendrikmobil

Registriert seit: 9. Nov 2006
1 Beiträge
 
#10

Re: Eingabe in Edit langsam nach suche in Netzwerk Datenbank

  Alt 9. Nov 2006, 23:06
Also, ich kann das vorher gesagte nicht ganz nachvollziehen, da die erste Suchfunktion ja schnell genug funktioniert.
Also hat das nichts mit der Datenmenge im Netzwerk zu tun.

Die Suchfunktion wird ja erst beim <ENTER> drücken gestartet. Ob nun per button oder <ENTER> ist doch ziemlich egal oder?

Ich habe durch den Einbau des MessageBeep festgestellt, dass wenn ich etwas in einen TEDIT eintrage und danach die SQL erstellt wird und dann die Datenmenge geöffnet wird. Das OnKeyPress Ereignis 2x aufgerufen wird, wärend es beim <ENTER> drücken ohne Inhalt in den TEDITS nur einmal aufgerufen wird.

Ich denke, dass dort der Hund begraben liegt, weiß aber noch nicht genau wo.

Gruß

Hendrik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 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