Aktion wenn neuer Monat gestartet ist

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Aktion wenn neuer Monat gestartet ist

    Guten Morgen Zusammen,

    ich würde gern beim Wechsel des Monats eine Aktion durchführen.
    Hierfür verwende ich folgenden Code.

    VB.NET-Quellcode

    1. ​Dim monat = DateSerial(Now.Year, Now.Month + 1, 0).ToString("MMMM")
    2. Dim heute = DateTime.Today.ToString("MMMM")
    3. If monat = heute then
    4. 'nichts
    5. else
    6. 'Aktion
    7. End If

    Leider funktioniert es nicht. Mit der DatumFestlegMethode ;) funktioniert es allerdings.

    VB.NET-Quellcode

    1. ​Dim heute = New DateTime(2022, 5, 2).ToString("MMMM")


    Was mache Ich falsch?

    MfG Madde
    Falsch ist schonmal der Umweg über Strings! Werte einfach die Felder von DateTime aus, bzw. vergleiche diese.

    VB.NET-Quellcode

    1. Dim dt1 As New DateTime
    2. Dim dt2 As DateTime = DateTime.Now
    3. If dt1.Month <> dt2.Month Then
    4. MessageBox.Show("Ungleich")
    5. End If


    Du gibts 0 für den Tag in DateSerial an, klingelt da was? M.M.n. sollte MS das mit einer Exception quittieren. Auch dein Format bei tostring ist falsch, Monat hat keine 4 stellen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Doch, das Date.ToString("MMMM") gibt's. Wird bei neueren VS-Versionen sogar von IntelliSense erklärt.

    Ich find aber den Code schon unaussagekräftig: If monat = heute then - seit wann kann heute ein Monat sein?
    Auch das If-Konstrukt ist banane. Es reicht doch ein If monat <> heute Then Aktion
    Bilder
    • MMMM.png

      20,32 kB, 1.240×173, 38 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das mit dem VB6-DateSerial DayIndex 0 klappt leider auch. Es wird eben nicht der 1. des Monats zurückgegeben, sondern der Tag davor. Also der letzte des Vormonats. Es gehen auch negative Zahlen! VB6 eben :S . Ein weiterer Grund, auf den VB6-Namespace zu verzichten
    Allerdings erkenn ich den Sinn noch nicht. Wann kann dieses Konstrukt jemals was anderes zurückgeben als dass heute im selben Monat ist wie der letzte Tag des aktuellen Monats?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Genau.
    @Madde Ganz einfach:

    VB.NET-Quellcode

    1. If DateTime.Now.Day = 1 Then
    2. ' was tun
    3. Enf If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Madde schrieb:

    ich würde gern beim Wechsel des Monats eine Aktion durchführen.

    Visual Basic-Quellcode

    1. If DateTime.Today.Month <> DateTime.Today.AddDays(-1).Month Then
    2. 'gestern war ein anderer Monat
    3. End If
    Du könntest in dem Fall aber auch einfach abprüfen, ob heute der erste ist.

    VB.NET-Quellcode

    1. ​If DateTime.Today.Day = 1 Then
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Naja, das klappt nur, wenn man jeden Tag das Programm ausführt. Das ist aber z.B. in einem Betrieb oder im eigenen Urlaub nicht gegeben.
    Es ginge z.B. indem Du ein gespeichertes Datum vergleichst:

    Quellcode

    1. Wenn MomentanerMonat ungleich MonatVonGespeichertemDatum Dann Aktion
    2. SpeichereDatum

    So wird das Datum des letzten Programmaufrufs grundsätzlich immer zum Vergleich hergenommen. Ist die Frage, ob das so vom Prinzip her für Dich passt @Madde
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für Eure Antworten.
    Der Gedanke, zu prüfen, ob der 1. ist, war mein Erster. Das hatte sich aber erledigt, wenn dieser auf das WE fällt oder Feiertag ist. Somit würde am 2. oder 3. beim Start des Programms keine neue Datei erstellt.
    Leider gilt das auch für die Prüfung ob gestern der alte Monat war - gleiches Problem.

    Ich glaube, die Idee das Datum des letzten Aufrufs zu speichern, wird die Einzige sein, die zielführend ist.

    Madde schrieb:

    wird die Einzige sein, die zielführend ist.
    Du musst Dir außerdem speichern, ob die Aktion diesen Monat bereits ausgeführt wurde, um ein Doppel zu vermeiden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich erkenn da den Sinn nicht. Die Aktion wird doch nur einmal ausgeführt. Und zwar, wenn der Monatswechsel ist. Danach in dem Monat nicht mehr. Oder welche Bedingungskonstellation hast Du da im Sinn?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Oder welche Bedingungskonstellation hast Du da im Sinn?
    Wenn das Programm z.B. am ersten April zwei Mal gestartet wird.
    Dass es nicht durch läuft, haben wir ja gerade gehört.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Selbst dann nicht - zumindest nicht bei meinem genannten Lösungsvorschlag. Da wird ja immer das Datum des letzten Programmstarts gespeichert und dieses Datum wird zum Vergleich hergenommen.
    30.04. gestartet -> Aktion + 30.04. gespeichert
    30.04. gestartet, mit gespeichertem Datum (30.04.) verglichen -> keine Aktion + 30.04. gespeichert
    02.05. gestartet, mit gespeichertem Datum (30.04.) verglichen -> Aktion + 02.05. gespeichert
    02.05. gestartet, mit gespeichertem Datum (02.05.) verglichen -> keine Aktion + 02.05. gespeichert

    Das Speichern bei "keine Aktion" könnte man - wenn es nur um diese Sache geht - weglassen, schadet aber auch nicht, es drinzulassen. Vielleicht will man ja aus anderen Gründen den letzten Programmstart loggen.
    Wenn man noch kein Datum hat, sollte man sich um diesen Fall gesondert kümmern. Wahrscheinlich Datum speichern, keine Aktion auslösen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich hatte mich da auf die in Post #9 genannten Speicherinhalte bezogen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Madde schrieb:

    Danke für Eure Antworten.
    Der Gedanke, zu prüfen, ob der 1. ist, war mein Erster. Das hatte sich aber erledigt, wenn dieser auf das WE fällt oder Feiertag ist. Somit würde am 2. oder 3. beim Start des Programms keine neue Datei erstellt.
    Leider gilt das auch für die Prüfung ob gestern der alte Monat war - gleiches Problem.
    .


    erstelle doch die benötigten Datei(en) für 1 jahr, die Datei(en) sind nun vorhanden.
    Dein System ist für mich nicht verständlich
    Ich habe es jetzt anders gelöst.
    Da ich ja ein Dataset mit einem Datum als Eintrag habe, überprüfe ich das und wenn es im alten Monat liegt, wird die neue Datei angelegt.
    Hätte ich genauer mit angeben müssen aber wenn man in dem Projekt drinsteckt, vergisst man hin und wieder, dass andere ja nicht wissen, wovon man konkret redet.

    VB.NET-Quellcode

    1. Dim letzteZeile = DirectCast(DirectCast(TblAuftragsbuchBindingSource(TblAuftragsbuchBindingSource.Count - 1), DataRowView).Row, dtsAuftragsbuch.tblAuftragsbuchRow)
    2. Dim heute = Date.Today.ToString("yyyy.MMMM")
    3. Dim LetzterEintrag = letzteZeile.Eingangsdatum.ToString("yyyy.MMMM")
    4. If heute > LetzterEintrag Then
    5. MessageBox.Show("Es ist ein neuer Monat")
    6. Else
    7. MessageBox.Show("Es ist der gleiche Monat")
    8. End If


    MfG Madde
    Eh … was? Du vergleichst Texte in Zeile#4. Wenn Text1 > Text2 dann …, also Wenn "2022.Mai" > "2022.Juni"
    Viel spaß mit den daraus resultierenden Logikfehlern.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    dann eher so?

    VB.NET-Quellcode

    1. Dim letzteZeile = DirectCast(DirectCast(TblAuftragsbuchBindingSource(TblAuftragsbuchBindingSource.Count - 1), DataRowView).Row, dtsAuftragsbuch.tblAuftragsbuchRow)
    2. Dim heute = Date.Today.Month
    3. Dim LetzterEintrag = letzteZeile.Eingangsdatum.Month
    4. If heute > LetzterEintrag Then
    5. MessageBox.Show("Es ist ein neuer Monat")
    6. Else
    7. MessageBox.Show("Es ist der gleiche Monat")
    8. End If

    @Madde Besser aber nicht gut.
    Vielleicht erläuterst Du uns angesichts der zahlreichen Posts hier in Deinem Thread noch mal aus jetziger Sicht, wie das ganze ablaufen soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Fast. Du hast dann noch ein Problem beim Jahreswechsel, weil dann der neue Monat 1 ist und der alte 12. Von daher:

    VB.NET-Quellcode

    1. Dim letzteZeile = DirectCast(DirectCast(TblAuftragsbuchBindingSource(TblAuftragsbuchBindingSource.Count - 1), DataRowView).Row, dtsAuftragsbuch.tblAuftragsbuchRow)
    2. Dim LetzterEintrag = letzteZeile.Eingangsdatum
    3. If Date.Today.Year > LetzterEintrag.Year OrElse Date.Today.Month > LetzterEintrag.Month Then
    4. MessageBox.Show("Es ist ein neuer Monat")
    5. Else
    6. MessageBox.Show("Es ist der gleiche Monat")
    7. End If
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.