[gelöst] Filter Befehle

7. September 2009 09:00

Hallo,

weiß jemand von euch ob es eine Liste mit möglichen Befehlen und deren Bedeutung gibt, die ich in die Filterfunktionen eintragen kann?[*]
Zuletzt geändert von Zwacket am 7. September 2009 09:33, insgesamt 1-mal geändert.

Re: Filter Befehle

7. September 2009 09:11

Herzlich Willkommen bei uns!

Geh in NAV unter ? -> Microsoft Business Solutions Navision-Hilfe
Registerkarte "Suchen"
Gebe ein, mit den doppelten Anführungsstrichen: "Feldfilter und Tabellenfilter". Wähle in der Ergebnisliste den Artikel mit eben jenem Namen aus.

Re: Filter Befehle

7. September 2009 09:15

danke :)

Re: [gelöst] Filter Befehle

17. September 2009 20:46

und wie kann man im Code selbst filtern?

Ich möchte eine Variable auf true setzen, immer wenn der Name mit "Hans" anfängt... Aber der Stern da hinten dran funktioniert irgendwie nich.

isrightname := (Name = 'Hans *');

Re: [gelöst] Filter Befehle

17. September 2009 21:14

z.B.:
Code:
SETFILTER(Feld,strsubstno('%1*','Wert'))
// oder
VAriableTxt := 'Hans';
SETFILTER(FELD,strsubstno('%1*',Variabletxt))
// oder
SETFILTER(FELD,'%1',rec2.Feld + '*');

IF FINDSET THEN BEGIN
  REPEAT
    DeinFeld := TRUE;
    MODIFY;
  UNTIL NEXT=0;
END;

// Oder

MODIFYALL(DEINFELD,TRUE);


Die Variable kann entweder eine Feld eines Rec´s sein oder eine Textvariable die Dynamisch/Statisch gesetzt wird.

Mit der Forensuche hättest du es auch gefunden :-)

Re: [gelöst] Filter Befehle

17. September 2009 21:19

Danke Mikka, aber irgendwie funktioniert das nicht. Ich hab schon im Forum geguckt, aber so wie ich das brauche is das wohl nich so einfach. Ich möchte durch alle Datensätze gehen und immer wenn ein Kriterium true ist (Also Name = 'Hans*'), dann soll was passieren. Mit SetFilter grenze ich ja schon generell die Datensätze aus. Das möcht ich ja gar nich... Und das folgende STatement geht auch nicht:

isrightname := (Name = STRSUBSTNO('%1*','Hans'));

Ich vergas noch zu erwähnen, dass mein Code funktioniert, sofern ich den vollständigen Namen richtig angebe.

Re: [gelöst] Filter Befehle

17. September 2009 21:27

Hää?
(Ich glaube ich bin heute abend zu Blond)

Du möchtest alle haben / Kennzeichnen, die mit 'Hans*' anfangen richtig?
Dann macht der Code das doch (siehe in meinem vorherigen Posting, ich habe es nacheditiert / erweitert)
Natürlich könnte statt dem TRUE / MODIFY auch etwas anderes stehen wie ein Funktionsaufruf,

Wenn das SETFILTER richtig gesetzt ist, grenzt du nur die aus, die du nicht haben möchtest.

Re: [gelöst] Filter Befehle

17. September 2009 21:30

Ja, ne, das möcht ich nicht. Ich möchte durch alle Datensätze durchgehen, also ohne filter, weil ich will ja durch alle durchgehen, und dann möcht ich machen, wenn der Datensatz mit "Hans" anfängt, zeige ne Meldung "Einen Hans gefunden" an. Und wenn der Datensatz mit "Jochen" beginnt, dann zeige "Ha, ein Jochen is auch noch da", und so weiter. Also ungefiltert durch alle durchgehen und jeden einzelnen Datensatz prüfen.
Was ich eigentlich nur wissen will, ist, wie man mit Wildcards im C/AL-Code arbeitet...

Re: [gelöst] Filter Befehle

17. September 2009 21:41

mhh, eine möglichkeit, die ein bisschen funktioniert, hab ich schon gefunden, aber richtig zufrieden bin ich damit noch nicht...

isrightname := strpos(Name,'Hans') <> 0;

Re: [gelöst] Filter Befehle

17. September 2009 21:44

Dosihris hat geschrieben:und wie kann man im Code selbst filtern?

Ich möchte eine Variable auf true setzen, immer wenn der Name mit "Hans" anfängt... Aber der Stern da hinten dran funktioniert irgendwie nich.

isrightname := (Name = 'Hans *');

Dein Ansatz sieht doch schon gut aus (die Klammern brauchst du übrigens syntaktisch gesehen nicht).
Die Frage hat jedoch nichts mit Filtern zu tun!
Filtern: Ich muss erst Datensätze holen und muss Bedingungen für einzelne Spalten festlegen.
Du dagegen scheinst schon in einem Datensatz zu stehen und möchtest hier eine Variable setzen

Code:
isrightname := COPYSTR(UPPERCASE(Name), 1, 4) = 'HANS';


Da dies jedoch auf einen Fehler laufen würde, sobald Name kürzer ist, als Hans lang ist:
Code:
IF STRLEN(Name) < 4 THEN
  isrightname = FALSE
ELSE
  isrightname := COPYSTR(UPPERCASE(Name), 1, 4) = 'HANS';


Und am elegantesten, weil so am schnellsten ein Hans durch einen Meiser ausgetauscht werden kann (nämlich nur in der ersten Codezeile):
Code:
SuchStr := 'MEISER';
IF STRLEN(Name) < STRLEN(SuchStr) THEN
  isrightname = FALSE
ELSE
  isrightname := COPYSTR(UPPERCASE(Name), 1, STRLEN(SuchStr)) = SuchStr;


ABER
Wenn du nun wirklich alle Datensätze gesucht hast, wo Name mit Hans anfängt, dann hätte es so ausgesehen:
Code:
DeinRec.SETFILTER(Name, '@Hans*');
IF DeinRec.FINDSET THEN
  REPEAT
    // was auch immer
  UNTIL DeinRec.NEXT = 0;


Möchtest du vielleicht in den Hans-Datensätzen ein bestimmtes Tabellenfeld setzen?
Code:
DeinRec.SETFILTER(Name, '@Hans*');
DeinRec.MODIFYFALL(DeinFeld, DeinWunschwert);


Edit:
Code:
isrightname := strpos(Name,'Hans') <> 0;

Ist doch super (hatte ich ganz vergessen) - aber warum bist du damit nicht zufrieden?
Falls es die Groß-/Kleinschreibung ist:
Code:
isrightname := STRPOS(UPPERCASE(Name),'HANS') <> 0;


Wenn es dir streng auf den Anfang des Names ankam, dann nimm meine Lösung.

Re: [gelöst] Filter Befehle

17. September 2009 21:45

Dosihris hat geschrieben:Was ich eigentlich nur wissen will, ist, wie man mit Wildcards im C/AL-Code arbeitet...

Wenn du vorfiltern möchtest:
Code:
MeinRecord.SETFILTER(MeinFeld,'%1*','Hans');
// alternativ
MeinRecord.SETFILTER(MeinFeld,'%1','Hans*');

oder wenn du ungefiltert duch alle Datensätze gehen möchtest:
Code:
IF STRPOS(MeinRecord.MeinFeld,'Hans') = 1 THEN
  // Hans (inkl. Groß-/Kleinschreib.) fängt zum ersten Mal an Position 1 an (steht also am Anfang)

Re: [gelöst] Filter Befehle

17. September 2009 21:47

Mir fällt kein Befehl ein, der das "so" kann.
Es währe eine Schleifenverarbeitung denkbar (aber recht unpraktisch vom handling, da alle Zeichen einzeln verarbeitet werden), z.B.

Code:
// I = eine Variable vom Typ Integer
REPEAT
  FOR I := TO STRLEN(DeinFeld) DO BEGIN
    VariableTxt := COPYSTR(DeinFeld,I,1); 
  END;

UNTIL NEXT=0;


Was ist den das konrete Ziel, evtl. ist es der falsche Ansatz?!

**NAchtrag**
Ich sehe Natalie hat einen "Batzen" gepostet. Ich stelle mein ersteinmal rein und schaue was Sie schreibt :wink:
:shock: Tinmo auch noch, ich bin mal wieder zu lam *heul*

Re: [gelöst] Filter Befehle

17. September 2009 21:51

Hi NAtalie,

danke für die toll ausformulierte nachricht. Du hast recht, der Begriff "Filtern" ist hier wohl fehl am platze (sorry mikka).

ok, ich versuch mal zu beschreiben, was ich wirklich will. Ich arbeite mit NAV 2009. Ich habe im RTC die Kundenliste vor mir. Man kann für bestimmte Spalten Styles erstellen. Somit haben die Einträge in dieser Spalte eine andere Farbe. Nun möcht ich aber nicht alle Einträge hervorheben, sondern nur die, die mit Hans anfangen. Dafür gibt es ein weitres Feld "StyleExpr". Hier kann man einen boolschen Ausdruck eingeben, der ausgewertet wird pro Datensatz. Ok, soweit sogut. Leider kann ich in StyleExpr nich einfach Hans* reinschreiben, warum auch. In der MSDN steht, ich solle eine globale boolsche Variable anlegen (die bei mir isrightname heisst), und im Code beim Laden aller Datensätze in der Funktion "OnAfterGetRecord" einfach meine Bedingung eingeben und dann die Variable auf true setzen, wenn die bedingung erfüllt ist. Diese Variable kann ich dann in StyleExpr einsetzen und dann funktioniert das. Puh.. das ist schon alles, was ich will...

ursprünglich wollte ich "nur" Wildcards in boolschen Bedingungen benutzen. Das ich hier halb NAV neu programmieren muss deswegen war mir nicht bewusst.

Re: [gelöst] Filter Befehle

17. September 2009 21:55

Dosihris hat geschrieben:In der MSDN steht, ich solle eine globale boolsche Variable anlegen (die bei mir isrightname heisst), und im Code beim Laden aller Datensätze in der Funktion "OnAfterGetRecord" einfach meine Bedingung eingeben und dann die Variable auf true setzen, wenn die bedingung erfüllt ist. Diese Variable kann ich dann in StyleExpr einsetzen und dann funktioniert das.

Wunderbar, das sollte doch jetzt eigentlich funktionieren - oder nicht?

(Falls noch nicht geschehen: Deine Bool-Variable benötigt die Eigenschaft IncludeInDataset = Yes)

Re: [gelöst] Filter Befehle

17. September 2009 21:58

Ja, es funktioniert ja auch, wenn ich schreibe "isrightname := Name ='Hans Vissler';". Dann ist Hans Vissler rot, und alle andere nicht. Das ist schonmal nicht schlecht. Aber ich hab noch nen Hans. Und der soll auch rot sein.. hehe also einfach simple Wildcards nutzen... Hans*

**NACHTRAG**

Ja, das hatte ich zubeginn auch vergessen zu setzen, aber dann hab ichnochmal richtig gelesen und dann gings.. nun brauch ich nur noch meine Wildcards und ich bin glücklich...

Re: [gelöst] Filter Befehle

17. September 2009 21:59

Dosihris hat geschrieben:hehe also einfach simple Wildcards nutzen... Hans*

Ähm - nur beim FILTERN, nicht bei String-Operationen ;-) (oder ich hätte damit heute eine neue Lektion gelernt)

Re: [gelöst] Filter Befehle

18. September 2009 12:56

Ja, also nun geht es. ich hab doch NAatalies Version mit COPYSTR benutzt. Die war mit die "einfachste". Wildcards in textfeldern gibt es wohl einfach nicht.. Danke für eure Hilfe.

Nico