Komplexität von Formeln verringern

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Komplexität von Formeln verringern

Beitrag von Andi_CH »

Von, man verzeihe mir meine sarkastische Ader, vernünftigen Programmiersprachen bin ich mich ja einges gewöhnt aber der Aufwand in OOo-Calc 4 Eingabewerte zu prüfen und zu verrechnen verschlägt mir beinahe den Atem :-)

Gibt es für das unten beschriebene, doch recht banale, Problem eine einfachere und vor allem einfacher wartbare Variante?

Der Benutzer gibt 4 Zeiten ein.
VM Kommt, VM geht, NM kommt, NM geht
B7 - E7
In F7 können bezahlte Abwesenheiten eingegeben werden

Istzustand:
Die Tagesarbeitszeit wird wie folgt berechnet
(Ich weiss nicht mehr woher diese Formeln kommen und warum da ein Vergleich drin steckt. Da reicht sicher eine einfach Subtraktion)
Vormittag (O7): =(C7<B7)+C7-B7
Nachmittag (P7): =(E7<D7)+E7-D7
Tagesarbeitszeit: =O7+P7+F7

Soweit so gut, wenn nun aber eine Zeit fehlt, wird falsch gerechnet.

Der Versuch mit der Formel liefert für den Vormittag das Resultat das ich erwarte

=WENN(UND(NICHT(B7=0);NICHT(C7=0));((C7<B7)+C7-B7); 0)

Mir graut schon vor dem Gedanken, dass ich die Zwischenschritte über Vor- und Nachmittags Felder eliminieren möchte. (Diese Formel und deren Pendant für den Nachmittag in einem Feld - Graus)

Kurzversion:
Muss:
Ich möchte aus 4 Zeiten die Tagesarbeitszeit berechnen, aber nur wenn für einen Halbtag beide Zeiten eingegeben sind.
Einzelne Zeiten werden ignoriert -> Resultat 0

Nice to have
Ich möchte überprüfen ob die Reihenfolge der Zeiten stimmt -> falls nicht gibt die Summe 0
Geht später als Kommt. VM Geht früher als NM kommt.

Einschränkungen:
Falls das eine Vereinfachung bringt, wird nie über Mitternacht hinaus gearbeitet (Da könnte ja NM Geht 24:00 und darauf VM kommt 0:00 eingegeben)

Nein bitte, ich möchte keine Fertigversion einer Zeiterfassung von irgendwoher runterladen, denn dann hätte ich ja nichts gelernt ;-)

PS: Ich habe noch nie Funktionen für Ooo geschrieben - wäre das eine wesentlich Vereinfachung?
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Das Problem ist sehr banal - die Art wie ich es hier zu lösen versuche ist extrem unübersichtlich, vor allem wenn ich auch noch die Anforderungen an die Kontinuität implementieren will.

In Java geht das wie folgt

Code: Alles auswählen

public double workingTime(double vmKommt, double vmGeht, double nmKommt, double nmGeht){
	double result = 0;
	if ((vmKommt != 0) && (vmGeht != 0) && (vmGeht > vmKommt))
		result = vmGeht - vmKommt;
	if ((nmKommt != 0) && (nmGeht != 0) && (nmGeht > nmKommt))
		result = vmGeht - vmKommt;
	if ((vmGeht!=0) && (nmKommt!=0) && (vmGeht>nmKommt))
		result = 0;
	return result;
}
Jedenfalls für meinen einfachen Geist ist das wesentlich verständlicher als das Folgende

Code: Alles auswählen

=WENN((D9>C9);(WENN(UND(NICHT(B9=0);NICHT(C9=0);(C9>B9));((C9<B9)+C9-B9);0) + WENN(UND(NICHT(D9=0);NICHT(E9=0);(E9>D9));((E9<D9)+E9-D9);0));0)
Ich kann nicht glauben, dass OOo keinen besseren Weg anbietet das, ich bleibe dabei recht banale Problem, auf eine einfachere Art zu lösen

Ausserdem ist es nun mal so, dass es auf der Welt Menschen gibt die halt eine trockene Art von Humor, welchen man durchaus als sarkastisch bezeichnen kann, pflegen :shock: 8) :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Komplexität von Formeln verringern

Beitrag von balu »

Hallo Andi,

ein Tabellenkalkulationsprogramm ist nun mal keine *Eier-legende-Wollmilch-Sau*. Es gibt da Regeln, oder Prinzipien, woran sich ein solches Programm halten muss. Und von daher läuft da nun mal halt einiges anders als man es sich so erwünscht. Das nur so am Rande.

Jedenfalls für meinen einfachen Geist ist das wesentlich verständlicher als das Folgende

Code: Alles auswählen

=WENN((D9>C9);(WENN(UND(NICHT(B9=0);NICHT(C9=0);(C9>B9));((C9<B9)+C9-B9);0) + WENN(UND(NICHT(D9=0);NICHT(E9=0);(E9>D9));((E9<D9)+E9-D9);0));0)
Warum addierst Du da zwei WENNs? Das ist mir nicht verständlich.
Aber mal ein anderer Tipp, wie man sich manchmal etwas Erleichterung verschaffen kann.
Durch selber experementieren kann man auf die dollsten Lösungen kommen, wenn man nur erstmal den richtigen *Schupps* bekommt. Und einen will ich dir geben.

Versuch mal mit Matrixformeln zu arbeiten.

Hört sich schlimmer an, als es ist. Und außerdem gibt es Matrixformeln, die eigentlich eine Kombination von beiden sind, also Normale und Matrix. Und in deinem Fall könnte ich dir eine viel kürzere Teil-Wahrheitsüberprüfung anbieten, als dein UND()-Aufbau.

Aber erstmal eine kurze Vorüberlegung.
Du möchtest 2 Zellen überprüfen ob sie eine Zahl enthalten. Okay!?
Und was für Funktionen gibt es, die so was anbieten?
Na mindestens =ISTZAHL()

Nur das dumme ist, dass ISTZAHL normalerweise nur eine Zelle (einen Wert) überprüft. Aber genau an dieser Stelle greifen wir auf die Matrixtechnologie zurück, und erreichen ratzfatz unser Ziel.
Also

Code: Alles auswählen

=WENN(ISTZAHL(A1:B1))
ergibt den Wahrheitswert FALSCH, auch wenn in beiden Zellen Zahlen stehen.

Jedoch die gleiche Formel mit "Strg" + "Shift" + "Enter" abgeschlossen

Code: Alles auswählen

{=WENN(ISTZAHL(A1:B1))}
ergibt eine 1, gleichzusetzen mit WAHR.

Nein bitte, ich möchte keine Fertigversion einer Zeiterfassung von irgendwoher runterladen, denn dann hätte ich ja nichts gelernt :wink:
Und in diesem Sinne arbeite mal meinen Vorschlag mit Matrix weiter aus :wink:.
Viel Spaß dabei :).


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Paljass: Gegen deinen Vorschlag spricht eigentlich nichts, nur bringt er nicht wirklich eine Vereinfachung. Oder habe ich etwas falsch verstanden? Ich wollte den Umweg über die Zwischenfelder eliminieren.

Die von mir oben gebastelte komplexe Formel ist nicht überprüft - die könnte auch falsch sein.
Meine Javaijmplementation kann als Beschreibung betrachtet werden was berechnet werden soll - die liefert das Referenzresultat

Matrixformeln? Da kann ich mir nicht mal in meinen kühnsten Träumen vorstellen was die machen, aber wenn ich damit alle if's übersichtlicher gestalten kann, warum nicht.

Ist der Weg über eine Formel / ein Makro keine Lösung? Davon habe ich allerdings noch gar keine Ahung wie/wo ich da was für Code schreiben müsste und wie die dann getriggert werden.

PS: Mein Job: Ich implementiere Berechnungen mit locker mal so 50 - 100 Thermen, welche auch mal iterativ gelöst werden müssen.
Aber das in einer Tabellenkalkulation - nö, das wäre mein Tod .... ich mach das ganz easy in Java :-)
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

balu hat geschrieben:Warum addierst Du da zwei WENNs? Das ist mir nicht verständlich.
Die drei vorkommenden WENN

1. Wenn am Vormittag beide Zeiten definiert sind und die erste Zeit kleiner ist als die Zweite, wird die Differenz genommen, ansonsten 0
2. Wenn am Nachmittag beide Zeiten definiert sind und die erste Zeit kleiner ist als die Zweite, wird die Differenz genommen, ansonsten 0
3. Zusammenzählen zur Tagesarbeitszeit, aber nur wenn die 2. Zeit vom Vormittag kleiner ist als die Erste vom Nachmittag, ansonsten 0

Hm, ist Prosa, aber sagt dasselbe aus wie der Java-Code ;-)
Gert Seler
*******
Beiträge: 1763
Registriert: Di, 03.10.2006 18:05

Re: Komplexität von Formeln verringern

Beitrag von Gert Seler »

Hallo Andi,
also das ist die Formel :

Code: Alles auswählen

=WENN(UND(B7<>"";C7<>"";D7<>"";E7<>"");(C7-B7)+(E7-D7)+F7;0)
Und sagt folgendes : Wenn in "B7" bis"E7" etwas Steht (<>"") , dann rechne (C7-B7)plus(E7-D7)+F7
Nächster Punkt :
Soweit so gut, wenn nun aber eine Zeit fehlt, wird falsch gerechnet.
Das wird mit der "WENN(UND(...." Formel abgefangen.
Mit "+F7 " in der obigen Formel wird die "bezahlte Abwesenheit" auch addiert. Das heißt, Vormittag & Nachmittag werden komplett berechnet.
Hier noch ne Hilfe, bitte lesen :
http://www.ooowiki.de/CalcFunktionenDat ... rieCalc%29
und hier :
http://www.ooowiki.de/WennVerschachtelu ... rieCalc%29

mfg
Gert
Es gibt nichts gutes, außer man tut es.
Win7_64 / LO_4.4.5.2
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Ohne die Formel jetzt abzutippen glaube ich nicht, dass sie funktioniert :(

Die Anforderung ist doch ganz klar formuliert! (Ok - es mag anstrengend sein einige Posts zurück zu lesen)

Wenn am Vormittag beide Zeiten eingegeben sind wird die Zeit berechnet, auch wenn am Nachmittag eine oder beide Zeiten fehlen.
Wenn am Nachmittag beide Zeiten eingegeben sind, wir die Zeit berechnet und addiert, auch wenn am Vormittag eine oder beide Zeiten fehlen.

Es müssen NICHT alle 4 Zeiten vorhanden sein!
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Erst einmal kämpfe ich mit/gegen OpenOffice:

Regelmässig tritt der Fehler:
Fehler beim Speichern des Dokumentes blabla:
Allgemeiner Fehler.
Allgemeiner Ein-/Ausgabefehler.

auf.

Der PC ist sicher in Ordnung, Schreibrechte hab ich auch, es ist auf dem lokalen Disk, der Disk ist nicht voll
Sind 16MB echt zu viel???? Das kann ja wohl nicht sein?


Die Daei liegt http://www.mediafire.com/?ss3kexzbqbihbxu hier
Zuletzt geändert von Andi_CH am Do, 06.01.2011 11:45, insgesamt 1-mal geändert.
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Warum hat dasDing 14MB wenn es ausgepackt ist?
Habe ich die Grenzen von Calc wirklich schon erreicht?

Arrrrrgh!

Die Datei ist zu groß. Die maximal erlaubte Dateigröße ist 128 KiB.

(ürigens was sind KiB? :shock: )

und was soll das ewige:
Allgemeiner Fehler
SQL ERROR [ mysqli ]

Tabelle './forensql3/ooo_de_search_wordmatch' ist als defekt markiert und der letzte (automatische?) Reparaturversuch schlug fehl [144]

Beim Laden der Seite ist ein SQL-Fehler aufgetreten. Bitte kontaktiere die Board-Administration, falls dieses Problem fortlaufend auftritt.
Andi_CH
***
Beiträge: 69
Registriert: Fr, 04.06.2010 09:21
Wohnort: Zürich

Re: Komplexität von Formeln verringern

Beitrag von Andi_CH »

Arrrgh - gezippt über 900kB .....

und ausserdem was soll das ewige:

Allgemeiner Fehler
SQL ERROR [ mysqli ]

Tabelle './forensql3/ooo_de_search_wordmatch' ist als defekt markiert und der letzte (automatische?) Reparaturversuch schlug fehl [144]

Beim Laden der Seite ist ein SQL-Fehler aufgetreten. Bitte kontaktiere die Board-Administration, falls dieses Problem fortlaufend auftritt.
Gert Seler
*******
Beiträge: 1763
Registriert: Di, 03.10.2006 18:05

Re: Komplexität von Formeln verringern

Beitrag von Gert Seler »

Hallo Andi,
die Datei konnte ich korrekt runterladen und entpacken(931kb)WinRAR.
Die Forumsseiten werden heute schneller aufgebaut.
Übrigens eine gute "Tabelle". Jetzt meine Frage : Erkläre bitte, warum überhaupt "Vormittags-" und "Nachmittagszeiten" aufgelistet werden müssen ?
Da es von der Logik her keinen Sinn macht.
Du bist der Spezi und kennst Dich in Deiner Firma aus. Es wären auch noch die Pausenzeiten zu berücksichtigen, in "Deutschland" ist nach 6,5Std "Arbeitszeit
eine Pause von 30Minuten einzuhalten.

mfg
Gert
Es gibt nichts gutes, außer man tut es.
Win7_64 / LO_4.4.5.2
Antworten