zeilen in listfield die älter als 1Jahr nicht mitzählen

Startseite Foren Deutsches LiveCode-Forum zeilen in listfield die älter als 1Jahr nicht mitzählen

Ansicht von 23 Antwort-Themen
  • Autor
    Beiträge
    • #25549
      akrages
      Teilnehmer

      Hallo LivecodeUser

      ich habe ein ScrollingField welches 3 Spalten enthält.
      Spalte1 Das Datum des Eintrags
      Spalte2 Den Namen des Autors
      Spalte3 Kommentar

      Sa, 12. Jan 2019 Name ohne_A
      Sa, 12. Mrz 2019 Name ohne_A
      Fr, 05. Jul 2019 Name ohne_A
      Mo, 08. Jul 2019 Name mit_A
      Di, 09. Jul 2019 Name mit_A
      Mi, 10. Jul 2019 Name mit_A
      Do, 11. Jul 2019 Name mit_A
      usw.
      Fr, 20. Nov 2020 Name mit_A

      Die Zeilen sind aufsteigend nach Datum sortiert.
      In einem Feld lasse ich mir die Anzahl aller Zeilen die nicht leer sind anzeigen.
      Das funktioniert soweit einwandfrei.

      Nun möchte ich gerne im nächsten Schritt nur die Zeilen zählen lassen,
      die nicht! älter als 1Jahr sind

      Ich finde aber leider keinen Lösungsansatz.
      Wer kann helfen?

    • #25553
      Klaus Major
      Verwalter

      Hi akrages,

      Prosit Neujahr! 🙂

      ...
      put fld "das mit den drei spalten" into tData
      ## TAB getrennt, denke ich? 
      ## Sonst itemdel anpassen:
      set itemdel to TAB
      put the seconds - (60*60*24*365) into VorEinemJahr
      put 0 into AnzahlJüngerals1Jahr
      repeat for each line tLine in tData
        put item 1 of tLine into tDatum
        convert tDatum from abbr system date to seconds
        if tDatum >= VorEinemJahr then
          add 1 to AnzahlJüngerals1Jahr
        end if
      end repeat
      answer AnzahlJüngerals1Jahr && "Zeilen haben Daten aus dem letzten Jahr."
      ...

      Aus dem Kopf, sollte aber funktionieren. 😎
      Und denk dran beim Testen, 2020 war ein Schaltjahr.

      Gruß

      Klaus

    • #25557
      akrages
      Teilnehmer

      prosit Neujar!

      Das ging ja schnell.
      Vielen Dank!
      Funktioniert soweit auch ganz gut, bis auf folgendes:
      Dein Code sucht jetzt in der Liste alle Zeilen aus dem Jahr 2020

      Ich möchte aber gerne immer vom aktuellen Datum ausgehend (also von Heute) nur die Zeilen zählen, welche nicht älter als ein Jahr sind.

      Wie kann ich deinen Code dahingehend ändern?

    • #25558
      Klaus Major
      Verwalter

      Genau danach hattest Du aber gefragt! 😎

      the seconds -> ist JETZT im Moment der Skriptausführung, also HEUTE
      60*60*24*365 -> Die Sekunden in einem Jahr
      put the seconds – (60*60*24*365) into VorEinemJahr -> Ein Datum genau ein Jahr weniger als JETZT
      Nun vergleiche ich jedes Datum in der Liste (item 1) ob es älter als das Datum vor einem Jahr ist, wenn nicht, wird die Zeile addiert.

      Oder habe ich hier etwas völlig falsch verstanden?

    • #25560
      akrages
      Teilnehmer

      So habe ich deinen Code auch gelesen.
      Aber von heute ausgehend dürfte er die Zeile:
      Fr, 01. Jan 2020 Name mit_A
      nicht mehr mitzählen, sondern nur noch die Zeile:
      Fr, 06. Mrz 2020 Name ohne_A
      welche umittelbar unter der erstgenannten steht.

      Und mit jedem weitern Tag in der Zukunft müssten ja, -wenn keine weiteren Einträge erfolgen,
      die angezeigte Zeilenzahl kleiner werden.

      Ich hoffe mich einigermaßen verständlich ausgdrückt zu haben.

    • #25561
      Klaus Major
      Verwalter

      So habe ich deinen Code auch gelesen.
      Aber von heute ausgehend dürfte er die Zeile:
      Fr, 01. Jan 2020 Name mit_A
      nicht mehr mitzählen, sondern nur noch die Zeile:
      Fr, 06. Mrz 2020 Name ohne_A
      welche umittelbar unter der erstgenannten steht.

      Aber der 1. Januar wird gtrotzdem mitgezählt?

      Und mit jedem weitern Tag in der Zukunft müssten ja, -wenn keine weiteren Einträge erfolgen, die angezeigte Zeilenzahl kleiner werden. Ich hoffe mich einigermaßen verständlich ausgdrückt zu haben.

      Das hatte ich schon richtig verstanden.
      Poste doch bitte mal Deine Liste mit den „Daten“ (Datums), muss ich hier nachvollziehen.

    • #25563
      Klaus Major
      Verwalter

      Oh, sorry, sehe gerade, daß Dein erstes ITEM kein gültiges -> abbr system date ist!
      Die müssten nämlich so aussehen:
      Fr, 1. Jan. 2020
      Sa, 1. Feb. 2020
      Fr, 6. März 2020

      Das bedeutet, wir müssen das erste ITEM zuerst in ein für LC erkennbares Format umwandeln und dann mit dem aktuellen Datum vor einem Jahr vergleichen.

    • #25565
      akrages
      Teilnehmer

      Danke.
      Ich glaube jetzt zählt er richtig.
      26 statt 25 Tage
      Morgen müssten es dann 25 Tage sein.

      Um das zu testen:
      Kann ich das aktuelle Datum simulieren?
      zB. Durch ein Feld in das ich ein Datum in der Zukunft liegend schreibe
      mit dem er dann die Berechnung vornimmt.

      Wie müsste ich deinen Code dann anpassen?

    • #25566
      Klaus Major
      Verwalter

      Ersetze -> the seconds in meinem Skript mit einem anderen Datum:

      ...
      put fld "das mit einem Testdatum" into tDatum
      convert tDatum from abbr system date to seconds
      ### put the seconds - (60*60*24*365) into VorEinemJahr
      tDatum - (60*60*24*365) into VorEinemJahr
      put 0 into AnzahlJüngerals1Jahr
      ...
    • #25568
      akrages
      Teilnehmer

      der Code sieht jetzt so aus:

      on mouseUp pMouseButton
         put fld "KrankentageConny" into tData
         ## TAB getrennt, denke ich? 
         ## Sonst itemdel anpassen:
         set itemdel to TAB
         ##put the seconds - (60*60*24*365) into VorEinemJahr
         put fld "Testdatum" into tDatum
         put tDatum - (60*60*24*365) into VorEinemJahr
         put 0 into AnzahlJüngerals1Jahr
         repeat for each line tLine in tData
            put item 1 of tLine into tDatum
            convert tDatum from abbr system date to seconds
            if tDatum >= VorEinemJahr then
               add 1 to AnzahlJüngerals1Jahr
            end if
         end repeat
         answer AnzahlJüngerals1Jahr && "Zeilen haben Daten aus dem letzten Jahr."
      end mouseUp

      bringt aber eine Fehlermeldung in der Zeile:

      put tDatum - (60*60*24*365) into VorEinemJahr

    • #25569
      akrages
      Teilnehmer

      Ahhh!
      convert tDatum from abbr system date to seconds

      hatte gefehlt.

    • #25570
      akrages
      Teilnehmer

      Er zählt leider immer noch falsch.
      Hier ist mal die Liste.

      Sa, 12. Jan 2019 Name ohne_A
      Sa, 12. Mrz 2019 Name ohne_A
      Fr, 5. Jul 2019 Name ohne_A
      Mo, 8. Jul 2019 Name mit_A
      Di, 9. Jul 2019 Name mit_A
      Mi, 10. Jul 2019 Name mit_A
      Do, 11. Jul 2019 Name mit_A
      Fr, 12. Jul 2019 Name mit_A
      Sa, 13. Jul 2019 Name mit_A
      Sa, 24. Jul 2019 Name ohne_A
      Mo, 26. Aug 2019 Name mit_A
      Di, 27. Aug 2019 Name mit_A
      Mi, 28. Aug 2019 Name mit_A
      Do, 29. Aug 2019 Name mit_A
      Fr, 30. Aug 2019 Name mit_A
      Sa, 31. Aug 2019 Name mit_A
      So, 1. Sep 2019 Name mit_A
      Mo, 2. Sep 2019 Name mit_A
      Di, 3. Aug 2019 Name mit_A
      Mi, 4. Aug 2019 Name mit_A
      Do, 5. Aug 2019 Name mit_A
      Fr, 6. Aug 2019 Name mit_A
      Sa, 7. Aug 2019 Name mit_A
      Mo, 16. Sep 2019 Name mit_A
      Di, 17. Sep 2019 Name mit_A
      Mi, 18. Sep 2019 Name mit_A
      Mo, 30. Dez 2019 Name ohne_A
      Di, 31. Dez 2019 Name ohne_A
      Do, 2. Jan 2020 Name mit_A
      Fr, 3. Jan 2020 Name mit_A
      Fr, 6. Mrz 2020 Name ohne_A
      Sa, 7. Mrz 2020 Name ohne_A
      Sa, 4. Apr 2020 Name ohne_A
      Mo, 4. Mai 2020 Name ohne_A
      Di, 5. Mai 2020 Name ohne_A
      Di, 16. Jun 2020 Name ohne_A
      Mi, 17. Jun 2020 Name ohne_A
      Fr, 19. Jun 2020 Name ohne_A
      Fr, 26. Jun 2020 Name mit_A
      Sa, 27. Jun 2020 Name mit_A
      Di, 8. Sep 2020 Name ohne_A
      Mo, 21. Sep 2020 Name ohne_A
      Do, 8. Okt 2020 Name mit_A
      Fr, 9. Okt 2020 Name mit_A
      Mo, 26. Okt 2020 Name mit_A
      Di, 27. Okt 2020 Name mit_A
      Mi, 28. Okt 2020 Name mit_A
      Fr, 6. Nov 2020 Name ohne_A
      Mi, 11. Nov 2020 Name ohne_A
      Mo, 16. Nov 2020 Name mit_A
      Di, 17. Nov 2020 Name mit_A
      Mi, 18. Nov 2020 Name mit_A
      Do, 19. Nov 2020 Name mit_A
      Fr, 20. Nov 2020 Name mit_A

    • #25571
      akrages
      Teilnehmer

      Im Feld „Testdatum“ steht: Mo, 20. Sep 2021

      und er zählt 14 Zeilen.

      Es müssten aber 13 Zeilen sein.
      Di, 8. Sep 2020 Name mit_A
      dürfte er nicht mehr mitzählen.

    • #25572
      akrages
      Teilnehmer

      Kann es sein, dass die letzte Zeile (eine Leerzeile) auch mitgezählt wird?

    • #25573
      akrages
      Teilnehmer

      Gerade überprüft.
      Daran liegt es nicht.

    • #25574
      Klaus Major
      Verwalter

      Bitte das hier noch einmal genau lesen:
      https://www.livecode-blog.de/forums/topic/zeilen-in-listfield-die-aelter-als-1jahr-nicht-mitzaehlen/#post-25563

      Das hier -> Di., 12. Mrz 2019
      (Der 12. März 2019 war ein Dienstag, kein Samstag wie in Deiner Liste!?)
      wird nach der Zeile:

      convert item 1 from abbr system date to seconds

      IMMER NOCH zu nicht Weiterem als -> Sa, 12. Mrz 2019
      Das wird das Problem sein.

      Um als gültiges „abbr system date“ für LC zu gelten, müsste es heissen:
      Di., 12. März 2019
      Verstehst Du?

      Kommt denn da keine fehlermeldung von LC, wenn wir davon etwas subrahieren wollen?

    • #25576
      Klaus Major
      Verwalter

      Also ich bekomme eine Fehlermeldung wie oben angedacht!

      Die Liste oben IST doch eigentlich TAB getrennt, oder?
      Also -> Sa, 7. Mrz 2020 TAB Name ohne_A
      Beim Einfügen hier geht der TAB schon mal verloren, daher frage ich lieber noch einmal nach!

      Ich hoffe, wir reden nicht aneinander vorbei!?

    • #25578
      Klaus Major
      Verwalter

      Zur Sicherheit, ist dieses Format bei Dir im System als Datumsformat definiert?
      -> Sa, 27. Jun 2020

      Frag LC mal:
      answer the abbr system date
      oder
      put the abbr sytem date
      dann kannst Du es in der Messagebox kopieren und hier posten.

      Mag ja bei Dir anders sein als bei mir!?

    • #25580
      akrages
      Teilnehmer

      Ja, ist es.
      ich weiß nicht warum, aber jetzt scheint es zu funktionieren.

    • #25581
      Klaus Major
      Verwalter

      Oft trügt der Schein… 😎

    • #25583
      akrages
      Teilnehmer

      Stimmt!
      Geht leider immer noch nicht richtig.
      Ich bekomme immer einen Tag zuviel angezeigt.

    • #25584
      Klaus Major
      Verwalter

      Wie ist denn jetzt Dein Datumsformat?

      Frag LC mal:
      answer the abbr system date
      oder
      put the abbr sytem date
      dann kannst Du es in der Messagebox kopieren und hier posten.

    • #25586
      akrages
      Teilnehmer

      Wie schon gesagt, mein Datumsformat ist: -> Sa, 27. Jun 2020

    • #25596
      Axwald
      Teilnehmer

      Hi,
      probier ich’s halt nochmal, schau mer ob das Forum diesen Post auch wieder frisst …

      Also:
      Wenn „Datums“ eh konvertiert werden müssen (speziell wenn damit gerechnet werden soll), dann ist „dateItems“ das Format der Wahl – das rechnet nämlich selber (mit einem kleinen Trick), und korrekt! Beispiel:

         put "Di, 28. Feb 2019" into myDate
         convert myDate from abbrev system date to dateItems  --  umwandeln
         --> myDate: 2019,2,28,0,0,0,5
         put item 1 of myDate into myYear              --  da ist das Jahr, falls wir das suchen!
         add 3 to item 3 of myDate                     --  3 Tage später ...
         --> myDate: 2019,2,31,0,0,0,5                 --  addiert, aber inkorrektes Datum
         convert myDate from dateItems to dateItems    --  Hier wird korrigiert!
         --> myDate: 2019,3,3,0,0,0,1                  --  jetzt stimmt es.
         
         put "Di, 28. Feb 2020" into myDate
         convert myDate from abbrev system date to dateItems  --  umwandeln
         add 3 to item 3 of myDate                     --  3 Tage später ...
         convert myDate from dateItems to dateItems    --  Hier wird korrigiert!
         --> myDate: 2020,3,2,0,0,0,2                  --  Schaltjahr ist berücksichtigt!

      DateItems ist auch zweckmäßig, wenn Datums-Daten irgendwie gespeichert werden müßen – DIN 5008/ ISO 8601 bietet sich da an. Ist auch als „SQL Datum“ bekannt: JJJJ-MM-TT
      Universell verwendbar, sortiert auch alphanumerisch – nur LC kennt es leider nicht :/ Also:

         put item 1 of myDate & "-" & \
               format("%02s", item 2 of myDate) & "-" & \
               format("%02s", item 3 of myDate) into myDate
         --> myDate: 2020-03-02

      Und schon hat man ein korrektes, überall verwendbares Datum.
      Zurück, für die Anzeige:

         set itemdel to "-"                            --  - als Trenner
         put item 1 of myDate & "," & \
               item 2 of myDate & "," & \
               item 3 of myDate & ",0,0,0,0" into myDate
         set itemdel to comma                          --  ItemDel zurücksetzen ...
         convert myDate from dateItems to short system date
         --> myDate: 02.03.2020

      Schönes Neues Jahr!

      Edit: Fehler im Code korrigiert …

Ansicht von 23 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.