![]() |
Datenbank: dbf • Zugriff über: bde
Filter oder SQL?
Hi folks,
ich möchte mit Hilfe von Daten aus einer Tabelle mehrere Panels mit Buttons kreiern. Nun müssten die Daten aber vorher gefiltert werden. D.h. aus der Spalte "Gruppe" werden die Panels bestückt. Was ist nun effizienter, vorher jeweils einen Filter auf die Tabelle setzen und dann für die entprechende Gruppe Buttons erstellen, dann die nächste Gruppe usw? Oder per SQL das ganze aus einem query? Grüße |
Re: Filter oder SQL?
so ganz verstehe ich die frage nicht,
sollen jeweils alle "Gruppen" (btw genauer erläutern ;) ) nacheinander erstellt werden, oder eine Gruppe bei Bedarf? |
Re: Filter oder SQL?
Wenn du einen Index darauf hast und es sich nicht um einen SQL Server handelt wo deinen Daten herkommen ist das Beste ein Range zu setzen. Wenn kein Index Drauf ist must du filtern.
Wenn es sich dabei um eine SQL Datenbank handelt solltest du immer über SQLs Filtern evtl. mit Parmeter-SQLs um es zu beschleunigen. |
Re: Filter oder SQL?
Danke Leute,
zur Erläuterung: In der dbf-tabelle stehen mehrere einträge die zu bestimmten Gruppen gehören. zB Gruppe1=12 Datensätze usw. Nun sind 5 Panels mit Buttons zu besetzen. Panel1 mit Buttons die in Spalte "Gruppe" Panel1 zu stehen haben. usw |
Re: Filter oder SQL?
Da es sich um DBF handelt, läuft das Ganze eh lokal. Es sollte somit keine Rolle spielen.
Zitat:
Wenn du 100 mal filtern willst, jagdst du 100 mal eine Anfrage zum DB Server. Je nach Abfrage, kann das unter Umständen einiges an Zeit nehmen. Es kann sich anbieten, alle 100 Abfragen in einer zu vereinen, also anstatt
SQL-Code:
dann lieber
select bla from Tabelle where kriterium = 1
SQL-Code:
Letztere Abfrage sollte wesentlich schneller sein als 5 mal hintereinander die erste.
select bla from Tabelle where kriterium in (1,2,3,4,5)
Filtern kannst du dann schön lokal auf die Spalte Kriterium. |
Re: Filter oder SQL?
Danke Jelly,
dann müsste das so aussehen,dass ich so vorgehen muss: filter setzen, schleife für buttons,filter deaktivieren usw. |
Re: Filter oder SQL?
Liebe Gemeinde,
wie funktioniert das mit dem Filter? Wird der Filter nun auf Spaltennamen gesetzt oder auf Begriffe die in der Tabelle stehen? Wenn sql, dann wird wie vorgegangen? Werden die Ergebnisse erst in query (Stringlist) gepackt? Bitte helft mir mal dabei! |
Re: Filter oder SQL?
Hallo,
Filter wird auf Eintrag gesetzt, es war hier gerade nen TThread dazu, Bsp. Filter:= 'name=''Test''' Zu SQL. Ich würde unter dbf nicht sql nehmen, es wird intern immer in umgebaut in TTable-Befehle. Von Pdx weiss ich (bei grossen Datenmengen) TTable schnell TQuery langsam Wenn du nur kleine Datenmengen hast, könntest du sogar alle Daten "laden"
Delphi-Quellcode:
Du ersparst dir einen Hauf SetRange
Table.First;
while not Table.EOF do begin // hier Gruppe auslesen // prüfen ob schon da und wenn nicht in ein TStringList Table.Text; end; Im Zweifelsfall mit ne grosse DB nehmen und ausprobieren. Solltest du vorhaben, dass ganze mal auf nen richtigen SQL-Server zu packen, dann heisst es nat. - zuerst sql probieren (group b<) - wenn zu langsam -> TTable Heiko |
Re: Filter oder SQL?
Danke hoika,
was bedeutet: Zitat:
oder nicht? konkret:
Delphi-Quellcode:
sieht es so aus. matenz ist ein count aus einem
for i := 0 to matenz -1 do
begin labeltag:=t1.Fields[2].Value; Spalte := i mod 6; Zeile := i div 6; aLabel:=TXiButton.Create(Self); aLabel.Parent:=hot; aLabel.Visible:=True; aLabel.Left:=Spalte*82; aLabel.Top:=Zeile*35; alabel.Width:=80; alabel.Height:=33; aLabel.ColorScheme:=csSky; aLabel.Caption:=labeltag; aLabel.Tag:=t1.fields[0].value; aLabel.OnClick:=p1_1Click; t1.Next; end; inifile. So läuft es bis jetzt. t1.fields sind daten aus der gleichen Tabelle wo auch die gruppen. field[0] steht ein Integer, field[2] ein string für den Buttoncaption. Soviel zur Erklärung für obigen quellt. Es werden also alle in dem inifile stehenden ausgelesen und Button erstellt. Jetzt soll das umgebaut werden auf mehrere Buttonfelder(Panels) und entsprechend zugeordnet werden. Grüße |
Re: Filter oder SQL?
:shock:
Arbeitest du jetzt mit INI Files oder einer Datenbank? |
Re: Filter oder SQL?
Hi Jelly,
na bisher ini jetzt WILL ich ja auf db umbasteln. |
Re: Filter oder SQL?
Zwei Sachen:
1. Ersetze deine For-Schleife durch ein
Delphi-Quellcode:
2. Nutze nach Möglichkeit anstatt Field[0] stattdessen die Spaltennamen, denn dann weisst du auch noch in 2 Wochen was gemeint ist. Dafür gibt es die Funktion FieldByName bei allen TDataset Abkömmlingen, also auch bei deiner TTable.
while not table.eof do begin
// .. Mach was table.Next ; end ; |
Re: Filter oder SQL?
Zitat:
|
Re: Filter oder SQL?
[quote="Bernhard Geyer"]
Zitat:
Für kleine DBF-Tabellen reicht z.B. ![]() Ich hab auch mit ADO und Text-Dateien gute Erfahrungen gemacht. |
Re: Filter oder SQL?
Oder man setzt gleich auf eine besseres DBMS
|
Re: Filter oder SQL?
Danke Leute,
kann man für ADO zB auch Tools wie die Datenbankoberfläche von Delphi nutzen um Tabellen zu erstellen? Funktioniert das Prinzip im ADO gleich wie unter BDE? Konnektiert ADO auch zu dbf, oder muss man eine andere Tabellenart benutzen? Grüße |
Re: Filter oder SQL?
Zitat:
Zitat:
Zitat:
|
Re: Filter oder SQL?
Und Access am Besten auch gleich.
|
Re: Filter oder SQL?
Hallo,
bis jetzt (fast) alles richtig. Access zu benutzen ist OK, wenn nicht Access als DB benutzt wird. Klingt komisch, aber is so ... Es gibt "Access Project", dabei wird Access als Oberfläche benutzt, die DB ist der MS-SQL. Vorteil: Die Assistenten funktionieren alle, Der Ausdruck kann schön konfiguriert werden. Nachteil: VBA, Access Basic. Für kleine Dinge, di nur zusammengeklickt werden sollen, kann man das benutzen. Heiko |
Re: Filter oder SQL?
Zitat:
Kann aber auch an den SW-Entwicklern dieses Systems liegen. Ein Wechsel zu einem anderem System ist aber auch Aufwändig und es müsste erst das richtige gefunden werden. Aber das wichtigst wird sein: Ich denke in 5-10 Jahren wird Access das gleiche Schicksal wie Foxpro treffen: Es wird eingestellt werden. Wieso sollte sich MS 2 DB's leisten? Und da der Weg von Access ist die .NET-Welt auch viele Anpassungen nötig machen würde wird man es irgendwann sterben lassen. |
Re: Filter oder SQL?
Noch ein Nachteil: langsam. Im Mehrbenutzerbetrieb recht fehleranfällig. Und da er in Delphi arbeitet auch überflüssig.
|
Re: Filter oder SQL?
Zitat:
![]() ![]() Martin |
Re: Filter oder SQL?
Zitat:
|
Re: Filter oder SQL?
Zitat:
Für lokale Datenbank Anwendungen ist Sqlite3 eine super Sache und der Umstieg auf MSEide+MSEgui lohnt sich alleweil. :-) |
Re: Filter oder SQL?
danke Leute, alles sehr interessant.
Wie funktioniert das mit ADO? gibts da n Tut? Ich hab mir die OH von ADO angesehen und kein ansatz gefunden wie man vorgeht. Kann ich die Datasource die sich schon im Prjekt befinden verwenden oder muss alles neu gemacht werden? Ich will jetzt wenigstens diese kleine Projekt zu Ende bringen dann werd ich mich eingehend mit den neuen Möglichkeiten beschäftigen. Eine Frage noch, die Alias-Geschichte wird die nur unter BDE genutzt? |
Re: Filter oder SQL?
|
Re: Filter oder SQL?
Unter ADO brauchst du keine Alias mehr. Über eine TADOConnection (ist das so, oder ist es eine TADODatabase... hab grad kein Delphi zur Hand) legst du alle Parameter zur Datenbankanbindung in der Eigenschaft ConnectionString fest. Dieser unterscheidet sich zwar je nachdem welche DB benutzt wird, ist aber dafür nur an einer Stelle zu definieren. Im ConnectionString sind zumeist auch Username und Passwort mit übergeben. Willst du die nicht direkt hardcodieren, musst du nur zur Laufzeit die deinen entsprechenden ConnectionString zusammenbauen.
Anschliessend ein Connect(), und du hast deine Datenbankverbindung. Jetzt kannst du, ganz analog zur BDE, die Komponenten TADOQuery und co. nutzen, um deine Befehle an die DB zu schicken. Eine Datasource kannst du an alles binden, was irgendwie TDataset kompatibel ist, also natürlich auch an eine TADOQuery. |
Re: Filter oder SQL?
Das werd ich mal an einem Beispiel ausprobieren.
aber zu meinem eigentlichen Problem:
Delphi-Quellcode:
Ich hab testhalber den Filter deaktiviert,
//t1.Filter:='GRUPPE='+QuotedStr('Hotstuff');
//t1.Filtered:=True; t1.First; while not t1.eof do begin Spalte := i mod 6; Zeile := i div 6; aLabel:=TXiButton.Create(Self); aLabel.Parent:=hot; aLabel.Visible:=True; aLabel.Left:=Spalte*82; aLabel.Top:=Zeile*35; alabel.Width:=80; alabel.Height:=33; aLabel.ColorScheme:=csNeoSky; aLabel.Caption:=t1.fieldbyname('kurz').AsString; aLabel.Tag:=t1.FieldByName('artnr').AsInteger; aLabel.OnClick:=p1_1Click; t1.Next; end; //t1.Filtered:=False; ich bekomme nur den letzten Datensatz, dabei wird doch erst auf First gesetzt und jeweils Next in der Schleife, WARUM?? |
Re: Filter oder SQL?
Die Labels werden bestimmt alle erzeugt, liegen aber übereinander.
Zitat:
|
Re: Filter oder SQL?
Verdammt, stimmt!
Bisher hab ich ja mit for i:=0 ... die schleife gemacht. Und nun :gruebel: |
Re: Filter oder SQL?
Ganz einfach: vor die Schleife ein
Delphi-Quellcode:
und als letzte Anweisung innerhalb der Schleife dann
i := 0;
Delphi-Quellcode:
inc(i);
|
Re: Filter oder SQL?
setzt am Anfabg i auf null und in der Schleife inc(i)
lol, DeddyH war schneller ;) |
Re: Filter oder SQL?
Habs, danke!
|
Re: Filter oder SQL?
Ich weiss das gehört hier jetzt nicht her,
aber für Euch doch n Klcks :-) der button kann ein ColorScheme bekommen. Wenn jetzt aus einem Tablefield ein String kommt, wie muss der String konvertiert werden um als ColorScheme akzeptiert zu werden? |
Re: Filter oder SQL?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz