Sortieren einer lokalen Variable unter beibehaltung von Leerzeilen

Startseite Foren Deutsches LiveCode-Forum Sortieren einer lokalen Variable unter beibehaltung von Leerzeilen

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

        Guten Tag.

        ich möchte gerne mit folgendem Script eine locale Variable, welche Untereinander aufgelistete Ziffern enthält  so sortieren, dass am Ende das Ergebnis eine Liste ist, welche absteigend sortiert ist.

        Das funktioniert aber die Leerzeilen in dem Ergebnis werden leider entfernt.

        global gAktuelleKalenderwoche, gActualYear

        on mouseUp pMouseButton
           put "Mo,Di,Mi,Do,Fr,Sa" into MyVar
           repeat for each item Temp in MyVar
              put (fld ("Sum" & Temp) of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear))& cr after tContainer
           end repeat
           answer tContainer
           
           sort tContainer descending numeric by item 1 of each
           answer tContainer
        end mouseUp

        Wer kann helfen?

      • #47655
        Klaus Major
        Administrator

          Leerzeilen werden nicht entfernt mit “sort”, sondern sie rutschen nur all nach oben.

          Was Du möchtest wird mit “sort” einfach nicht funktionieren!

           

          Hast Du das mit dem “Resturlaub” schon geklärt? 😎

        • #47656
          Klaus Major
          Administrator

            So, nach einen leckeren Frühstück habe ich die Lösung!

            Wir gehen durch jede Zeile und wenn sie leer ist, erstzen wir sie durch einen String OHNE CR, der HÖCHSTWAHRSCHEINLICH nicht im eigentlichen Text vorkommt.

            Danach sortieren wir wie gewünscht und ersetzen den String wieder durch CR, et voila, Sortierung wie gewünscht und alle Leerzeilen da, wo sie hingehör(t)en.

            ########################################

            on mouseUp pMouseButton

            put “Mo,Di,Mi,Do,Fr,Sa” into MyVar

                repeat for each item Temp in MyVar

                  put (fld (“Sum” & Temp) of grp (“Leistung ” & gAktuelleKalenderwoche) of grp (“Leistung ” & gActualYear))& cr after tContainer

               end repeat

               answer tContainer

               

               repeat for each line tLine in tContainer

                  if tLine <> EMPTY then

                     put tLine & CR after tNewData

                  else

                     put “<xyxyxy>” after tNewData

                  end if      

               end repeat

               if char -1 of tNewData = CR then

                  delete char -1 of tNewData

               end if

               set itemdel to TAB

               sort lines of tNewData descending numeric by item 1 of each

               replace “<xyxyxy>” with CR in tNewData

                answer tNewData

            end mouseUp

            ##########################

          • #47657
            Klaus Major
            Administrator

              Ich geb es auf mit der Formatierung von LC Quelltext…

              Wie hast Du das hinbekommen in Deinem Posting oben?

            • #47658
              Klaus Major
              Administrator

                Test der Formatierung für CODE:

                on mouseup

                  beep

                end mouseup

                Au man, sieht das übel aus…

              • #47659
                akrages
                Teilnehmer

                  Guten Abend Klaus.
                  Danke für deine Mühe, aber leider fürt dein Script nicht zum gewünschten Ergebnis.

                  Nachdem ich die Formatierung von deinem Script korrigiert habe, bekomme ich vom ersten
                  answer tContainer folgendes angezeigt:

                  Leerzeile
                  7.5
                  Leerzeile
                  8.5
                  9.5
                  10.5

                  wobei ich hier nur zur Verdeutlichung die Leerzeile mit Leerzeile tituliere. Da steht natürlich nix 😉

                  und das zweite answer tNewData zeigt:

                  10.5
                  9.5
                  Leerzeile
                  7.5
                  Leerzeile
                  8.5

                  Gewünscht ist aber folgendes Ergebnis:

                  Leerzeile
                  10.5
                  Leerzeile
                  9.5
                  8.5
                  7.5

                  Ach ja, deine Frage wegen der Formatiereung von LC Quelltext.
                  Ich klicke zuerst auf die Registerkarte Text (oben in der Titelleiste des Nachrichtenfensters), bevor ich anfange meine Frage zu formulieren.
                  Wenn ich dann einen Quelltext einfüge möchte, kopiere ich diesen und füge ihn mit einem Rechtsklick in das Nachrichtenfenster und im daraufhin erscheinenden Kontextfenster mit klick auf Einfügen ein.
                  Danach wähle ich den Quelltext mit der Maus aus und klicke auf das Wort CODE oben in der Titelleiste des Nachrichtenfensters.
                  Das ist alles.

                • #47660
                  Klaus Major
                  Administrator

                    Hm, ich hatte das hier ausprobiert, und es funktionierte wie gewünscht!?

                    Allerdings nur mit einfachem Text OHNE Tabs.

                    Kannst Du mir mal tContainer als Text zuschicken, damit ich korrekte Daten zum Testen habe?

                    Danke!

                    klaus AT major-k.de

                    Mit der Formatierung bekomme ich immer das im vorherigen Post…

                  • #47661
                    Klaus Major
                    Administrator

                      Ach so, jetzt habe ich das erst verstanden!

                      Ich dachte pro Zeile sollten die eventuell nachfolgenden Leerzeilen mitkommen, aber die Leerzeilen sollen wieder an der selben Stelle wie vorher stehen, richtig?

                    • #47662
                      akrages
                      Teilnehmer

                        Ja genau.

                      • #47663
                        akrages
                        Teilnehmer

                          Danke für deine Mühe.
                          Aber du musst dir meine Anfrage (#47659) genauer anschauen. Da steht doch schon der Inhalt von tContainer!?!
                          Die Zahlen dokumentieren den jeweiligen Resturlaub und sollen jetzt chronologisch in die richtige Reihenfolge gebracht werden. Dabei ist es wichtig, das die Leerzeilen erhalten bleiben, weil ja an diesen Tagen kein Urlaubstag eingetragen wurde.
                          Ich hoffe es einigermaßen verständlich beschrieben zu haben.
                          Schade, das man hier keine Bilder hochladen kann.
                          Manchmal sagt ein Bild mehr als tausend Worte ha ha.

                          Obwohl…
                          Auf dem Reiter Visuell, unter Einfügen gibt es die Möglichkeit Bilder einzufügen.
                          Aber das funktioniert offensichtlich nicht. Es wird nur ein Platzhalter angzeigt.

                        • #47668
                          Klaus Major
                          Administrator

                            Danke, jetzt hab ich es endlich gerafft! 😀

                            Ich überleg mir was…

                             

                            Ich fürchte, Bilder können nur per Link eingefügt werden, also die müssten dann irgendwo schon online bereitstehen.

                          • #47671
                            Klaus Major
                            Administrator

                              So, Lösung gefunden, aber eher „von hinten durch die Brust ins Auge“! ?
                              Schau es an und lass es Dir langsam auf der Zunge zergehen!
                              Bei Fragen bitte fragen.

                              on mouseUp
                                 put empty into tContainer
                                 put empty into tAlleZeilen
                                 put empty into tGesamtZeilen
                                 put empty into tData
                              
                                 put „Mo,Di,Mi,Do,Fr,Sa“ into MyVar
                                 repeat for each item Temp in MyVar
                                    put (fld („Sum“ & Temp) of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear))& cr after tContainer
                                 end repeat
                                 answer tContainer
                                 
                                 ## Wieviele Zeilen haben wir insgesamt:
                                 put the num of lines of tContainer into tGesamtZeilen
                                 
                                 ## Bei repeat for each müssen wir manuell einen Zähler verwalten:
                                 put 1 into tCounter
                                 repeat for each line tLine in tContainer
                                    
                                    ## Wir sammeln alle Daten (= nicht leere Zeilen) in tData, 
                                    ## das werden wir später sortieren
                                    if tLine <> EMPTY then
                                       put tLine & CR after tData
                                       
                                       ## Wir merken uns auch Nummern die nicht leeren Zeilen haben:
                                       put tCounter & CR after tVolleZeilen
                                    end if     
                                    add 1 to tCounter 
                                 end repeat
                                 
                                 ## Aufräumen
                                 if char -1 of tData = CR then
                                    delete char -1 of tData
                                 end if
                                 if char -1 of tVolleZeilen = CR then
                                    delete char -1 of tVolleZeilen
                                 end if
                                 
                                 ## Wir erstellen auf diese Weise eine Variable mit tGesamtZeilen Leerzeilen
                                 put EMPTY into line tGesamtZeilen of tAlleZeilen
                                 
                                 ## Jetzt alle vollen Zeilen sortieren...
                                 set itemdel to TAB
                                 sort lines of tData descending numeric by item 1 of each
                                 put 1 into tCounter2
                                 
                                 ## ... und füllen die nicht leeren Zeilen wieder mit Inhalt.
                                 ## Aber in umgekehrter Reihenfolge, da wir sortiert haben.
                                 ## Somit bleiben alle leeren Zeilen erhalten und an der korrekten Stelle!
                                 repeat for each line tLine in tVolleZeilen
                                    put line tCounter2 of tData into line tLine of tAlleZeilen
                                    add 1 to tCounter2
                                 end repeat
                                 answer tAlleZeilen
                              end mouseUp

                              EDIT:
                              Habe das (tData) mal korrigiert und Dein “put empty into…” hinzugefügt.

                            • #47673
                              akrages
                              Teilnehmer

                                Nach einer kleinen Korrektur:
                                aus
                                put line tCounter2 of tNewData into line tLine of tAlleZeilen
                                wurde
                                put line tCounter2 of tData into line tLine of tAlleZeilen
                                hat es auch bei mir funktioniert.

                                Außerdem musste ich ganz am Anfang die Variablen mit:

                                   put empty into tContainer
                                   put empty into tAlleZeilen
                                   put empty into tGesamtZeilen
                                   put empty into tData

                                leeren, weil sonst “solange die Anwendung nicht beendet wurde” bei weiteren Einträgen die Liste immer länger wurde.

                                Ansonsten ist deine Lösung mal wieder auf den Punkt gebracht.
                                Vielen Dank für deine Mühe.

                              • #47674
                                Klaus Major
                                Administrator

                                  Ach ja, hatte die Namen der Variablen am Ende geändert, da ist mir tData wohl durch die Lappen gegangen.

                                  Sorry, wusste nicht, daß Du hier mit lokalen oder globalen Variablen arbeitest.
                                  Aber prima, daß es nun bei Dir läuft. 🙂

                                  Wie Du siehst, habe ich es nun auch mit der korrekten Darstellung von CODE etc. geschafft!
                                  Hat etwas gedauert, bis ich herausbekommen hatte, daß ich hioer oben rechts TEXT einstellen musste.

                                  Dein entsprechender Hinweis oben war mir leider entschlüpft…

                                • #47675
                                  akrages
                                  Teilnehmer

                                    Hallo Klaus.
                                    Ich brauche nochmal etwas Hilfe.
                                    Ich wollte gerne, dass nur Zeilen in tContainer landen, bei denen das Urlaubssymbol eingeblendet (sichtbar) ist.

                                    Dazu habe ich unser Script am Anfang wie folgt ergänzt:

                                     put "Mo,Di,Mi,Do,Fr,Sa" into MyVar
                                       
                                       ## Nur Zeilen mit sichtbaren Urlaubssymbolen berücksichtigen.
                                       repeat for each item Temp in MyVar
                                          put the short name (img ("Urlaub!" & Temp) into tImage
                                          if the visible of img tImage of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true then
                                             repeat for each item Temp in MyVar
                                                put (fld ("Sum" & Temp) of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear))& cr after tContainer
                                             end repeat         
                                          end if
                                       end repeat
                                       answer tContainer
                                       
                                       ## Wieviele Zeilen haben wir insgesamt:
                                       put the num of lines of tContainer into tGesamtZeilen

                                    Allerdings bekomme ich jetzt eine Ausgabe in tContainer (Ich habe als Test Di und Do jeweils 1 Tag Urlaub eingetragen) die so aussieht:

                                    Leerzeile (also nüscht)
                                    7.5 (Der Resturlaub am Dienstag)
                                    Leerzeile
                                    8.5 (Der Resturlaub am Mittwoch)
                                    Leerzeile
                                    Leerzeile

                                    Leerzeile (also nüscht)
                                    7.5 (Der Resturlaub am Dienstag)
                                    Leerzeile
                                    8.5 (Der Resturlaub am Mittwoch)
                                    Leerzeile
                                    Leerzeile

                                    Wie du sehen kannst, wird tContainer 2x identisch gefüllt.
                                    Wo liegt hier der Fehler?
                                    Ich verstehe es nicht.

                                  • #47676
                                    Klaus Major
                                    Administrator

                                      Ist das das gesamte Skript?

                                      Hinweis:
                                      put the short name (img ("Urlaub!" & Temp) into tImage
                                      The short name of img (“Urlaub!” & Temp) IST (“Urlaub!” & Temp) 😀

                                    • #47677
                                      Klaus Major
                                      Administrator

                                        Quick guess: Kommentiere den inneren “repeat” Lopp mal aus!
                                        Du hast nämlich zwei Mal -> repeat for each item Temp in MyVar

                                      • #47678
                                        akrages
                                        Teilnehmer

                                          Quick guess: Kommentiere den inneren „repeat“ Lopp mal aus!

                                          Dann fehlen leider die Leerzeilen.

                                        • #47679
                                          Klaus Major
                                          Administrator

                                            OK, dann schaue ich mir das noch einmal genauer an.

                                          • #47680
                                            Klaus Major
                                            Administrator

                                              Vielleicht haben wir uns missverstanden, ich meinte es so, nur den REPEAT, nicht dessen Inhalt:

                                               put "Mo,Di,Mi,Do,Fr,Sa" into MyVar
                                                 
                                                 ## Nur Zeilen mit sichtbaren Urlaubssymbolen berücksichtigen.
                                                 repeat for each item Temp in MyVar
                                                    put the short name (img ("Urlaub!" & Temp) into tImage
                                                    if the visible of img tImage of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true then
                                                      ## repeat for each item Temp in MyVar
                                                          put (fld ("Sum" & Temp) of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear))& cr after tContainer
                                                      ## end repeat         
                                                    end if
                                                 end repeat
                                                 answer tContainer
                                                 
                                                 ## Wieviele Zeilen haben wir insgesamt:
                                                 put the num of lines of tContainer into tGesamtZeilen
                                            • #47681
                                              Klaus Major
                                              Administrator

                                                Nee, wahrscheinlich auch nicht…
                                                Die Lererzeilen entstehen, wenn das passende Bild (“Urlaub” & TEMP) unsichtbar ist, richtig?
                                                Wenn ja, dann lass die IF Abfrage und das REPEAT mal weg.

                                                Sorry, ohne den Stack kann ich nur raten…

                                              • #47682
                                                akrages
                                                Teilnehmer

                                                  Hallo Klaus.
                                                  Erst mal Danke für deine Hilfsbereitschaft. (Ist ja schließlich auch deine Freizeit).
                                                  Ich habe es jetzt so gelöst:

                                                  global gAktuelleKalenderwoche, gActualYear
                                                  local tContainer, tImage
                                                  
                                                  on mouseUp pButtonNumber
                                                     SortReverse
                                                  end mouseUp
                                                  
                                                  on SortReverse
                                                     put "Mo,Di,Mi,Do,Fr,Sa" into MyVar
                                                     put empty into tContainer
                                                     put empty into tAlleZeilen
                                                     put empty into tGesamtZeilen
                                                     put empty into tData
                                                     
                                                     put "Mo,Di,Mi,Do,Fr,Sa" into MyVar
                                                     repeat for each item Temp in MyVar
                                                        put (fld ("MyOldVacation" & Temp)) & cr after tContainer
                                                     end repeat
                                                     ##answer tContainer 
                                                     
                                                     ## Wieviele Zeilen haben wir insgesamt:
                                                     put the num of lines of tContainer into tGesamtZeilen
                                                     
                                                     ## Bei repeat for each müssen wir manuell einen Zähler verwalten:
                                                     put 1 into tCounter
                                                     repeat for each line tLine in tContainer
                                                        
                                                        ## Wir sammeln alle Daten (= nicht leere Zeilen) in tData, 
                                                        ## das werden wir später sortieren
                                                        if tLine <> EMPTY then
                                                           put tLine & CR after tData
                                                           
                                                           ## Wir merken uns auch Nummern die nicht leere Zeilen haben:
                                                           put tCounter & CR after tVolleZeilen
                                                        end if     
                                                        add 1 to tCounter 
                                                     end repeat
                                                     
                                                     ## Aufräumen
                                                     if char -1 of tData = CR then
                                                        delete char -1 of tData
                                                     end if
                                                     if char -1 of tVolleZeilen = CR then
                                                        delete char -1 of tVolleZeilen
                                                     end if
                                                     
                                                     ## Wir erstellen auf diese Weise eine Variable mit tGesamtZeilen Leerzeilen
                                                     put EMPTY into line tGesamtZeilen of tAlleZeilen
                                                     
                                                     ## Jetzt alle vollen Zeilen sortieren...
                                                     set itemdel to TAB
                                                     sort lines of tData descending numeric by item 1 of each
                                                     put 1 into tCounter2
                                                     
                                                     ## ... und füllen die nicht leeren Zeilen wieder mit Inhalt.
                                                     ## Aber in umgekehrter Reihenfolge, da wir sortiert haben.
                                                     ## Somit bleiben alle leeren Zeilen erhalten und an der korrekten Stelle!
                                                     repeat for each line tLine in tVolleZeilen
                                                        put line tCounter2 of tData into line tLine of tAlleZeilen
                                                        add 1 to tCounter2
                                                     end repeat
                                                     ##answer tAlleZeilen
                                                     
                                                     ##answer "ich sortiere jetzt"
                                                     if the visible of img "Urlaub!Mo" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 1 of tAlleZeilen <> empty then
                                                        put line 1 of tAlleZeilen into fld "MyOldVacationMo"
                                                        put fld "MyOldVacationMo" into fld "SumMo" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                     
                                                     if the visible of img "Urlaub!Di" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 2 of tAlleZeilen <> empty then
                                                        put line 2 of tAlleZeilen into fld MyOldVacationDi
                                                        put fld "MyOldVacationDi" into fld "SumDi" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                     
                                                     if the visible of img "Urlaub!Mi" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 3 of tAlleZeilen <> empty then
                                                        put line 3 of tAlleZeilen into fld MyOldVacationMi
                                                        put fld "MyOldVacationMi" into fld "SumMi" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                     
                                                     if the visible of img "Urlaub!Do" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 4 of tAlleZeilen <> empty then
                                                        put line 4 of tAlleZeilen into fld MyOldVacationDo
                                                        put fld "MyOldVacationDo" into fld "SumDo" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                     
                                                     if the visible of img "Urlaub!Fr" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 5 of tAlleZeilen <> empty then
                                                        put line 5 of tAlleZeilen into fld MyOldVacationFr
                                                        put fld "MyOldVacationFr" into fld "SumFr" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                     
                                                     if the visible of img "Urlaub!Sa" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear) is true and\
                                                           line 6 of tAlleZeilen <> empty then
                                                        put line 6 of tAlleZeilen into fld MyOldVacationSa
                                                        put fld "MyOldVacationSa" into fld "SumSa" of grp ("Leistung " & gAktuelleKalenderwoche) of grp ("Leistung " & gActualYear)
                                                     end if
                                                  end SortReverse

                                                  Ich habe an Stelle der Abfrage nach sichtbaren Urlaubssymbolen einfach die vorhandenen Felder “MyOldVacationMo” bis “MyOldVacationSa” verwendet.
                                                  Weil es neben den Urlaubssymbolen noch 4 weitere Symbole gibt, wäre das ganze zu Aufwendig geworden.
                                                  So funktioniert es schon ganz wie ich wollte.
                                                  Was hältst du davon?
                                                  Oder hast du eine bessere Idee?

                                                • #47683
                                                  Klaus Major
                                                  Administrator

                                                    Ohne den Stack mal zu sehen, kann ich das leider so rein theroretisch mittlerweile nicht ganz nachvollziehen…

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