Hallo Liebe Leute!
Ich habe die die vorläufige Endversion fertiggestellt für jeder man nutzbar!
Einige Infos vorab: Ihr können 4 Schicht Bezeichnung freie werte zuteilen, ihr werden aufgefordert Feiertage auszuwählen was den Zweck hat das in jedem Bundesland verschieden gefeiert wird und für die richtige Rechnung erforderlich ist! Darüber hinaus werden ihr gefragt ob eine Desktop verlinken anleget werden soll. Auf der linken Seite können ihr in dem ersten Eingabe Feld den Namen eintragen darunter die Position des Mitarbeiters! Rechts daneben sind drei Eingabe Felder untereinander das erste ist für Plus-Minus stunden vom vor Monat darunter die die Stunden in der Woche z.B 40 st. das letzte ist für Urlaub. Daneben haben ihr jetzt 31 * 2 Felder die erste Reihe ist für die schichten und die untere für Urlaub zu besseren Übersicht! Standard für schichten in diesem Programm sind F-S-FF-SS-K u. U die sind abhängig von den Stunden in der Woche z.b ein Mitarbeiter hat eine 40 st.woche, setzt sich die Rechnung wie folgt zusammen 40/5 = 8 die 8 wird jetzt für F-S-K-U genutzt weiter 8/2 = 4 die 4 wird für FF-SS, ihr habt wie schon erwähnt die Möglichkeit 4 schichten nach euren Wünschen anzupassen! Des Weiteren lassen sich die Namen Position und die gerechneten werte speichern und auch wieder aufrufen!
F=Frühsicht S=Spätschicht (FF=Frühes Früh SS=Spätes Spät kurze Zwischenschichten) K=Krank U=Urlaub und die Möglichkeit F2-S2-Z-Na zu freien Verwendung!
Feiertagsberechnung von: BugFix
Druck Option von: Nuts wenn ich richtigliege
Update: 21.11.2009
Neu jeder gespeicherter Monat lässt sich komplett wieder einlesen! (Jeder Name-Position , vergebene Schicht u. Rechnung)
Ubdate: 23.11.2009 Bug behoben und Optimiert!
Update:25.11.2009 4 Bugs behoben und Optimiert!
Neu: Ansicht leeren , jedes Jahr wird einzelnt gespeichert sowie die dazugehörigen Monate und auch wieder einlesbar!
So der Code:
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Pic\ICON_541.ICO
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <Date.au3>
#include<File.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GUIScrollBars.au3>
#include <ListviewConstants.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Opt('GUIOnEventMode', 1)
Global $likpro = @DesktopDir & '\Dienstplan.lnk', $sDBFile = @ScriptDir & '\Druckerbank.html', $schichtsetz = @ScriptDir & '\data\Schichten.ini', $GUI, $GUI2, $GUI3, $GUI4, $GUI5, $as_array
If Not FileExists($likpro) Then _desklink()
If Not FileExists($sDBFile) Then _FileCreate($sDBFile)
If Not FileExists($schichtsetz) Then
For $i = 0 To 3
IniWrite($schichtsetz, 'Schichten', 'Gesetzt' & $i + 1, '0')
Next
EndIf
$GUI = GUICreate('Dienstplan', 1010, 600, -1, -1)
GUISetBkColor(0xFFFACD, $GUI)
GUISetOnEvent(-3, '_Exit')
Local $OptionsMenu = GUICtrlCreateMenu(' M&enü ')
Local $aMenue[6][2] = [['A&nsicht Speichern', '_save_lesen'],['M&onat Einlesen', '_save_lesen'],['Ansicht Leeren', '_save_lesen'],['S&peicherabfrage', '_Fgui'],['S&chichtsetzen', '_gui5'],['B&eenden', '_Exit']]
Local $aMErst[5]
For $i = 0 To 4
$aMErst[$i] = GUICtrlCreateMenuItem($aMenue[$i][0], $OptionsMenu)
GUICtrlSetOnEvent(-1, $aMenue[$i][1])
Next
GUICtrlCreateLabel('Monat :', 12, 15, 40, 20)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlCreateLabel('Soll', 868, 68, 20, 15)
GUICtrlSetTip(-1, 'Gesamter Monats Zeitraum ')
GUICtrlCreateLabel('Ist', 920, 68, 20, 15)
GUICtrlSetTip(-1, 'Wieviel im Monat geleistet')
GUICtrlCreateLabel('Übertrag', 950, 68, 42, 15)
GUICtrlSetTip(-1, 'Plus Minus Stunden Übertragen')
GUICtrlCreateLabel('Jahr :', 17, 44, 40, 20)
GUICtrlSetFont(-1, 9, 400, 2)
Local $monataus = GUICtrlCreateLabel('-------------------', 60, 15, 75)
Local $mweahl = GUICtrlCreateCombo('', 60, 15, 110, 20)
GUICtrlSetState($mweahl, $GUI_HIDE + $GUI_DISABLE)
GUICtrlSetOnEvent(-1, 'PlusMinus')
GUICtrlSetData($mweahl, 'Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember')
Local $monatzahl = GUICtrlCreateLabel('0', -100, 0, 0, 0)
Local $miusB = GUICtrlCreateButton('Wählen', 125, 14, 49, 20)
GUICtrlSetOnEvent(-1, 'PlusMinus')
Local $jahr = GUICtrlCreateLabel(@YEAR, 60, 44, 40, 19)
Local $minus = GUICtrlCreateButton('-', 135, 44, 15, 15)
GUICtrlSetOnEvent(-1, 'PlusMinus')
Local $plus = GUICtrlCreateButton('+', 150, 44, 15, 15)
GUICtrlSetOnEvent(-1, 'PlusMinus')
Local $Schalt = GUICtrlCreateLabel('', 860, 44, 60, 25)
GUICtrlSetColor(-1, 0x0000FF)
Local $option = GUICtrlCreateButton('Option', 925, 22, 60, 30)
GUICtrlSetOnEvent(-1, '_Fgui3')
Local $feita = GUICtrlCreateLabel('Feitertage:', 190, 17, 80, 20)
GUICtrlSetColor(-1, 0x0000FF)
Local $afeilabel[7]
Local $l = 267
For $i = 0 To 6
$afeilabel[$i] = GUICtrlCreateLabel('', $l, 17, 60, 18)
GUICtrlSetOnEvent(-1, '_ftausl')
GUICtrlSetColor(-1, 0x0000FF)
$l += 65
Next
Local $abutt[12]
Local $x = 120
For $i = 0 To 11
$abutt[$i] = GUICtrlCreateButton('Berechnen M-' & $i + 1, 9, $x, 98, 20)
GUICtrlSetOnEvent(-1, '_buton')
$x += 70
Next
Local $agrupre[12], $arzei[12], $arzeire[12], $aname[12][2]
Local $x = 116, $x1 = 111, $x2 = 124, $x3 = 120, $x4 = 79, $y4 = 101
For $i = 0 To 11
$agrupre[$i] = GUICtrlCreateGroup('', 858, $x1, 45, 25)
$arzei[$i] = GUICtrlCreateLabel('R=', 112, $x2, 19, 12)
$arzeire[$i] = GUICtrlCreateLabel('R=', 880, $x3, 20, 12)
$aname[$i][0] = GUICtrlCreateInput('', 9, $x4, 120, 21)
$aname[$i][1] = GUICtrlCreateInput('', 9, $y4, 120, 19)
$x += 70
$x1 += 70
$x2 += 70
$x3 += 70
$x4 += 70
$y4 += 70
Next
Local $arTage[31][2], $aschTage[31][2], $aschTage1[31][2], $aschTage2[31][2], $aschTage3[31][2]
Local $aschTage4[31][2], $aschTage5[31][2], $aschTage6[31][2], $aschTage7[31][2], $aschTage8[31][2]
Local $aschTage9[31][2], $aschTage10[31][2], $aschTage11[31][2]
Local $x = 176
For $i = 0 To 30
$arTage[$i][0] = GUICtrlCreateLabel(StringRight('0' & $i + 1, 2), $x + 2, 46, 19, 18)
$arTage[$i][1] = GUICtrlCreateLabel('', $x + 2, 69, 19, 18)
$aschTage[$i][0] = GUICtrlCreateInput('', $x, 90, 21, 20)
$aschTage[$i][1] = GUICtrlCreateInput('', $x, 111, 21, 20)
$aschTage1[$i][0] = GUICtrlCreateInput('', $x, 160, 21, 20)
$aschTage1[$i][1] = GUICtrlCreateInput('', $x, 181, 21, 20)
$aschTage2[$i][0] = GUICtrlCreateInput('', $x, 230, 21, 20)
$aschTage2[$i][1] = GUICtrlCreateInput('', $x, 251, 21, 20)
$aschTage3[$i][0] = GUICtrlCreateInput('', $x, 300, 21, 20)
$aschTage3[$i][1] = GUICtrlCreateInput('', $x, 321, 21, 20)
$aschTage4[$i][0] = GUICtrlCreateInput('', $x, 370, 21, 20)
$aschTage4[$i][1] = GUICtrlCreateInput('', $x, 391, 21, 20)
$aschTage5[$i][0] = GUICtrlCreateInput('', $x, 440, 21, 20)
$aschTage5[$i][1] = GUICtrlCreateInput('', $x, 461, 21, 20)
$aschTage6[$i][0] = GUICtrlCreateInput('', $x, 510, 21, 20)
$aschTage6[$i][1] = GUICtrlCreateInput('', $x, 531, 21, 20)
$aschTage7[$i][0] = GUICtrlCreateInput('', $x, 580, 21, 20)
$aschTage7[$i][1] = GUICtrlCreateInput('', $x, 601, 21, 20)
$aschTage8[$i][0] = GUICtrlCreateInput('', $x, 650, 21, 20)
$aschTage8[$i][1] = GUICtrlCreateInput('', $x, 671, 21, 20)
$aschTage9[$i][0] = GUICtrlCreateInput('', $x, 720, 21, 20)
$aschTage9[$i][1] = GUICtrlCreateInput('', $x, 741, 21, 20)
$aschTage10[$i][0] = GUICtrlCreateInput('', $x, 790, 21, 20)
$aschTage10[$i][1] = GUICtrlCreateInput('', $x, 811, 21, 20)
$aschTage11[$i][0] = GUICtrlCreateInput('', $x, 860, 21, 20)
$aschTage11[$i][1] = GUICtrlCreateInput('', $x, 881, 21, 20)
$x += 22
Next
Local $asoll[12][2], $aist[12][2], $arurlaub[12][2], $asoler[12][2], $auebertr[12][2]
Local $x = 101, $x1 = 84, $x2 = 121, $x3 = 115
Local $y = 84, $y2 = 115, $y4 = 79
For $i = 0 To 11
$asoll[$i][0] = GUICtrlCreateInput('', 130, $x, 45, 19)
$asoll[$i][1] = GUICtrlCreateInput('', 858, $y, 45, 21)
$aist[$i][0] = GUICtrlCreateInput('', 904, $x1, 45, 21)
$arurlaub[$i][0] = GUICtrlCreateInput('', 130, $x2, 45, 18)
$arurlaub[$i][1] = GUICtrlCreateInput('', 904, $y2, 45, 21)
$asoler[$i][0] = GUICtrlCreateInput('', 950, $x3, 45, 21)
$auebertr[$i][0] = GUICtrlCreateInput('', 130, $y4, 45, 21)
$auebertr[$i][1] = GUICtrlCreateInput('', 950, $x1, 45, 21)
$x += 70
$y += 70
$x1 += 70
$x2 += 70
$y2 += 70
$x3 += 70
$y4 += 70
Next
_GUIScrollBars_Init($GUI)
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
GUISetState()
$GUI2 = GUICreate('Speicher Abfrage', 627, 585, -1, -1, $WS_SIZEBOX, $WS_EX_ACCEPTFILES)
GUISetOnEvent(-3, '_Fguischl')
Local $monaswa = GUICtrlCreateCombo('', 20, 520, 75, 22)
GUICtrlCreateLabel('Bitte Monat auswählen !', 110, 525, 140, 22)
Local $alinil = GUICtrlCreateButton('Daten Einlesen', 240, 520, 90, 20)
GUICtrlSetOnEvent(-1, '_save_lesen')
GUICtrlCreateButton('Print', 335, 520, 90, 20)
GUICtrlSetOnEvent(-1, '_Druck')
Local $hListview = GUICtrlCreateListView('Name|Position|Soll|Ist|Übertrag|R=Urlaub', 0, 0, 625, 500)
_GUICtrlListView_SetExtendedListViewStyle($hListview, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
Global $hLVHandle = GUICtrlGetHandle($hListview)
Local $alistHa[6] = ['Name', 'Position', 'Soll', 'Ist', 'Übertrag', 'R=Urlaub']
Local $alzeig[6]
For $i = 0 To 5
$alzeig[$i] = _GUICtrlListView_SetColumn($hLVHandle, $i, $alistHa[$i], 100, 0)
Next
GUICtrlSetData($monaswa, 'Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember')
GUISetState(@SW_HIDE, $GUI2)
$GUI3 = GUICreate('Option', 250, 100, -1, -1)
GUISetOnEvent(-3, '_Fguischl3')
Local $aspeig = GUICtrlCreateButton('Daten Speichern', 20, 20, 100, 20)
GUICtrlSetOnEvent(-1, '_save_lesen')
GUICtrlCreateButton('Speicher Abfragen', 125, 20, 100, 20)
GUICtrlSetOnEvent(-1, '_Fgui')
GUICtrlCreateLabel('Feiertage', 38, 60, 60, 20)
GUICtrlSetColor(-1, 0x0000FF)
Local $speiloe1 = GUICtrlCreateButton('Zurücksetzen', 125, 57, 100, 20)
GUICtrlSetOnEvent(-1, '_speleoein')
GUISetState(@SW_HIDE, $GUI3)
$GUI4 = GUICreate('Feiertage', 370, 420, -1, -1)
GUISetOnEvent(-3, '_Fguischl4')
GUICtrlCreateLabel('Die zutreffenden Feiertage des jeweiligen Bundeslands auswählen.', 25, 10, 390, 20)
GUICtrlSetColor(-1, 0x0000FF)
Local $afei = _Feiertage(GUICtrlRead($jahr))
Local $feiersp[32]
Local $x = 20, $y = 50
For $i = 0 To 31
If $i = 16 Then
$x = 200
$y = 50
EndIf
$feiersp[$i] = GUICtrlCreateButton($afei[$i][1], $x, $y, 150, 20)
GUICtrlSetOnEvent(-1, '_wrii')
$y += 22
Next
GUISetState(@SW_HIDE, $GUI4)
$GUI5 = GUICreate('Schichten vergeben', 370, 330, -1, -1)
GUISetOnEvent(-3, '_gui5exit')
GUICtrlCreateLabel('Sie haben die Möglichkeit 4 schichten mit verschiedene Zeiten auszustatten. Das Programm merkt sich die eingegeben Zeiten und arbeitet mit ihnen!', 20, 20, 320, 50)
Local $schiInput[4]
Local $t = 80
For $i = 0 To 3
$schiInput[$i] = GUICtrlCreateInput('', 160, $t, 30, 20)
$t += 50
Next
Local $schibut[4]
Local $t = 80
For $i = 0 To 3
$schibut[$i] = GUICtrlCreateButton('Speichern', 220, $t, 80, 20)
GUICtrlSetOnEvent(-1, '_schisetz')
$t += 50
Next
Local $schizurue = GUICtrlCreateButton('Werte Zurücksetzen', 190, 270, 110, 20)
GUICtrlSetOnEvent(-1, '_speleoein')
Local $sichtiniaus = IniReadSection($schichtsetz, ' Schichten ')
If @error Then
Else
For $i = 1 To $sichtiniaus[0][0]
GUICtrlSetData($schiInput[$i - 1], $sichtiniaus[$i][1])
Next
EndIf
GUICtrlCreateLabel('Schichtbezeichnung: F2 ', 25, 83, 120, 20)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateLabel('Schichtbezeichnung: S2 ', 25, 133, 120, 20)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateLabel('Schichtbezeichnung: Z ', 25, 183, 120, 20)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateLabel('Schichtbezeichnung: Na ', 25, 233, 120, 20)
GUICtrlSetColor(-1, 0x0000FF)
GUISetState(@SW_HIDE, $GUI5)
Func _desklink()
If FileExists(@ScriptDir & '\data\Ndekv') Then Return
Local $bLoop = 1
Local $spei = MsgBox(4, '', 'Wollen sie eine Verknüpfung auf dem Dektop anlegen?')
If $spei = 7 Then
_FileCreate(@ScriptDir & '\data\Ndekv')
$bLoop = 0
EndIf
If $bLoop = 1 Then FileCreateShortcut(@ScriptDir & "\Dienstplan.exe", @DesktopDir & "\Dienstplan.lnk", @DesktopDir & "\Pic\ICON_541.ICO", @SW_MINIMIZE)
EndFunc ;==>_desklink
Func _speleoein()
Switch @GUI_CtrlId
Case $speiloe1
FileDelete(@ScriptDir & '\data\Feiertage' & GUICtrlRead($jahr) & '.ini')
Sleep(150)
_Wochentag()
Case $schizurue
FileDelete(@ScriptDir & '\data\Schichten.ini')
Local $s = IniReadSection($schichtsetz, 'Schichten')
For $i = 0 To 3
IniWrite($schichtsetz, 'Schichten', 'Gesetzt' & $i + 1, '0')
GUICtrlSetData($schiInput[$i], '0')
Next
EndSwitch
EndFunc ;==>_speleoein
Func PlusMinus()
Dim $am[12][2] = [['Januar', 1],['Februar', 2],['März', 3],['April', 4],['Mai', 5],['Juni', 6],['Juli', 7],['August', 8],['September', 9],['Oktober', 10],['November', 11],['Dezember', 12]]
Switch @GUI_CtrlId
Case $miusB
GUICtrlSetState($miusB, $GUI_HIDE)
GUICtrlSetState($mweahl, $GUI_SHOW + $GUI_ENABLE)
Case $mweahl
GUICtrlSetState($mweahl, $GUI_HIDE + $GUI_DISABLE)
GUICtrlSetState($miusB, $GUI_SHOW)
For $i = 0 To UBound($am) - 1
If $am[$i][0] = GUICtrlRead($mweahl) Then GUICtrlSetData($monatzahl, $am[$i][1])
Next
GUICtrlSetData($monataus, GUICtrlRead($mweahl))
_Wochentag()
Case $minus
If GUICtrlSetData($jahr, GUICtrlRead($jahr) - 1) Then _Wochentag()
Case $plus
If GUICtrlSetData($jahr, GUICtrlRead($jahr) + 1) Then _Wochentag()
EndSwitch
EndFunc ;==>PlusMinus
Func _Wochentag()
Dim $aei1[12] = [$aschTage, $aschTage1, $aschTage2, $aschTage3, $aschTage4, $aschTage5, $aschTage6, $aschTage7, $aschTage8, $aschTage9, $aschTage10, $aschTage11]
Dim $z, $zah = 0, $anzSaSo = 0, $iniaus, $feierINI = @ScriptDir & '\data\Feiertage' & GUICtrlRead($jahr) & '.ini'
GUICtrlSetData($Schalt, '')
If Not FileExists($feierINI) Then Return MsgBox(0, 'Info', 'Es ist kein Feiertag speicher vorhanden!') & _Fgui4()
For $i = 0 To 6
GUICtrlSetData($afeilabel[$i], '')
Next
For $i = 0 To 30
GUICtrlSetState($arTage[$i][0], $GUI_HIDE)
GUICtrlSetState($arTage[$i][1], $GUI_HIDE)
Next
For $i = 0 To UBound($aei1) - 1
$z = $aei1[$i]
For $e = 0 To UBound($z) - 1
If $e < _DateDaysInMonth(GUICtrlRead($jahr), GUICtrlRead($monatzahl)) Then
GUICtrlSetData($arTage[$e][1], _getwochwntag(_DateToDayOfWeek(GUICtrlRead($jahr), GUICtrlRead($monatzahl), GUICtrlRead($arTage[$e][0]))))
GUICtrlSetState($z[$e][0], $GUI_ENABLE)
GUICtrlSetState($z[$e][1], $GUI_ENABLE)
Else
GUICtrlSetData($arTage[$e][1], "")
GUICtrlSetState($z[$e][0], $GUI_DISABLE)
GUICtrlSetState($z[$e][1], $GUI_DISABLE)
EndIf
Next
Next
For $i = 0 To UBound($aei1) - 1
$z = $aei1[$i]
For $e = 0 To UBound($z) - 1
If GUICtrlRead($arTage[$e][1]) = 'Sa' Or GUICtrlRead($arTage[$e][1]) = 'So' Then
GUICtrlSetBkColor($z[$e][0], 0xDADBE5)
GUICtrlSetBkColor($z[$e][1], 0xDADBE5)
GUICtrlSetColor($arTage[$e][1], 0xff0000)
GUICtrlSetColor($arTage[$e][0], 0xff0000)
Else
GUICtrlSetBkColor($z[$e][0], 0xFFFFFF)
GUICtrlSetBkColor($z[$e][1], 0xFFFFFF)
GUICtrlSetColor($arTage[$e][1], 0x000000)
GUICtrlSetColor($arTage[$e][0], 0x000000)
EndIf
Next
Next
$iniaus = IniReadSection($feierINI, GUICtrlRead($monataus))
_ArraySort($iniaus, 0, 0, 0, 1)
For $i = 1 To UBound($iniaus) - 1
Local $as_arrayr = _StringSplitCount(StringReplace($iniaus[$i][1], '.', ''), 2)
If _DateToDayOfWeekISO($as_arrayr[2] & $as_arrayr[3], $as_arrayr[1], $as_arrayr[0]) = 5 Or _DateToDayOfWeekISO($as_arrayr[2] & $as_arrayr[3], $as_arrayr[1], $as_arrayr[0]) = 6 Then
Else
$zah += 1
EndIf
GUICtrlSetData($afeilabel[$i - 1], $iniaus[$i][1])
Next
For $i = 0 To 30
GUICtrlSetState($arTage[$i][0], $GUI_SHOW)
GUICtrlSetState($arTage[$i][1], $GUI_SHOW)
If _DateToDayOfWeek(GUICtrlRead($jahr), GUICtrlRead($monatzahl), GUICtrlRead($arTage[$i][0])) = 1 Or _DateToDayOfWeek(GUICtrlRead($jahr), GUICtrlRead($monatzahl), GUICtrlRead($arTage[$i][0])) = 7 Then $anzSaSo += 1
Next
$x = _DateDaysInMonth(GUICtrlRead($jahr), GUICtrlRead($monatzahl)) - $anzSaSo - $zah
If _DateIsLeapYear(GUICtrlRead($jahr)) Then GUICtrlSetData($Schalt, 'Schaltjahr')
EndFunc ;==>_Wochentag
Func _getwochwntag($wtag)
Local $aWT[8] = ['', 'So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
Return $aWT[$wtag]
EndFunc ;==>_getwochwntag
Func _buton()
If GUICtrlRead($monataus) = '-------------------' Then Return MsgBox(0, 'Info', 'Keine Monat ausgewählt!')
Local $b = (@GUI_CtrlId - 31)
Local $mr
If $b = 0 Then $mr = $aschTage
If $b = 1 Then $mr = $aschTage1
If $b = 2 Then $mr = $aschTage2
If $b = 3 Then $mr = $aschTage3
If $b = 4 Then $mr = $aschTage4
If $b = 5 Then $mr = $aschTage5
If $b = 6 Then $mr = $aschTage6
If $b = 7 Then $mr = $aschTage7
If $b = 8 Then $mr = $aschTage8
If $b = 9 Then $mr = $aschTage9
If $b = 10 Then $mr = $aschTage10
If $b = 11 Then $mr = $aschTage11
GUICtrlSetData($aist[$b][0], (_aUtage($mr) * _weiter(GUICtrlRead($asoll[$b][0]))) + _renunga2($mr, $b))
GUICtrlSetData($arurlaub[$b][1], StringReplace(GUICtrlRead($arurlaub[$b][0]), ',', '.') - _aUtage($mr))
GUICtrlSetData($asoll[$b][1], _weiter(GUICtrlRead($asoll[$b][0])) * $x)
GUICtrlSetData($asoler[$b][0], Round(GUICtrlRead($aist[$b][0]) - GUICtrlRead($asoll[$b][1]), 2))
GUICtrlSetData($auebertr[$b][1], Round(GUICtrlRead($asoler[$b][0]) + StringReplace(GUICtrlRead($auebertr[$b][0]), ',', '.'), 2))
EndFunc ;==>_buton
Func _renunga2($rech, $c)
Local $zaehlen = 0
Local $s = IniReadSection($schichtsetz, 'Schichten')
Local $ssch = StringReplace($s[1][1], ',', '.')
Local $ssch1 = StringReplace($s[2][1], ',', '.')
Local $ssch2 = StringReplace($s[3][1], ',', '.')
Local $ssch3 = StringReplace($s[4][1], ',', '.')
Local $a = _weiter(GUICtrlRead($asoll[$c][0]))
Local $b = $a / 2
For $i = 0 To UBound($rech) - 1
If GUICtrlRead($rech[$i][0]) = 'F' Then $zaehlen += $a
If GUICtrlRead($rech[$i][0]) = 'S' Then $zaehlen += $a
If GUICtrlRead($rech[$i][0]) = 'FF' Then $zaehlen += $b
If GUICtrlRead($rech[$i][0]) = 'SS' Then $zaehlen += $b
If GUICtrlRead($rech[$i][0]) = 'Z' Then $zaehlen += $ssch2
If GUICtrlRead($rech[$i][0]) = 'F2' Then $zaehlen += $ssch
If GUICtrlRead($rech[$i][0]) = 'S2' Then $zaehlen += $ssch1
If GUICtrlRead($rech[$i][0]) = 'Na' Then $zaehlen += $ssch3
If GUICtrlRead($rech[$i][0]) = 'K' Then $zaehlen += $a
Next
Return $zaehlen
EndFunc ;==>_renunga2
Func _aUtage($urech)
Local $anzSicht = 0
For $i = 0 To UBound($urech) - 1
If GUICtrlRead($urech[$i][1]) = 'U' Then $anzSicht += 1
Next
Return $anzSicht
EndFunc ;==>_aUtage
Func _weiter($wochstu)
Local $waus = StringReplace($wochstu, ',', '.')
Return $waus / 5
EndFunc ;==>_weiter
Func _save_lesen()
Dim $z, $wahl = GUICtrlRead($jahr), $zz = 0, $N = 0, $h = 0, $sch = @ScriptDir & '\data\' & $wahl & '\SichtenSpeicher\Schicht' & GUICtrlRead($mweahl) & '.ini', $alesenschreibINI = @ScriptDir & '\data\' & $wahl & '\Dienstplan_settings_Ueberblick' & $wahl & '.ini', $aData
Dim $spei, $loop = 1
Dim $aei1[34][2] = [['Name', $aname],['Position', $aname],['Soll', $asoll],['WS', $asoll],['Ist', $aist],['Übertrag', $auebertr],['PM', $auebertr],['Urlaub', $arurlaub],['NU', $arurlaub],['Soller', $asoler],['M1-', $aschTage],['UT1-', $aschTage],['M2-', $aschTage1],['UT2-', $aschTage1],['M3-', $aschTage2],['UT3-', $aschTage2],['M4-', $aschTage3],['UT4-', $aschTage3],['M5-', $aschTage4],['UT5-', $aschTage4],['M6-', $aschTage5],['UT6-', $aschTage5],['M7-', $aschTage6],['UT7-', $aschTage6],['M8-', $aschTage7],['UT8-', $aschTage7],['M9-', $aschTage8],['UT9-', $aschTage8],['M10-', $aschTage9],['UT10-', $aschTage9],['M11-', $aschTage10],['UT11-', $aschTage10],['M12-', $aschTage11],['UT12-', $aschTage11]]
DirCreate(@ScriptDir & '\data\' & GUICtrlRead($jahr) & '\Sichtenspeicher')
Switch @GUI_CtrlId
Case $aMErst[0], $aspeig
If GUICtrlRead($monataus) = '-------------------' Then Return MsgBox(0, 'Info', 'Kein Monat ausgewählt!')
GUISetState(@SW_HIDE, $GUI)
ProgressOn('', 'Daten werden gespeichert ...')
$h += 10
ProgressSet($h, $h & '%')
For $i = 0 To 11
IniWrite($alesenschreibINI, GUICtrlRead($monataus), 'Name' & $i + 1, GUICtrlRead($aname[$i][0]) & '|' & GUICtrlRead($aname[$i][1]) & '|' & GUICtrlRead($asoll[$i][1]) & '|' & GUICtrlRead($aist[$i][0]) & '|' & GUICtrlRead($auebertr[$i][1]) & '|' & GUICtrlRead($arurlaub[$i][1]))
$h += 2
ProgressSet($h, $h & '%')
Next
For $i = 0 To UBound($aei1) - 1
$N = 0
If $aei1[$i][0] = 'Position' Or $aei1[$i][0] = 'Soll' Or $aei1[$i][0] = 'Übertrag' Or $aei1[$i][0] = 'Urlaub' Or StringLeft($aei1[$i][0], 2) = 'UT' Then $N = 1
$z = $aei1[$i][1]
For $e = 0 To UBound($z) - 1
If GUICtrlRead($z[$e][$N]) <> IniRead($sch, GUICtrlRead($mweahl), $aei1[$i][0] & $e + 1, '') Then IniWrite($sch, GUICtrlRead($monataus), $aei1[$i][0] & $e + 1, GUICtrlRead($z[$e][$N]))
Next
$h += 2
ProgressSet($h, $h & '%')
Next
ProgressOff()
GUISetState(@SW_SHOW, $GUI)
MsgBox(64, 'Speicher Bericht', 'Speicher der Daten Komplett!')
Case $aMErst[1]
For $i = 0 To UBound($aei1) - 1
$N = 0
If $aei1[$i][0] = 'Position' Or $aei1[$i][0] = 'Soll' Or $aei1[$i][0] = 'Übertrag' Or $aei1[$i][0] = 'Urlaub' Or StringLeft($aei1[$i][0], 2) = 'UT' Then $N = 1
$z = $aei1[$i][1]
For $e = 0 To UBound($z) - 1
If Not GUICtrlRead($z[$e][$N]) = '' Then Return MsgBox(0, 'Info', 'Bevor eingelesen werden kann, Speichern oder leren sie die Ansicht!')
Next
Next
If IniReadSection($sch, GUICtrlRead($mweahl)) Then Return MsgBox(0, 'Info', 'Speicher nicht vorhanden!')
GUISetState(@SW_HIDE, $GUI)
ProgressOn('', 'Daten werden geladen ...')
$h += 1
ProgressSet($h, $h & '%')
For $i = 0 To UBound($aei1) - 1
$N = 0
If $aei1[$i][0] = 'Position' Or $aei1[$i][0] = 'Soll' Or $aei1[$i][0] = 'Übertrag' Or $aei1[$i][0] = 'Urlaub' Or StringLeft($aei1[$i][0], 2) = 'UT' Then $N = 1
$z = $aei1[$i][1]
For $e = 0 To UBound($z) - 1
If GUICtrlRead($z[$e][$N]) = '' Then GUICtrlSetData($z[$e][$N], IniRead($sch, GUICtrlRead($mweahl), $aei1[$i][0] & $e + 1, ''))
Next
$h += 3
ProgressSet($h, Round($h) & '%')
Next
ProgressOff()
GUISetState(@SW_SHOW, $GUI)
MsgBox(64, 'Einlese Bericht', 'Einlesen vom Speicher Komplett!')
Case $alinil
If Not FileExists($alesenschreibINI) Or IniReadSection($alesenschreibINI, GUICtrlRead($monaswa)) Then Return MsgBox(0, 'Info', 'Speicher nicht vorhanden!')
$aData = IniReadSection($alesenschreibINI, GUICtrlRead($monaswa))
GUICtrlCreateListViewItem('----------|----------|---------|' & GUICtrlRead($monaswa) & GUICtrlRead($jahr) & '|----------|----------', $hListview)
For $i = 1 To $aData[0][0]
GUICtrlCreateListViewItem($aData[$i][1], $hListview)
Next
MsgBox(0, 'Daten einelese', 'Daten von ' & GUICtrlRead($monaswa) & ' wurde erfolgreich eingelsen!')
Case $aMErst[2]
For $i = 0 To UBound($aei1) - 1
$N = 0
If $aei1[$i][0] = 'Position' Or $aei1[$i][0] = 'Soll' Or $aei1[$i][0] = 'Übertrag' Or $aei1[$i][0] = 'Urlaub' Or StringLeft($aei1[$i][0], 2) = 'UT' Then $N = 1
$z = $aei1[$i][1]
For $e = 0 To UBound($z) - 1
GUICtrlSetData($z[$e][$N], '')
Next
Next
EndSwitch
EndFunc ;==>_save_lesen
Func _ftausl()
Local $c = (@GUI_CtrlId - 24)
Local $d = GUICtrlRead($afeilabel[$c])
Local $inifeiaus = IniReadSection(@ScriptDir & '\data\Feiertage' & GUICtrlRead($jahr) & '.ini', GUICtrlRead($monataus))
If @error Then
Else
For $i = 1 To $inifeiaus[0][0]
If $inifeiaus[$i][1] = $d Then MsgBox(0, '', $inifeiaus[$i][0])
Next
EndIf
EndFunc ;==>_ftausl
Func _wrii()
Local $a = (@GUI_CtrlId - 1015)
Local $afeius = _Feiertage(GUICtrlRead($jahr))
Local $as_array = _StringSplitCount(StringReplace($afeius[$a][0], '.', ''), 2)
Local $as_aweit = _getmonatwahl($as_array[1])
IniWrite(@ScriptDir & '\data\Feiertage' & GUICtrlRead($jahr) & '.ini', $as_aweit, $afeius[$a][1], $afeius[$a][0])
_GUICtrlButton_Enable($feiersp[$a], False)
EndFunc ;==>_wrii
Func _StringSplitCount(Const $S_TEXT, Const $I_COUNT)
Return StringRegExp($S_TEXT, '.{1,' & $I_COUNT & '}', 3)
EndFunc ;==>_StringSplitCount
Func _getmonatwahl($monatw)
Local $aMonat[13] = ['', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']
Return $aMonat[$monatw]
EndFunc ;==>_getmonatwahl
Func _schisetz()
Local $a = (@GUI_CtrlId - 1052)
Local $c
If $a = 0 Then $c = 1
If $a = 1 Then $c = 2
If $a = 2 Then $c = 3
If $a = 3 Then $c = 4
IniWrite($schichtsetz, 'Schichten', 'Gesetzt' & $c, GUICtrlRead($schiInput[$a]))
EndFunc ;==>_schisetz
Func _Druck()
Local $array = _Listviewtoarray($hLVHandle)
_test($array)
EndFunc ;==>_Druck
Func _test($array)
Local $open = FileOpen($sDBFile, 2)
Local $html = _ArrayToHTMLTable2($array, True)
FileWrite($open, $html)
FileClose($open)
ShellExecute($sDBFile)
EndFunc ;==>_test
Func _Listviewtoarray($hwnd)
Local $col, $getcol, $lcount, $atext, $counter = 1
$col = _GUICtrlListView_GetColumnCount($hwnd)
$lcount = _GUICtrlListView_GetItemCount($hwnd)
Local $alistview[$lcount + 1][$col]
For $y = 0 To $col - 1
$getcol = _GUICtrlListView_GetColumn($hwnd, $y)
$alistview[0][$y] = $getcol[5]
Next
For $i = 0 To $lcount - 1
$atext = _GUICtrlListView_GetItemTextArray($hwnd, $i)
For $x = 0 To $atext[0] - 1
$alistview[$counter][$x] = $atext[$x + 1]
Next
$counter += 1
Next
Return $alistview
$counter = 1
EndFunc ;==>_Listviewtoarray
Func _ArrayToHTMLTable2(ByRef $aArray, $bHeader = True, $break = 37)
Local $int, $theader, $hcounter = 0, $del = $break + 1
Local $iD1 = UBound($aArray, 1)
If @error Then
SetError(1)
Return ''
EndIf
Local $iD2 = UBound($aArray, 2)
If @error Then
SetError(1)
Return ''
EndIf
Local $sTable = ""
$sTable &= '<style type="text/css">' & @CRLF
$sTable &= '</style>' & @CRLF
$sTable &= '<table border="1" style="width:100%">' & @CRLF
Local $iStart = 0
If $bHeader Then
$iStart = 1
$sTable &= '<tr>' & @CRLF
For $i = 0 To $iD2 - 1
$theader &= @TAB & '<th align="left">' & $aArray[0][$i] & '</th>' & @CRLF
Next
$sTable &= $theader
$sTable &= '</tr>' & @CRLF
EndIf
For $i = $iStart To $iD1 - 1
$hcounter += 1
If $hcounter = $del Then
$sTable &= '</table>' & @CRLF
$sTable &= '<h5>Übertrag</h5>' & @CRLF
$sTable &= '<h5 style="page-break-before:always">Übertrag</h5>' & @CRLF
$sTable &= '<table border="1" style="width:100%">' & @CRLF
$sTable &= '<tr>' & @CRLF
$sTable &= $theader
$sTable &= '</tr>' & @CRLF
$hcounter = 0
$del = $break
EndIf
$sTable &= '<tr>' & @CRLF
For $j = 0 To $iD2 - 1
$sTable &= @TAB & '<td>' & $aArray[$i][$j] & '</td>' & @CRLF
Next
$sTable &= '</tr>' & @CRLF
Next
$sTable &= '</table>' & @CRLF
$theader = ""
Return $sTable
EndFunc ;==>_ArrayToHTMLTable2
Func _Feiertage($year, $DateTyp = 1)
Local $4AdvDat, $3AdvDat, $2AdvDat, $1AdvDat, $TotSoDat, $BuBDat, $MutterDat, $ErnteDat, $tmp
Local $HDays[32][2], $a, $b, $c, $d, $e, $H1, $H2, $N, $M
$HDays[0][0] = $year & "/01/01\Neujahr"
$HDays[1][0] = $year & "/01/06\Heilige Drei Könige"
$HDays[2][0] = $year & "/02/14\Valentinstag"
$HDays[3][0] = $year & "/05/01\Maifeiertag"
$HDays[4][0] = $year & "/10/03\Tag der Deutschen Einheit"
$HDays[5][0] = $year & "/10/31\Reformationstag"
$HDays[6][0] = $year & "/11/01\Allerheiligen"
$HDays[7][0] = $year & "/12/24\Heiligabend"
$HDays[8][0] = $year & "/12/25\1. Weihnachtsfeiertag"
$HDays[9][0] = $year & "/12/26\2. Weihnachtsfeiertag"
$HDays[10][0] = $year & "/12/31\Silvester"
$a = Mod($year, 19)
$b = Mod($year, 4)
$c = Mod($year, 7)
$H1 = Int($year / 100)
$H2 = Int($year / 400)
$N = 4 + $H1 - $H2
$M = 15 + $H1 - $H2 - Floor(Int((8 * $H1 + 13) / 25))
$d = Mod((19 * $a + $M), 30)
$e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7)
If $d + $e = 35 Then
Dim $Easter = 50
Else
If $d = 28 And $e = 6 And $a > 10 Then
$Easter = 49
Else
Local $Easter = 22 + $d + $e
EndIf
EndIf
If $Easter < 32 Then
Local $EasterDay = $Easter
Local $EasterMonth = "03"
Else
Dim $EasterDay = $Easter - 31
Local $EasterMonth = "04"
EndIf
If $EasterDay < 10 Then
$EasterDay = "0" & $EasterDay
EndIf
If $year < 1900 Then
Local $RestJahr = Mod($year, 100)
If _DateIsLeapYear($year) Then
If $RestJahr < 10 Then
Local $RestJahr = "0" & $RestJahr
EndIf
Local $Tempyear = 20 & $RestJahr
Else
If $RestJahr < 10 Then
Local $RestJahr = "0" & $RestJahr
EndIf
$Tempyear = 19 & $RestJahr
EndIf
Local $EasterDate = $Tempyear & "/" & $EasterMonth & "/" & $EasterDay
Else
Dim $EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
EndIf
Local $WFastDate = _DateAdd('d', -52, $EasterDate)
Local $RosDat = _DateAdd('d', -48, $EasterDate)
Local $FastDat = _DateAdd('d', -47, $EasterDate)
Local $AschDat = _DateAdd('d', -46, $EasterDate)
Local $GrDoDat = _DateAdd('d', -3, $EasterDate)
Local $KarDat = _DateAdd('d', -2, $EasterDate)
Local $OSaDat = _DateAdd('d', -1, $EasterDate)
Local $OSoDat = $EasterDate
Local $OMoDat = _DateAdd('d', 1, $EasterDate)
Local $HiFaDat = _DateAdd('d', 39, $EasterDate)
Local $PfSoDat = _DateAdd('d', 49, $EasterDate)
Local $PfMoDat = _DateAdd('d', 50, $EasterDate)
Local $FroDat = _DateAdd('d', 60, $EasterDate)
For $maitag = 8 To 14
If _DateToDayOfWeek($year, 5, $maitag) = 1 Then
If $maitag < 10 Then
$maitag = "0" & $maitag
EndIf
$MutterDat = $year & "/05/" & $maitag
If $MutterDat = $PfSoDat Then
$MutterDat = _DateAdd('d', -7, $year & "/05/" & $maitag)
EndIf
ExitLoop
EndIf
Next
For $oktobertag = 1 To 7
If _DateToDayOfWeek($year, 10, $oktobertag) = 1 Then
$oktobertag = "0" & $oktobertag
$ErnteDat = $year & "/10/" & $oktobertag
ExitLoop
EndIf
Next
For $deztag = 18 To 24
If _DateToDayOfWeek($year, 12, $deztag) = 1 Then
$4AdvDat = $year & "/12/" & $deztag
$3AdvDat = _DateAdd('d', -7, $4AdvDat)
$2AdvDat = _DateAdd('d', -14, $4AdvDat)
$1AdvDat = _DateAdd('d', -21, $4AdvDat)
$TotSoDat = _DateAdd('d', -28, $4AdvDat)
$BuBDat = _DateAdd('d', -32, $4AdvDat)
ExitLoop
EndIf
Next
$HDays[11][0] = $WFastDate & "\Weiberfastnacht"
$HDays[12][0] = $RosDat & "\Rosenmontag"
$HDays[13][0] = $FastDat & "\Fastnacht"
$HDays[14][0] = $AschDat & "\Aschermittwoch"
$HDays[15][0] = $GrDoDat & "\Gründonnerstag"
$HDays[16][0] = $KarDat & "\Karfreitag"
$HDays[17][0] = $OSaDat & "\Ostersamstag"
$HDays[18][0] = $OSoDat & "\Ostersonntag"
$HDays[19][0] = $OMoDat & "\Ostermontag"
$HDays[20][0] = $HiFaDat & "\Christi Himmelfahrt"
$HDays[21][0] = $PfSoDat & "\Pfingstsonntag"
$HDays[22][0] = $PfMoDat & "\Pfingstmontag"
$HDays[23][0] = $MutterDat & "\Muttertag"
$HDays[24][0] = $FroDat & "\Fronleichnam"
$HDays[25][0] = $ErnteDat & "\Erntedankfest"
$HDays[26][0] = $BuBDat & "\Buß- und Bettag"
$HDays[27][0] = $TotSoDat & "\Totensonntag"
$HDays[28][0] = $1AdvDat & "\1. Advent"
$HDays[29][0] = $2AdvDat & "\2. Advent"
$HDays[30][0] = $3AdvDat & "\3. Advent"
$HDays[31][0] = $4AdvDat & "\4. Advent"
_ArraySort($HDays, 0, 0, 10)
_ArraySort($HDays, 0, 11)
For $i = 0 To 31
If $DateTyp Then
$tmp = StringSplit($HDays[$i][0], "\", 2)
$HDays[$i][0] = StringMid($tmp[0], 9) & "." & StringMid($tmp[0], 6, 2) & "." & StringMid($tmp[0], 1, 4)
$HDays[$i][1] = $tmp[1]
Else
$HDays[$i][1] = StringTrimLeft($HDays[$i][0], 11)
$HDays[$i][0] = StringLeft($HDays[$i][0], 10)
EndIf
Next
Return $HDays
EndFunc ;==>_Feiertage
Func WM_VSCROLL($hwnd, $Msg, $wParam, $lParam)
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Local $index = -1, $yChar, $yPos
Local $Min, $Max, $Page, $Pos, $TrackPos
For $x = 0 To UBound($aSB_WindowInfo) - 1
If $aSB_WindowInfo[$x][0] = $hwnd Then
$index = $x
$yChar = $aSB_WindowInfo[$index][2]
ExitLoop
EndIf
Next
If $index = -1 Then Return 0
Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hwnd, $SB_VERT)
$Min = DllStructGetData($tSCROLLINFO, "nMin")
$Max = DllStructGetData($tSCROLLINFO, "nMax")
$Page = DllStructGetData($tSCROLLINFO, "nPage")
$yPos = DllStructGetData($tSCROLLINFO, "nPos")
$TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
$Pos = $yPos
Switch $nScrollCode
Case $SB_TOP
DllStructSetData($tSCROLLINFO, "nPos", $Min)
Case $SB_BOTTOM
DllStructSetData($tSCROLLINFO, "nPos", $Max)
Case $SB_LINEUP
DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
Case $SB_LINEDOWN
DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
Case $SB_PAGEUP
DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
Case $SB_PAGEDOWN
DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
Case $SB_THUMBTRACK
DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
EndSwitch
DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hwnd, $SB_VERT, $tSCROLLINFO)
_GUIScrollBars_GetScrollInfo($hwnd, $SB_VERT, $tSCROLLINFO)
$Pos = DllStructGetData($tSCROLLINFO, "nPos")
If ($Pos <> $yPos) Then
_GUIScrollBars_ScrollWindow($hwnd, 0, $yChar * ($yPos - $Pos))
$yPos = $Pos
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_VSCROLL
Func _Exit()
Exit
EndFunc ;==>_Exit
Func _Fgui()
GUISetState(@SW_HIDE, $GUI3)
GUISetState(@SW_SHOW, $GUI2)
EndFunc ;==>_Fgui
Func _Fgui3()
GUISetState(@SW_SHOW, $GUI3)
EndFunc ;==>_Fgui3
Func _Fgui4()
GUISetState(@SW_SHOW, $GUI4)
EndFunc ;==>_Fgui4
Func _Fguischl()
GUISetState(@SW_HIDE, $GUI2)
EndFunc ;==>_Fguischl
Func _Fguischl3()
GUISetState(@SW_HIDE, $GUI3)
EndFunc ;==>_Fguischl3
Func _Fguischl4()
GUISetState(@SW_HIDE, $GUI4)
If FileExists(@ScriptDir & '\data\Feiertage' & GUICtrlRead($jahr) & '.ini') Then _Wochentag()
For $i = 0 To 31
_GUICtrlButton_Enable($feiersp[$i], True)
Next
EndFunc ;==>_Fguischl4
Func _gui5()
GUISetState(@SW_SHOW, $GUI5)
EndFunc ;==>_gui5
Func _gui5exit()
GUISetState(@SW_HIDE, $GUI5)
EndFunc ;==>_gui5exit
While 1 * Sleep(10)
WEnd
Und immer noch unter 1000 zeilen!
Freu mich auf Feedback!
LG Kleiner