Frage zu DataGrid

Startseite Foren Deutsches LiveCode-Forum Frage zu DataGrid

Schlagwörter: 

Ansicht von 16 Antwort-Themen
  • Autor
    Beiträge
    • #17152
      Radmuehl
      Teilnehmer

        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 DataGrid

        Was 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)

      • #17159
        Klaus Major
        Administrator

          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 = DELETE

          Genaue Syntax hier:

          Aber 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

        • #17161
          Klaus Major
          Administrator

            Mist, immer Probleme mit Links…
            SQL Syntax:
            Update
            Delete

          • #17163
            Radmuehl
            Teilnehmer

              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

            • #17165
              Klaus Major
              Administrator

                Nein, einfach “column visible” wegklicken für diese Spalte im Inspektor! 🙂

              • #17167
                Klaus Major
                Administrator

                  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.

                • #17252
                  Radmuehl
                  Teilnehmer

                    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

                  • #17255
                    Klaus Major
                    Administrator

                      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

                    • #17257
                      Radmuehl
                      Teilnehmer

                        Hallo Klaus,

                        danke Dir. Ist logisch. Ich bin ein kleines Dummerschen.

                        Gruß

                        Dieter

                      • #17515
                        Radmuehl
                        Teilnehmer

                          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

                        • #17532
                          Klaus Major
                          Administrator

                            Das Datagrid kann nur nach englischem oder deutschem (system date!) Datum sortieren.
                            In welchem Format liegen denn Deine Daten vor?

                          • #17552
                            Radmuehl
                            Teilnehmer

                              In einem nummerischen Feld in der Datenbank steht z.B. 31.12.2019.

                            • #17554
                              Klaus Major
                              Administrator

                                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.2019

                                Aufsteigend sortiert:
                                01.10.2019
                                12.10.2019
                                18.11.2019
                                31.12.2019

                                Sieht für mich ziemlich korrekt aus! 🙂

                              • #17556
                                Radmuehl
                                Teilnehmer

                                  Hallo Klaus,

                                  danke Dir. Klappt prima.

                                  Viele Grüße

                                  Dieter

                                • #17560
                                  Radmuehl
                                  Teilnehmer

                                    Hat wie geschrieben alles prima funktioniert. Leider nur unter Windows. Die App ist jetzt auf verschiedenen Androidgeräten und da geht es nicht.

                                  • #17561
                                    Radmuehl
                                    Teilnehmer

                                      Es geht jetzt. Ich trage das Datum mit JJJJ.MM.TT in die Datenbank ein. Dann sortiert er richtig ohne “System DateTime”.

                                    • #17570
                                      Klaus Major
                                      Administrator

                                        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

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