Startseite › Foren › Deutsches LiveCode-Forum › Blättern in SQLite-Datenbank
- Dieses Thema hat 18 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren, 3 Monaten von Axwald.
-
AutorBeiträge
-
-
November 18, 2019 um 10:15 Uhr #17092
Ich habe folgendes vor. Ich möchte alle Felder der Datensätze in der Tabelle mit dem Namen Kosten addieren un die Gesamtsumme zu erhalten. In Profan habe ich das immer mit einer Schleife gemacht. Ich bin zum ersten Datensatz gegangen und habe dort den Wert ausgelesen und in eine Variable geschrieben. Dann zum nächsten Datensatz und den Wert dort zu dem ersten Wert addiert. Das ging dann bis der letzte Daensatz in der Datenbank erreicht wurde. In Livecode habe ich jetzt das ganze Wochenende recherchiert und bisher nicht gefunden wie ich das Erreichen des letzten Datensatzes abfragen könnte. Zum Blättern in den Datensätzen habe ich nur Befehle gefunden, die mir leider Fehlermeldungen bringen.
Z.B.
move To First()
Viele Grüße
Radmühl
-
November 18, 2019 um 15:06 Uhr #17094
Das geht sogar direkt in SQL:
... put "SELECT SUM('kosten') FROM 'alle_kosten';" into tSQL revexecute... ...
Ich schlage immer hier nach, wenn es mal wieder um SQL geht, man kann nicht alles im Kopf haben:
https://www.w3schools.com/sql/default.asp -
November 18, 2019 um 17:36 Uhr #17101
Hallo Klaus,
danke für die rasche Antwort. Ich schaue meist hier nach, aber da gibt es halt kein Put usw.
https://www.datenbanken-verstehen.de/sql-funktionen/sql-sum-funktion/
Mit dem von Dir mitgeteiltem Code habe ich Schwierigkeiten und er bringt mir auch bei revexecute eine Fehlermeldung. Ich habe eine Datenbank die Auto.db heißt. Die Tabelle heißt einfach nur Auto. Die Summe soll auf das Datenfeld Kosten gemacht werden.
Wenn ich den Code richtig verstehe müsste die gesamtsumme dann in der Variablen tSQL stehen. Hier mal der von mir verwendete Code
on mouseup put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revexecute... revCloseDatabase dbid end mouseup
Viele Grüße
Radmühl
-
November 18, 2019 um 17:37 Uhr #17102
Hallo Klaus,
danke für die rasche Antwort. Ich schaue meist hier nach, aber da gibt es halt kein Put usw.
https://www.datenbanken-verstehen.de/sql-funktionen/sql-sum-funktion/
Mit dem von Dir mitgeteiltem Code habe ich Schwierigkeiten und er bringt mir auch bei revexecute eine Fehlermeldung. Ich habe eine Datenbank die Auto.db heißt. Die Tabelle heißt einfach nur Auto. Die Summe soll auf das Datenfeld Kosten gemacht werden.
Wenn ich den Code richtig verstehe müsste die gesamtsumme dann in der Variablen tSQL stehen. Hier mal der von mir verwendete Code
on mouseup put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revexecute... revCloseDatabase dbid end mouseup
Viele Grüße
Radmühl
-
November 18, 2019 um 17:43 Uhr #17103
Hallo Klaus,
meine letzte Antwort wird leider nicht angezeigt und wenn ich es nochmal schreibe bekomme ich die Meldung, dass es ein doppelter Eintrag wäre. Komisch. Hier nun der nächste Versuch.
Danke für die rasche Antwort. Ich schaue meist hier nach, aber da gibt es halt kein Put usw.
https://www.datenbanken-verstehen.de/sql-funktionen/sql-sum-funktion/
Mit dem von Dir mitgeteiltem Code habe ich Schwierigkeiten und er bringt mir auch bei revexecute eine Fehlermeldung. Ich habe eine Datenbank die Auto.db heißt. Die Tabelle heißt einfach nur Auto. Die Summe soll auf das Datenfeld Kosten gemacht werden.
Wenn ich den Code richtig verstehe müsste die gesamtsumme dann in der Variablen tSQL stehen. Hier mal der von mir verwendete Code
on mouseup put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revexecute... revCloseDatabase dbid end mouseup
Viele Grüße
Radmühl
-
November 19, 2019 um 11:05 Uhr #17116
Hallo Klaus,
Danke für die rasche Antwort.
Mit dem von Dir mitgeteiltem Code habe ich Schwierigkeiten und er bringt mir auch bei revexecute eine Fehlermeldung. Ich habe eine Datenbank die Auto.db heißt. Die Tabelle heißt einfach nur Auto. Die Summe soll auf das Datenfeld Kosten gemacht werden.
Wenn ich den Code richtig verstehe müsste die gesamtsumme dann in der Variablen tSQL stehen. Hier mal der von mir verwendete Code
on mouseup put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revexecute... revCloseDatabase dbid end mouseup
Viele Grüße
Radmühl
-
November 19, 2019 um 11:40 Uhr #17120
Hallo Radmühl,
Wenn ich den Code richtig verstehe müsste die gesamtsumme dann in der Variablen tSQL stehen.
korrekt!
Aber aus reiner Faulheit habe ich das mit “revexecute…” nicht ausgeschreiben, ich hatte gehofft, Du würdest diesen Part erkennen und übernehmen! 😎
... put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revexecute dbid,tSQL put THE RESULT into die_gesammelten_kosten revCloseDatabase dbid ...
Rührt die Fehlermeldung eventuell daher?
Oder hast Du die Zahlen in Deiner Tabelle mit KOMMA eingeben?
Also nicht 10.32 sondern 10,32?
Livecode rechnet nämlich auf englisch.Gruß
Klaus
-
November 19, 2019 um 14:25 Uhr #17124
Hallo Klaus,
wenn ich den Code abspeichere bringt er keinen Fehler. Wenn ich dann den Button teste bleibt er bei der Zeile revexecute dbId,tSOL stehen und bringt folgende Fehlermeldung
button “Button”: execution error at line 22 (Handler: can’t find handler) near “revexecute”, char 1
Die Werte stehen mit . in der Datenbank. Liegt es vielleicht an der Feldart? Die habe ich in der Datenbanktabelle auf NUMERIC gesetzt.
Gruß
Radmühl
-
November 19, 2019 um 14:51 Uhr #17126
Oh, pardon, mein Fehler, es muss heissen:
…
revExecuteSQL tDBID, tSQL
… -
November 19, 2019 um 15:25 Uhr #17128
Danke aber es funktioniert leider immer noch nicht. In dem beschriebenen Ausdruck scheint ein Schreibfehler zu sein. revExecuteSQL tDBID, tSQL. Da ist wohl ein t zuviel. Ich habe s in revExecuteSQL DBID, tSQL abgeändert und es laäuft jetzt durch. Ich habe mal alles möglich abgefragt:
on mouseup put revOpenDatabase ("sqlite","d:auto.db", , , , ) into dbid answer dbid put "SELECT SUM('Kosten') FROM 'Auto';" into tSQL revExecuteSQL DBID, tSQL put THE RESULT into die_gesammelten_kosten answer die_gesammelten_kosten answer tSQL revCloseDatabase dbid
answer dbID = bringt einen Wert
answer die_gesammelten_kosten bringt 0
answer tSQL bringt als Rückgabewert den Text SELECT SUM(‘Kosten’) FROM ‘Auto’;Ich denke da ist der Fehler begraben.
Gruß
Radmühl
-
November 19, 2019 um 15:44 Uhr #17130
Hm, die SQL Syntax ist definitiv korrekt, siehe oben verlinkte Website.
Sorry, keine brillante Idee im Moment… -
November 21, 2019 um 13:47 Uhr #17142
Hallo,
nimm die Hochkommata raus – die machen aus dem Feldnamen (“Kosten”) einen String. Wenn Du Feld-Tabellen-Namen “quoten” willst, nimm ` (“backquote”).Und wenn Du mit SQL arbeiten willst, besorg Dir am Besten ein Tool, mit dem Du Deine SQL-Strings direkt in der DB testen kannst, z.B. “DB Browser for SQLite”. Ist gut gegen graue Haare 😉
Viel Spaß!
-
November 21, 2019 um 16:18 Uhr #17144
Hi Axwald,
alle Beispiele bei z.B. https://www.w3schools.com/sql/default.asp benutzen das “Hochkomma” -> ‘ = SHIFT-#. Das macht aber noch keinen String daraus! Oder ist das eine SQLite Eigenart?
Jedenfalls benutze ich das immer und hatte nie Probleme damit.
Ausserdem denke ich, Kosten und Autos sind hier die echten Namen des Feldes bzw. der Tabelle. 🙂
Aber einen Datenbank-Browser benutze ich auch, um SQL Befehle auszuprobieren, ein kleiner Fehler ist immer drin in meiner Syntax. 😎
Gruß
Klaus
-
November 21, 2019 um 20:42 Uhr #17146
Ausserdem denke ich, Kosten und Autos sind hier die echten Namen des Feldes bzw. der Tabelle. ?
Das ist richtig.
Gruß
Radmühl
-
November 22, 2019 um 08:10 Uhr #17148
Der Code funktioniert aus unerklärlichen Gründen zawr nicht, aber ich habe trotzdem einiges gelernt. Besten Dank.
Ich habe es jetzt wie ursrünglich geplant realisiert. Ich habe die Anzahl der Datensätze der Datenbank ausgelesen und dann mit einer Schleife die einzelnen Werte summiert. Durch eingefügte Abfragen konnte ich die Summenbildung dann auch den unterschiedlichen Fahrzeugen zuordnen.
Viele Grüße
Dieter
(Radmühl) -
November 22, 2019 um 14:33 Uhr #17157
Hmmm.
alle Beispiele bei z.B. https://www.w3schools.com/sql/default.asp benutzen das “Hochkomma” -> ‘ = SHIFT-#. Das macht aber noch keinen String daraus! Oder ist das eine SQLite Eigenart?
Jedenfalls benutze ich das immer und hatte nie Probleme damit.Ich hatte es im SQLite Manager (mein Tool der Wahl, geht noch im Waterfox) probiert, und da hat mir:
SELECT SUM('FeldName') FROM 'TabellenName';
0 gegeben, wie Du auch schriebst.SELECT SUM(FeldName) FROM TabellenName;
hingegen ergab die korrekte Summe.Ich arbeite auch mit viel mit MySQL/ MariaDB, und habe mir das irgendwann angewöhnt:
SELECT SUM(
Field1) from
Table1WHERE
Field2= 'einString';
Wobei der “backquote” eigentlich nur notwendig ist, wenn ein Feld- oder Tabellen-Name zufällig auch ein SQL-Schlüsselwort ist.Aber warum die SUM()-Funktion in der DB nicht gehen soll, ist mir auch nicht klar. Es handelt sich schon um ein numerisches Feld? VARCHARS lassen sich schlecht summieren …
Viel Spaß!
PS: Jetzt hab ich nochmal in “w3schools.com/sql” geschaut – aber gar kein Beispiel für gequotete Feld- oder Tabellennamen gefunden :/
-
November 23, 2019 um 17:56 Uhr #17185
Irgendwie hat das Forum meinen Beitrag gefressen. Ich hatte ihn 2 mal geändert (wegen versemmelter Formatierung), und dann war er auf einmal weg. Nochmal einstellen geht nicht, weil das Forum meint, das hätte ich doch schon gepostet :/
Egal, ich probiere es noch mal:
———————————————————————————
Hmmm.alle Beispiele bei z.B. https://www.w3schools.com/sql/default.asp benutzen das “Hochkomma” -> ‘ = SHIFT-#. Das macht aber noch keinen String daraus! Oder ist das eine SQLite Eigenart?
Jedenfalls benutze ich das immer und hatte nie Probleme damit.Ich hatte es im SQLite Manager (mein Tool der Wahl, geht noch im Waterfox) probiert, und da hat mir:
SELECT SUM('FeldName') FROM 'TabellenName';
0 gegeben, wie Du auch schriebst.SELECT SUM(FeldName) FROM TabellenName;
hingegen ergab die korrekte Summe.Ich arbeite auch mit viel mit MySQL/ MariaDB, und habe mir das irgendwann angewöhnt:
Feld- und Tabellenname in backquotes (`), Strings in Hochkommata (‘).
Wobei der “backquote” eigentlich nur notwendig ist, wenn ein Feld- oder Tabellen-Name zufällig auch ein SQL-Schlüsselwort ist.Aber warum die SUM()-Funktion in der DB nicht gehen soll, ist mir auch nicht klar. Es handelt sich schon um ein numerisches Feld? VARCHARS lassen sich schlecht summieren …
Viel Spaß!
PS: Jetzt hab ich nochmal in “w3schools.com/sql” geschaut – aber gar kein Beispiel für gequotete Feld- oder Tabellennamen gefunden :/
-
November 23, 2019 um 23:11 Uhr #17187
Hier zum Beispiel:
https://www.w3schools.com/sql/sql_where.asp
…
Example Where Clause:
SELECT * FROM Customers
WHERE Country=’Mexico’;
…-
Juli 10, 2020 um 13:45 Uhr #17218
Ah,
jetzt wird’s klarer – babylonische Begriffsverwirrung!2 Sachen sind zu unterscheiden:
- Text-Strings in den Daten
Das (… WHERE Country=’Mexico’) sollte eindeutig sein – einfache Quotes für String-Daten. Die mySQL Referenz sagt dazu:A string is a sequence of bytes or characters, enclosed within either single quote (‘) or double quote (“) characters.
Double Quotes sind dabei mit Vorsicht zu genießen – nicht nur wird das Zusammenbauen der SQL-Queries in LC damit zum fehlerträchtigen Puzzle, die Bedeutung in mySQL ist auch noch abhängig von der DB-Einstellung (Schalter: “ANSI QUOTES”)!
- “Identifier”, d.h. Tabellen- und Feld-Namen, Schlüsselwörter u.ä.
Das (SELECT * FROM component WHERE timestamp = …) ist auch nicht schwierig – das angeführte Beispiel wird Fehler werfen, weil sowohl “component” als auch “timestamp” Bestandteile von SQL sind (reservierte/ Schlüsselwörter).
In diesem Fall quoten wir, und mySQL sieht dafür den “backtick/ backquote” vor. Quote:The identifier quote character is the backtick (`)
Das ist nicht anders als in LC, wo es auch sinnvoll ist, Feld- und Button-Namen zu quoten. Der Unterschied ist, daß (zumindest) mySQL unterschiedliche Zeichen verlangt.
Jetzt habe ich noch mal bei SQLite nachgeschaut – die bemühen sich, zu allen der anderen SQL-Dialekten kompatibel zu sein, und treiben es dabei auf die Spitze. Quote:
If a keyword in single quotes (ex: ‘key’ or ‘glob’) is used in a context where an identifier is allowed but where a string literal is not allowed, then the token is understood to be an identifier instead of a string literal.
Das heißt, es kann funktionieren, muss aber nicht …
Ich hoffe, ich konnte zur allgemeinen Verwirrung beitragen 😉
Viel Spaß!
- Text-Strings in den Daten
-
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.