Startseite › Foren › Deutsches LiveCode-Forum › mehrzeiliger Text von sqlite in DataGrid ?
- Dieses Thema hat 18 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren, 2 Monaten von foto2004.
-
AutorBeiträge
-
-
August 9, 2020 um 21:56 Uhr #22079
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?
-
August 13, 2020 um 13:02 Uhr #22112
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
-
August 15, 2020 um 08:02 Uhr #22174
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
-
August 15, 2020 um 09:26 Uhr #22175
Ohne Dein Skript zu sehen kann ich nichts dazu sagen.
-
August 15, 2020 um 10:35 Uhr #22177
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” aufrufton 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
-
August 15, 2020 um 11:05 Uhr #22178
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.
-
August 15, 2020 um 11:10 Uhr #22180
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… 😎
-
August 15, 2020 um 11:59 Uhr #22182
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 ...
-
August 15, 2020 um 13:08 Uhr #22184
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.
-
August 15, 2020 um 13:33 Uhr #22185
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
-
August 15, 2020 um 13:45 Uhr #22187
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
-
-
August 15, 2020 um 14:03 Uhr #22188
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
-
August 15, 2020 um 17:44 Uhr #22194
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 ?
-
-
August 15, 2020 um 23:31 Uhr #22200
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! 🙂
-
August 16, 2020 um 11:20 Uhr #22202
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” — uswEin 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
-
August 16, 2020 um 11:28 Uhr #22203
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…
-
August 18, 2020 um 10:29 Uhr #22241
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.
-
August 18, 2020 um 15:07 Uhr #22250
Im Inspector fürs Datagrid “multiple lines” wegklicken.
-
August 18, 2020 um 15:15 Uhr #22252
Danke, das einfache liegt oft so nah und man sieht es nicht.
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.