[gelöst] Report Filter

23. September 2008 10:57

Hallo Leute,

ich habe mal ne Frage zur Reportprogrammierung.

Ich habe einen Report der aus mehreren Data-Items besteht. Alle Data-Items beziehen sich auf die Tabelle G/L-Entry.

Jedes Data-Item hat unterschiedliche Filterkriterien.

Diese Filterkriterien setze ich im OnPreDataItem Bereich des jeweiligen Data-Item mit Data-Item.setrange, bzw. Data-item.setfilter.

So jetzt zum eigentlich Problem.

Kann ich die Tabelle G/L Entry im Vorfeld schon mit Filter belegen, so dass quasi die Tabelle G/L-Entry nur eingeschränkt (bzw. vorgefiltert)

für die anderen Data-Items zur Verfügung steht?

Quasi so ne Art Hauptfilter der den anderen Filter vorgeschaltet ist?

Vielen Dank für eure Mühen im Vorraus

mfg

zimbo
Zuletzt geändert von zimbo am 24. September 2008 13:43, insgesamt 3-mal geändert.

Re: Report Filter

23. September 2008 11:01

Mein Kollege meinte ich müßte im Vorfeld

quasi beim Report start die Tabelle G/L Entry mit den entsprechenden Filtern

in ein Array schreiben. Anschließend sollten sich die Data-Items auf dieses Array beziehen.

Re: Report Filter

23. September 2008 11:05

Warum so kompliziert?
Warum nicht auch im OnPreDateItem oder direkt über das Property DataItemTableView?

Hoffe ich hab dich richtig verstanden ;)

Re: Report Filter

23. September 2008 11:08

Code:
onPreReport
GLEntryMain.Setrange(...); //hier setzt du die Filter für die alle G/L-Entry-Records gelten sollen
GLEntryMain.Setfilter(...); //hier das gleiche mit Setfilter, wenn nötig

GLEntry1.Copy(GLEntryMain);
GLEntry2.Copy(GLEntryMain); // und so weiter und so fort


mit dem Copy-Befehl kopierst du Records (gleiche Table!) und deren Filter

im onPreDataItem kannst du nun deine einzelnen Records weiter abfiltern

Re: Report Filter

23. September 2008 11:21

Außerdem stehen dir die Befehle COPYFILTER und COPYFILTERS zur Verfügung (siehe Onlinehilfe).
Diese kannst du dann verwenden, falls du in den anderen DataItems einen anderen Schlüssel gewählt hast und dieser NICHT durch deine "Kopiervorlage" geändert werden soll.

Re: Report Filter

23. September 2008 11:23

@Sebastian

Frage:

ich lege also eine Record Variable mit dem Namen GLEntryMain an. Dort setze ich die Hauptfilter. Soweit habe ich das verstanden.

GLEntry1 ist jetzt eine weitere Record Variable? Oder ist das jetzt das DataItem?

Besten Dank für die schnelle antworten.

Re: Report Filter

23. September 2008 11:25

zimbo hat geschrieben:@Sebastian

Frage:

ich lege also eine Record Variable mit dem Namen GLEntryMain an. Dort setze ich die Hauptfilter. Soweit habe ich das verstanden.

GLEntry1 ist jetzt eine weitere Record Variable? Oder ist das jetzt das DataItem?

Besten Dank für die schnelle antworten.

Hinter dem Namen eines DataItems steckt nichts anderes als eine Record-Variable (auf eine bestimmte Tabelle). Du kannst sie (Recordvariablen und DataItems) also gleichwertig verwenden und auf zusätzliche Recordvariablen verzichten.

Re: Report Filter

23. September 2008 11:30

Hallo!

Habe jetzt im Report folgendes gemacht.

OnPreReport

test.SETFILTER(test."G/L Account No.",'8125');

Im DataItem (Name ist Umsatz Labor)

"Umsatz Labor".COPY(test);

"Umsatz Labor".SETRANGE("Umsatz Labor"."Global Dimension 2 Code",FORMAT(1020),FORMAT(1025));
"Umsatz Labor".SETFILTER("Umsatz Labor"."G/L Account No.",'8000..8445|8730..8744|8989..8995');
"Umsatz Labor".SETRANGE("Umsatz Labor"."Posting Date",startdate,enddate);

Trotzdem zeigt er mir alle Datensätze an von den drei Filter an. Der erste Filter (8125) greift nicht.

Was mache ich falsch?

Re: Report Filter

23. September 2008 11:33

Dein Quelltext könnte sich an falscher Stelle befinden (das kann ich nichti so ohne Weiteres herauslesen).

Dieser Teil gehört in Umsatz Labor - OnPreDataItem
Code:
"Umsatz Labor".COPY(test);

"Umsatz Labor".SETRANGE("Umsatz Labor"."Global Dimension 2 Code",FORMAT(1020),FORMAT(1025));
"Umsatz Labor".SETFILTER("Umsatz Labor"."G/L Account No.",'8000..8445|8730..8744|8989..8995');
"Umsatz Labor".SETRANGE("Umsatz Labor"."Posting Date",startdate,enddate);


Außerdem widersprechen sich deine Filter.
Deine Vorlage war eine bestimmte Sachkontennr.:
Code:
test.SETFILTER(test."G/L Account No.",'8125');

Diese überpinselst du hier aber hiermit:
Code:
Umsatz Labor".SETFILTER("Umsatz Labor"."G/L Account No.",'8000..8445|8730..8744|8989..8995');


Wenn du Quelltexte veröffentlichst, schreibe sie bitte so: [code]Dein Quelltext[/code]

Re: Report Filter

23. September 2008 11:38

Hallo Natalie,

der Code befindet sich in Umsatz Labor - OnPreDataItem.

Trotzdem greift der erste Filter nicht.

langsam verzweifel ich an navision und diesem Report-Designer...

vielen dank für eure Hilfe und Unterstützung...

Re: Report Filter

23. September 2008 11:40

Nochmal, der erste Filter kann nicht greifen, wenn du ihn im zweiten Anlauf direkt mit anderen Werten überschreibst.

Schreib mal in den OnPreDataItem nur die COPY-Zeile ohne weitere SETFILTERs.

Re: Report Filter

23. September 2008 11:43

Hallo!

Ok mit dem CODE merke ich mir. :-D .

Kann ich nicht das einstellen das es so läuft.

Tabelle G/L Entry wird durch den Hauptfilter (8125) eingeschränkt.

Der zweite Filter greift jetzt auf die vorgefilterte Tabelle zu ohne den ersten Filter zu löschen.

Re: Report Filter

23. September 2008 11:50

zimbo hat geschrieben:Der zweite Filter greift jetzt auf die vorgefilterte Tabelle zu ohne den ersten Filter zu löschen.

Nein, so funktioniert die Filtersetzung in NAV nicht (siehe Onlinehilfe).
Wenn du einen SETFILTER oder SETRANGE wiederholst, wird der vorherige Inhalt einfach gelöscht.

Wenn du den Filter ergänzen möchtest, musst du die Inhalte logisch vernüpfen.
Beispiel:
Filterung Nr 1:
Code:
Record1.SETFILTER(Feldname, '50..60');

Filterung Nr 2:
Code:
Record2.SETFILTER(Feldname, 70);


So muss es dann aussehen:
Code:
SETFILTER(Feldname, '50..60|70');

Die erreichst du so:
Code:
SETFILTER(Feldname, '%1|70', Record1.GETFILTER(Feldname));

Re: Report Filter

23. September 2008 11:53

Ok mit der Filtersetzung habe ich verstanden.

Also muss ich das doch mit so ne Art virtuellen Tabelle, bzw. Array machen.

Wo ich die Datensätze reinschreibe mit dem ersten Filter.

Anschließend setze ich auf diese virtuelle Tabelle, bzw. Array den zweiten Filter!?

@Natalie

das Problem ist das ich den zweiten Filter nicht erweitern kann da dieser meistens mehr hat als der erste.
Darum muss der erste Filter die Tabelle im Prinzip einschränken und dann soll der zweite drüber laufen.

Re: Report Filter

23. September 2008 12:02

zimbo hat geschrieben:Darum muss der erste Filter die Tabelle im Prinzip einschränken und dann soll der zweite drüber laufen.
Das Problem ist das ich den zweiten Filter nicht erweitern kann da dieser meistens mehr hat als der erste.

Dann brauchst du halt keine ODER-Verknüpfung ("|"), sondern eine UND-Verknüpfung ("&").
Dann schränken sich die Filter gegenseitig ein und du musst keinen Umweg über einen "Array" gehen.

Re: Report Filter

23. September 2008 12:04

Hallo Natalie,

kannst du das eventuell für mein Beispiel mal posten?

Irgenwie versteh ich jetzt das & nicht.

Re: Report Filter

23. September 2008 12:05

nein nichts mit arrays

sie meint wenn du einen filter auf das bereits gefilterte feld erweitern willst (zum beispiel du filterst im vornherein auf eine option im feld "testoption", später willst du aber eine zweite option aus diesem feld mit abfiltern, dann müsstest du so filtern: 'option1|option2', denn wenn du einfach zweimal einen setfilter/setrange auf das feld machst, dann wird der erste setfilter/setrange vom zweiten überschrieben: setrange("testoption","testoption"::option1) und das gleiche danach mit option2 überschreibt dir den ersten befehl und du hast nur auf option2 gefiltert

Re: Report Filter

23. September 2008 12:07

Ich meinte das hier:
Code:
SETFILTER(Feldname, '%1&70', Record1.GETFILTER(Feldname));

Einfach das | durch ein & austauschen

Re: Report Filter

23. September 2008 12:10

Nein, so sollte es aussehen:
Code:
"Umsatz Labor".SETFILTER("G/L Account No.", '8000..8445|8730..8744|8989..8995&%1', test.GETFILTER("G/L Account No."));


Ohne Verwendung eines Platzhalters (%1) kommst du nicht weiter.

SORRY zimbo, hab aus Versehen deinen Betrag editiert statt einen neuen zu schreiben, war wirklich keine Absicht!
Natalie
:oops: :oops: :oops:

Re: Report Filter

23. September 2008 12:14

Sorry, über diesem Beitrag meine tümpelhafte Korrektur ... :oops:

Re: Report Filter

23. September 2008 12:16

ich weiß wo der fehler liegt, es fehlen klammern

Re: Report Filter

23. September 2008 12:17

Sebastian Pfliegel hat geschrieben:ich weiß wo der fehler liegt, es fehlen klammern


Denke nicht, zimbos Vorschlag hatte nämlich (in etwa :oops: ) diesen Aufbau:

Code:
"Umsatz Labor".SETFILTER("G/L Account No.", '8000..8445|8730..8744|8989..8995', test.GETFILTER("G/L Account No."));

Also kein Platzhalter, der das test.GETFILTER("G/L Account No.") überhaupt aufnehmen konnte.
Die Klammern waren schon OK.

Re: Report Filter

23. September 2008 12:20

Natalie hat geschrieben:
Sebastian Pfliegel hat geschrieben:ich weiß wo der fehler liegt, es fehlen klammern


Denke nicht, zimbos Vorschlag hatte nämlich (in etwa :oops: ) diesen Aufbau:

Code:
"Umsatz Labor".SETFILTER("G/L Account No.", '8000..8445|8730..8744|8989..8995', test.GETFILTER("G/L Account No."));

Also kein Platzhalter, der das test.GETFILTER("G/L Account No.") überhaupt aufnehmen konnte.
Die Klammern waren schon OK.


ich meine ja auch im filter ;)

also so:
Code:
"Umsatz Labor".SETFILTER("G/L Account No.", '(8000..8445|8730..8744|8989..8995)&(%1)', test.GETFILTER("G/L Account No."));

denn ein oder hat eine andere priorität wie ein und

Re: Report Filter

23. September 2008 12:21

Sebastian Pfliegel hat geschrieben:denn ein oder hat eine andere priorität wie ein und
Hm stimmt :-)

Re: Report Filter

23. September 2008 13:37

Hallo !

@Natalie Kein Problem wenn du meinen Beitrag bearbeitet hast. Gib schlimmers. :-D :-D

@all Vielen Vielen Dank. Läuft einwandfrei und super.

Dieses Forum ist echt mal GOLD :mrgreen: wert.

Ich hoffe, das ich irgendwann mal ein paar Posts schreiben kann die anderen Leuten weiter helfen können... ...

mfg

zimbo