![]() |
Datenbank: keine • Version: keine • Zugriff über: Delphi
ClientDataSet mit zwei Filtern
Moin,
ich habe eine ClientDataSet das ich mit folgendem Source filtere und anzeigen lasse:
Delphi-Quellcode:
Das funktioniert auch wunderbar. Jetzt möchte ich aber nach einem zweiten Feld zusätzlichen Filtern .. also
function TKund.KundenSuchen(const KundenNummer: String; var KundenRec: TKundenRec): Boolean;
(* Anzeige des DBGrid aus Rückgabe des gewählten Datensatzes *) begin DatenUebernahme := false; ClientDataSet_Kunden.Filtered := True; ClientDataSet_Kunden.Filter := CTitelKundenNr +'=' +KundenNummer; Kund.ShowModal; if DatenUebernahme then begin KundenRec.Firma1 := ClientDataSet_Kunden.FieldByName(CTitelFirma1).AsString; KundenRec.Firma2 := ClientDataSet_Kunden.FieldByName(CTitelFirma2).AsString; end; if DatenUebernahme then Result := true else Result := false; end;
Delphi-Quellcode:
ClientDataSet_Kunden.Filter := CTitelKundenNr +'=' +KundenNummer +' AND ' +CTitelFirma1 +'=' +FilterString;
Wenn ich z. B. den FilterString auf den Text "RIO" setze dann bekomme ich eine Exception mit der Meldung "Das Feld 'Rio' wurde nicht gefunden." Also mache ich das irgendwie falsch - aber wie mache ich es richtig ?? Gruß Hans |
AW: ClientDataSet mit zwei Filtern
Hallöle...:P
Manchmal helfen ein paar Hochkommata...8-)
Delphi-Quellcode:
ClientDataSet_Kunden.Filter := CTitelKundenNr + '=' + KundenNummer + ' AND ' + CTitelFirma1 + '=' + QuotedStr(FilterString);
|
AW: ClientDataSet mit zwei Filtern
Wenn das RIO auch ein Text/String sein soll, dann solltest du es auch wie einen "String" schreiben.
Und warum nehmen Alle immer QuotedStr? Das ist einfach nicht richtig. Dafür gibt es irgendwo in den Units der DB-Komponente passende "Escape"-Funktionen (EscapeName, EscapeValue oder so), welche das richtig machen, denn
Delphi-Quellcode:
'feld = ' + QuoteStr('Das ist ein Text mit " und \ drin')
|
AW: ClientDataSet mit zwei Filtern
Vielen Dank, so klappt das jetzt.
Zwei Dinge habe ich aber nicht verstanden: 1) Warum muss ich beim zweiten Text das QuotedStr nutzen, aber nicht beim ersten String (Kundennummer) ? 2) @himitsu: Was meinst Du mit der Bemerkung "'feld = ' + QuoteStr('Das ist ein Text mit " und \ drin')" ? Wenn ich das in Delphi ausprobiere kommt genau das raus was ich erwarte ! Gruß Hans |
AW: ClientDataSet mit zwei Filtern
Sorry - eine Sache verstehe ich leider immer noch nicht:
Filter auf nur ein Feld - klappt !
Delphi-Quellcode:
Suche nach zwei Feldern, zweites Feld mit Anfangsbuchstaben und dann Asterix - klappt !
CTitelKundenNr := 'Nummer';
CTitelFirma1 := 'Firma1'; ClientDataSet_Kunden.FilterOptions := [foCaseInsensitive]; ClientDataSet_Kunden.Filtered := True; ClientDataSet_Kunden.Filter := CTitelKundenNr +'=' +QuotedStr(KundenNummer);
Delphi-Quellcode:
Suche nach zwei Feldern, zweites Feld OHNE Anfangsbuchstaben und dann Asterix - klappt nicht sondern es gibt kein Ergebnis !
FilterString := 'M';
CTitelKundenNr := 'Nummer'; CTitelFirma1 := 'Firma1'; ClientDataSet_Kunden.FilterOptions := [foCaseInsensitive]; ClientDataSet_Kunden.Filtered := True; ClientDataSet_Kunden.Filter := CTitelKundenNr +'=' +QuotedStr(KundenNummer) +' AND ' +CTitelFirma1 +'=' +QuotedStr(FilterString +'*');
Delphi-Quellcode:
Meine Idee war das ich den Suchstring zeichen für Zeichen aufbaue und dann eben partiell danach suche. Nur - wenn ich noch keine Suchstring habe müsste der Filter
FilterString := ''; { <- hier ist der Unterschied }
CTitelKundenNr := 'Nummer'; CTitelFirma1 := 'Firma1'; ClientDataSet_Kunden.FilterOptions := [foCaseInsensitive]; ClientDataSet_Kunden.Filtered := True; ClientDataSet_Kunden.Filter := CTitelKundenNr +'=' +QuotedStr(KundenNummer) +' AND ' +CTitelFirma1 +'=' +QuotedStr(FilterString +'*');
Delphi-Quellcode:
doch eigentlich alle Datensätze anzeigen, oder ?
+CTitelFirma1 +'= *')
Gruß Hans |
AW: ClientDataSet mit zwei Filtern
Wie ist das denn, wenn du statt "=" ein "like" verwendest?
UNd nicht unbedingt relevant, aber sollte man nicht erst den Filter definieren und dann Filtered=True setzen? |
AW: ClientDataSet mit zwei Filtern
Moin Jumpy,
Zitat:
Delphi-Quellcode:
Eine Exception in Modul MIDAS - Lesen von Adresse 000000
ClientDataSet_Kunden.Filter := CTitelKundenNr +' LIKE ' +QuotedStr(KundenNummer) +' AND ' +CTitelFirma1 +' LIKE ' +QuotedStr(FilterString +'*');
Zitat:
Hans |
AW: ClientDataSet mit zwei Filtern
Wenn man "nach alles" sucht (also der Stern), kann man die Bedingung auch prima weglassen.
Bin nicht sicher, aber das Like gehrt glaub ich nicht zu dem Funktionsumfang bzw. dieser Filterimplementierung. Bzw. die Wildcard Funktion im Code Beispiel des TE mit <feld>='M*', die offenbar ein Ergebnis liefert, zeigt ja, dass die Implementierung so mit Gleichheitszeichen gedacht ist/funktioniert. Könnte mir vorstellen, dass ein führendes "*" einfach nicht unterstützt ist wegen Performance. Müsste man mal Doku lesen. |
AW: ClientDataSet mit zwei Filtern
OK - dann muss ich den Suchstring eben entsprechend per IF zusammensetzen - ich hatte nur gedacht das man sich das sparen kann.
Gruß Hans |
AW: ClientDataSet mit zwei Filtern
Zitat:
![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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