letze x-Zeilen in widget Line Graph

Startseite Foren Deutsches LiveCode-Forum letze x-Zeilen in widget Line Graph

Ansicht von 22 Antwort-Themen
  • Autor
    Beiträge
    • #26389
      akrages
      Teilnehmer

        Hallo liebe LiveCoder
        Ich brauche mal wieder Hilfe.
        Ich möchte gerne die letzten Zeilen aus einem Listenfeld in einem Widget (Line Graph) darstellen.
        Dies ist die Liste:

        Sa, 23. Jan 2021	210
        Mo, 25. Jan 2021	410
        Di, 26. Jan 2021	300
        Mi, 27. Jan 2021	300
        Do, 28. Jan 2021	300
        Fr, 29. Jan 2021	210
        Sa, 30. Jan 2021	410
        Mo, 1. Feb 2021	300
        Di, 2. Feb 2021	300
        Mi, 3. Feb 2021	300
        So, 7. Feb 2021		268
        So, 7. Feb 2021		233

        Und das ist der Code dazu:

                 ##Daten aus Feld "PickHistory" in widget "Line Graph" anzeigen
                 put empty into gData
                 set itemDel to tab 
                 repeat with x = 7 to the number of lines of field "PickHistory" of grp "scrollArea1" of cd "History"
                    put (item 1 of line x of field "PickHistory" of grp "scrollArea1" of cd "History" & "," & item 3 of line x of field "PickHistory"of grp "scrollArea1" of cd "History" & return ) after gData
                 end repeat
                 answer gData
                 set the graphData of widget "Line Graph" to gData

        Aber irgendwie klappt das nicht so richtig.
        Hat jemand eine Idee woran es liegen könnte?

      • #26391
        Torsten
        Teilnehmer

          Hi,

          einmal hast Du item 3 statt item 2 und dann sind in den letzten beiden Zeilen tabs zuviel in der Mitte

            put empty into gData
             set itemDel to tab 
             repeat with x = 7 to the number of lines of field "PickHistory" 
                put (item 1 of line x of field "PickHistory" & "," & item 2 of line x of field "PickHistory" & return ) after gData
             end repeat
             answer gData
             set the graphData of widget "Line Graph" to gData
          Sa, 23. Jan 2021	210
          Mo, 25. Jan 2021	410
          Di, 26. Jan 2021	300
          Mi, 27. Jan 2021	300
          Do, 28. Jan 2021	300
          Fr, 29. Jan 2021	210
          Sa, 30. Jan 2021	410
          Mo, 1. Feb 2021	300
          Di, 2. Feb 2021	300
          Mi, 3. Feb 2021	300
          So, 7. Feb 2021	268
          So, 7. Feb 2021	233

          Damit gehts bei mir.

          Happy Coding
          Torsten

        • #26396
          akrages
          Teilnehmer

            Danke für die schnelle Antwort.
            Ich habe deine Änderung übernommen.
            Der Inhalt von „Line Graph“ zeigt jetzt folgendes:
            Fr,0,210
            Sa,0,410
            Mo,0,300
            Di,0,300
            Mi,0,300
            So,0,323

            also eine 0 nach Fr,
            die darf da nicht hin.
            Ich weiß nicht wo die herkommt?!
            Und wenn weitere Einträge hinzukommen, werden auch diese im widget „Line Graph“ angezeigt.
            Ich möcht aber immer nur die letzten sechs Zeilen aus dem Field „PickHistory“ im widget „Line Graph“ darstellen.
            Kannst Du mir sagen, was ich ändern muss?

          • #26398
            akrages
            Teilnehmer

              Habs jetzt soweit hinbekommen, dass die Darstellung im Widget „Line Graph“ alle Zeilen mit den Richtigen Werten darstellt.
              Leider alle Zeilen.
              Wie schaffe ich es, das immer nur die letzten sechs Zeilen für die Darstellung im Widget „Line Graph“ berücksichtigt werden?

            • #26400
              Klaus Major
              Administrator

                Für optimale Geschwindigkeit sollten wir auf Text in Feldern nur EINMAL zugreifen, in eine Variable packen und damit arbeiten!

                Du könntest sowas machen:

                ...
                put field "PickHistory" into tData
                put the num of lines of tData into anzahl_zeilen
                put anzahl_zeilen - 5 into loop_start
                put line loop_start to anzahl_zeilen of tData into myData
                ## MyData enthält nur die letzten 6 Zeilen Deines Feldes.
                ...
              • #26404
                akrages
                Teilnehmer

                  Hi Danke.
                  Habe es in der Zwischenzeit so hinbekommen:

                           ##Daten in das Feld "PickHistory" eintragen
                           if fld "DatumTLeistung" of cd "Schichtstart" is not empty then
                              put  fld "DatumTLeistung" & "," & TAB & fld "AnzahlTLeistung" & return after fld "PickHistory" of cd "History"
                              add fld "AusgabeTagespicks" to fld "PickSumm" of cd "Schichtende"
                           end if
                           
                           ##die letzten sechs Zeilen der aus dem Feld "PickHistory" in widget "Line Graph" anzeigen
                           put empty into gData
                           set itemDel to "," 
                           repeat with x = 2 to the number of lines of field "PickHistory" of cd "History"
                              
                              put (item 1 of line x of field "PickHistory" of cd "History" & "," & item 3 of line x of field "PickHistory" of cd "History" & return ) after gData
                           end repeat
                           ## die letzten sechs Zeilen von gData in gData2 packen und in widget "Line Graph" darstellen.
                           put line -6 to -1 of gData into gData2
                           set the graphData of widget "Line Graph" to gData2
                • #26406
                  Klaus Major
                  Administrator

                    Bitte lies Dir mein Posting noch einmal genuer durch und versuch,
                    dessen „Botschaft“ zu verstehen und auch umzusetzen! 😉

                  • #26408
                    akrages
                    Teilnehmer

                      stehe geradeauf dem Schlauch.
                      1. Ich habe die Daten aus dem Feld „PickHistory“ mit dem repeat with klumbatsch aufbereitet.
                      aus:
                      Sa, 23. Jan 2021, 210
                      Mo, 25. Jan 2021, 410
                      Di, 26. Jan 2021, 300
                      Mi, 27. Jan 2021, 300
                      Do, 28. Jan 2021, 300
                      Fr, 29. Jan 2021, 210
                      Sa, 30. Jan 2021, 410
                      Mo, 1. Feb 2021, 300
                      Di, 2. Feb 2021, 300
                      Mi, 3. Feb 2021, 300

                      wird in gData das:
                      Sa,210
                      Mo,410
                      Di,300
                      Mi,300
                      Do,300
                      Fr,210
                      Sa,410
                      Mo,300
                      Di,300
                      Mi,300
                      So,400

                      2. und dann kann ich doch erst die letzten sechs Zeilen in gData2 packen.

                    • #26410
                      Klaus Major
                      Administrator

                        Wenn Du zuerst die letzten sechs Zeile wie in meinem Beispiel in eine variable packst, und dann DAMIT alles Weitere anstellst, ist es halt schneller.

                        OK, wird bei den paar Daten nur messbar sein, aber je mehr Daten, desto größer die Zeitersparnis!

                        ...
                          ##Daten in das Feld "PickHistory" eintragen
                           if fld "DatumTLeistung" of cd "Schichtstart" is not empty then
                              put  fld "DatumTLeistung" & "," & TAB & fld "AnzahlTLeistung" & return after fld "PickHistory" of cd "History"
                              add fld "AusgabeTagespicks" to fld "PickSumm" of cd "Schichtende"
                           end if
                           
                           ##die letzten sechs Zeilen der aus dem Feld "PickHistory" in widget "Line Graph" anzeigen
                           put field "PickHistory" of cd "History" into gData
                           
                           ## Das ist der DEFAULT Itemdelimiter, daher braucht er nicht neu gesetzt zu werden,
                           ## da Du ihn vorher nicht geändert hattest.
                           ## set itemDel to "," 
                           
                           ## Sehr clevere Lösung! :-)
                           put line -6 to -1 of gData into gData1
                           
                           ## Jetzt erst den ganzen "Klumpatsch" abarbeiten, bzw. Daten sammeln:
                           repeat with for each line tLine in gData1
                              put item 1 of tLine & "," & item 3 of tLine & CR after gData2
                           end repeat
                           
                           ## gData2 hat ein CR am Ende!
                           delete char -1 of gData2
                           set the graphData of widget "Line Graph" to gData
                        ...
                      • #26412
                        akrages
                        Teilnehmer

                          Vielen Dank.
                          Natürlich werden die Daten täglich mehr, aber ich denke ein messbarer Geschwindigkeitsvorteil wird sich wohl erst nach 100 oder gar 1000 Zeilen zeigen.

                          Deine Lösung finde ich aber auch sehr clever.
                          Ich werde sie auf jeden Fall mal testen.

                        • #26414
                          akrages
                          Teilnehmer

                            Gibt es eine Möglichkeit, die exakten Werte auf der x-Achse im widget „Line Graph“ anzuzeigen?
                            Im Moment steht da:
                            410
                            328
                            246
                            168
                            82
                            0
                            Oder kann man die exakten werte bei den Markern anzeigen?

                          • #26416
                            Klaus Major
                            Administrator

                              Was meinst Du mit „exakte Werte“?
                              Sieht so aus, als müssen es immer ganze Zahlen sein, falls Du das meinst.

                            • #26418
                              akrages
                              Teilnehmer

                                exakte Werte wären ja:
                                210
                                410
                                300
                                300
                                300
                                400

                              • #26423
                                Klaus Major
                                Administrator

                                  Die X-Achse geht von links nach rechts und da steht Fr Sa Mo Di Mi So
                                  Du meinst sicher die Y-Achse, oder?

                                  Mit diesen Daten aus Deinem Beispiel, die letzten sechs Zeilen:
                                  Fr,210
                                  Sa,410
                                  Mo,300
                                  Di,300
                                  Mi,300
                                  So,400

                                  Bekomme ich in der Y-Achse von oben nach unten:
                                  410
                                  370
                                  330
                                  290
                                  250
                                  210

                                  Sieht so aus, als würden diese Werte von Deinen Daten abgeleitet bzw. errechnet.
                                  (Max Wert – Min wert) / (Anzahl Zeilen – 1)
                                  Also 200/5 = 40
                                  Das ist die berechnete Differenz für die angezeigten Zwischenwerte.
                                  (Min =) 210
                                  + 40 (=250)
                                  + 40 (=290)
                                  + 40 (=330)
                                  + 40 (=370)
                                  + 40 (=410 = Max)
                                  Verstehst Du?
                                  Ich fürchte, das können wir nicht ändern, zumindest sehe ich da keine Möglichkeit.

                                  Vielleicht verstehe ich Dein Problem auch überhaupt nicht? 🙂

                                • #26445
                                  akrages
                                  Teilnehmer

                                    Hallo Klaus.
                                    Doch, du hast das Problem richtig erkannt.
                                    Es wird der min-Wert und der max-Wert geschrieben und die Werte dazwischen abgeleitet.

                                    Noch eine Frage.
                                    Ich habe 3 Check-Boxen
                                    Button „20 min.“
                                    Button „30 min.“
                                    Button „60 min.“

                                    In den Label´n steht entsprechen 20, 30, und 60

                                    Nun möchte ich gerne, dass beim Auswählen einer Ceheck-Box das Handy respektive meine Smartwatch (Android) in Abständen entsprechend der jeweiligen Label vibriert.

                                    In einem Switch Button, der das ganze Ein und Ausschaltet habe ich folgendes Script:

                                    on hiliteChanged --pSwitchIsOn
                                       if (the hilite of btn "20 min." = true or the hilite of btn "30 min." = true or hilite of btn "60 min." = true) then
                                          set the visible of grp "Trinken" to true
                                          put the label of btn "20 min." into AusgabeVib20
                                          ##answer AusgabeVib20 ##ist 20! also weiter
                                          ##put AusgabeVib20 into field "AusgabeVib1"
                                          if the environment = "mobile" then
                                             mobileVibrate 1 ##1 bedeutet 1x vibrieren 0 vibrieren off!
                                             put AusgabeVib20 into SecondsToWait
                                          else
                                             set the hilite of me to false         
                                             set the visible of grp "Trinken" to false        
                                             if the environment = "mobile" then
                                                mobileVibrate 0
                                             end if
                                             answer "Bitte wähle, in welchen Abständen Du an das Trinken erinnert werden willst"         
                                          end if
                                       end if
                                    end hiliteChanged

                                    Leider funktioniert das noch nicht.
                                    Kannst Du helfen?

                                  • #26447
                                    Klaus Major
                                    Administrator

                                      Leider funktioniert das noch nicht.

                                      Und was genau funktioniert nicht? Vibriert’s nicht?
                                      Ersetze das mal mit einem ANSWER und gucke, was passiert.

                                      Das Skript sieht korrekt aus, allerdings kannst Du

                                      ...
                                      if the environment = "mobile" then
                                         mobileVibrate 0
                                      end if
                                      ...

                                      ruhig weglassen! 🙂

                                    • #26457
                                      akrages
                                      Teilnehmer

                                        Die Vibration erfolgt nur beim Betätigen des Switch Button´s.
                                        Die Label der Check-Boxen werden nicht berücksichtigt.

                                      • #26459
                                        Klaus Major
                                        Administrator

                                          Hm, klappt so etwas Simples denn mit einem SWITCH Button:

                                          on hilitechanged
                                            answer the hilite of me
                                          end hilitechanged

                                          ?

                                        • #26461
                                          Klaus Major
                                          Administrator

                                            Vielleicht auch mal weitere Klammern einfügen, man weiß ja nie…

                                            ...
                                            if (the hilite of btn "20 min.") or (the hilite of btn "30 min.") or (hilite of btn "60 min.") then
                                            ...

                                            Hinweis, wenn wir = TRUE weglassen, nimmt LC genau das als gegeben an!
                                            Also:
                                            if The hilte of btn „das radio“ = true THEN…
                                            ist identisch mit
                                            if the hilite of btn „radio THEN…

                                          • #26463
                                            akrages
                                            Teilnehmer

                                              Zu 1.
                                              Ja klappt.
                                              Zu 2.
                                              if (the hilite of btn "20 min.") or (the hilite of btn "30 min.") or (hilite of btn "60 min.") then
                                              dieser Code funktioniert, denn wenn keine der Ceck Boxen angeklickt wird, erfolgt:
                                              answer „Bitte wähle, in welchen Abständen Du an das Trinken erinnert werden willst“

                                              Da muss noch irgend etwas anders fehlen!?

                                            • #26465
                                              Klaus Major
                                              Administrator

                                                Zu 1. und 2. meinte ich auf dem Handy.

                                              • #26469
                                                akrages
                                                Teilnehmer

                                                  Ich auch.

                                                • #26471
                                                  Klaus Major
                                                  Administrator

                                                    OK, und was ist mit einer abgespeckten Version:

                                                    on hiliteChanged
                                                       if the hilite of me then
                                                          if the environment = "mobile" then
                                                             mobileVibrate 1 
                                                          else
                                                             set the hilite of me to false         
                                                             answer "Bitte wähle, in welchen Abständen Du an das Trinken erinnert werden willst"         
                                                          end if
                                                       end if
                                                    end hiliteChanged

                                                    Auf der mobilen Platform wird das HILITE nicht zurückgesetzt,
                                                    so daß man dort ZWEI Mal klicken muss!
                                                    Vielleicht liegt es daran?

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