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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

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

      on hilitechanged
        answer the hilite of me
      end hilitechanged

      ?

    • #26461
      Klaus Major
      Verwalter

      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
      Verwalter

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

    • #26469
      akrages
      Teilnehmer

      Ich auch.

    • #26471
      Klaus Major
      Verwalter

      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.