Entwickler-Ecke
Datenbanken - Filter auf einen Datumsbereich
Arne Danikowski - Di 02.10.07 19:59
Titel: Filter auf einen Datumsbereich
Hallo
ich habe folgendes Problem, ich möchte einen Filter über table.filter setzen. Dieser soll mir ein Datumsbereich herausfiltern.
Dabei soo eine dbcheckbox berücksichtig werden, ebenso noch andere Filtereigenschaften.
Der Filter soll sich also so zusammensetzen:
1.) Filtereigenschaften 1 in Variable
2.) Wenn dbcheckbox <> Ja
3.) Datum alle Datensätze vor Datum heute
Delphi-Quelltext
1: 2:
| filterapv:= '(archiv <>' + QuotedStr('Ja') +') and (papierk <>' + QuotedStr('Ja')+ ') and (vermittelt <>' + QuotedStr('Ja')+ ') and (Bezahlt1 <>' + QuotedStr('Ja')+ ')'; |
Meine Probleme gestalten sich im Datum. Ich benötige ein Datum kleiner als heute
Delphi-Quelltext
1: 2: 3: 4: 5:
| var today:String
beginn today:=BoolToStr (date > now); |
Damit erhalte ich einen Boolean Wert also 0 oder 1, damit bekomme ich keinen Filter hin. Ich habe das auch schon mit Stringfeldern versucht, nur jedesmal sobalt ich an den Operator > komme, erhalte ich ja einen Boolean Wert.
Ich habe es auch schon mal mit
Delphi-Quelltext
1:
| table1.filter:='eingereich =' + QuotedStr(BoolToStr(date>now)); |
versucht. Geht natürlich auch nicht
Hat jemand ne Idee wie das aussehen muss?
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 03.10.2007 um 00:04
Agawain - Di 02.10.07 22:55
Hi
also ganz spontan, ohne drüber nachgedacht zu haben, jedenfalls richtig nachgedacht zu haben...heute nicht mehr drin *g*
Nimm ein query statt table...select datum < date() oder so...evtl. kannst du die select-Kriterien noch weiter eingrenzen.
Tsble ist sowieso immer ungünstig...je nach Kontext oder immer, wird das ganze Teil geladen...schlecht für die Performance.
SQL besser
Gruß
Aga
Arne Danikowski - Mi 03.10.07 11:00
Nun erstmal danke für die Antwort. Woher wußte ich das nur schon wieder, das als Antwort TQuery kommt. Ist aber nicht das was ich suche. Mit der Datenbank auf SQL habe ich so meine Schwierigkeiten. Welche will ich hier gar nicht erörtern. Dazu müsste ich 10 andere Treads aufmachen :)
Es muss doch mit einem table filter funktionieren.
Ich habe das Programm eigentlich fertig. Mir fehelen nur noch so ein paar Kleinigkeiten.
raiguen - Mi 03.10.07 11:09
Mir scheint bei dir folgender Gedankenfehler zu sein:
| Zitat: |
| today:=BoolToStr (date > now); |
das ergibt meines Wissens immer false bzw '0'
Du willst doch das hier:
| Zitat: |
| Ich benötige ein Datum kleiner als heute |
Dann müsste dein Filter so aussehen:
Delphi-Quelltext
1:
| table1.filter := 'eingereich <' + QuotedStr(DateToStr(Date)); |
Arne Danikowski - Mi 03.10.07 16:05
Ok danke der Filter leuchtet ein.
So sieht mein Filter nun aus:
Delphi-Quelltext
1:
| table1.filter:='(BEZAHLT1 <>' + QuotedStr('')+ ')and (EINGEREICH <' + QuotedStr(DateToStr(Date))+ ')and (BEZAHLT1 =' + QuotedStr('NEIN')+ ')'; |
Nun werden mir aber keine Datensätze mehr angezeigt
Der Filter soll: Alle Datensätze dessen Feldinhalt der dbcheckbox BEZAHLT1 leer ist nicht anzeigen
Der Filter soll: Alle Datensätze anzeigen die das Datum vor heute haben
Der Filter soll: Alle Datensätze dessen Feldinhalt der dbcheckbox BEZAHLT1 NEIN enhält nicht anzeigen
raiguen - Mi 03.10.07 19:04
Arne Danikowski hat folgendes geschrieben: |
Der Filter soll: Alle Datensätze dessen Feldinhalt der dbcheckbox BEZAHLT1 leer ist nicht anzeigen
Der Filter soll: Alle Datensätze dessen Feldinhalt der dbcheckbox BEZAHLT1 NEIN enhält nicht anzeigen |
Ähm...zusammenfassend würd ich sagen: der Feldinhalt von
BEZAHLT1 ist
gleich 'Ja', somit vereinfacht sich der Filter:
Delphi-Quelltext
1:
| table1.filter:='(BEZAHLT1 =' + QuotedStr('Ja')+ ') and (EINGEREICH <' + QuotedStr(DateToStr(Date))+ ')'; |
Ich empfehle darüber hinaus, alle Felder schon beim Anlegen eines neuen Datensatzes mit entsprechenden Werten vorzubelegen; z.B. BEZAHLT1->'NEIN' - somit entfällt die Prüfung auf Feldinhalt gleich NULL...
Noch eins fällt mir gerade ein: was genau steht im Feld drin? -> ja oder Ja oder JA ??? Dürfte klar sein, dass der Filter NICHT CaseSensitiv ist gelle...
Arne Danikowski - Do 04.10.07 09:21
Danke für die Antwort. Das mit dem Wert gleich Nein beim Anlegen des Datensatzes hört sich gut an.
Wie geht das? :)
Noch ein paar überlegungen. Wenn ich EINGEREICH < im Filter habe, Filtert der mit dann nicht alle Daten aus die vor dem Aktuellem Datum liegen? Also eigentlich das Gegenteil, was ich beabsichtige? Ich möchte ja das diese angezeigt werden. Oder unterliege ich hier einem Denkfehler.
raiguen - Do 04.10.07 12:01
Hallo Arne,
zum Vorbelegen eines Feldes mit einem bestimmten Wert gibt es zwei Möglichkeiten:
a) je nach verwendetem DBS gibt es in der Tabellenstruktur u.a. die Eigenschaft 'Default' und hier wird halt der entsprechende Wert eingetragen (bei dir z.B. NEIN) -> sobald ein neuer Datensatz eingefügt wird, erhält das Feld den vorbelegten Wert, wenn nicht programmseitig expliziet ein anderer Wert eingetragen wird
b) Programmseitig gibts du ausdrücklich dem Feld einen Wert: NEIN, wenn die zugehörige Checkbox unchecked ist und JA, wenn das Häkchen drin ist (um das mal an Deinem Programm klarzumachen)
| Zitat: |
| Wenn ich EINGEREICH < im Filter habe, Filtert der mit dann nicht alle Daten aus die vor dem Aktuellem Datum liegen? |
Es werden ALLE Datensätze angezeigt, deren Datum VOR dem heutigen Datum liegen - sprich: wenn heute der 04.10.2007 ist, dann zeigt der Filter alles an, was datumsmässig im Bereich 31.12.1899...03.10.2007 liegt ;)
Somit ist es genau das, wass Du möchtest -> alle DAtensätze bis gestern ;)
Arne Danikowski - Do 04.10.07 13:48
OK klingt logisch.
Die Einstellungen für die Werte der DBCHECKBOX hatte ich ja schon vorgenommen. Nun handelt es sich um eine DBASE Datei. Da habe ich nicht die Möglichkeit, in der Struktur einen default Wert einzugeben. Ich glaube das geht bei der Paradox.
Kann man über den dbNavigator irgendwie ne IF THEN anweisung einbauen? Also sowas wie
IF dbnavigator neuen Datensatz dann dbcheckbox gleich false?
raiguen - Fr 05.10.07 12:12
Bei dBase- bzw Paradox-Tabellen gibt es die von mir erwähnte 'Eigenschaft' Default nicht, so dass Du programmseitig bei Neuanlegen eines Datensatzes die Feldwerte definiert vorbelegen solltest.
Um bei Deinem Beispiel zu bleiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormCreate(Sender: TObject; begin ... TntDBCheckBox.ValueChecked := 'Ja'; TnTDBCheckBox.ValueUnckecked := 'Nein'; .... |
Beim Anlegen eines neuen Datensatzes die DBCheckboxen expliziet unckecked setzen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); begin if Button = nbInsert then begin TntDBCheckBox1.Checked := False; TntDBCheckBox1.State := cbUnckecked; end; end; |
Somit wird nach dem Post des neuen Datensatzes das entsprechende Tabellenfeld mit 'Nein' vorbelegt.
Ein weiterer Vorteil - gerade bei Checkboxen - ist der, dass der Status der DBCHeckbox eindeutig gesetzt wird und somit das ausgegraute Häkchen bei Feldwert NULL vermieden wird (und somit der Benutzer nicht verwirrt wird).
Arne Danikowski - Fr 05.10.07 14:10
Ich war mal so frei und habe den Quelltext kopiert und an den entspechenden Stellen eingefügt.
Ich bekomme allerdings die Meldung: Nicht deklarierter Bezeichner
Welche Deklaration muss ich denn vornehmen? Es liegt wohl an den "Tnt"
raiguen - Fr 05.10.07 19:21
:oops: Mein Fehler! Da ich ich fast ausschliesslich mit TnTKomponenten (weil unicode-fähig) arbeite, steht in meinem Codeschnipssel gewohnheitsgemäss
TnTDBCheckBox anstatt 'normal' DBCheckBox... :wink:
Sorry für den Umstand - aber so ist's halt wenn man schnell was codet und keine aussagekräftigen Komponenten-Namen vergibt :roll:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!