[gelöst]Navisionfilter verwenden

20. August 2009 09:44

Hallo,

wie kann ich in einer Funktion die Filter verwenden/übertragen, die ich auf einer Karte mit F7 gesetzt habe.

Danke

vg
Zuletzt geändert von rom am 20. August 2009 16:38, insgesamt 1-mal geändert.

Re: Navisionfilter verwenden

20. August 2009 10:36

es gibt hier mehrere Möglichkeiten:

Mit COPY überträgst du alle Filter von Rec nach Rec2:
Code:
Rec2.COPY(Rec)


Du kannst auch alle Filter als Text auslesen:
Code:
FilterText := Rec.GETFILTERS;


oder du lässt dir einen bestimmten Filter als Text zurückliefern:
Code:
FilterText := Rec.GETFILTER(Feld1);


Gruß Torsten

Re: Navisionfilter verwenden

20. August 2009 10:42

Kommt darauf an, was du machen möchtest.

Einzelne Filter auslesen:
String := Record.GETFILTER(Field)
(Schau dir in der Online-Hilfe an)

Mit diesem kannst du je Feld den gesetzten Filter auslesen.
z.B.:
Code:
ItemFilter := Item.GETFILTER("No.");
DeineFunktion(ItemFilter);



Alternativ kannst du auch einen ganzen Record übergeben, z.B.:
Angenommen "HoleWährungscode" ist eine Funktion in der CodeUnit "Tools" und erwartet einen Record der Tabelle 37. Als Rückgabewert liefert diese den Währungscode vom Typ Code.
Code:
Währungscode := Tools.HoleWährungsCode(VerkaufsZeileRec);


Noch einen Schritt weiter könntest du auch per SETTABLEVIEW arbeiten, z.B. In Reports
1. Hierzu die Form (oder Dataport / Report) als Variable deklarieren.
2. Den Record, der gefiltert übergeben werden soll Filtern.
3. Das Objekt öffnen

z.B.

Code:
// Artikelkarte wurde als Variable vom Typ Form deklariert (Form 30)
LItemRec.SETRANGE(LItemRec."No.",DeinFilter);
Artikelkarte.SETTABLEVIEW(LItemRec);
Artikelkarte.RUNMODAL;


Im w1w1adg.pdf steht auch etwas über Funktionsaufrufe drin, u.a. auf Seite 312 "Function Calls".

Ich hoffe ich konnte das halbwegs verständlich erklären? :wink:

Re: Navisionfilter verwenden

20. August 2009 10:45

Nicht zu vergessen
Code:
CurrForm.SETSELECTIONFILTER(ZielRec);

Re: Navisionfilter verwenden

20. August 2009 13:34

Danke für die vielen Antworten. Ich glaube aber, nachdem ich diese ausprobiert habe, dass diese bei mir nicht funktionieren. Es werden immer noch alle Datensätze verändert, nicht nur die, die geflitert sind.

Re: Navisionfilter verwenden

20. August 2009 13:44

Dann schreibe uns, was das Ziel sein soll und was du bisher gemacht hast.
Wäre doch gelacht, wenn wir das hier im Board nicht lösen können :-)

Re: Navisionfilter verwenden

20. August 2009 13:46

rom hat geschrieben:Danke für die vielen Antworten. Ich glaube aber, nachdem ich diese ausprobiert habe, dass diese bei mir nicht funktionieren. Es werden immer noch alle Datensätze verändert, nicht nur die, die geflitert sind.


Ich glaube eher, dass an deinem Quelltext etwas faul ist - zeig doch mal her ;-)

Re: Navisionfilter verwenden

20. August 2009 13:48

Natalie hat geschrieben:Ich glaube eher, dass an deinem Quelltext etwas faul ist - zeig doch mal her ;-)


Klar gerne.... in dieser Version ist deine gepostet Möglichkeit implementiert...

Code:

IF CONFIRM(TEXT001,FALSE,gcoResourceNo) THEN BEGIN
  RESET;
  SETFILTER("Resource No.",gcoResourceNo);
  SETRANGE("Document closed",FALSE);
//  Setrange("Posting Date"
  IF FINDFIRST THEN BEGIN
   REPEAT
     greWorkTime.RESET;
     //greWorkTime.SETFILTER("Resource No.",gcoResourceNo);
     //greWorkTime.SETRANGE("Document closed",FALSE);
     CurrForm.SETSELECTIONFILTER(greWorkTime);
     greWorkTime.MARKEDONLY;
     IF greWorkTime.FINDSET THEN BEGIN
      greWorkTime."Document closed" := TRUE;
      greWorkTime."Approval Status Responsible" := greWorkTime."Approval Status Responsible"::Released;
      greWorkTime."Approval Date Responsible" := TODAY;
      greWorkTime.MODIFY;
     END;
   UNTIL NEXT = 0;
  END;
END;



Re: Navisionfilter verwenden

20. August 2009 14:44

Uaaaaaaaaah mein Fehler, dies nicht explizit zu erwähnen: SETSELECTIONFILTER ist dafür gedacht, die Datensätze zu ermitteln, die durch den Benutzer dunkelblau angeklickt worden sind - nicht für Satzmarken oder selbst gewählte Filter!

Aber dein Konstrukt macht ohnehin keinen Sinn, wenn du Rec (bzw. dessen von dir gesetzten Filter) zuerst mit
Code:
RESET;
SETFILTER("Resource No.",gcoResourceNo);
SETRANGE("Document closed",FALSE);

"kaputt machst" um ihn DANACH mit CurrForm.SETSELECTIONFILTER(greWorkTime); wieder auszulesen.
SETSELECTIONFILTER geht auf Rec und schiebt seine Filter in greWorkTime.

Mir ist so nicht klar, was du eigentlich erreichen willst?

Re: Navisionfilter verwenden

20. August 2009 14:45

Was soll der Code eigentlich leisten?

Ich habe mal ein paar auffällige Stellen kommentiert, die allerdings nicht unbedingt erklären, dass jeder Datensatz verändert wird (kann aber grad nichts testen, also ohne Gewähr .. )

rom hat geschrieben:
Code:
IF CONFIRM(TEXT001,FALSE,gcoResourceNo) THEN BEGIN
  RESET;  // Falls es hier um das rec der Form handelt: von hier ...
  SETFILTER("Resource No.",gcoResourceNo); // SetRange wäre schöner ;)
  SETRANGE("Document closed",FALSE); 
//  Setrange("Posting Date"
  IF FINDFIRST THEN BEGIN // .. bis hier schränkst du den Filter auf die Zeilen noch weiter ein (FINDSET wäre übrigens besser), den du ..
   REPEAT
     greWorkTime.RESET;
     //greWorkTime.SETFILTER("Resource No.",gcoResourceNo);
     //greWorkTime.SETRANGE("Document closed",FALSE);
     CurrForm.SETSELECTIONFILTER(greWorkTime); // hier setzt. Nun dürften in greWorkTime nur noch die DS übrig sein, die in der Form UND durch SetRange/-Filter gefiltert wurden
     greWorkTime.MARKEDONLY; // diese Zeile wäre überflüssig (das macht setselectionfilter sowieso)
     IF greWorkTime.FINDSET THEN BEGIN  // Sind greWorkTime und rec Instanzen derselben Tabelle? (Hier wäre allerdings FINDFIRST besser)
      greWorkTime."Document closed" := TRUE;
      greWorkTime."Approval Status Responsible" := greWorkTime."Approval Status Responsible"::Released;
      greWorkTime."Approval Date Responsible" := TODAY;
      greWorkTime.MODIFY;
     END;
   UNTIL NEXT = 0;
  END;
END;

Re: Navisionfilter verwenden

20. August 2009 14:49

Natalie hat geschrieben:Aber dein Konstrukt macht ohnehin keinen Sinn, wenn du Rec (bzw. dessen von dir gesetzten Filter) zuerst mit
Code: Alles auswählen
RESET;
SETFILTER("Resource No.",gcoResourceNo);
SETRANGE("Document closed",FALSE);
"kaputt machst" um ihn DANACH mit CurrForm.SETSELECTIONFILTER(greWorkTime); wieder auszulesen.

Sicher? Ich meine, dass sich das nun addiert (Filter+SelectionFilter)

Natalie hat geschrieben:Mir ist so nicht klar, was du eigentlich erreichen willst?

Immerhin da sind wir uns einig :-)

Re: Navisionfilter verwenden

20. August 2009 14:54

McClane hat geschrieben:Sicher? Ich meine, dass sich das nun addiert (Filter+SelectionFilter)

Ach, ich habs schon wieder durcheinander gewürfelt: SETSELECTIONFILTER holt keinen Benutzerfilter, sondern setzt(!) einen auf Basis der Zeilenmarkierungen. Insofern dürfte ihn auch das RESET - theoretisch - nicht stören.
Insofern ist SETSELECTIONFILTER für diese Anforderung (Filter des Benutzers holen) sowieso nicht geeignet :-/

Re: Navisionfilter verwenden

20. August 2009 14:57

alse, rec und greWorkTime sind die gleiche Tabelle.

Das Form dient dazu, Zeiterfassungsdatensätze einer Ressource freiszugeben. Das mache ich, in dem ich bei den Datensätze der Wert bei Document closed auf true setze. Ich möchte nun die Filter weiterverwenden, die ich im Form setzen kann. (f7 oder Button) Wenn dort Filter gesetzt sind, sollen diese bei der Freigabefunktion mit übernommen werden.

Wenn ich also insgesamt 7 DS habe, filtere ich mir im Form 2 heraus, so dass im Form nur noch diese beiden angezeigt werden. Wenn ich nun die Freigabefunktion verwende, sollen nur diese beiden DS freigegeben werden. Momentan werden alle freigegeben.

danke!
lg

Re: Navisionfilter verwenden

20. August 2009 15:09

rom hat geschrieben:Das Form dient dazu, Zeiterfassungsdatensätze einer Ressource freiszugeben. Das mache ich, in dem ich bei den Datensätze der Wert bei Document closed auf true setze. Ich möchte nun die Filter weiterverwenden, die ich im Form setzen kann. (f7 oder Button) Wenn dort Filter gesetzt sind, sollen diese bei der Freigabefunktion mit übernommen werden.

Dann hat Natalie natürlich Recht, dafür taugt der SetSelectionFilter nicht.

Würde da nicht ein copyfilters helfen?

Re: Navisionfilter verwenden

20. August 2009 15:33

übernimmt den Copyfilters diese Filter mit?

Re: Navisionfilter verwenden

20. August 2009 15:45

rom hat geschrieben:übernimmt den Copyfilters diese Filter mit?

copyfilters kopiert alle Filter, die auf der Form gesetzt sind. Allerdings überschreibt man damit alle davor auf das Ziel-rec gesetzten Filter, und danach per SetRange gesetzte Filter bewirken, dass die kopierten Filter verloren gehen (oder?). Wenn das so ist (kann wie gesagt nicht schauen), kann man zweiteres evtl. mit Filtergroup oder Markieren umgehen.

Re: Navisionfilter verwenden

20. August 2009 16:34

ich muss nicht wirklich das setrange nehmen. Wenn ich über den copyfilter die Datensätze bekommen, ist mir das auch recht.

Re: Navisionfilter verwenden

20. August 2009 16:38

habe es hinbekommen, danke für eure hilfe