Tage und Monat minus bestimmte Zahl subtrahieren

  • Guten Morgen,

    hab keinen Plan wie ich die Überschrift sonstsinnvoll benennen soll.

    Mein Probelm ist folgendes. Ich möchte gerne z.B. den heutigen Tag (28.01.2014) - 10 Tage rechnen, das klappt auch wunderbar, aber wenn ich z.b den 09.01.2013 - 10 Tage rechne, dann klappt das nicht, dass dann das Datum angepasst wird auf den 31.12.2013.

    Mein Programm schmiert dann ab und eine selbst erstellte MsgBox zeigt mir an lediglich an das Tag1(09.01.2013)-Tag2(10) = -1 ist.


    Wie bekomme ich es hin, dass mir der richtige Tag angezeigt wird?

  • Okey also ich hätte vermutlich mehr Input geben müssen damit ich eine Lösung bekomme, die auf mein Problem passt. Deine Lösung mit _DateAdd klappt irgendwie nicht mit dem Problem was ich eingetlich habe, naja das lag an mir.

    Das folgede Script ist relativ lang:


    Also ich hab folgendes: Mein Programm erstellt folgende Ordner:

    [autoit]

    DirCreate (@ScriptDir&"\Daten\Archiv\Start"&@YEAR&""&@MON)
    DirCreate (@ScriptDir&"\Daten\Archiv\Ende"&@YEAR&""&@MON)
    DirCreate (@ScriptDir&"\Daten\Archiv\Stopp"&@YEAR&""&@MON)
    DirCreate (@ScriptDir&"\Daten\Aufragaserfassung")
    DirCreate (@ScriptDir&"\Daten\Archiv\Aufragserfassung"&@YEAR&""&@MON)
    $Pfad_Auftragserfassung = @ScriptDir&"\Daten\Aufragaserfassung"
    $Pfad_Stoppgruende = @ScriptDir&"\Daten\Stoppgründe"
    $Stopp = @ScriptDir&"\Daten\Stopp"
    $Pfad_Start = @ScriptDir&"\Daten\Start"
    $Pfad_Ende = @ScriptDir&"\Daten\Ende"
    $Pfad_Stopp = @ScriptDir&"\Daten\Stopp"
    $Pfad_Mitarbeiter = @ScriptDir&"\Daten\Mitarbeiter"
    $Pfad_Stoppgruende = @ScriptDir&"\Daten\Stoppgründe"
    $Pfad_KomBereiche = @ScriptDir&"\Daten\KomBereiche"
    $Pfad_Archierung = @ScriptDir&"\Daten\Archiv"
    $Pfad_Start_Archiv = @ScriptDir&"\Daten\Archiv\Start"&@YEAR&""&@MON
    $Pfad_Ende_Archiv = @ScriptDir&"\Daten\Archiv\Ende"&@YEAR&""&@MON
    $Pfad_Stopp_Archiv = @ScriptDir&"\Daten\Archiv\Stopp"&@YEAR&""&@MON
    $Stoppgruende = GUICtrlRead($Stoppgruende_List)
    $Pfad_Auftragserfassung_Archiviert = @ScriptDir&"\Daten\Archiv\Aufragserfassung"&@YEAR&""&@MON
    $Pfad_Ende_ArchivTC = @ScriptDir&"\Daten\Archiv\Ende"&@YEAR&""&@MON
    $Pfad_Stopp_ArchivTC = @ScriptDir&"\Daten\Archiv\Stopp"&@YEAR&""&@MON
    DirCreate($Pfad_Ende)
    DirCreate($Pfad_Start)
    DirCreate($Stopp)
    DirCreate($Pfad_Stoppgruende)

    [/autoit]

    In meinem Programm werden dann jeweils nach Datum noch halt die Dateien erstellt, also zum Beispiel heute wird dann in allen Ordnern mit

    [autoit]

    @YEAR&@MON

    [/autoit]

    die Datei

    [autoit]

    @MDAY&".ini"

    [/autoit]

    erstellt.

    Anschließend wird irgendwann, falls dies gefordert ist, der Inhalt dieser Datei z.B. von Heute Also Datei 28.ini in eine ListView bzw. 2 ListViews eingetrage, dabei spielen folgende Ini-Dateien eine Rolle:

    [autoit]

    ;~ -------ListView Übersicht komplett füllen---------------------------------------
    Func ListView_Uebersicht_fuellen()
    $Tag = @MDAY
    $Tag2 = $Tag ;- 10
    ;~ $Tag = @YEAR&"-"&@MON&"-"&@MDAY
    ;~ $Tag2 = _DateAdd('D', -10, $Tag);_NowCalcDate())
    MsgBox(0,"","Tag 1 entspricht"&$Tag)
    MsgBox(0,"","Tag nach abzug von 10 Tagen entspricht"&$Tag2)
    For $x= $Tag To $Tag2 step -1
    ListViewLaden($Pfad_Start&"\Start.ini",0,$x)
    ListViewLaden($Pfad_Stopp&"\Stopp.ini",1,$x)
    ListViewLaden($Pfad_Ende&"\Ende.ini",2,$x)
    Next
    EndFunc

    [/autoit][autoit]

    ;~ -------ListView Übersicht Komplett füllen Func----------------------------------
    Func ListViewLaden($Pfad_ListViewLaden,$Auswahl,$h)
    $SectionsCount = IniReadSectionNames($Pfad_ListViewLaden)

    [/autoit][autoit][/autoit][autoit]

    If NOT @error Then
    $Count = $SectionsCount[0]
    For $e = 1 To $Count
    $ArrayStartName = IniReadSection($Pfad_ListViewLaden, $SectionsCount[$e])
    $Name = $ArrayStartName[1][1]
    $Spool = $ArrayStartName[2][1]
    $Stopp = $ArrayStartName[3][1]
    $Time = $ArrayStartName[4][1]
    $Date = $ArrayStartName[5][1]
    ;~ _ArrayDisplay($ArrayStartName)

    [/autoit][autoit][/autoit][autoit]

    $Kom = IniRead($Pfad_Auftragserfassung_Archiviert&""&$h&".ini", $Spool ,"Kom","")
    $Bemerkung = IniRead($Pfad_Auftragserfassung_Archiviert&""&$h&".ini", $Spool ,"Bemerkung","Fehler")
    $Express = IniRead($Pfad_Auftragserfassung_Archiviert&""&$h&".ini", $Spool ,"Express","Fehler")
    $EndGe = "-"

    [/autoit][autoit][/autoit][autoit]

    If $Bemerkung <> "Fehler" AND $Express <> "Fehler" Then
    If $Auswahl = 0 Then
    GUICtrlCreateListViewItem($Name&"|"&$Kom&"|"&$Spool&"|"&$Time&"|"&$Date&"|"&$EndGe&"|"&$EndGe&"|"&$EndGe&"|"&$EndGe&"|"&$Bemerkung&"|"&$Express,$Voll_Uebersicht_List);Start
    ElseIf $Auswahl = 1 Then
    GUICtrlCreateListViewItem($Name&"|"&$Kom&"|"&$Spool&"|"&$EndGe&"|"&$EndGe&"|"&$EndGe&"|"&$EndGe&"|"&$Time&"|"&$Date&"|"&$Bemerkung&"|"&$Express,$Voll_Uebersicht_List);Stopp
    ElseIf $Auswahl = 2 Then
    GUICtrlCreateListViewItem($Name&"|"&$Kom&"|"&$Spool&"|"&$EndGe&"|"&$EndGe&"|"&$Time&"|"&$Date&"|"&$EndGe&"|"&$EndGe&"|"&$Bemerkung&"|"&$Express,$Voll_Uebersicht_List);Ende
    EndIf
    EndIf
    If $Express = "Ja" Then GUICtrlSetBkColor(-1,0xFF0000)
    Next
    EndIf
    EndFunc

    [/autoit][autoit]

    ;~ -------ListView in Array einfügen-----------------------------------------------
    Func _GUICtrlListView_CreateArray($hListView, $sDelimeter = '|')
    Local $iColumnCount = _GUICtrlListView_GetColumnCount($hListView), $iDim = 0, $iItemCount = _GUICtrlListView_GetItemCount($hListView)
    If $iColumnCount < 3 Then
    $iDim = 3 - $iColumnCount
    EndIf
    If $sDelimeter = Default Then
    $sDelimeter = '|'
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Local $aColumns = 0, $aReturn[$iItemCount + 1][$iColumnCount + $iDim] = [[$iItemCount, $iColumnCount, '']]
    For $i = 0 To $iColumnCount - 1
    $aColumns = _GUICtrlListView_GetColumn($hListView, $i)
    $aReturn[0][2] &= $aColumns[5] & $sDelimeter
    Next
    $aReturn[0][2] = StringTrimRight($aReturn[0][2], StringLen($sDelimeter))

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To $iItemCount - 1
    For $j = 0 To $iColumnCount - 1
    $aReturn[$i + 1][$j] = _GUICtrlListView_GetItemText($hListView, $i, $j)
    Next
    Next
    Return SetError(Number($aReturn[0][0] = 0), 0, $aReturn)
    EndFunc

    [/autoit][autoit]

    ;~ --------ListView KomBereiche Summe füllen-------------------------------------
    Func ListView_KomBereich_Summe()
    $sDelimeter = ""
    $ListKom =_GUICtrlListView_CreateArray($Voll_Uebersicht_List, $sDelimeter = '|')
    $k = $ListKom[0][0]
    Dim $KomList[1]
    ReDim $KomList[UBound($ListKom)]
    For $l = 0 To $k Step 1
    $KomList[$l] = $ListKom[$l][1]
    Next
    _ArraySort($KomList)

    [/autoit][autoit][/autoit][autoit]

    Dim $ExpressList[10]
    ReDim $ExpressList[UBound($ListKom)]
    For $n = 0 To $k Step 1
    $ExpressList[$n] = $ListKom[$n][10]
    Next
    _ArraySort($ExpressList)
    $ArrayExp = $ExpressList
    $AdditionExp = Express($ArrayExp)
    $CountExpress = UBound($AdditionExp)-1
    ;~ _ArrayDisplay($AdditionExp)
    For $q = 0 To UBound($CountExpress)
    $AddExp = $AdditionExp[$q][1]
    GUICtrlCreateListViewItem("Davon Express"&"|"&$AddExp, $KomBereich_Summe)
    Next

    [/autoit][autoit][/autoit][autoit]

    $ArrayKom = $KomList
    $AdditionKom = Addition($ArrayKom)
    _ArraySort($AdditionKom)
    $Counter3 = UBound($AdditionKom)-1
    For $m = 0 to $Counter3
    $AddSum = $AdditionKom[$m][1]
    $KomToAdd = $AdditionKom [$m][0]
    GUICtrlCreateListViewItem($KomToAdd&"|"&$AddSum,$KomBereich_Summe)
    Next
    EndFunc

    [/autoit]

    Wie ich heute Morgen bereits gesagt habe habe ich das Problem mit dem Datum, hab bereits auch denn Tipp von BugFix ausprobiert, aber da scheint doch mehr dahinter zustecken, als ich sehen kann.

    So konkrett zum Problem: Wenn ich jetzt die Daten einlese, z.b vom 31.Jan.2014 bis 10 Tage davor, dann klappt dies auch, und alles wird richtig in die ListView eingetrage, wenn ich jetzt allerdings Daten von 9.Jan - bis 10 Tage davor einlesen will geht das nicht, weil das Datum in den -Tage bereich geht.

    Heißt:

    [autoit]

    9.Jan - 10 Tage = -1.Jan

    [/autoit]

    Das andere Problem ist der Monatswechsel z.B. Am 1.Feb. Datei erstellt und alles auslesen, was davor die 10 Tage angelegt wurde. Klappt natürlich auch nicht :(;(

    Der Fehler wird mir immer hier angezeigt:

    [autoit]

    For $q = 0 To UBound($CountExpress)
    $AddExp = $AdditionExp[$q][1]
    GUICtrlCreateListViewItem("Davon Express"&"|"&$AddExp, $KomBereich_Summe)
    Next

    [/autoit]


    Hab schon herrausbekommen, das er dieses Array überhaupt nicht erstellt, da die ListView nicht gefüllt wird.


    Ich weis, dass das viel verlangt ist, mir da irgendwie zuhelfen, aber ich komm hier überhaupt nicht mehr weiter =(

    Meiner Meinung nach liegt es am Datum auslesen ?(

    • Offizieller Beitrag

    Die Datumsfunktionen funktionieren tadellos - sie erfordern aber auch zwingend, dass du das korrekte Datumsformat übergibst ( "YYYY/MM/DD" ). Ohne Jahr kannst du nicht rechnen.
    Und du wirst immer ein gültiges Datum bekommen, dafür sorgt die Funktion, inklusive Berücksichtigung von Schaltjahren.

  • Als genereller Denkanstoß: Besonders leicht sind solche Probleme immer über die Unix-Time zu lösen.
    Hier: Datum in Unix-Time umrechnen; 60 * 60 * 24 * 10 (10 Tage) abziehen und dann die Unix-Time wieder in das normale Zeitformat umrechnen. Müsste DLL-Funktionen dazu geben.

    Widerstand ist Zwecklos!

    Meine Projekte: Kizzys Controller, 2nd Desktop und Versteckte Dateien Assistent
    Meine Downloadwebsite .