mehrzeiliger Text von sqlite in DataGrid ?

Startseite Foren Deutsches LiveCode-Forum mehrzeiliger Text von sqlite in DataGrid ?

Ansicht von 16 Antwort-Themen
  • Autor
    Beiträge
    • #22079
      foto2004
      Teilnehmer

        Entschuldigt dass ich schon wieder dumme Fragen stelle aber wie bekomme ich einen mehrzeiligen Text von sqlite in ein DataGrid?

        Problem ist sobald da in einem Feld ein return drinnen ist macht er ja eine neue Zeile daraus?

      • #22112
        Klaus Major
        Administrator

          Hi Immanuel,

          ich habe im englischen Forum gesehen, daß Du einen Workaround mit einer weiteren DB Tabelle gefunden hast. Gut, aber das kann nicht im Sinne des Erfinders sein, oder!?

          Vorweg:
          Das geht, aber da ein Datagrid vom Typ TABLE nicht dazu ausgelegt ist, mehrzeiligen Text anzuzeigen, ergibt das im Endeffekt wenig Sinn.

          Du darfst dazu nicht (mehr) mit “THE DGTEXT of grp xyz” arbeiten, denn das ist durch TAB und CR getrennter “normaler” Text und die DEFAULT Trenner bei DB Abfragen sind TAB (DB Felder) und CR (Datensatz), was bei mehrzeiligem Text schon von Weitem nach Ärger schreit!

          1. Du musst andere Trenner definieren.
          Und zwar welche, die definitiv NICHT in den Daten in der DB vorhanden sind.

          2. Du musst die Daten aus der DB in ein ARRAY umwandeln und dann “THE DGDATA of grp xyz” setzen.

          Beispiel:
          Datenbank mit 3 Feldern -> name, vorname und adresse
          Welches Datgenbankfeld mehrzeiligen Text enthält ist dann egal.

          ...
          put "SELECT name,vorname,adresse from kunden;" into tSQL
          
          ## Trenner definieren: 
          ## Feldtrenner
          put numtochar(2) into tFeldtrenner
          ## Datensatztrenner
          put numtochar(3) into tDatansatztrenner
          
          ## Jetzt Datenabfragen mit unseren Trennern:
          put revDataFromQuery(tFeldtrenner,tDatensatztrenner, databaseID, tSQL) into tData
          
          ## Jetzt tData in Array umwandeln
          ## Vorarbeit, wir müssen diese Trenner auch für LC definieren:
          set ITEMDEL to tFeldtrenner
          set LINEDEL to tDatensatztrenner
          
          ## Repeat for each ist schnell, aber dann müssen wir einen eigenen Counter managen
          put 0 into tCounter
          repeat for each line tDatensatz in tData
            add 1 to tCounter
            
            ## Nun die Felder in das Array packen, mit dem Namen Deiner Spalten im DG als Keys
            put item 1 of tDatensatz into tArray[tCounter]["name"]
            put item 2 of tDatensatz into tArray[tCounter]["vorname"]
            put item 3 of tDatensatz into tArray[tCounter]["adresse"]
          end repeat
          
          ## Jetzt das DG füllen:
          set the DGDATA of grp "dein DG hier..." to tArray
          ...

          Gruß

          Klaus

        • #22174
          foto2004
          Teilnehmer

            Guten Morgen Klaus,

            soweit tut es das was es soll aber ich bekomme nur den ersten Datensatz im DG angezeigt …..

            wenn ich mir mit put tDatensatz die Daten anzeigen lasse sind aber alle drinnen?

            wo hab ich jetzt wieder den Denkfehler drinnen?

            LG Immanuel

          • #22175
            Klaus Major
            Administrator

              Ohne Dein Skript zu sehen kann ich nichts dazu sagen.

            • #22177
              foto2004
              Teilnehmer

                entschuldige. Ich habe mir eine weitere Card aufgemacht um das ganze zu testen.
                Gobale Variablen sind drinnen und es ist nur noch ein Button darauf der eben “displayDB” aufruft

                on displayDB --Datenfeld auffüllen
                   sqlCon
                   put "SELECT * from huhn  " into tSQL -- DB auslesen
                   ## Trenner definieren: 
                   ## Feldtrenner
                   --put numtochar(2) into tFeldtrenner
                   put numToCodepoint(2) into tFeldtrenner
                   ## Datensatztrenner
                   --put numtochar(3) into tDatansatztrenner
                   put numToCodepoint(3) into tDatansatztrenner
                   
                   ## Jetzt Datenabfragen mit unseren Trennern:
                   put revDataFromQuery(tFeldtrenner,tDatansatztrenner,connID,tSQL)into tData 
                   
                   ## Jetzt tData in Array umwandeln
                   ## Vorarbeit, wir müssen diese Trenner auch für LC definieren:
                   set ITEMDEL to tFeldtrenner
                   set LINEDEL to tDatensatztrenner
                   
                   ## Repeat for each ist schnell, aber dann müssen wir einen eigenen Counter managen
                   put 0 into tCounter
                   repeat for each line tDatensatz in tData
                      add 1 to tCounter
                      
                      ## Nun die Felder in das Array packen, mit dem Namen Deiner Spalten im DG als Keys
                      put item 1 of tDatensatz into tArray[tCounter]["id"]
                      put item 2 of tDatensatz into tArray[tCounter]["ring"]
                      put item 3 of tDatensatz into tArray[tCounter]["geb"]
                      put item 4 of tDatensatz into tArray[tCounter]["sex"]
                      put item 5 of tDatensatz into tArray[tCounter]["vater"]
                      put item 6 of tDatensatz into tArray[tCounter]["mutter"]
                      put item 7 of tDatensatz into tArray[tCounter]["stall"]
                      put item 8 of tDatensatz into tArray[tCounter]["impfungen"]
                      put item 9 of tDatensatz into tArray[tCounter]["abgangAm"]
                      put item 10 of tDatensatz into tArray[tCounter]["abgangArt"]
                      put item 11 of tDatensatz into tArray[tCounter]["info"]
                      put item 12 of tDatensatz into tArray[tCounter]["bild"]
                   end repeat
                   
                   
                   -- das alte --set the dgText of group "dataHuhn2" to tData
                   set the DGDATA of grp "dataHuhn2" to tArray
                   if the result <> EMPTY then
                      answer the result
                   end if
                   put tDatensatz
                   revCloseDatabase connID
                end displayDB
              • #22178
                Klaus Major
                Administrator

                  Oha, da hatte sich bei mir ein kleiner Tippfehler eingeschlichen, den du dann übernommen hast, tut mir leid! Es muss immer tDatEnsatztrenner heissen:

                  on displayDB --Datenfeld auffüllen
                     sqlCon
                     put "SELECT * from huhn" into tSQL -- DB auslesen
                     ## Trenner definieren: 
                     ## Feldtrenner
                     --put numtochar(2) into tFeldtrenner
                     put numToCodepoint(2) into tFeldtrenner
                     ## Datensatztrenner
                     --put numtochar(3) into tDatansatztrenner
                     ## put numToCodepoint(3) into tDatansatztrenner
                     put numToCodepoint(3) into tDatensatztrenner
                     
                     ## Jetzt Datenabfragen mit unseren Trennern:
                     put revDataFromQuery(tFeldtrenner,tDatensatztrenner,connID,tSQL)into tData 
                  ...

                  Das sollte das Problem beheben.

                • #22180
                  Klaus Major
                  Administrator

                    Und danke für die Erinnerung daran, daß numtochar und chartonum heute mit numtocodepoint und codepointtonum zu ersetzen sind.

                    Nach fast 20 Jahren mit LC und seinen Vorfahren verfalle ich immer noch in alte Muster… 😎

                  • #22182
                    Klaus Major
                    Administrator

                      Noch ein Hinweis:
                      Du kannst mit diesem Trick wieder einen Menge Tipparbeit sparen, einfach Deinen REPEAT Loop hiermit ersetzen:

                      ...
                        ## Repeat for each ist schnell, aber dann müssen wir einen eigenen Counter managen
                         put 0 into tCounter
                         
                         ## Alle Keys als Komma getrennte Liste erstellen:
                         put "id,ring,sex,vater,mutter,stall,impfungen,abgangAm,abgangArt,info,bild" into tKeys
                      
                         ## Wir hatten ja den ITEMDELIMITER neu gesetzt, also auch hier:
                         replace "," with tFeldtrenner in tKeys
                         
                         repeat for each line tDatensatz in tData
                            add 1 to tCounter
                            
                            ## Diesen Counter resetten, damit wir wieder bei 0 anfangen können beim Loop durch alle Keys
                            put 0 into tKeyCounter
                            repeat for each item tKey in tKeys
                               add 1 to tKeyCounter
                               put item tKeyCounter of tDatensatz into tArray[tCounter][tKey]
                            end repeat
                         end repeat
                      ...
                    • #22184
                      foto2004
                      Teilnehmer

                        wieder einmal recht vielen Dank.

                        woher kommt eigentlich das “tDatEnsatztrenner” ?

                        das mit dem numtochar habe ich rein zufällige gelesen als ich wissen wollte was das eigentlich macht.

                        Wahnsinn seit 20 Jahren machst du das schon, währe sicher interessant bei dir in die Lehre zu gehen.

                      • #22185
                        Klaus Major
                        Administrator

                          woher kommt eigentlich das “tDatEnsatztrenner” ?

                          Meinst Du das Wort selber?
                          Das ist meine Erfindung, ist ja nur der Name einer Variablen. In meinen Beispielen gebe ich Variablen etc. immer (hoffentlich) selbsterklärende Namen.

                          Wir können die Variable auch karlheinz nenne, was aber nicht so aussagekräftig wäre. 😀

                          Wahnsinn seit 20 Jahren machst du das schon, währe sicher interessant bei dir in die Lehre zu gehen.

                          Um genau zu sein, Ende 1999 kam die erste Version von Metacard, dem Großvater von LC, für Mac und Windows heraus. Vorher, seit 1992, gab es das nur für UNIX!
                          Seitdem bin ich Fan davon, da Logik irgendwie mein Ding ist und ich dank der englisch ähnlichen Syntax diese recht zügig umsetzen kann.

                          Ich biete auch Mentoring/Coaching für LC an, falls Interesse besteht, bitte eine Mail an mich: klaus AT major-k.de

                          • #22187
                            foto2004
                            Teilnehmer

                              das mit der Variable habe ich zu spät überrissen dass nur ein Tippfehler war, hab zu schnell darauf geschrieben …

                              das mit dem Metoring/Coaching hört sich interessant an da werde ich sicher noch mal darauf zurückkommen.

                              Aber wenn es erlaubt ist noch eine Frage: wie um Himmels willen bekomme ich die Daten wieder aus dem DG raus so dass ich sie zB zeilenweise bearbeiten kann den mein gebautes Dingens geht da nicht mer weil er mir jetzt das das Return raus liest.

                              on selectionChanged
                                 put the dgHilitedLines of me into zeile
                                 --put line zeile of the dgText of me into zeilentext
                                 put line zeile of the dgText of me into zeilentext
                                 set the itemDelimiter to tab
                                 put item 1 of zeilentext into idZ
                                 put item 2 of zeilentext into fldRingZ
                                 put item 3 of zeilentext into fldGebZ
                                 put item 4 of zeilentext into fldSexZ
                                 put item 5 of zeilentext into fldVaterZ
                                 put item 6 of zeilentext into fldMutterZ
                                 put item 7 of zeilentext into fldStallZ
                                 put item 8 of zeilentext into fldImpfungZ
                                 put item 9 of zeilentext into fldAbgangAmZ
                                 put item 10 of zeilentext into fldAbgangArtZ
                                 put item 11 of zeilentext into fldInfoZ
                                 put item 12 of zeilentext into imgBildZ
                                 set the text of fld fldID to idZ
                                 set the text of fld fldRing to fldRingZ
                                 set the text of fld fldGeb to fldGebZ
                                 set the text of fld fldSex to fldSexZ
                                 set the text of fld fldVater to fldVaterZ
                                 set the text of fld fldMutter to fldMutterZ
                                 set the text of fld fldStall to fldStallZ
                                 set the text of fld fldImpfung to fldImpfungZ
                                 set the text of fld fldAbgangAm to fldAbgangAmZ
                                 set the text of fld fldAbgangArt to fldAbgangArtZ
                                 set the text of fld fldInfo to fldInfoZ
                                 set filename of image "imgBild" to imgBildZ
                                 --displayDBImpf(idZ)
                                 --displayDBInfo(idZ)
                                 --put idZ
                              end selectionChanged
                              
                          • #22188
                            Klaus Major
                            Administrator

                              Wie ich schon sagte, hier darfst Du NICHT mehr mit the dgtext arbeiten, sondern immer mit the dgdata, also dem Array im Datagrid!

                              Heissen die Spalten (columns) in Deinem Datagrid wie die Felder, die Du füllen möchtest?
                              Eine geschickte Namensgebung ist nämlich die halbe Miete, da wir so Objektnamen zusammenbasteln und uns JEDE Menge Tipparbeit sparen können.

                              Wichtig:
                              Eingennamen IMMER in Anführungszeichen -> fld “fldAbgangArt”

                              Beispiel:

                              on selectionChanged
                                 put the dgHilitedLines of me into zeile
                              
                                 ## Jetzt das passende Array auslesen:
                                 put the dgDataOfLine[zeile] of me into tData
                              
                                 ## tData enthält nun ein eindimensionales Array mit den Namen Deiner Spalten als Keys
                                 ## -> tData["id"]
                                 ## -> tData["ring"]
                                 ## etc...
                              
                                 put the keys of tData into tKeys
                                 ## tKeys enthält nun eine CR getrennte Liste mit den Keys dieses Array = Namen der Spalten
                                 ## Jetzt können wir schnell die benötigten Daten in die entsprechenden Felder füllen
                                 ## GANZ WICHTIG, wenn wir mehr als ein oder zwei Felder modifizieren:
                                 LOCK SCREEN
                              
                                 repeat for each line tKey in tKeys
                                    ## Eine Ausnahme müssen wir abfangen, da das Ziel hier kein Feld ist!
                                    if tKey = "bild" then
                                      set filename of image "imgBild" to tData["bild"]
                                    else
                                    ## Angenommen Deine Felder heissen wie die Spalten aber mit "fld" davor:
                                      put "fld" & tKey into tFeldname
                                      put tData[tKey] into fld tFeldname
                                  end if
                                end repeat
                                unlock screen
                              end selectionChanged 
                              • #22194
                                foto2004
                                Teilnehmer

                                  Danke. hab gesehen du spielst Bass. Ich spiele Gitarre.

                                  Noch ein Verständnis Problem habe ich

                                  die beiden Zeilen, da steige ich nicht ganz durch:

                                           ## Angenommen Deine Felder heissen wie die Spalten aber mit "fld" davor:
                                           put "fld_" & tKey into tFeldname. ## ok setzt den Feldnamen
                                           put tData[tKey] into fld tFeldname ## hir kommen die Daten in das Feld 
                                  

                                  aber wie spielt das zusammen ?

                              • #22200
                                Klaus Major
                                Administrator

                                  OK, Beispiel, erster Loop:

                                  ...
                                  ## tKey enthält nun -> id
                                  put "fld_" & tKey into tFeldname. ## ok setzt den Feldnamen
                                  ## Somit enhält tFeldname -> fld_id
                                  
                                  ## Und die folgende Zeile holt den Inhalt des Keys namens "id" aus dem Array und legt den Text in obiges Feld!
                                  put tData[tKey] into fld tFeldname
                                  
                                  ## Im ersten Loop liest LC hier:
                                  ## put tData["id"] into fld "fld_id"
                                  ## Etc... für alle weiteren Felder
                                  ...

                                  Ich denke, Du siehst hier den Vorteil von geschickter Namensgebung! 🙂

                                • #22202
                                  foto2004
                                  Teilnehmer

                                    OK danke so hatte ich es mir jetzt auch zusammengestöpselt.

                                    ## put tData[“id”] into fld “fld_id”
                                    ## put 3 into fld “fld_id” — z. B
                                    ## put 10.10.2020 into fld “fld_geb” — usw

                                    Ein andere Frage, gibt es eigentlich ein Verzeichnis wo man die, mit der Cummunity Edition erstellten Programme die veröffentlicht werden, gelistet hat?

                                    Ich meine da könnte man ja dadurch auch einiges lernen?

                                    LG Immanuel

                                  • #22203
                                    Klaus Major
                                    Administrator

                                      Ein andere Frage, gibt es eigentlich ein Verzeichnis wo man die, mit der Cummunity Edition erstellten Programme die veröffentlicht werden, gelistet hat?

                                      Nicht, daß ich wüsste…

                                    • #22241
                                      foto2004
                                      Teilnehmer

                                        eine andere Frage zu DataGrid, wenn ich es auf ein Mobilgerät lade und laufen lasse ist mir aufgefallen dass wenn ich per Finger eine Zeile im DataGrid auswähle ich auch danach eine 2. und 3 ….. auswählen kann und alle bleiben markiert. wie kann man das machen dass immer nur eine Zeile ausgewählt ist? zur Zeit muss ich immer eine Zeile antippen dann ist sie ausgewählt und wenn ich eine andere markieren möchte muss ich besagte Zeile erneut antippen damit sie nicht mehr ausgewählt ist und dann kann ich erst eine andere Zeile antippen.

                                      • #22250
                                        Klaus Major
                                        Administrator

                                          Im Inspector fürs Datagrid “multiple lines” wegklicken.

                                        • #22252
                                          foto2004
                                          Teilnehmer

                                            Danke, das einfache liegt oft so nah und man sieht es nicht.

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