SETFILTER auf Boolean Feld

17. Februar 2009 11:42

Hallo zusammen. Ich versuchen ein Setfilter auf ein Boolean Feld zu setzen und wollte fragen ob das überhaupt geht?Wie kann ich das in den Trigger reinschreiben?
Will das wenn ich einen Option Butten drücke mir die Tabelle nur die Felder mit True ausgibt.

Gruß Chiwi

Re: SETFILTER auf Boolean Feld

17. Februar 2009 11:48

Eigentlich ganz einfach:

So:
Code:
DeinRec.SETFILTER(DeinBoolFeld, TRUE);

oder so:
Code:
DeinRec.SETRANGE(DeinBoolFeld, TRUE);


Aus Performancegründen ist SETRANGE vorzuziehen.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 11:52

Code:
Record.SETFILTER(Feld,FORMAT(TRUE));

Das ist aber nicht empfehlenswert. Nimm lieber einen SETRANGE (
Code:
Record.SETRANGE(Feld,TRUE);
), dieser sollte performanter sein.
Naja mehr musst du eigentlich nicht machen, als diesen Befehl in den OnPush-Trigger setzen.

EDIT: Natalie war mal wieder schneller :P

EDIT2: Ah ich habe einen Fehler entdeckt, Natalie :-P
Dein Setfilter-Befehl dürfte nicht funktionieren. SETFILTER geht nur über Text.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 11:57

Das habe ich auch so versucht, nur wenn Ich Setfilter benutze dann kommt immer ein Typkonvertierungsfehler. Beim SETRANGE dagegen gibt es keine Fehlermeldung.

Wenn ich den SETRANGE geschrieben habe und den Optionbutton drücke, Filtert mir die Tabelle aber trotzdem nicht die Felder mit dem TRUE raus. Habe den Code auch in den OnPush Trigger des Optionbuttons geschrieben.

Irgendetwas mach ich noch falsch. Muss ich was in den Properties des OptionButtons ändern?

Möchte halt gerne das in meiner Tabelle eine Art Tabelfilter auf mein Booleanfeld gesetzt wird.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 12:03

Sebastian Pfliegel hat geschrieben:Dein Setfilter-Befehl dürfte nicht funktionieren. SETFILTER geht nur über Text.

lol
War mir nach 2,5 Jahren NAV noch kein einziges Mal aufgefallen :D
Alternativ kann man es auch so schreiben:
Code:
DeinRec.SETFILTER(DeinBoolFeld, '%1', TRUE);


Chiwi hat geschrieben:Irgendetwas mach ich noch falsch. Muss ich was in den Properties des OptionButtons ändern?

Wie lautet denn dein Quelltext?
Vermutlich arbeitest du nicht mit Rec (der Tabelle, die gerade auf deiner Form angezeigt wird).
Code:
Rec.SETRANGE(DeinBoolFeld, TRUE); //Rec. kann auch weggelassen werden

Eventuell solltest du noch ein
Code:
IF FIND('-') THEN;

dahinter schreiben, damit die Datensätze auch wirklich neu gelesen werden.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 12:10

Also code sieht so aus
Code:
lr_lagerbewegung.SETRANGE(lr_lagerbewegung.Bearbeitet,TRUE);
  IF lr_lagerbewegung.FIND('-') THEN
    REPEAT
      neulagerort2 := neulagerort;
      neulagerfach2 := neulagerfach;
    UNTIL
  lr_lagerbewegung.NEXT = 0;


Mein Ausbilder meint so weit ist das richtigt, nur muss ich jetzt dafür sorgen das die Tabelle aktualisiert wird und mir die neue Werte ausgibt.Wie mach ich das denn?

Re: SETFILTER auf Boolean Feld

17. Februar 2009 12:22

Hallo Chiwi,

wenn du in eine Tabelle einen Datensatz einfügen willst, reicht es nicht den Datensatz zuzuweisen. Du musst für jeden Datensatz den du in die neue Tabelle einfügen willst auch ein ZielTabelle.INSERT(True/False) durchführen, sonst wird zwar die Record-Variable zugewiesen, die landet aber erst nach dem INSERT in der Datenbank.
Ob du INSERT mit TRUE oder FALSE aufrufst hängt von den Gegebenheiten deiner Tabelle ab. Dazu musst du die Tabelle kennen, und prüfen ob das was im OnInsert-Trigger der Tabelle ausgeführt wird, auch ausgeführt werden soll.

Gruß, Fiddi

Re: SETFILTER auf Boolean Feld

17. Februar 2009 12:37

Ich will nur das mein Window aktualisiert wird.

Ich glaube irgendwas mit CurrForm...

Re: SETFILTER auf Boolean Feld

17. Februar 2009 12:40

Chiwi hat geschrieben:
Code:
lr_lagerbewegung.SETRANGE(lr_lagerbewegung.Bearbeitet,TRUE);
  IF lr_lagerbewegung.FIND('-') THEN
    REPEAT
      neulagerort2 := neulagerort;
      neulagerfach2 := neulagerfach;
    UNTIL
  lr_lagerbewegung.NEXT = 0;


Nur so ein Tipp: Schreib den Code lieber so:
Code:
lr_lagerbewegung.SETRANGE(Bearbeitet,TRUE);
  IF lr_lagerbewegung.FINDFIRST THEN
    REPEAT
      neulagerort2 := neulagerort;
      neulagerfach2 := neulagerfach;
    UNTIL
  lr_lagerbewegung.NEXT = 0;


Das mit dem FINDFIRST hat Performance-Gründe. Und das mit dem Setrange und dem lr_lagerbewegung.Bearbeitet hat den Grund der Übersichtlichkeit. Nach einem GET, SETRANGE und Co. kann man immer im ersten Parameter das Feld direkt aus dem Record angeben.

Der Befehl lautet: CurrForm.UPDATE;

Re: SETFILTER auf Boolean Feld

17. Februar 2009 13:13

Das mit dem FINDFIRST hat Performance-Gründe.

Da ist dir aber was durcheinander gerutscht. Findfirst ist nur dann performanter, wenn man wirklich nur den ersten Datensatz sucht.

Re: SETFILTER auf Boolean Feld [korrigiert]

17. Februar 2009 13:14

Also SETFILTER geht meiner Meinung nach auf fast alle Datentypen.

MfG
Zuletzt geändert von m_schneider am 17. Februar 2009 15:53, insgesamt 1-mal geändert.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 13:17

m_schneider hat geschrieben:SETRANGE funktioniert NUR auf Schlüsselfeldern!!!
Das stimmt ja nun nicht.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 13:26

McClane hat geschrieben:
m_schneider hat geschrieben:SETRANGE funktioniert NUR auf Schlüsselfeldern!!!
Das stimmt ja nun nicht.

Allerdings ;-)
m_schneider, wie kommst du darauf?

Re: SETFILTER auf Boolean Feld

17. Februar 2009 14:08

Ich zitiere den C/SIDE-Reference Guide:
C/SIDE-Reference Guide hat geschrieben:SETRANGE (Record)
Use this function to set a simple filter, such as a single range or a single value, on a field.

Record.SETRANGE(Field [,FromValue] [.ToValue])
Record

Data type: record

The record that contains the field you want to filter.

Field

Data type: field

The field you want to filter.

FromValue

Data type: -

The lower limit of the range. The data type of FromValue must match Field.

ToValue

Data type: -

The upper limit of the range. If you omit this parameter, the system uses the value you specified for FromValue. The data type of ToValue must match Field.

Comments
SETRANGE is a quick way to set a simple filter on a field.

SETRANGE removes any filters that were set earlier and replaces them with the From-Value/To-Value parameters that you specify.

If you use SETRANGE without setting the From-Value/To-Value parameters, the function removes any filters that are already set.

If you only set the From-Value, the To-Value is set to the same value as the From-Value.


Also ich seh da nichts von Schlüsselfeldern. Was mir da nur einfällt wäre GET, aber das ist ja kein echtes Filtern.

Re: SETFILTER auf Boolean Feld

17. Februar 2009 15:55

Entschuldigung, habe ich anscheinend tatsächlich mit GET verwechselt. Dachte mich erinnern zu können das irgendwo mal gelesen zu haben.

Irren ist menschlich!

Re: SETFILTER auf Boolean Feld

22. Februar 2009 16:24

Hallo Chiwi,

Die einfachste Variante, die Tabelle nach dem SETRANGE zu aktualisieren:

Code:
lr_lagerbewegun.SETRANGE(...);
lr_lagerbewegun.MODIFYALL(FeldZumAktualisieren,WertZumAktualisieren);


Die einfachste Variante, die Tabelle mit den neuen Werten in einer REPEAT - UNTIL Schleife zu aktualisieren:

Code:
REPEAT
  lr_lagerbewegun.VALIDATE(FeldZumAktualisieren,WertZumAktualisieren);
  lr_lagerbewegun.MODIFY(TRUE);
UNTIL


Du musst nur beachten, dass das FeldZumAktualisieren weder im aktiven Schlüssel vorhanden ist noch auf ihn gefiltert wurde. Wenn das der Fall wäre, sollte es durch eine weitere Record Variable gelöst werden:

Code:
REPEAT
  lr_lagerbewegun2 := lr_lagerbewegun;
  lr_lagerbewegun2.VALIDATE(FeldZumAktualisieren,WertZumAktualisieren);
  lr_lagerbewegun2.MODIFY(TRUE);
UNTIL


Gruß, Michael