Autor Beitrag
Bernd
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 20.02.03 18:49 
Hallo alle Miteinander,
mein erstes Posting in diesem Forum.
Wenn ich in Delphi 2.01 (bitte nicht lachen) in einer SQL-Abfrage einen Parameter habe der aus einer Datasource ermittelt wird

Beispiel:
ausblenden Quelltext
1:
2:
3:
Select *
From Kunden
Where Name >= :NameAusTable1

dann wird das Ergebnis recht zügig in einem DbGrid angezeigt sobald ein anderer Datensatz in Table1 gewählt wird.

Möchte ich nun eine Abfrage generieren ohne eine Datensource

Beispiel:
ausblenden Quelltext
1:
2:
3:
Select *
From Kunden
Where Name >= :SuchName

den Parameter also über Query1.ParamByName('SuchName').AsString := 'Irgendwas' setze, bleibt mir nichts anderes übrig als das Query zu schliessen und neu zu öffnen. Dies dauert mir einfach zu lange. In "DBTables.pas" finde ich leider nicht (mittlerweile habe ich wohl ein Brett vor dem Kopf) wie Borland es schafft das Query wenn es mit einer DataSource verbunden so schnell zu aktualisieren.

Enable- und DisableControls bzw. Prepare führen leider nicht zum erfolg.

Falls jemand weiss wie ich die gleiche Geschwindigkeit wie mit einer DataSource hinbekomme wäre ich für einen Hinweis sehr dankbar.

Vielen Dank im voraus
Bernd

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Fr 21.02.03 08:54 
Hi,

erst mal ein willkommen!

Den Geschwindigkeitsvorteil mit einem DataSource kann ich mir nur so vorstellen, dass das DS nur soviele Datensätze anfordert, wie aktuell benötigt werden, so dass dort eine Menge an Übertragungsvolumen eingespart wird. Kommt aber auch immer auf die verwendete Datenbank an (SQL-Server/Desktop-DB).

Noch ein Tipp: Für ca. 25 EUR bekommst Du in fast jedem Buchladen das Buch "Delphi für Kids" incl. einer Vollversion von Delphi 3 Prof (d.h. auch updateberechtigt!)

Grüße
Lemmy
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Fr 21.02.03 09:31 
jup, herzlich willkommen... 8)

Zitat:
Den Geschwindigkeitsvorteil mit einem DataSource kann ich mir nur so vorstellen, dass das DS nur soviele Datensätze anfordert, wie aktuell benötigt werden, so dass dort eine Menge an Übertragungsvolumen eingespart wird. Kommt aber auch immer auf die verwendete Datenbank an (SQL-Server/Desktop-DB).


ich glaub aber, das beantwortet die frage auch nicht wirklich, denn in seinem 2. beispiel macht er doch auch nix anderes, als die DB zu filtern, ergo wird ihm ja auch keine größere Ergebnissmenge zurück-geliefert als beim ersten... denk ich mal.

Aber was ich mich frage: Kann ich rein technisch gesehen überhaupt ohne DataSource-Komponente arbeiten? Und wieso versuchst du ohne DataSource zu arbeiten?

Konnt dir jetzt warscheinlich auch nicht viel weiterhelfen, aber vielleicht weiß jemand anders die Lösung...

mfg
KiwiChT
Bernd Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 22.02.03 22:13 
Hallo Lemmy Hallo KiwiChT,
vorab vielen Dank das Ihr euch über mein Problem Gedanken gemacht habt. Lemmy, alleine der Tip mit dem upgrade fähigen Delphi 3 war es schon wert dieses Forum zu besuchen.
Zur erklärung novhmal ein Wort zu der DatenSource: Bitte nicht verwechseln mit der DataSource die an das Query gebunden wird. In der Query-Komponente kann man eine DataSource wählen aus der Delphi die dynamischen Werte der für die Parameter holt die in SQL angegeben werden.
In meinem ersten Beispiel kommt der Wert für "NameAusTable1" aus einer Table in dem ein Feld "NameAusTable1" vorhanden sein muss. Wird ein anderer datensatz in der Table gewählt und der Wert des Feldes "NameAusTable1" ändert sich, wird auch gleichzeitig der Parameter wert in der SQL-Abfrage geändert und die SQL-Abfrage neu (und recht schnell) ausgeführt. Damit könnte ich leben.
Im zweiten Beispiel kann ich die Abfrage nur neu ausführen indem ich das Query schliessen, den Parameter ändere und dann das Query neu öffne. Genau das dauert mir einfach zu lange. Es muss aber einen anderen weg geben denn Borland schafft es ja mit der Datensource.
Ich lönnte natürlich einen Workaround über eine Dummy-Table machen aber der wäre nicht elegant und später für die Wartung der Software auch nicht so einfach nach zu vollziehen.
Vielleicht hat ja jemand schon mal diese Problem gelöst.
Nochmals vielen dank und ein schönes Wochenende und
viele grüsse
Bernd
olliterski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Sa 22.02.03 23:34 
Hi Bernd,

etwas konfus zu lesen was Du eigentlich willst, aber ich fang mal von vorne an:

DatenSource: Was immer Du auch darunter verstehst - ich denke mal Datenbank!
DataSource: Container der die Ergebnismenge einer Abfrage auf der Datenbank enthält. d.h.die abgefragten Daten liegen bereits im Speicher deines Rechners und werden nicht wie vermutet nach bedarf von der Datenbank angefordert!

Table: Ergebnissmenge einer Tabelle der Datenbank (->Select * from 'Tabelle'); meist mit dem nachteil behaftet, das bis zum Ende der Anwendung ein extraconnect zur Datenbank (z.B. Adaptive Server Enterprise 11.3 ff.) aufrecht erhalten wird und die angegebene Tabelle für alle anderen Anwenderzugriffe sperrt!

Query: Ergebnismenge einer Abfrage die über eine oder mehrere Tabellen geht (-> Select a.id, a.name,b.id,b.name from TabelleA, tabelleB where a.id = b.id); sperrt Tabellen nur für die Dauer der Abfrage und hat keinen Extraconnect.

Wenn Du jetzt Daten innerhalb der DataSource in Abhängigkeit von einer anderen Abfrage/Table anzeigen willst, würde ich normalerweise zu einer Query raten der du dein dyn. Wert übergibst und sie dann ausführst. Wenn Dir das zulange dauert, nimm deinen Wert und führe auf deine DataSource einen Filter aus!!!
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
   arg:string;
begin
   filtered:=false;  //beim zweiten mal ist der Filter noch aktiv und muß erst ausgeschaltet sein!
   arg:=<NameausTable1>;
   Filter:=arg;
   filtered:=true;
end;


Das nur als Beispiel! Da Du Delphi 2 oder jetzt ja die 3er Version benutzt und ich die 7er kann ich Dir nicht sagen ob alles wie es bei mir steht auch bei dir steht, aber der Weg sollte zumindest klar sein!

Viele Grüße

Oliver

_________________
Viele Grüße
Oliver
Bernd Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 24.02.03 12:17 
Hallo Oliver,

danke für Deine ausführliche Antwort. Du hast recht ich habe mich vermutlich das Problem nicht richtig geschildert. Hier nochmal ein Beispiel.

Beispiel Normfall Query1:

Select * From KundenDB
Where KdNr = :SuchKdNr

Abfrage:
Query1.Close;
ParamByName('SuchKdnr').AsInteger := 1234;
Query1.Open;


Beispiel Parameter aus DataSource:

Es existiert eine Table1 (zb. eine RechnungsTable) mit einem Feld "KundenNr".
Im Objektinspektor wird die Eigenschaft DataSource von QUERY1 auf die DataSource von Table1 gesetzt (in der das Feld "KundenNr" vorhanden sein muss).

Select * From KundenDB
Where KdNr = :KundenNr

Abfrage:
Das Query muss nur einmal geöffnet werden. Delphi holt sich den Parameter aus Table1.
Und immer wenn in Table1 (RechnungTable) ein anderer Datensatz gewählt wird, wird das Query sehr schnell von Delphi aktualisiert.
Der Vorteil gegenüber einem Filter ist das über die Where-Abfrage auch mit "Like %KundenNr%" ausgeführt werden kann, was mit einem Filter nicht zu realisieren ist (soweit ich weiss).


Hoffentlich habe ich diesmal mein Problem etwas genauer erklärt. Ich frage mich nämlich wie Borland es schafft die Aktualisierung so schnell, auch über mehrere tausend Datensätze, auszuführen, während der herkömmliche Weg „Close/Open“-Query immer mit einer entsprechenden Verzögerung ausgeführt was uU. bei einem DAU (Dümmster anzunehmender User) die Vermutung aufkommen lässt das Programm ist „abgestürzt“ wenn nicht sofort was passiert.

Viele Grüsse Bernd
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 24.02.03 12:29 
@Olliterski:

Eine TDatasource-Komponente ist nichts weiter als eine zusätzliche Schnittstelle. Es puffert keine Daten, das tut das TTable- oder TQuery-Objekt.

Cu,
Udontknow
olliterski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Mo 24.02.03 13:09 
Hi,

@udontknow
Oh, ein falscher Fehler!! Sorry!!!!

Ich hab mich da etwas geirrt! War keine Absicht hier mit falschen Infos aufzuwarten!

Ich globe Besserung! :lol:

Viele Grüße

Oliver

PS: Hoffe der Rest war wenigstens richtig!?!?!?!?!

_________________
Viele Grüße
Oliver
mars
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 238

Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
BeitragVerfasst: Mo 24.02.03 13:24 
olliterski hat folgendes geschrieben:

Oh, ein falscher Fehler!!


ein Pleonasmus der höchsten Form... :D