| Autor |
Beitrag |
Arne Danikowski
      
Beiträge: 194
|
Verfasst: Di 02.10.07 19:59
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
      
Beiträge: 460
win xp
D5, MySQL, devxpress
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Fr 05.10.07 19:21
 Mein Fehler! Da ich ich fast ausschliesslich mit TnTKomponenten (weil unicode-fähig) arbeite, steht in meinem Codeschnipssel gewohnheitsgemäss TnTDBCheckBox anstatt 'normal' DBCheckBox...
Sorry für den Umstand - aber so ist's halt wenn man schnell was codet und keine aussagekräftigen Komponenten-Namen vergibt 
|
|