Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
 //filter 1 Damit habe ich 1.) und 2.) in einer Variablen
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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
//Datum kleiner heute in Variable
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
ausblenden 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 03.10.2007 um 00:04
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
table1.filter := 'eingereich <' + QuotedStr(DateToStr(Date));					
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mi 03.10.07 16:05 
Ok danke der Filter leuchtet ein.

So sieht mein Filter nun aus:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Mi 03.10.07 19:04 
user profile iconArne 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject;
begin
   ...
   //--entweder hier oder aber im OI setzen
   TntDBCheckBox.ValueChecked := 'Ja';
   TnTDBCheckBox.ValueUnckecked := 'Nein';
   ....


Beim Anlegen eines neuen Datensatzes die DBCheckboxen expliziet unckecked setzen:
ausblenden 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;
      //-- oder
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Fr 05.10.07 19:21 
user profile iconArne Danikowski hat folgendes geschrieben:
Es liegt wohl an den "Tnt"
: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: