29. Januar 2024 16:13
NAV 2027
Hallo zusammen,
ich habe eine Listview und gebe dort oben rechts einen Filter ein. Nach Ausführung des Filters werden nur noch die gefilterten Datensätze gelistet.
Wie kann ich auf diese gefilterten Datensätze eine Aktion ausführen? COPYFILTERS ist nicht der richtige Befehl. Der setzt ja ein codiertes SETRANGE voraus.....
Vielen Dank!
Grüße
29. Januar 2024 16:22
Versuch's mal mit SETSELECTIONFILTER wobei das eigentlich die Markierung und nicht die Filterung übertragen sollte.
29. Januar 2024 16:29
SETSELECTIONFILTER --> das kenn ich auch. Ohne?
29. Januar 2024 16:43
Ralph71 hat geschrieben:SETSELECTIONFILTER --> das kenn ich auch. Ohne?
Ich verstehe die Frage "Ohne?" nicht...
https://learn.microsoft.com/de-de/previ ... R-Function
29. Januar 2024 16:47
entschuldigung. "Ohne" = ohne, dass markiert werden muss.
29. Januar 2024 17:01
Da bin ich mir gerade nicht sicher, ich glaube dass man aber erst markieren muss - musst du mal ausprobieren.
29. Januar 2024 17:15
Hallo,
eigentlich müsste Rec gefiltert sein (Alle markieren sollte also nicht nötig sein, wenn du nicht SetSelctionFilter benutzt). Das Problem könnten allerdings die FilterGroups sein, wenn du nicht Rec benutzen möchtest.
Ich habe jetzt nicht im Kopf ob "OtherRec.Copy(Rec)" die Filtergroups mit kopiert. Bitte mal probieren.
Gruß Fiddi
30. Januar 2024 08:46
"OtherRec.Copy(Rec)" --> und woher soll "er" jetzt wissen, dass im Frontend ein Filter gesetzt wurde?
Hab das natürlich getestet. Er zeigt mir nach einem REPEAT auf den OtherRec immer den letzten Datensatz der gesamten Liste. Da fehlt doch noch was....
30. Januar 2024 10:27
Hallo,
versuchs vor dem Repeat mal mit dem "If OtherRec.FindSet() Then" . Ohne den funktioniert alles andere auch nicht.
Gruß Fiddi
31. Januar 2024 12:01
Das macht doch so keinen Sinn.
Wie soll die CU auch wissen, dass tempTbl2 jetzt einen Filter nutzen soll...
Ergebnis vom counter ist immer identisch. In meinen Augen auch logisch.
- Code:
OnRun()
counter := 0;
IF tempTbl.FINDSET THEN BEGIN
REPEAT
counter:= counter + 1;
UNTIL tempTbl.NEXT = 0;
MESSAGE (FORMAT(counter));
tempTbl2.COPY(tempTbl);
IF tempTbl2.FINDSET() THEN BEGIN
counter := 0;
REPEAT
counter:= counter + 1;
UNTIL tempTbl2.NEXT = 0;
MESSAGE (FORMAT(counter));
END;
END;
31. Januar 2024 12:35
Hallo,
das musst du aber auch dabei schreiben, das du mit temporären Tabellen arbeitest. Da ist da ein bisschen anders.
Wenn du bei einer Temp-Tabelle eine Referenz an einen anderen Temp- Record übergeben möchtest, dann musst du beim Copy noch den Parameter ",true" angeben.
Ansonsten kopiert er nur die Filter, und nicht die Referenz auf die Tabelle, was bei Temp-Tabellen wichtig sein könnte, die haben nämlich jede für sich eigenständige Daten und greifen normalerweise nicht auf gemeinsame Daten zu.
Gruß Fiddi
31. Januar 2024 13:50
nein, sind keine temp-Tabellen. ist nur das Basiskonstrukt vom letzten Test.
Trotzdem: der Code kann doch so nicht funktionieren. Er kopiert einen Record bzw die Referenz in den anderen mittels "tempTbl2.COPY(tempTbl);"
An welcher Stelle kommt denn der Filter übers Frontend in die Codierung?
31. Januar 2024 15:52
Die Funktion die du suchst könnte SETRECFILTER sein. Diese kopiert die Filter vom aktuelle Rec auf eine beliebige Variable. Du könntest auch mit SETVIEW, GETVIEW arbeiten.
31. Januar 2024 17:47
SETRECFILTER setzt einen Filter auf den aktuellen Record und nur den.
Gruß Fiddi
31. Januar 2024 18:28
Ich hab das mal gerade getestet - in NAV 2017.
Page 440 Issued Reminder List
Standard Page Action:
<Action16> - OnAction()
CurrPage.SETSELECTIONFILTER(IssuedReminderHeader);
IssuedReminderHeader.PrintRecords(TRUE,FALSE,FALSE);
Die funktioniert für markierte Datensätze, der Anwender markiert 3 Mahnungen und die werden dann gedruckt.
<Action1000000000> - OnAction()
IssuedReminderHeader.COPYFILTERS(Rec);
IssuedReminderHeader.PrintRecords(TRUE,FALSE,FALSE);
Meine Page Action funktioniert für Filter. Der Anwender filtert auf die 3 Mahnungsnummern und die werden dann gedruckt.
31. Januar 2024 23:21
Hallo,
Wenn du den gefilterten Record an eine Codunit übergeben willst, Dann musst du in der Codeunit deine Tabelle als Record definieren und Im RUN-Trigger Rec benutzen, der enthält dann auch die Filter.
Der Aufruf der Codeunit erfolgt dann so:
- Code:
Table.Setrange(XXX,123);
Codeunit.Run(Codeunit::DoSomething,Table);
in der Codeunit sieht da etwa so aus.
- Code:
OnRun(var Rec)
IF Rec.FindSet then
repeat
Do something important
Until rec.next =0;
Gruß Fiddi
2. Februar 2024 13:41
Lösung:
in der aufnehmenden Codeunit "Check" muss eine öffentliche Funktion "SetFilter" angelegt werden, die den Filter entgegen nimmt und in den RecordZiel kopiert.
Mit RecordZiel kann dann in der Codeunit weitergearbeitet werden.
RecordZiel.COPY(paraRecordQuelle);
In der abgebenden Codierung muss der Filter des Frontends (liegt in der Rec-Variablen) an die Funktion "SetFilter" der Codeunit Check übergeben werden. Anschließend wird die Codeunit gestartet.
Check.SetFilter(Rec);
Check.RUN;
Fertig.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.