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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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.