Startseite › Foren › Deutsches LiveCode-Forum › Frage zu DataGrid
Schlagwörter: Datagrid
- Dieses Thema hat 16 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren, 10 Monaten von Klaus Major.
-
AutorBeiträge
-
-
November 22, 2019 um 08:42 Uhr #17152
Guten Morgen an Alle.
Ich habe mir die Beschreibung von DataGrid in diesem Forum durchgelesen. Leider hört sie da auf was ich jetzt benötige.
Was ich bisher geschafft habe:
Ich schreibe einen Datensatz in unterschiedliche Tabellen
Ich lese den Datensatz der allgemeinen Tabelle dann in das DataGridWas ich nicht weiß:
Wie kann ich einen Datensatz über DataGrid löschen und das in den unterschiedlichen Tabellen?
Wie kann ich einen Datensatz über DataGrid ändern und in den unterschiedlichen Tabellen korregieren?Ich möchte die Schritte mit zwei Button realisieren. Code weiter unten.
Datensatz schreiben:
on mouseup -- Datensatz in allgemeine Tabelle speichern put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "insert into auto (Tag, Monat, Jahr, Datum, Auto, Restladung, Endladung, Lademenge, Kw, Kosten) VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10)" into sql revExecuteSQL dbid, sql,"gTag","gMonat","gJahr","gDatum","gAutoauswahl","gRestladung","gEndladung","gLademenge","gKw","gKosten" -- Abfrage in die zugehörigen Tabellen der einzelnen Fahrzeuge speichern if gAutoauswahl = gAuto1 then put "insert into KAuto1 (Monat, Jahr,Kosten) VALUES (:1,:2,:3)" into sql revExecuteSQL dbid, sql,"gMonat","gJahr","gKosten" -- Abfrage ob es das aktuelle Jahr ist -- Wenn ja in aktuelles Jahr des Fahrzeuges speichern If gaJahr = gJahr then put "insert into JKAuto1 (Monat, Jahr,Kosten) VALUES (:1,:2,:3)" into sql revExecuteSQL dbid, sql,"gMonat","gJahr","gKosten" end if end if if gAutoauswahl = gAuto2 then put "insert into KAuto2 (Monat, Jahr,Kosten) VALUES (:1,:2,:3)" into sql revExecuteSQL dbid, sql,"gMonat","gJahr","gKosten" If gaJahr = gJahr then put "insert into JKAuto2 (Monat, Jahr,Kosten) VALUES (:1,:2,:3)" into sql revExecuteSQL dbid, sql,"gMonat","gJahr","gKosten" end if end if revCloseDatabase dbid Answer "Daten wurden gespeichert" end mouseup
Datensatz in DataGrid einlesen
put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT Datum, Auto, Restladung, Endladung, Lademenge, Kw, Kosten From auto" into sql put revDataFromQuery (tab, return, dbid,sql) into ergebnis put the number of lines of Ergebnis into anzahl set the dgtext of group "myDataGrid" to ergebnis set the itemDelimiter to tab put item 7 of line 4 of ergebnis into Kosten put Kosten into Summe revCloseDatabase dbid
DataGrid laut Beschreibung im Forum für die Bearbeitung vorbereiten
on mouseUp put the dgHilitedLines of me into zeile put line zeile of the dgText of me into zeilentext set the itemDelimiter to tab put item 1 of zeilentext into DataGridDatum put item 2 of zeilentext into DataGridAuto put item 3 of zeilentext into DataGridRestladung put item 4 of zeilentext into DataGridEndladung put item 5 of zeilentext into DataGridLademenge put item 6 of zeilentext into DataGridKw put item 7 of zeilentext into DataGridKosten -- Anfang Nur zum Test answer DataGridDatum answer DataGridAuto answer DataGridRestladung answer DataGridEndladung answer DataGridLademenge answer DataGridKw answer DataGridKosten --Ende nur zum Test
Mit den nachfolgenden Button soll dann die Löschung oder Änderung der Datensätze durchgeführt werden.
Ändern:
On mouseup If kein Datensatz markiert then Answer "Bitte Datensatz markieren" else end mouseup
Löschen:
On mouseup If kein Datensatz markiert then Answer "Bitte Datensatz markieren" else end mouseup
Kein Datensatz markiert ist natürlich nur ein Platzhalter, da ich nicht weiß was ich abfragen soll.
Viele Grüße
Dieter
(Radmühl) -
November 22, 2019 um 18:36 Uhr #17159
OK, hier erst mal ein paar Tips:
1. Der Übersichtlichkeit halber (viele Verschachtelungen!), steige ich aus einem IF THEN so schnell wie möglich aus, so wie hier:On mouseup If kein Datensatz markiert then Answer "Bitte Datensatz markieren" exit to top end if ## Weitere Anweisungen hier... end mouseup
Also kein ELSE nötig.
2. Passt nun nicht inbedingt zu Deinem Problem, aber Du kannst Dir eine Menge Tipparbeit sparen, wenn Du mit DGDATA bzw. dgDataOfLine[zeilennummer] arbeitest, das liefert dann ein ARRAY zurück, was Du einfach abfragen kannst.
Die KEYS dieses Array sind die Namen Deiner Spalten!
on mouseUp put the dgHilitedLines of me into zeile put the dgDataOfLine[zeile] of me into zeilenArray answer zeilenarray["datum"] answer zeilenarray["auto"] answer zeilenarray["restladung"] ## etc. end mouseup
OK, nun zu Deinem eigentlichen Problem:
ändern = UPDATE
löschen = DELETEAber dazu musst Du in SQL genau sagen WELCHER datensatz geändert oder gelöscht werden soll mit der WHERE Klausel.
Guter Tip:
Erstelle IMMER einen Index für Deine Tables (primary key!), also eine automatische fortlaufende Nummer, ruf diese auch immer mit ab und speichere sie in einer unsichtbaren Spalte im Datagrid. Auf diese Weise weisst Du immer genau, was Du bei WHERE schreiben musst.Wenn Du diese Info nicht hast, und ALLE Einträge eines Datensatzes geändert werden, stehst Du nämlich auf dem Schlauch, da Du dann keine Relation mehr zu dem dazugehörigen Datensatz hast. Verstehst Du?
Gruß
Klaus
-
November 22, 2019 um 18:38 Uhr #17161
-
November 22, 2019 um 20:43 Uhr #17163
Hallo Klaus
Danke Du hast mir sehr geholfen und ich habe es auch verstanden. Eine kleine Frage noch. Wie mache ich das mit der unsichtbaren Spalte im DataGrid? Alles eingelesene steht ja in Zeilen in der Variablen Ergebnis. Einfach die Spaltenbreite auf 0 setzen?
Viele Grüße
Dieter -
November 22, 2019 um 20:47 Uhr #17165
Nein, einfach “column visible” wegklicken für diese Spalte im Inspektor! 🙂
-
November 22, 2019 um 21:07 Uhr #17167
Praktischer Tip, sofern du das nicht schon gemacht hast:
In den Voreinstellungen von LC:
General -> Property labels are: -> Name of Livecode Property
anklicken.Danach werden alle Bezeichnungen im Inspektor angezeigt mit den Namen,
die Du in Skripten verwenden kannst. -
November 26, 2019 um 12:39 Uhr #17252
Danke für die zahlreichen Hilfestellungen.
mit dem Datensatzlöschen habe ich noch ein Problem. In den Beschreibungen steht immer, hier in meinem Fall, folgendes.
put "DELETE FROM auto WHERE ID = 2" into sql revExecuteSQL dbid, sql
Hier wird der Datensatz mit der ID 2 gelöscht. Das funktioniert auch.
Bei mir wird aber die Datansatz-ID in die Variable gloeschid gelesen. Ich habe schon alles Mögliche versucht aber das mit der Variablen löscht er nicht. Egal in welcher Form ich die Variable gloeschid angebe. Hochkomma, ohne usw.
put "DELETE FROM auto WHERE ID = 'gloeschid'" into sql revExecuteSQL dbid, sql
Viele Grüße
Dieter
-
November 26, 2019 um 17:02 Uhr #17255
Hallo Dieter,
Du übergibst den String -> gLoeschID aber nicht dessen Inhalt!
... ## So sollte es klappen: put "DELETE FROM auto WHERE ID = '" & gloeschid & "'" into sql revExecuteSQL dbid, sql ...
Gruß
Klaus
-
November 26, 2019 um 17:28 Uhr #17257
Hallo Klaus,
danke Dir. Ist logisch. Ich bin ein kleines Dummerschen.
Gruß
Dieter
-
Dezember 15, 2019 um 10:50 Uhr #17515
Mir ist noch etwas aufgefallen. Die Tabellen in DataGrid kann man ja auf Mouseclick sortieren. Beim Feld Datum sortiert er nicht nach dem kompletten Wert. Er nimmt immer erst die Tage, dann den Monat und zum Schluß das Jahr. Wie kann ich das ändern? Ich vermute es hat etwas mit der Formatation zu tun.
Vile Grüße
Dieter -
Dezember 15, 2019 um 14:37 Uhr #17532
Das Datagrid kann nur nach englischem oder deutschem (system date!) Datum sortieren.
In welchem Format liegen denn Deine Daten vor? -
Dezember 15, 2019 um 18:35 Uhr #17552
In einem nummerischen Feld in der Datenbank steht z.B. 31.12.2019.
-
Dezember 15, 2019 um 19:06 Uhr #17554
Ich habe es hier gerade getestet, klappt wie gewünscht!
Du musst im Inspektor für diese Spalte bei “Sort options” -> “System DateTime” anwählen, dann klappt das auch mit dem automatischen Sortieren beim Klick auf die Spaltenüberschrift!
Meine Beispieldaten frisch aus dem Datagrid, absteigend sortiert:
31.12.2019
18.11.2019
12.10.2019
01.10.2019Aufsteigend sortiert:
01.10.2019
12.10.2019
18.11.2019
31.12.2019Sieht für mich ziemlich korrekt aus! 🙂
-
Dezember 15, 2019 um 20:59 Uhr #17556
Hallo Klaus,
danke Dir. Klappt prima.
Viele Grüße
Dieter
-
Dezember 16, 2019 um 10:32 Uhr #17560
Hat wie geschrieben alles prima funktioniert. Leider nur unter Windows. Die App ist jetzt auf verschiedenen Androidgeräten und da geht es nicht.
-
Dezember 16, 2019 um 11:33 Uhr #17561
Es geht jetzt. Ich trage das Datum mit JJJJ.MM.TT in die Datenbank ein. Dann sortiert er richtig ohne “System DateTime”.
-
Dezember 16, 2019 um 16:10 Uhr #17570
Oh, ich dachte, die Schotten hätten nun endlich auch mal System Date und System Time unter Android eingebaut, sieht wohl nicht so aus. :-/
Hatte ich schon vor Jahren als Bug gemeldet:
System Time Bug auf Android
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.