Komplexität von Formeln verringern
Moderator: Moderatoren
Komplexität von Formeln verringern
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?
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?
Re: Komplexität von Formeln verringern
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
Jedenfalls für meinen einfachen Geist ist das wesentlich verständlicher als das Folgende
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
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;
}
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)
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
Re: Komplexität von Formeln verringern
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.
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.
Alsoergibt den Wahrheitswert FALSCH, auch wenn in beiden Zellen Zahlen stehen.
Jedoch die gleiche Formel mit "Strg" + "Shift" + "Enter" abgeschlossenergibt eine 1, gleichzusetzen mit WAHR.
Viel Spaß dabei .
Gruß
balu
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.
Warum addierst Du da zwei WENNs? Das ist mir nicht verständlich.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)
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))
Jedoch die gleiche Formel mit "Strg" + "Shift" + "Enter" abgeschlossen
Code: Alles auswählen
{=WENN(ISTZAHL(A1:B1))}
Und in diesem Sinne arbeite mal meinen Vorschlag mit Matrix weiter aus .Nein bitte, ich möchte keine Fertigversion einer Zeiterfassung von irgendwoher runterladen, denn dann hätte ich ja nichts gelernt
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
wehr rächtschraipfähler findet khan si behalden
Re: Komplexität von Formeln verringern
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
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
Re: Komplexität von Formeln verringern
Die drei vorkommenden WENNbalu hat geschrieben:Warum addierst Du da zwei WENNs? Das ist mir nicht verständlich.
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
-
- *******
- Beiträge: 1763
- Registriert: Di, 03.10.2006 18:05
Re: Komplexität von Formeln verringern
Hallo Andi,
also das ist die Formel :
Und sagt folgendes : Wenn in "B7" bis"E7" etwas Steht (<>"") , dann rechne (C7-B7)plus(E7-D7)+F7
Nächster Punkt :
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
also das ist die Formel :
Code: Alles auswählen
=WENN(UND(B7<>"";C7<>"";D7<>"";E7<>"");(C7-B7)+(E7-D7)+F7;0)
Nächster Punkt :
Das wird mit der "WENN(UND(...." Formel abgefangen.Soweit so gut, wenn nun aber eine Zeit fehlt, wird falsch gerechnet.
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
Win7_64 / LO_4.4.5.2
Re: Komplexität von Formeln verringern
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!
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!
Re: Komplexität von Formeln verringern
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
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.
Re: Komplexität von Formeln verringern
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? )
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.
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? )
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.
Re: Komplexität von Formeln verringern
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.
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.
-
- *******
- Beiträge: 1763
- Registriert: Di, 03.10.2006 18:05
Re: Komplexität von Formeln verringern
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
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
Win7_64 / LO_4.4.5.2