so, wieder back.
Also mal in Ruhe :-)
Nehmen wir an, Du hast Mitarbeiter, die täglich irgendwelche Umsätze generieren. Jeder Umsatz wird einzeln = je 1 Dokument in Notes festgehalten. Dabei wird der Mitarbeiter, der Umsatz und der Tag erfasst. UND wir lassen das Problem nunmehr außer Acht, daß Mitarbeiternamen in diesem Unternehmen absolut einmalig sind. Form= "Umsatz"
Rambo am
01.01.2002 1000 Euro
01.01.2002 2000 Euro
02.01.2002 3000 Euro
Tiger am
01.01.2002 2000 Euro
01.01.2002 4000 Euro
02.01.2002 8000 Euro
Zampano am
01.01.2002 4000 Euro
01.01.2002 8000 Euro
02.01.2002 16000 Euro
Nun möchtest Du (hast es leider zu wenig erläutert, daher meine Annahme) pro Monat UND Mitarbeiter ein Dokument haben, in dem monatlich alle Umsätze pro Tag kumuliert angezeigt werden. Form= "Report"
Also 3 Dokumente sollen rauskommen:Rambo
01.01.2002 = 3.000 Euro
02.01.2002 = 3.000 Euro
Tiger
01.01.2002 = 6.000 Euro
02.01.2002 = 8.000 Euro
Zampano
01.01.2002 = 12.000 Euro
02.01.2002 = 16.000 Euro
Die Daten werden stets in maximal 31 Feldern pro Monatsumsatz-Mitarbeiterdokument abgelegt. Je ein Field "DatumX" und ein Field "SummeX" pro Tag. 31 deswegen, da dies der maximalen Anzahl von Monatstagen entspricht. Somit hast Du eine Art Tabelle von 31x2 Tagesfeldern, jeweils Datum und Umsatz-Summe.
Zusätzlich steht im Dokument ein Auswahlfeld, in dem das auszuwertende Monat/Jahr vom User auszuwählen ist, damit Notes weiß, welchen Monat es nun verarbeiten soll.
So, wie nun anhand der Umsatzdokumente die Monats-Auswertungen pro Mitarbeiter generieren und stets updaten?Schritt für Schritt
1. Step:User erstellt händisch ein Mitarbeiter Auswertungsdokument und stellt im 2 Auswahlfeldern "Januar" und "2002" ein.
2. Step:User klickt auf Aktionsbutton "Auswerten"
3. Step:Nun triggert die Formel im Aktionsbutton los. Keine großartige Formel. Nur ein "command - refresh" auf das Dokument. Warum? Die Maske ist aufgrund der Vielzahl der berechneten Felder auf "manuell aktualisieren" gesetzt. Daher statt "F9" für die User ein eigener Button (DAU Lösung halt *grins*)
4. Step:Zunächst wird ein internes Feld namens "LISTE" in der Maske gefüllt. Das Feld steht nach den Feldern "Mitarbeitername", "Monat" und "Jahr".
Dieses Feld wird nach der Berechnung alle Umsatzwerte für Mr. Zampano für Jan. 2002 im folgenden String-Format enthalten:
"Zampano~01.01.2002|4000
Zampano~01.01.2002|8000
Zampano~02.01.2002|16000"
GANZ Wichtig: das Feld LISTE muss zwingend Multivalue sein!!!
Wie wird das nun so gefüllt?Erstelle dazu eine Ansicht, die alle Umsatzdokumente enthält.
Also unsere wichtige Quellansicht!! 2 Spalten nur!
1. Spalte: Mitarbeitername~Jahr~Monat,
!!! SORTIERT, AUFSTEIGEND !!!
(Mitarbeiter + "~" + @Text(@Year(Datum)) + "~" + @Text(@Month(Datum)))
Bedeutet? Daß im Umsatzdokument 3 Felder dazu existieren müssen, um diese Ansicht so zu füllen=
1. Feld = Mitarbeiter
2. Feld = Datum des Umsatzes als Zeitwert und
3.Feld = Umsatz (kommt später dran)
2. Spalte: enthält Mitarbeitername~Datum|Umsatz
Spalten-Formel:
Mitarbeiter+ "~" + @Text(Datum) + "|" + @Text(Umsatz)
Soo...die Ansicht hätten wir, das
Berechnete Feld "LISTE" im Mitarbeiterdokument für Zampano, Januar 2002 auch. Wie lautet nun die Formel für das Big Feld "LISTE"?
_Key := Mitarbeiter + "~" + @Text(Jahr) + "~" + @Text(Monat);
_UmsatzList := @DbLookup("":"NoCache"; ""; "Umsätze"; _Key; 2);
@If(@IsError(_UmsatzList); ""; _UmsatzList)
Das erzeugt im Feld LISTE folgenden Inhalt:
"Zampano~01.01.2002|4000
Zampano~01.01.2002|8000
Zampano~02.01.2002|16000"
5. Step:Was machen wir nun mit diesem Multivalue-Inhalt bzw. wie gruppieren wir die Tagesumsätze zu einem Tages Gesamtumsatz und wie bekommen wir diesen Umsatz vom 01.01. und 02.01. in das entsprechende Feld???
Dazu erstellen wir die ersten beiden Umsatz-Reportfelder. Für den 01.01.2002:
Name "Date1" = @Date(Jahr; Monat; 1), Berechnet !
dann steht also drin 01.01.2002. Geschafft. Das war easy.
Das zweite, korrespondierende Feld lautet
"Umsatz1", berechnet und vom Typ Zahl, nicht Multivalue!
Optisch?
Mach halt pro Tag ne Tabellenzeile, am Ende haste also eine Tabelle mit 31 Zeilen und 2 Spalten + eine Kopfzeile für die Spaltenbeschriftung. In Spalte 1 das Datum und in Spalte 2 das Umsatzfeld jeweils (in jeder Zeile).
So, was steht nun als Formel in "Umsatz1" für den 01.01.2002?_Key := Mitarbeiter + "~" + @Text(Datum1);
_Key1 := Mitarbeiter + "~" + @Text(Datum1) + "|";
_Position := @Member(_Key; @Left(LISTE; "|") ) ;
_return:=@If(_Position > 0;@Right(LISTE; _Key1);"0");
@sum(@texttonumber(@explode(_return)))
Das ist der kumulierte Umsatz vom 01.01.2002
Übersetzt???_Key = "Zampano~01.01.2002"
_Key1 = "Zampano~01.01.2002|"
_Position = "1"
_return = "4.000" und "8.000"
und als letzte Zeile = 12.000 als Summe
Die Variable _Key benötige ich, um zu ermitteln, ob es überhaupt einen Umsatz am 01.01. gab.
Dazu übergebe ich sie an _Position, die per @Member rausfindet, ob ein Umsatz eben am 01.01. stattgefunden hat.
Auch wenn ich 10 Umsätze am 01.01. hätte, käme durch die Memberfunction "1" heraus. Wenn es keinen Umsatz gegeben hätte, würde "0" herauskommen.
Das frage ich dann in der nächsten Formelzeile über _Position>0 ab. Wenn es 0 wäre, dann lautet Ergebnis für den 01.01. halt 0 Euro. Sonst die Summe der Umsätze am 01.01.2002.
Die Umsätze bekomme ich über die @Right Anweisung. Diese sucht in dem Multivalue Feld "LISTE" nach dem String "Zampano~01.01.2002|" udn liefert alles rechts davon zurück = den Umsatz eben.
Jo...für die restlichen Tage funzt das genauso die Formel. Tricky wird es nur zum Monatsende, halt wegen 28.-31. und Schaltjahre net vergessen (wie war das mit durch 4 teilbar bzw. noch so ne Ausnahme..egal, streng Deinen Grips ruhig an...*grins*). Hm...mit diesem Verfahren kannst Du natürlich auch weitere Infos übergeben, wie zB Produkttyp. Aber, dann werden die Formeln immer fieser, da man auch mit @subset, @word und erschlag mich tot arbeiten muss. Ieeeehhh
und wenn Du mir net glaubst, dass das alles so klappt, lad halt die R5 .nsf runner:
http://www.robertbasic.de/upload/Gliederung.zip
Haken? Hm..wenn es noch die 15K Begrenzung für Textfelder gibt, kann ein zu fleissiger Mitarbeiter das Textfeld LISTE sprengen. Umgehung? Vielleicht Script...schmunzel
Isch habe ferdisch.
Warum ich das Ganze gemacht habe, auch wenn Du es wohl kaum verwenden wirst? Nun ja, irgendwie war mir danach, sich mal wieder so richtig im Formelschlamm zu suhlen...herrrlich...mit 1-2-3 hatte ich vor zig Jahren begonnen und immer noch lassen mich diese Formeln nicht los. Zumal, dieses Zeuchs könnte man wunderbar für Zeiterfassungen und anderen Kram prinzipiell verwenden, wenn es um Tagesreports geht *kichert verrückt*
Hat jemand Verbesserungswünsche/vorschläge? Mir schmeckt zB überhaupt nicht, daß für jeden Umsatz ein Record angelegt werden muss. Kann mit der Zeit ziemlich heavy werden diese Ansicht mit Umsätzen, oder? Man sollte eher versuchen, ein Doc pro Tag für alle Umsätze anzulegen. Und dann dieses auswerten.
BELGARION, MEEEENSCH, Du hast es bis zum Ende geschafft? *klopft Belgarion auf die Schulter* Ist wirklich nicht so schwer denke ich, versuchs mal ruhig nachzuvollziehen.
Und weißt Du übrigens - wenn Du die Lösung verwenden kannst - was der übliche Verrechnungspreis ist? Eine Kiste Sekt! *prost*