Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DataSet Filtern (https://www.delphipraxis.net/155154-dataset-filtern.html)

WizoHulk 11. Okt 2010 12:43

Datenbank: SQL • Version: 1 • Zugriff über: ibExpert

DataSet Filtern
 
Hi Leute,
wie kann ich ein DbGrid Filtern, das er mir nur noch das anzeigt was ich in ein Editfeld schreibe.
ich hab eine Datenbank worüber ich die Anweisung gebe

Delphi-Quellcode:
TForm1.Button1Click(Sender: TObject);
var
  LSql : String;
begin
  LSql := 'SELECT id, Beschreibung FROM technik WHERE beschreibung LIKE';
  LSql := LSql + #39 +'%' + Edit1.Text + '%' + #39;
  ibdTechnik.SelectSQL.Text := LSql;
  ibdTechnik.Open;
habe ich da jetzt noch was Vergessen?
ich habe das DBGrid mit dem DataSource verknüpft und den DataSource mit dem DataSet so wie DataBase und Transaction.
ich Hatte es auch mit dem...

Delphi-Quellcode:
ibdTechnik.Filtered := true;
  ibdTechnik.Active := true;
  ibdTechnik.Locate('Beschreibung','test',[loPartialKey,loCaseInsensitive]);
  ibdTechnik.Filtered := true;
...versucht.
aber da schleuderte der Compiler mir Error meldungen um die Ohren, das bei leere Datenmenge nicht abgefragt werden kann.

Ich hoffe ich hab nicht umsonst ein neuen Thread geöffnet.

schon mal Danke für eure Hilfe.

Sir Rufo 11. Okt 2010 12:47

AW: DataSet Filtern
 
Wieso Filtered auf true und dann auf true?

WizoHulk 11. Okt 2010 12:52

AW: DataSet Filtern
 
jaaaaaa, hab ich wohl über sehen, eigendtlich soll da false hin.

Bummi 11. Okt 2010 12:53

AW: DataSet Filtern
 
kann es sein daß Du #34 statt #39 nehmen mußt?

Sir Rufo 11. Okt 2010 12:55

AW: DataSet Filtern
 
Schau mal ob es bei der Query Komponente einen OnFilter Event gibt

Dort kannst du dann entscheiden, was und wie gefiltert werden soll

Wenn die Abfragemenge sehr groß ist, dann kann man es auch so programmieren, dass erst ab 3 Zeichen im Edit die Abfrage ausgeführt wird und danach arbeitet man mit dem Filter weiter.

Dadurch reduziert sich die übertragene Datenmenge und auch die Anzahl der Abfragen

DeddyH 11. Okt 2010 12:58

AW: DataSet Filtern
 
Und verwende SQL-Parameter, dann muss man sich auch um den Zeichencode (#34, #39 oder wie?) keine Gedanken mehr machen.

Sir Rufo 11. Okt 2010 13:04

AW: DataSet Filtern
 
Code:
Select id, bezeichnung from MeineTab where Bezeichnung like :BezLike
Delphi-Quellcode:
Qry.ParamByName[ 'BezLike' ] := '%' + Edit1.Text + '%';
Für das OnFilter Event brauchst du noch eine Like Funktion http://www.latiumsoftware.com/en/delphi/00018.php

Ersetze in der Funktion * mit % und ? mit _ dann wird es SQL Like

nachti1505 11. Okt 2010 13:32

AW: DataSet Filtern
 
Außerdem fehlt in deinem InitalSQL glaube ich ein Leerzeichen hinter dem "LIKE"!

WizoHulk 11. Okt 2010 15:09

AW: DataSet Filtern
 
Vielen vielen dank für die schnellen Antworten.

gibt es da noch andere Möglichkeiten, bin in sql und db noch nicht so bewandert.
Ich dachte wenn schon der sql code in IbExpert geht dann wird er ja in Delphi auch gehen.
denn dort spuckt er mir ja haarklein in halbtextsuche alles aus.

nachti1505 11. Okt 2010 20:07

AW: DataSet Filtern
 
Was hast du denn bis jetzt probiert?

shmia 12. Okt 2010 10:17

AW: DataSet Filtern
 
Zitat:

Zitat von WizoHulk (Beitrag 1055089)
Ich dachte wenn schon der sql code in IbExpert geht dann wird er ja in Delphi auch gehen.

Das funktioniert aber nur, wenn du die SQL-Anweisung richtig kopierst.
Wenn du nur den kleinsten Fehler machst (siehe Beitrag #8), dann kann das nicht klappen.

WizoHulk 12. Okt 2010 10:27

AW: DataSet Filtern
 
ich hab als erstes den DBGrid inhalt gelöscht.
dann habe ich wie du meintest, das hinter like noch ein Leerzeichen gesetzt.
Hat aber auch nichts geholfen.

Hab ein dataset genommen, ist das nicht genau das gleiche wie eine Querry?
Da in vielen beiträgen Querrys genommen werden.
Kann ich auch befehle an die Db schicken ohne einen String aus SQL anweisungen?

muss hinter...
Delphi-Quellcode:
....;
....;
dataSet1.SelectSQL.Text := LSql;
dataSet1.Open;
...noch was erfolgen?

Habe auch das...
Delphi-Quellcode:
DataSet1.FilterOption := foCaseInsensitive,foNoPartialCompare];
... gesetzt.

mit der function OnfilterEvent komm ich net klar.
Im Dataset gibt es nur onFilterRecord, hat das die gleiche Funktion?

mkinzler 12. Okt 2010 10:31

AW: DataSet Filtern
 
Um was für ein DataSet handelt es sich?

nachti1505 12. Okt 2010 10:40

AW: DataSet Filtern
 
Ich habe irgendwie das Gefühl, das du ganz doll doppelt filterst... es existieren zwei Möglichkeiten der Filterung für dein Problem.

a) Über die DB -> SQLText verändern -> DataSet neu anfordern -> es werden gefilterte Daten übertragen
b) Über das Dataset -> DS öffnen -> es werden alle Daten übertragen -> du setzt lokal einen Filter und nicht passende Entries werden nur ausgeblendet

Imho verwendest du momentan eine Mischung aus beiden.

Persönlich denke ich übrigens, ist bis auf Ausnahmen, grundsätzlich Variante a zu bevorzugen!

WizoHulk 12. Okt 2010 10:44

AW: DataSet Filtern
 
Es ist ein TIBDataSet

Sir Rufo 12. Okt 2010 10:49

AW: DataSet Filtern
 
Es ist das OnFilterRecord was ich meinte

Die Kombination macht Sinn wenn in einer sehr großen Datenmenge gefiltert werden soll

Aber immer Step by Step
Erst mal die Abfrage richtig zum Laufen bringen und erst dann mit dem Filter des DataSet weiterarbeiten

WizoHulk 12. Okt 2010 11:18

AW: DataSet Filtern
 
ich hab jetzt nur mal zum Test mir alles datensätze ausgeben Lassen die in ID und Beschreibung vorhanden sind.
Das macht er aber auch net, ich da liegt irgendwo andwers das Problem.
Delphi-Quellcode:
  LSql := 'SELECT id, beschreibung FROM technik';
  ibdTechnik.SelectSQL.Text := LSql;
  ibdTechnik.Open;

mkinzler 12. Okt 2010 11:20

AW: DataSet Filtern
 
Zeigt er was Falsches oder Garnichts an?

WizoHulk 12. Okt 2010 11:33

AW: DataSet Filtern
 
er zeigt gar nichts an, Ein feld mit nichts drin.

mkinzler 12. Okt 2010 11:46

AW: DataSet Filtern
 
Ist das DataSet richtig verknüpft?

WizoHulk 12. Okt 2010 12:02

AW: DataSet Filtern
 
ich habs war mal wieder DAU!
Habe vergessen mein datasource mit meinem dataset noch mal zur laufzeit zu verknüpfen
Delphi-Quellcode:
 LSql := 'SELECT id, beschreibung FROM technik WHERE beschreibung LIKE';
  LSql := LSql + #39 +'%' + eSuch.Text + '%' + #39;
  ibdTechnik.SelectSQL.Text := LSql;
  ibdTechnik.Open;
  dsTechnik.DataSet := ibdTechnik; // muss neu hinzugefügt werden
danke für eure Hilfe

DeddyH 12. Okt 2010 12:04

AW: DataSet Filtern
 
Trotzdem solltest Du SQL-Parameter verwenden ;)

WizoHulk 12. Okt 2010 13:31

AW: DataSet Filtern
 
aha. jaaa wäre wohl besser mit dem. werd mich ma umschaun


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 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