Frage zu DataGrid

Startseite Foren Deutsches LiveCode-Forum Frage zu DataGrid

Schlagwörter: 

Ansicht von 8 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
      Moderator

      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
      Moderator

      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
      Moderator

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

    • #17167
      Klaus Major
      Moderator

      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
      Moderator

      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

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