Blättern in SQLite-Datenbank

Startseite Foren Deutsches LiveCode-Forum Blättern in SQLite-Datenbank

Ansicht von 17 Antwort-Themen
  • Autor
    Beiträge
    • #17092
      Radmuehl
      Teilnehmer

        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

      • #17094
        Klaus Major
        Administrator

          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

        • #17101
          Radmuehl
          Teilnehmer

            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

          • #17102
            Radmuehl
            Teilnehmer

              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

            • #17103
              Radmuehl
              Teilnehmer

                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

              • #17116
                Radmuehl
                Teilnehmer

                  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

                • #17120
                  Klaus Major
                  Administrator

                    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

                  • #17124
                    Radmuehl
                    Teilnehmer

                      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

                    • #17126
                      Klaus Major
                      Administrator

                        Oh, pardon, mein Fehler, es muss heissen:

                        revExecuteSQL tDBID, tSQL

                      • #17128
                        Radmuehl
                        Teilnehmer

                          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

                        • #17130
                          Klaus Major
                          Administrator

                            Hm, die SQL Syntax ist definitiv korrekt, siehe oben verlinkte Website.
                            Sorry, keine brillante Idee im Moment…

                          • #17142
                            Axwald
                            Teilnehmer

                              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ß!

                            • #17144
                              Klaus Major
                              Administrator

                                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

                              • #17146
                                Radmuehl
                                Teilnehmer

                                  Ausserdem denke ich, Kosten und Autos sind hier die echten Namen des Feldes bzw. der Tabelle. ?

                                  Das ist richtig.

                                  Gruß

                                  Radmühl

                                • #17148
                                  Radmuehl
                                  Teilnehmer

                                    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)

                                  • #17157
                                    Axwald
                                    Teilnehmer

                                      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) fromTable1WHEREField2= '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 :/

                                    • #17185
                                      Axwald
                                      Teilnehmer

                                        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 :/

                                      • #17187
                                        Klaus Major
                                        Administrator

                                          Hier zum Beispiel:
                                          https://www.w3schools.com/sql/sql_where.asp

                                          Example Where Clause:
                                          SELECT * FROM Customers
                                          WHERE Country=’Mexico’;

                                          • #17218
                                            Axwald
                                            Teilnehmer

                                              Ah,
                                              jetzt wird’s klarer – babylonische Begriffsverwirrung!

                                              2 Sachen sind zu unterscheiden:

                                              1. 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”)!

                                              2. “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ß!

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