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
        Administrator

          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
            Administrator

              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
                Administrator

                  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
                  Administrator

                    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
                      Administrator

                        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
                                    Administrator

                                      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
                                      Administrator

                                        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
                                        Administrator

                                          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
                                            Administrator

                                              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
                                                Administrator

                                                  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.