Wow, das ging wieder schnell. Danke ihr Beiden.
Mal schauen ob ich da durch steige
Beiträge von xbl38spezial
-
-
Nun ist das Berechnungsprogramm schon beinahe 4000 AutoIt-Zeilen lang und weiß noch immer zu überraschen...
Beim durchrechnen verschiedener Beispielfälle ist mir etwas sonderbares aufgefallen.Und zwar: Beträge im Hunderter, und Zehnerbereich mit den ungeraden Nachkommastellen XXX,33 / XX,33 und XXX,55 / XX,55 werden beim teilen durch 2 bzw. auf 50% gerechnet, falsch kaufmännisch gerundet.
Beispiele:
500,33 € * 0,5 = 250,16 € anstatt wie es richtig wäre 250,17 € oder
55,55 € * 0,5 = 27,77 € anstatt 27,78 €Nehme ich aber stattdessen Beträge über dem Hunderterbereich z.B. 5000,33 € * 0,5 wird mir folgerichtig 2500,17 € ausgegeben.
Beim Zehnerbereich verhält es sich ebenfalls korrekt.Hat jemand ne Ahnung woran das liegt? Ein Bug?
Und wenn ich schon mal schreibe, kann ich die Beträge auch mit 1.000 er Trennpunkt darstellen?
Momentan werden sie dank bernd670 mit GUICtrlSetData($hHandle, StringFormat("%.2f €", Number($szValue))) im Format 1000.00 € ausgegeben/umgewandelt. Vermutlich wird es durch die Scriptsprache vorgegebene Formatierung für den Euro nicht möglich sein, zumindest nicht ohne das es Probleme beim Rechnen gibt.
-
Und wieder einmal recht herzlichen Dank!
Nur ein klein wenig Anpassung und es tut was es soll.
AutoIt
Alles anzeigenFunc _KaufmMonat() $Tage = GUICtrlRead( $Diffausgabe) ;tatsächliche Anzahl der Tage im Dienstleistungsmonat $StringDate = GUICtrlRead($Enddate) $MaxTageMonat = _DateDaysInMonth(StringRight($StringDate,4), StringMid($StringDate,4,2)) $Tage82 = $szdate If $Tage >= 30 and String($MaxTageMonat) > 30 Then GUICtrlSetData($82Teiler, "30/30") ElseIf $Tage < 30 and String($MaxTageMonat) > 30 Then GUICtrlSetData($82Teiler, $Tage & "/30") Else GUICtrlSetData($82Teiler, $Tage & "/" & String($MaxTageMonat)) EndIf EndFunc
Zitat von BugFixDazu gibt es fertige Funktionen:
- $tMin = _GUICtrlMonthCal_GetMonthRangeMin($idMonthCal)
- $tMax = _GUICtrlMonthCal_GetMonthRangeMax($idMonthCal)
MfG BugFix
Diese Variante scheint leider bei dem verwendeten Kalender nicht zu funktionieren oder ich hab es vergeigt :-/
-
Gibt es eigentlich eine Möglichkeit die Maximalanzahl an Tagen eines Monats aus einem Datepicker auszulesen?
Das hier war einer meiner Versuche, leider nicht von Erfolg gekrönt
Funktioniert nur mit dem aktuellen Systemdatum.AutoIt
Alles anzeigen#include <GUIConstants.au3> #include <Date.au3> $hGUI = GUICreate(@ScriptName, 400, 250, 150, 150) $startdate = GUICtrlCreateDate("2016/07/01", 60, 100, 100, 20, $SS_CENTER) $Ergebnis = GUICtrlCreateInput("Ergebnis", 230, 100, 100, 20, $SS_CENTER) $diffausgabe = 11 $MaxTageRechnen = GUICtrlCreateButton("Funktioniert mit Systemmonat", 30, 200, 150, 20, $SS_CENTER) $MaxTageRechnen2 = GUICtrlCreateButton("Funktioniert nicht: Datepicker", 210, 200, 150, 20, $SS_CENTER) Func _Datefunc1() $MaxTageMonat = _DateDaysInMonth(@YEAR, @MON) $days82 = $diffausgabe GUICtrlSetData($Ergebnis, $days82 & "/" & String($MaxTageMonat)) EndFunc Func _Datefunc2() $MaxTageMonat = _DateDaysInMonth($startdate) $days82 = $diffausgabe GUICtrlSetData($Ergebnis, $days82 & "/" & String($MaxTageMonat)) EndFunc GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg(1) Switch $msg[0] Case $MaxTageRechnen _Datefunc1() Case $MaxTageRechnen2 _Datefunc2() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd
-
Leute, ihr seit klasse! Vielen Dank.
-
Vielen lieben Dank! Funktioniert tadellos.
Edit: Einer InputBox das kaufmännische Euro-Format vorgeben kann man aber nicht, oder?
Daher 2 Dezimalstellen und ggf. das €-Zeichen?
Also ein Excel-Äquivalent zu: =text(A1;"00,00")&" €"
Bei mir schaut das im Moment so aus:
[Blockierte Grafik: http://fs1.directupload.net/images/150530/uvflphuj.jpg]
-
Funktioniert leider nicht.
Hier das Ganze mal in einer abgespeckten Version:
AutoIt
Alles anzeigen#include <Array.au3> #include <ButtonConstants.au3> #include <GUIConstants.au3> #include <GUIConstantsEx.au3> #include <Misc.au3> ; Summe 1, Summe 2 und Anzahl der Tage vorgeben. Anschließend Leistung61berechnen oder Leistung62berechnen anklicken; oder einfach ENTER $hGUI = GUICreate( @ScriptName, 400, 250, 150, 150) $Arbeitsentgelt = GUICtrlCreateInput("Summe1", 20, 20, 100, 20, $SS_CENTER) $Entgeltersatz = GUICtrlCreateInput("Summe2", 150, 20, 100, 20, $SS_CENTER) $diffausgabe = GUICtrlCreateInput("Tage", 280, 20, 100, 20, $SS_CENTER) $LeistungNach6 = GUICtrlCreateLabel("", 95, 150, 100, 20, $SS_CENTER) GUICtrlCreateLabel("Ergebnis:", 95, 130, 100, 20, $SS_CENTER) $hoechstsatzinput = GUICtrlCreateLabel("", 200, 150, 100, 20, $SS_CENTER) GUICtrlCreateLabel("Höchstsatz:", 200, 130, 100, 20, $SS_CENTER) $Leistung61berechnen = GUICtrlCreateButton("Leistung61berechnen", 20, 200, 180, 20, $SS_CENTER) $Leistung62berechnen = GUICtrlCreateButton("Leistung62berechnen", 200, 200, 180, 20, $SS_CENTER) $hoechsttext11 = GUICtrlCreateLabel("", 10, 80, 380, 20, $SS_CENTER) GUISetState(@SW_SHOW) Dim $multi[3] = ["0", "215", "258"] Func _Leistung61() Opt("GUIOnEventMode", 1) $Summe6 = GUICtrlRead($Arbeitsentgelt) + GUICtrlRead($Entgeltersatz) $days = GUICtrlRead($diffausgabe) $hoechstsatzoutput = $days * $multi[1] GUICtrlSetData($hoechstsatzinput, $hoechstsatzoutput) If Int(GUICtrlRead($Summe6)) > Int(GUICtrlRead($hoechstsatzinput)) then GUICtrlSetData($LeistungNach6, $hoechstsatzoutput) Else GUICtrlSetData($LeistungNach6, $Summe6) EndIf GUICtrlSetData($hoechsttext11, "Höchsttagessatz 215 € multiplitziert mit den Tagen") TrayTip("###-####", "Leistung nach § 6 ###, Höchstsatz 215 €", 5) Opt("GUIOnEventMode", 0) EndFunc Func _Leistung62() Opt("GUIOnEventMode", 1) $Summe6 = GUICtrlRead($Arbeitsentgelt) + GUICtrlRead($Entgeltersatz) $days = GUICtrlRead($diffausgabe) $hoechstsatzoutput = $days * $multi[2] GUICtrlSetData($hoechstsatzinput, $hoechstsatzoutput) If Int(GUICtrlRead($Summe6)) > Int(GUICtrlRead($hoechstsatzinput)) then GUICtrlSetData($LeistungNach6, $hoechstsatzoutput) Else GUICtrlSetData($LeistungNach6, $Summe6) EndIf GUICtrlSetData($hoechsttext11, "Höchsttagessatz 258 € multiplitziert mit den Tagen") TrayTip("###-####", "Leistung nach § 6 ###, Höchstsatz 258 €", 5) Opt("GUIOnEventMode", 0) EndFunc Func _convert6() Local $sSumme61 = StringReplace(ControlGetText("","", $Arbeitsentgelt), ",", ".") ControlSetText("Test", "", "[CLASS:Edit; INSTANCE:2]", $sSumme61) GUICtrlSetData($Arbeitsentgelt, $sSumme61) Local $sSumme62 = StringReplace(ControlGetText("","", $Entgeltersatz), ",", ".") ControlSetText("Test", "", "[CLASS:Edit; INSTANCE:2]", $sSumme62) GUICtrlSetData($Entgeltersatz, $sSumme62) EndFunc While 1 $msg = GUIGetMsg(1) Switch $msg[0] Case $Leistung61berechnen _convert6() _Leistung61() Case $Leistung62berechnen _convert6() _Leistung62() Case $GUI_EVENT_CLOSE Exit Endswitch WEnd
-
Erst mal sry, dass ich so spät antworte. Kam die Tage leider nicht dazu.
Vergiss mal den 04.03.2016, es sollte von Anfang an der 06.03.2016 sein. Ist aber auch nicht wichtig
Vielen Dank für den Code übrigens, auch wenn er nicht ganz das zu sein scheint, was ich gesucht habe.
Ich hab es vorerst wie folgt gelöst:AutoIt
Alles anzeigenFunc _Datefunc1() $startdate_neu = GUICtrlRead($startdate) $enddate_neu = GUICtrlRead($enddate) $startdate_neu = StringMid($startdate_neu, 7, 4) & "/" & StringMid($startdate_neu, 4, 2) & "/" & StringMid($startdate_neu, 1, 2) $enddate_neu = StringMid($enddate_neu, 7, 4) & "/" & StringMid($enddate_neu, 4, 2) & "/" & StringMid($enddate_neu, 1, 2) _GUICtrlEdit_SetText($diffausgabe, _DateDiff("D", $startdate_neu, $enddate_neu)+1) ConsoleWrite($startdate_neu & @CRLF) ConsoleWrite($enddate_neu & @CRLF) ConsoleWrite(_DateDiff("D", $startdate_neu, $enddate_neu) & @CRLF & @CRLF) EndFunc
Ich bin zwar dadurch gezwungen, das Enddatum auf das Monatsende zu setzen, wenn dieses über den betreffenden Monat hinaus geht, aber die Berechnung der Tage funktioniert tadellos.
Edit:
Was das allgemeine Rechenproblem anbelangt habe ich es vorerst so gelöst:AutoIt
Alles anzeigenDim $multi[3] = ["0", "215", "258"] For $i = 1 To UBound($multi) -1 ConsoleWrite($multi[$i] & @CRLF) Next Func _Leistung6() If GUICtrlRead($Angehoerige1) <> "Ja" and GUICtrlRead($Angehoerige2) <> "Ja" and GUICtrlRead($Angehoerige3) < 1 and GUICtrlRead($Angehoerige4) < 1 then _Leistung61() Else _Leistung62() EndIf EndFunc Func _Leistung61() Opt("GUIOnEventMode", 1) $Summe6 = GUICtrlRead($Arbeitsentgelt) + GUICtrlRead($Entgeltersatz) $days = GUICtrlRead($diffausgabe) $hoechstsatzoutput = $days * $multi[1] GUICtrlSetData($hoechstsatzinput, $hoechstsatzoutput) If GUICtrlRead($Summe6) > GUICtrlRead($hoechstsatzinput) then GUICtrlSetData($LeistungNach6, $hoechstsatzinput) Else GUICtrlSetData($LeistungNach6, $Summe6) EndIf GUICtrlSetData($hoechsttext11, "Höchsttagessatz 215 € multiplitziert mit den mtl. ##########-Tagen") TrayTip("###-####", "Leistung nach § 6 ###, Höchstsatz 215 €", 5) Opt("GUIOnEventMode", 0) EndFunc Func _Leistung62() Opt("GUIOnEventMode", 1) $Summe6 = GUICtrlRead($Arbeitsentgelt) + GUICtrlRead($Entgeltersatz) $days = GUICtrlRead($diffausgabe) $hoechstsatzoutput = $days * $multi[2] GUICtrlSetData($hoechstsatzinput, $hoechstsatzoutput) If GUICtrlRead($Summe6) > GUICtrlRead($hoechstsatzinput) then GUICtrlSetData($LeistungNach6, $hoechstsatzinput) Else GUICtrlSetData($LeistungNach6, $Summe6) EndIf GUICtrlSetData($hoechsttext11, "Höchsttagessatz 258 € multiplitziert mit den mtl. ##########-Tagen") TrayTip("###-####", "Leistung nach § 6 ###, Höchstsatz 258 €", 5) Opt("GUIOnEventMode", 0) EndFunc
Teile die sich explizit auf das Gesetz beziehen musste ich vorerst durch "#" ersetzen, da dieses noch nicht vollends verabschiedet ist.
Auch hier funktioniert so weit alles, bis auf die Abfrage in Zeile 20 bzw. 36
Hier soll verglichen werden, ob das Ergebnis $summe6 größer ist als das Ergebnis des erfolgreich errechneten $hoechstsatzinput.
Leider wird diese Abfrage scheinbar einfach ignoriert und stattdessen immer das Ergebnis $summe6 in die Inputbox "$LeistungNach6" eingetragen.Selbst die vorherige Konvertierung von Kommabeträgen funktioniert nach einigen Anlaufschwierigkeiten problemlos, aber der Vergleich will mir einfach nicht gelingen -.-
Edit bernd670: Bitte nicht komplette Beiträge zitieren!
-
Hallo,
Wenn der Dienstleistungszeitraum vom 04.03.2016 - 15.04.2016 geht, warum wird dann im März vom 06.03.2016 - 28.03.2016 gerechnet und nicht von 04.03.2016 - 31.03.2016?
Entschuldige, du hast völlig recht. Tatsächlich waren natürlich die Zeiträume 06.03.2016 - 31.03.2016 = 26 Tage und 01.04.2016 - 15.04.2016 = 15 Tage als Beispiele angedacht gewesen. Kleiner Vertipper
Zwischenzeitlich hat sich ein neues Problem aufgetan, nach dem ich das Erste vorerst zurückgestellt habe, um wenigstens die GUI fertigzustellen und mich dabei ein wenig mehr mit dieser für mich neuen Script-Sprache beschäftigen.
Eigentlich wollte ich nur ganz nebenbei zwei Summen, welche in GUICtrlCreateInput()-Feldern händisch eingetragen werden sollen, miteinander zu addieren. Leider geschieht das nur mit Summen die ich direkt im Script hinterlege, als Ausgangswert für meine Beispielfälle. Trage ich aber neue Summen in die Felder, so findet keine erneute Berechnung statt.Spoiler anzeigen
Code
Alles anzeigen$Arbeitsentgeld = GUICtrlCreateInput ("500", 370, 120, 75, 20, $ES_RIGHT) $Entgeltersatz = GUICtrlCreateInput ("250", 370, 160, 75, 20, $ES_RIGHT) $Zahl61 = GUICtrlRead($Arbeitsentgeld) $Zahl62 = GUICtrlRead($Entgeltersatz) $Summe6 = $Zahl61 + $Zahl62 Func _Leistung6() GUICtrlRead($Summe6, _GUICtrlEdit_SetText($LeistungNach6, $Summe6)) Endfunc
Die hier vorgegebenen Summen werden bei Programmstart wie gesagt brav summiert, spätere Änderungen bleiben jedoch bei erneutem Aufruf der Funktion unberücksichtigt.
Hach, Excel ist so schön einfach...
-
Auch dir vielen Dank, für die prompte Antwort.
Das klingt ganz nach dem, was ich gesucht habe. Danke für den Tipp!Schau Dir das mal in der Hilfe Date user defined functions Reference an. Bei Datumrechnungen hilft oftmals day of the year ->also tag des Jahres. dieser läßt sich über die (differenz zum 1.1.xyz jahr ) +1 errechnen. _date days in month die tage in den monaten - und schon hat man alle Basisdaten um Dein Problem zu lösen
Gruß
Peter
-
Erst einmal vielen Dank für deine schnelle Antwort.
Zitat von AndyDu musst lediglich für jeden Tag die Summe aus Tagen, Monaten, Jahren festlegen.
Wenn neuer Tag, Tagberechnung = Tagberechnung +1
Wenn neuer Monat, Monatsberechnung=Monatsberechnung+1 : Tagberechnung merken : Tagberechnung=1
Wenn neues Jahr, Jahrberechnung=Jahrberechnung+1 : Monat merken : Monatsberechnung=1 :Tagberechnung merken : Tagberechnung = 1
Ich bin mir nicht sicher, ob das mit der Tageberechnung nach Auswahl "X"-Nummer richtig rüber gekommen ist.
Erst mal versuche ich durch das was du geschrieben hast durchzusteigen, um zu erkennen, ob es das ist was ich meinte (Autoit-Newby)Ich würde dir ja gerne die Excel-Formel oder ein Arbeitsblatt zur Verfügung stellen, damit du dir ein Bild davon machen kannst, was ich meine. Leider jedoch kann mein uraltes Excel 2003 diese Formeln auf Grund der hochgradigen Verschachtelung nicht anzeigen, im Gegensatz zu der aktuellen Office-Version bei mir im Büro.
Nach Pfingsten schicke ich es mir zu und wenn du magst, dann kannst du ja mal einen Blick darauf werfen.Was die Lösung in VBA angeht, so muss ich gestehen, dass mir das Scripten in Autoit irgendwie eingängiger ist.
Ich hab VBA in den Berechnungsblättern lediglich genutzt, um bestimmte Werte abzufragen, zu vergleichen und entsprechend Zeilen auszublenden oder Zellen zu befüllen. Das Ausblenden bestimmter Bereiche in der Excel-Version ist deshalb nötig, da am Ende automatisch ein vollständiger Bescheid erstellt wird, der in ausgedruckter Form nie größer als 5 Seiten sein darf, wegen der Kapazitäten unserer vollautomatischen Druckstraße 600 km entfernt. -
Erst mal Hallo zusammen! (Bin neu hier)
Ich habe neuerdings Autoit für mich entdeckt und mir vorgenommen einige umfangreiche Excel-Berechnungsblätter in einem lauffähigen Programm abzubilden.
In dem Berechnungsblättern geht es darum, finanzielle Leistungen nach etlichen Kriterien (Rechtsgrundlage (§), Dienstgrad, Anzahl von Angehörigen, ob diese unterhaltsberechtigt und/oder im gemeinsamen Haushalt leben, ob Entgeldersatzleistungen oder Gehälter - zzgl. eventueller Einkommen durch Teil,- Selbstständigkeiten bezogen werden etc.) berechnet.
Alles in allem sehr komplex und das Wälzen von Gesetzestexten während der Erstellung hat die Sache nicht einfacher gemacht.
Die Mühe hat sich jedoch gelohnt und die besagten Berechnungsblätter sind in der Excel-Variante fertiggestellt.Bis dato habe ich praktisch die gesamte GUI mit mehr oder weniger Fummelei und durch viel Lesen hinbekommen.
Jetzt aber gehtes an's Eingemachte und schon stehe ich vor meinem ersten Problem. Stichwort: DateDiffÜber eingefügte Datepicker wird ein Dienstleistungszeitraum festgelegt, z.B. Beginn der Dienstleistung: 04.03.2016 - Ende der Dienstleistung: 15.04.2015.
Da die Berechnungen aber monatlich stattfinden, währen das für besagten Dienstleistungszeitraum 2 Teilzeiträume.
Daher 06.03.2015 - 28.03.2016 = 25 Tage und 01.04.2016 - 15.04.2016 = 15 Tage. Einzeln für sich genommen bin ich bereits erfolgreich geworden, daher wenn ich die Zeiträume einzeln so eingebe, werden diese auch korrekt berechnet. Die Anzeige des gesamten Dienstleistungszeitraumes ist leider unumgänglich.
Nun ist es aber so, dass ich anhand des gesamten Dienstleistungszeitraums errechnen muss, um wie viele Monatsberechnungen es sich handelt. Hier wäre das Ergebnis wie schon erwähnt "2". In Excel wird mir dies durch ein Auswahlfeld X von 2 angezeigt, wobei ich durch die Auswahl des hier als "X" dargestellten Auswahlmenüs die "1" für den ersten Berechnungsmonat März 2016 und die "2" für den zweiten Berechnungsmonat April 2016 auswählen kann und mir die auf diesen Monat anfallenden Tagein einer weiteren Zelle angezeigt werden.Daher 04.03.2016 - 15.04.2016 | 1 von 2 | März 2016 | 25 Tage
04.03.2016 - 15.04.2016 | 2 von 2 | April 2016 | 15 TageSowohl die Tage als auch die Angabe von Monat & Jahr in eigenen Feldern sind im Laufe der weiteren Berechnungen enorm wichtig.
Schon in Excel war für die Berechnung der auf den Monat anfallenden Tage eine recht aufwendige Formel, die sich über 5 Zeilen erstreckte notwendig.
Bei Autoit stehe ich gerade leider völlig ratlos dar, wie ich das umsetzen soll. Dass ich ein blutiger Autoit-Anfänger bin, macht die Sache nicht leichter, aber es wäre enorm schade wenn ich an dieser Stelle scheitere, wenn doch das gesamte Programm zumindest rein optisch schon steht.Für hilfreiche Ratschläge, Kniffe u.Ä. wäre ich sehr dankbar!