AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

Ein Thema von RSE · begonnen am 30. Nov 2011 · letzter Beitrag vom 1. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2   
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 10:44
Datenbank: InterBase • Version: 6.1 • Zugriff über: IBObjects
Hallo Leute,

wir arbeiten mit Delphi 5 und den IBObjects (TIBOQuery usw.). Gibt es die Möglichkeit, eine Query, ein Table oder irgendein anderes TDataSet so zu benutzen, dass es sich die Daten nicht aus der Datenbank, sondern aus einer anderen Query holt? Das Anwendungsszenario sieht folgendermaßen aus: Ich habe eine Tabelle, in der gesucht werden kann. Die Daten werden währenddessen in einem Tabellen-Control angezeigt. Nun möchte ich, dass sich bei jedem Tastenanschlag in einem Suchfeld die Anzeige weiter einschränkt. Ich kann also nicht jedes Mal eine neue DB-Anfrage machen, nur um eine Teilmenge der schon geholten Daten nochmals zu holen. Stattdessen möchte ich einfach die schon bekannten Daten nutzen und davon nur eine Teilmenge darstellen. Es handelt sich um größere Datenmengen (mehrere 10.000 Datensätze).

Ich weiß, dass das TClientDataSet dazu wie geschaffen ist. Dessen Einsatz steht aber außer Frage, da wir noch in Delphi 5 programmieren und hier die Nutzung nur erfolgen kann, wenn die midas.dll auf allen Clients installiert und registriert ist (Uses LibMidas ist erst ab D6 möglich) und das können wir nicht sicherstellen.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
jaevencooler

Registriert seit: 8. Sep 2005
Ort: Friedrichshafen
41 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 12:05
Moin, Moin,


Die Idee eine Query mit dem kompletten Datenbestand einmalig öffnen, und dann mit einer weiteren Query
darauf zu greifen wird nicht funktionieren !

Schon mal über die Verwendung eines Filters nachgedacht, oder eventuell mit Locate arbeiten ?

Die bessere Alternative für eine schnelle Suche innerhalb der Daten ist auf jeden Fall die
Daten gut und geschickt zu indizieren, und alle Möglichkeiten Deines Datenbankservers zu nutzen.

Was für eine RDBMS setzt Du denn ein ?
(Ups, wer lesen kann ....)


Beste Grüße
Michael
Michael
Wissen ist Macht, nichts wissen macht auch nichts.
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#3

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 12:38
Wenn ich bei jedem Tastenanschlag eine DB-Abfrage starten würde, dann wäre das einfach nur elendig langsam. Allein die Latenz durch das LAN ist doch schon zu langsam dafür - egal wie schnell der Server reagieren würde. Deshalb möchte ich die Einschränkung lokal berechnen, und zwar vorzugsweise nur für so viele Datensätze wie ich grad brauche (wie angezeigt werden).

Tastenanschlag -> Grid unter Berücksichtigung der neuen Bedingungen mit so vielen Datensätzen füllen, wie angezeigt werden

Das Ganze muss also in Sekundenbruchteilen (Hundertstel) passieren!
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 12:53
klingt so als ob Du Filter verwenden solltest ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 13:00
Ich denke, der Ansatz ist nicht optimal. Ein Tastenanschlag (bzw. Suchänderung) könnte ja auch bedeuten, dass aus dem Suchstring etwas gelöscht wurde. Dann kommst Du mit einer weiteren Subfilterung nicht mehr zurecht.
Du solltest versuchen, immer komplett neu zu selectieren/zu filtern und diesen Vorgang bestmöglich zu optimieren. Das wäre jedenfalls mein Ansatz.

Ich habe ein altes Projekt, bei dem ich anhand von Sucheingaben einen Datensatz lokalisiere. Das erfolgt bei jeder Suchtextänderung indem erst in einer Straßen-Tabelle nach einem passenden Straßenindex gesucht wird und dann in einer Grundstücks-Tabelle nach dem Straßenindex und der passenden Hausnummer. Durch die Trennung in zwei Tabellen und Index-Verwendung geht das sehr schnell.

Vielleicht kannst Du ja Deine DB noch optimieren?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (30. Nov 2011 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 13:03
klingt so als ob Du Filter verwenden solltest ....
IBO setzt Filter in ein Where um und schickt die Abfrage zuzm Server.
Dieses lokale Filtern geht wohl z.B. in FibPlus.

Tastenanschlag -> Grid unter Berücksichtigung der neuen Bedingungen mit so vielen Datensätzen füllen, wie angezeigt werden

Das Ganze muss also in Sekundenbruchteilen (Hundertstel) passieren!
Wenn du das schaffst, geb ich einen aus.
Ich weiß ja nicht, was du als "Tabellencontrol" benutzt.
Aber allein das Neu Laden der gefilterten Daten in der Grid dauert lange genug.

Aus gutem Grunde gibt es dieses Verhalten in diversen LookUp - Komponenten.
Aber ich würde nie auf die Idee kommen, eine Rechnung über ein LookUp zu suchen.
Für Anreden, Mengenneinheiten - eben kleinere Tabellen - ist das OK.

Aber wenn du es versuchen willst, dann benutze diverse MemDatasets.
Diese können meist per Assign Daten und Struktur eines TDataSet übernehmen.

Ich würde aber bei so vielen Daten immer Eingabe - Enter - Suchen bevorzugen.
Evtll. noch durch einen Timer, welcher nach ca. 1 Sekunde Pause automatisch filtert.

Frank
Frank Reim
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#7

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 13:22
Ich habe mich jetzt ein wenig zu TIBOQuery und Filtern belesen. In den IBO-FAQ steht folgendes:
Zitat:
The Locate() method for TIB_Query seems to work well. Is there a way to do a "LocateNext"?
You will find that this works rather nicely: instead of using the Locate() method, you can leave the Filtered property False and set a filter based on the value you are locating. Then, use the FindFirst, FindNext, FindLast, etc. methods to navigate through the records isolated by the locate (filter) criteria.
Ich denke ich werde dieses Verhalten benutzen. Ich fange dann bei jedem Tastenanschlag an zu filtern. Dabei werde ich Application.Processmessages einbauen und wenn zwischenzeitlich ein neuer Tastenanschlag aufgetreten ist, breche ich ab. Dann läuft die neu getriggerte Filterung an. So sollte das Ganze performant bleiben und trotzdem sofort Ergebnisse ausspucken.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#8

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 14:17
hat die Komponente eventuell ein onFilterRecord Ereignis?
In dem Ereignis kannst Du nach Deinen Kriterien Filtern.
Ich nutze es mit TMSQuery da funktioniert es super und blitz schnell
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 14:27
Wenn ich bei jedem Tastenanschlag eine DB-Abfrage starten würde, dann wäre das einfach nur elendig langsam.
Ich mache dies i.d.R. so:
  1. Ein Tastenanschlag zieht einen timer auf, der zB auf 100 ms eingestellt ist
    Delphi-Quellcode:
    timer1.enabled:=false;
    timer1.interval:=100;
    timer1.enabled:=true;
  2. im Timer-Event wird der Timer Disabled und die Daten geladen
    Delphi-Quellcode:
    timer1.enabled:=false;
    //Lade Daten
  3. Falls Du noch eine Einschränkung brauchst, weil zB Deine Komponenten immer komplett laden wollen, setze ein TOP 30 in das Statement
    SELECT TOP 30 * FROM mytable WHERE <Filter-Bedingung>
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#10

AW: Tabelle/Query, die ihre Daten aus einer anderen Query bezieht

  Alt 30. Nov 2011, 14:47
Falls Du noch eine Einschränkung brauchst, weil zB Deine Komponenten immer komplett laden wollen, setze ein TOP 30 in das Statement
SELECT TOP 30 * FROM mytable WHERE <Filter-Bedingung>
Ich glaube nicht, dass InterBase 6.1 das kann Zumindest unserer nicht.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:25 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