GroupTotalFields über mehrere DataItems

4. Januar 2007 19:37

Wunscherschönen guten Abend!

Ich muss leider gestehen, dass ich erst seit einigen Monaten mit Nav arbeite, und leider nicht unbedingt ein Freund von Programmieren unter Nav.

Unsere Rechnungswesenabteilung (Ich verfluche Sie) möchte einen Report der folgendes macht:

Sales Invoice Header - Alle Verkaufsaufträge bzw. nach ReqForm gefiltert
G/L Entry - Die jeweiligen Buchungszeilen dazu
Und jetzt zum eigentlichen Problem - am Ende des Reports pro Sachkonto eine Summe.

Wenn ich die G/L Entry´s mit GroupTotalFields im Report anzeige, gekomme ich klarerweise die Gruppeninfos immer pro Sales Invoice Header summiert, aber ich möchte die Summe im Sales Invoice Header Footer haben. Und eben zwar nach Sachkonto gruppiert.

Ich habe schon so ziemlich alles versucht. Nachdem die Abfrage des Sales Invoice Headers gefiltert ist, muss ich leider die G/L Entry Zeile Verlinken. Und somit komme ich nie zu meinen Gruppen.

Ich hoffe mein Anliegen ist einigermaßen verständlich, und bitte um Hilfe.

Vielen Dank im Voraus.

5. Januar 2007 01:00

Die Idee mit den Grouptotals ist schon der richtige Ansatz.
Ausserdem brauchst du eine temporäre Tabelle mit 2 Feldern: Kontonr. und Betrag.
In den Groupfooter-onpresection Triggern platzierst du ein Currreport.Showoutput(false) damit die Sektion nicht gedruckt wird.
Dann füllst du im gleichen Trigger deine Temporäre Tabelle mit der aktuellen Kontonr und der Gruppensumme, bzw bei schon vorhandenem Eintrag addierst du die Gruppensumme zum vorhandenen Betrag hinzu.
Am Ende fügst du dann auf gleicher Ebene wie der Sales Header ein DataItem hinzu, dass diese temporäre Tabelle als Quelle hat. Damit gibst du dann die summierten Gruppensummen aus.

8. Januar 2007 11:57

Bei solchen Anforderungen bin ich immer froh dass ich JetReports habe ...

Danke für die Tipps

8. Januar 2007 16:56

Das mit der Temporären Tabelle scheint mir doch ein wenig zu Aufwendig. Vor allem bei meinen minderbemittelten Programmierkentnissen.

Ich werde versuchen das Problem anders zu lösen. Sollte ich etwas passendens gefunden haben, werde ich dies selbstverständlich posten.

Nur eine kurze Frage gleich noch bezüglich JetReport. Ich habe gedacht diese Option sei nur bei der verwendung mit Excel sinnvoll. Zumindest was ich auf der Homepage gesehen habe. Kann ich damit leicht und schneller Reports auch direkt im Navision machen?

Danke.

8. Januar 2007 17:06

Ich (persönlich) kann dir nur dazu raten, den inneren Schweinehund bezüglich der temporären Tabellen zu überwinden, weil es
a) wirklich nicht schwer ist
b) du es immer wieder brauchen wirst (weils einfach meistens die beste Alternative ist).

Re: Danke für die Tipps

8. Januar 2007 18:10

martinhaindl hat geschrieben:[...] Nur eine kurze Frage gleich noch bezüglich JetReport. Ich habe gedacht diese Option sei nur bei der verwendung mit Excel sinnvoll. Zumindest was ich auf der Homepage gesehen habe. Kann ich damit leicht und schneller Reports auch direkt im Navision machen?[...]


Das hast du richtig gesehen. JetReports kommuniziert aus Excel heraus über C/FRONT mit Navision, d.h. du hast die Auswertung dann "nur" im Excel. Innerhalb Navision hast du keinen Nutzen von JetReports. Allerdings - wenn du Auswertungen an Fachabteilungen herausgeben sollst, ist denen oft egal, in welchem Programm die Auswertung erstellt wurde, Hauptsache die Datenbasis stimmt. Manchmal ist ihnen Excel sogar lieber, weil man mit den Daten mehr anfangen kann (Weiterverarbeitung) als mit dem Print-Output eines Navision-Reports.
Im JetReport stehen dir außerdem alle Funktionen von Excel zur Verfügung (Teilergebnisse, Summenfunktionen etc.), so dass du die Power von Navision und die von Excel bündeln kannst. Dazu kommt, dass der (Jet-)Report auch immer wieder ausgeführt werden kann (ohne verändert werden zu müssen) und immer die aktuellen Daten aus Navision holt.

Was die Temp. Tables angeht, gebe ich Natalie recht, so schwer ist es nicht, und brauchen kann man es immer wieder.

LG
Dirk

Re: Danke für die Tipps

8. Januar 2007 21:49

martinhaindl hat geschrieben:Das mit der Temporären Tabelle scheint mir doch ein wenig zu Aufwendig. Vor allem bei meinen minderbemittelten Programmierkentnissen.

Ich kann mich Natalie nur anschließen. Das ist etwas was man in vielen Situationen sinvoll einsetzen kann. Klar, auf die schnelle wird man soetwas nicht lernen, aber ich würde es schön im Hinterkopf behalten. :-)

Zu JetReports: JetReports können natürlich auch gut und an vielen Stellen eingesetzt werden, aber auch dort muss man sehr gute Kenntnisse von der Tabellenstruktur haben.

Gruß, Marc

15. Januar 2007 13:05

Danke vielmals für eure Tips. Ihr seid wirklich schnell.

Ich habe es nun doch ohne Temp Tabelle geschafft. Ich muss aber zugegen das ich externe Unterstützung hatte, bzw. jemand hat es für mich fast fertigprogrammiert und ich habe die Sache dann nur noch in meine Report eingefügt. Gelöst wurde es nun mit einem Array.

Ich werde mir das mit der externen Tabelle jedoch im Hinterkopf behalten und bei Gelegenheit nochmals versuchen.

Nachmals vielen Dank an alle. :-P

15. Januar 2007 13:13

Falls dein Array keine fixe Größe hat, dann IST es eine temp. Tabelle ;-)

Veröffentliche die Lösung doch mal, dass evtl. auch andere etwas davon haben?

Veröffentlichung

17. Januar 2007 13:56

Hallo!

Anbei der Code. Nachdem das ganze mit Unterstützung erstellt wurde, und nicht aus meiner Hand stammt, kann ich natürlich auch nicht sicher sagen wie was wo.

Zumindest für alle die es benötigen können anbei der Code.


[hr]

Sorry ich habe keine Ahnung was ich machen muss, damit der Code in so einer schönen grünen Box angezeigt wird. Drum copy & paste. :?:

Code:
[color=blue]// AM DATAITEM G/L Entry Cr. Purch - OnAfterGetRecord()
// VAR Globals
// KontensaldoHaben Decimal
// KontensaldoSoll  Decimal
// Kontonummer      Integer
// GesamtsummeHaben  Decimal
// Gesamtsumme Soll Decimal

// Die Kontonummern sind vom Typ CODE, gottseidank werden in Österreich nur Zahlen
// verwendet, wir können also einfach konvertieren, das ergibt einen Index für das
// Speicherarray

EVALUATE(Kontonummer,"G/L Account No.");

// Wir addieren die Zeilenbeträge zu den jeweiligen Speicherarray-Zellen bzw.
// der Gesamtsumme

KontensaldoHaben[Kontonummer] := KontensaldoHaben[Kontonummer] + "Credit Amount";
GesamtsummeHaben := GesamtsummeHaben + "Credit Amount";

KontensaldoSoll[Kontonummer] := KontensaldoSoll[Kontonummer] + "Debit Amount";
GesamtsummeSoll := GesamtsummeSoll + "Debit Amount";



// In der SECTION G/L Account, Body (2) - OnPreSection()
// Wir müssen wieder den Arrayindex aus dem CODE-Feld extrahieren

EVALUATE(Kontonummer, "No.");

// Wenn der Wert ungleich Null ist, zeigen wir den Saldo des Kontos an

IF (KontensaldoHaben[Kontonummer] <> 0) OR (KontensaldoSoll[Kontonummer] <> 0) THEN
  CurrReport.SHOWOUTPUT(TRUE)
ELSE
  CurrReport.SHOWOUTPUT(FALSE);[/color]


[Edit - Rotsch/17.01.07] Codezeilen für bessere Lesbarkeit formatiert

17. Januar 2007 14:17

Um Code zu schreiben, schreibe [ code] vor den Text und [/ code] hinter den Text - ohne die Leerzeichen innerhalb der eckigen Klammern.

Mit wie vielen Dimensionen wurden eigentlich die Array-Variablen deklariert? (falls du das noch nicht kennst: gehe auf eine dieser Variablen in der Liste der globalen Variablen und rufe deren Eigenschaften auf)

19. Januar 2007 15:58

KontensaldoHaben Decimal Dimension 99999
KontensaldoSoll Decimal Dimension 99999

Die Anzahl an Dimensionen ergeben sich durch die Länge der Sachkonten in Österreich. Die meisten Kontenrahmen liegen im 5 stelligen Bereich.