Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Integer Filtern in einem DBgrid (https://www.delphipraxis.net/111379-integer-filtern-einem-dbgrid.html)

simon790 2. Apr 2008 15:24

Datenbank: Excel • Zugriff über: ADO

Integer Filtern in einem DBgrid
 
Hallo
In einem DBGrid zeige ich den Inhalt einer Exceldatei auf die ich per ADO zugreife.
Dazu habe ich noch einen Filter der das zwischengeschaltete Dataset filtert.

Delphi-Quellcode:
procedure TMainForm.FilterEditChange(Sender: TObject);
begin
  with DBGrid do
  begin
    DataSource.DataSet.Fields.FieldByNumber(2).SetFieldType(String);
    DataSource.DataSet.Filtered := Trim(FilterEdit.Text) <> '';
    if DataSource.DataSet.Filtered then
        DataSource.DataSet.Filter := SelectedField.FieldName + ' Like ' + QuotedStr('*'+FilterEdit.Text+'*')
    else
      DataSource.DataSet.Filter := '';
  end;
end
Funkioniert soweit ganz gut solange ein Feld ausgewählt wird welches String Einträge enthält.
Sobald ich aber ein Feld öffne welches Integer-Werte (TelNr) Enthält bekomm ich die Meldung "der Filter kann nicht geöffnet werden".

Gibt es eine Möglichkeit den Filter auf Integer-Felder anzuwenden?
Gruss
Simon

marabu 2. Apr 2008 15:49

Re: Integer Filtern in einem DBgrid
 
Hallo Simon,

natürlich kannst du auch nach Integer-Werten filtern. Allerdings musst du dann den LIKE Operator fallen lassen. Falls der LIKE Operator dir wichtig ist, dann musst du den Integer-Wert zuvor per CAST in einen String umwandeln. Da du CAST in einer Filter-Expression wahrscheinlich nicht verwenden darfst, musst du dann aber das Ereignis OnFilterRecord() bedienen.

Grüße vom marabu

simon790 2. Apr 2008 16:03

Re: Integer Filtern in einem DBgrid
 
Zitat:

Zitat von marabu
Allerdings musst du dann den LIKE Operator fallen lassen.

Heist das ich kann in einer IF-Verzweigunf entweder mit Like oder = suchen. Habe ich so probiert, bekomme aber eine Fehlermeldung "Typkonflikt"


Da ich eigentlich auf eine ADOSQLQuery zugreife, gäbe es auch die Möglichkeit mit einem ensprechenden SQL Befehl das Feld mit den Integer-Werten als Feld mit Strings zu "Selecten"? So auf die Art "Select F2 As TELEFON ToString From..."?

shmia 2. Apr 2008 16:50

Re: Integer Filtern in einem DBgrid
 
Frage doch ab, ob es sich um ein String- oder Integer-Feld handelt.
Wenn es ein Integer-Feld ist, dann macht eine LIKE-Bedingung absolut keinen Sinn!!
Was soll denn das Ergebnis folgender Abfrage sein ?
SQL-Code:
SELECT * FROM Tabelle WHERE Intfeld LIKE 42
Das kann man eigentlich nur so umschreiben:
SQL-Code:
SELECT * FROM Tabelle WHERE Intfeld = 42
Noch besser wäre natürlich ein Bereichsfilter bei numerischen Feldern:
SQL-Code:
SELECT * FROM Tabelle WHERE Intfeld >= 120 AND Intfeld <= 150

simon790 3. Apr 2008 06:51

Re: Integer Filtern in einem DBgrid
 
Zitat:

Zitat von shmia
Frage doch ab, ob es sich um ein String- oder Integer-Feld handelt.

Ich weiss ja welches Feld ein Integer Feld ist und kann der Filter demenstprechend zusammenstellen:

Delphi-Quellcode:
procedure TMainForm.FilterEditChange(Sender: TObject);
begin
  with DBGrid do
  begin
    DataSource.DataSet.Filtered := Trim(FilterEdit.Text) <> '';
    if DataSource.DataSet.Filtered then
      if SelectedField.FieldName ='TELEFON' then //Das ist das IntegerFeld
        DataSource.DataSet.Filter := SelectedField.FieldName + ' = ' + QuotedStr('*'+FilterEdit.Text+'*')
      else // all die StringFelder
      DataSource.DataSet.Filter := SelectedField.FieldName + ' Like ' + QuotedStr('*'+FilterEdit.Text+'*')
    else
      DataSource.DataSet.Filter := '';
  end;
end;
aber mit dem Gleichheitszeichen statt dem Like Operator tuts auch nicht!

mkinzler 3. Apr 2008 06:54

Re: Integer Filtern in einem DBgrid
 
-Bei Integern brauchst du nicht zu Quoten.
-Joker-Suche geht bei integern auch nicht.
-Du fragst nicht den Feldtyp sondern dessen namen ab, der Typ wäre universeller.

simon790 3. Apr 2008 07:28

Re: Integer Filtern in einem DBgrid
 
OK, es geht jetzt wenn der komplette Ausdruck übereinstimmt zudem habe ich gerade gemerkt da es der Feldtyp Float ist und nicht integer. :roll:
Ja die abfrage nach dem Feldtyp ist besser, da auch noch andere Felder vorkommen können die FloatWerte enthalten.Schade ist, dass keine JokerSuche möglich ist.

überlege gerade ob es sinnvol ware am anfang das Dataset durchzurasseln und die entsprechender Feldern in Strings umzuwandeln. Das Problem ist, dass das ganze ja auf ein Excelsheet zugreift und ich nicht weiss ob ich da die Datentypen so ändern kann

mkinzler 3. Apr 2008 07:38

Re: Integer Filtern in einem DBgrid
 
Versuch mal in der Abfrage das Feld als string zu behandeln.


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