Zur Navigation

Web SQL nutzen [4]

31 Kokarde

Huch, ganz vergessen zu posten :)

Ich habe es geschafft, das mit dem HIDDEN war natürlich die Lösung.
Musste jetzt nur noch bissle weiter aufbohren, da ja auch die TABELLE identifiziert werden muss und nicht nur der Datensatz darin :)

Sieht jetzt so aus:

 var td3 = document.createElement('td');
        td3.innerHTML = '<form method="GET" action="edit_munition.html"><input name="formstueckzahl" type="text" value="' + results.rows[i].stueckzahl + '" size="5" maxlength="4" id="formstueckzahl"><input type="hidden" name="formid" value="' + results.rows[i].id + '">' + '<input type="hidden" name="formtabelle" value="' + tblname + '">' + " " + '<input type="submit" name="form" value="update"></form>';

Aber schon bin ich beim nächsten Problem.
Die Werte kommen jetzt schon in der nächsten Datei an, die den Update in der DB machen soll, doch auch hier scheitere ich wieder an diesem Zusammenstückeln des Strings :((((

Das hier scheint nicht zu funktionieren, wobei kein Fehler kommt, aber es ändert sich auch nix im Feld was ich ändern will. Das Skript wird aber bis zum Ende durchlaufen und die Werte kommen auch richtig an.

Versuch 1:

 tx.executeSql('UPDATE ' + KISTE + ' SET stueckzahl = ' + STUECKZAHL + ' WERE id =' + ID +')'); 

Versuch 2:

       tx.executeSql('UPDATE ' + KISTE + ' SET stueckzahl = "' + STUECKZAHL + '" WERE id ="' + ID +'"');  

Ich glaub wenn ich damit fertig bin gönne ich mir 24 Stunden Schlaf :)


Hier noch ein Tipp für alle Leute die sich schnell und einfach eine uniq ID bauen wollen:

// Variablen und Berechnung - Millisekunden - intere Uhr in UNIX Format für die ID    
                    
    var d = new Date();
    var n = d.getTime();
    var id = n; 

29.09.2016 11:13 | geändert: 29.09.2016 11:40

32 Kokarde

LÖSUNG durch rumfummeln gefunden :))))

tx.executeSql('   UPDATE ' + KISTE + ' set stueckzahl = ' + STUECKZAHL + ' where id = ' + ID + ' '); 

29.09.2016 12:22

33 Kokarde

So, einen guten Wochenstart wünsche ich!

Wer kann mir denn Tipps geben, wie ich in die Formulare, wie z. B. das für die Kisten-Löschung, ein Array einbauen kann, so dass ich das Dropdown automatisch mit dem Inhalt aus dem DB bestücken kann, in diesem Falle die vorhandenen "Kisten"?

 <div class=container>

<form method="GET" action="clear_munitionskiste.html" name="form">
<b>Name der Munitionskiste?</b> <br>Beispiel: "Kiste1" (siehe Liste unten). <br><br>       
<input name="munitionskiste" type="text" value="0" size="12" maxlength="12" id="munitionskiste"><br><br>
<input type='submit' name='form' value='Kiste löschen'>
<input type="reset" value="Eingabe zurücksetzen">
</form>   
          
            
          <hr>
        
     <div id="status" name="status"><b>Folgende Kisten/Fächer/Schränke/Taschen sind vorhanden</b><br><br></div> 
          
 <script>
     
     
    // Skript bei @rushi - http://stackoverflow.com/questions/39620761/web-sql-javascript-show-all-tables-of-database
     
     // Erzeugt eine komplette Übersicht aller Tablellen in der DB und deren Inhalt = die Kisten!
     
     var db;

    function runExample() {
      createDbAndTables();
      getAllTablesFromDB(getResultSetFromTable);
    }

    function createDbAndTables(callback) {
      db = openDatabase('MUNITION', '1.0', 'Munitionsübersicht', 2 * 1024 * 1024);
      db.transaction(function(tx) {

      });
    }

    function getAllTablesFromDB(callback) {
      db.transaction(function(tx) {
        tx.executeSql('SELECT tbl_name from sqlite_master WHERE type = "table"', [], function(tx, results) {
          callback(results, processResultSet);
        });
      });
    }

    function getResultSetFromTable(results, callback) {
      var length = results.rows.length;
      var j = 0;
      for (var i = 0; i < length; i++) {
        db.transaction(function(tx) {
          var k=0,tblname=results.rows[j++].tbl_name;
          tx.executeSql('SELECT * FROM ' + tblname , [], function(tx, results) {
            callback(tblname,results);
          });
        });
      }

    }

    function processResultSet(tblname,results) {
      console.log('----------------------'+tblname)
      var len = results.rows.length;
      var tbl = document.createElement('table');
      var trTblName = document.createElement('tr');
      var thTblName = document.createElement('th');
      thTblName.innerHTML = tblname;
      trTblName.colSpan = 2;
      trTblName.appendChild(thTblName);
      tbl.appendChild(trTblName);
        

      var trHeader = document.createElement('tr');
      var th1 = document.createElement('th');
      th1.innerHTML = '';
      trHeader.appendChild(th1);
      tbl.appendChild(trHeader);
        

      for (var i = 0; i < len; i++) {
        var tr = document.createElement('tr');
        tbl.appendChild(tr);
      }
      var body = document.getElementsByTagName('X')[0];
      body.appendChild(tbl);

    }
  </script>


   <!-- Ausgabe TagName X --> 
       
          <X></X> 
          
  


</div>
                    
        
        
      


In diesem Falle sieht es so aus, dass halt oben das Formular liegt mit einem Eingabefeld das per Klick dann an die Datei weiter gegeben wird die das verarbeitet und die vorhandene Kiste löscht.

Unter dem Formular wird durch das o. g. Script eine Liste aller Datenbank-Tabellen = die Kisten, erzeugt.

Ich würde gerne die Handeingabe des Wertes, z. B. KISTE1, per Dropdown umsetzen. Wenn ich das richtig verstanden habe, müsste ich dazu vorher ein Array erzeugen in dem die Werte liegen.

Wo wäre jetzt der Ansatz dafür?

ThanX

04.10.2016 15:01

34 Jörg Kruse

Die Funktion processResultSet() muss so umgebaut werden, dass sie ein select statt eine Tabelle erzeugt.

Allerdings fehlt mir im Code noch etwas zum Verständnis:

      for (var i = 0; i < len; i++) {
        var tr = document.createElement('tr');
        tbl.appendChild(tr);
      }

Hier werden nur die Tabellenreihen erzeugt, aber nicht die Tabellenzellen? letztere enthalten ja erst den eigentlichen Inhalt. Wird dieser bei dir angezeigt?

04.10.2016 17:23 | geändert: 04.10.2016 17:23

35 Kokarde

Guten Morgen

Ich habe die App mal hoch geladen:

http://www.hardwareplattform.de/websql-db/

Damit man den vollständigen Code auch mal notfalls sehen kann.

Ich muss zugeben, diese ganzen Funktionen habe ich noch nicht wirklich verstanden. processResultSet() macht wohl einen Teil der Tabelle.
Es funktioniert soweit, dass mir die Tabellen angelegt und auch angezeigt werden, auch deren Inhalt (Zellen).

Ggf. kann man diese Funktion duplizieren, bzw. im Formular entsprechend abändern, so das dann ein Dropdown gebaut werden kann.

Ja, stimmt, die Inhalte für den Dropdown stehen in der Datenbank und im Value "th1" , wenn ich das soweit verstanden habe.

Ich brauche ja nur die Tabellen-Namen die existieren.
Die Ausgabe funzt ja schon gut, nur das ich den Wert in einem Array benötige und dann im Formular-Dropdown ausgegeben werden soll.

05.10.2016 08:56

36 Kokarde

Nachtrag:

Also in der Variablen
"tblname"
stehen die gewünschten Tabellennamen.

Mein Array wird auch erzeugt, sieht aber noch scheisse aus.

var array = [tblname];
document.write('<form>');
document.write('<select name="top5" size="5">'); 
document.write('<option>'); 
              for (i=0; i < array.length ; i++ ) { document.write(array[i] + "</option>"); 
document.write('</select></form>');
                                                                                            
}

Es werden 2 Form-Fenster angezeigt :(

Es sollen aber alle Werte in einer Select-Box stehen!

Doch wie?

05.10.2016 13:41 | geändert: 05.10.2016 13:44

37 Jörg Kruse

OK, ich habe mir jetzt mal das Originalscript auf stackoverflow.com angeschaut, das ist ja vollständig

In th1 und th2 stehen nur die Kopfdaten der Tabelle. Die eigentlichen Daten stehen in td1 und td2.

Ein Dropdown würde man analog so in etwa bauen:

function processResultSet2(selectName,results) {
    var len = results.rows.length;
    var select = document.createElement('select');
    select.name = 'munitionskiste';
    for (var i = 0; i < len; i++) {
        var option = document.createElement('option');
        option.name = results.rows[i].id;
        option.innerHTML = results.rows[i].name;
        select.appendChild(option);
    }
    var form = document.getElementsByTagName('form')[0];
    form.appendChild(select);
}

Probier mal, ob das hinhaut.

PS: unsere Antworten haben sich grad überschnitten :)

05.10.2016 13:42 | geändert: 05.10.2016 13:44

1 Forenmitglied fand diesen Beitrag gut

38 Kokarde

Hi, ja die Antworten haben sich gerade überschnitten :))

Leider klappt der Code nicht, es kommt, zu meiner Verwunderung, auch in der Console keine Ausgabe. Auch kein Fehler.

Ich habe im Body den folgenden Wert eingetragen, der als Platzhalter vorhanden sein muss, wenn ich das richtig verstanden habe:

<form></form>

Schade, sah cool aus.

Mein Array funktioniert, nur muss ich die richtige Stelle finden wo ich es einbaue und so zusammenbaue, dass das Form korrekt erzeugt wird.
Die Inhalte stimmen und lassen sich mit alert() korrekt ausgeben.

05.10.2016 13:56

39 Jörg Kruse

Du hast ja schon ein Formular - document.getElementsByTagName('form')[0] bezieht sich auf das erste Formular im HTML. Dort wird der Dropdown eingefügt

Dann muss der Code noch ausgeführt werden, wie im Beispiel von stackoverflow.com, mittels onload Attribut:

<body onload="runExample()">

Zudem habe ich an den Funktionsnamen noch eine "2" drangehängt, also muss der Callback hier noch angepasst werden:

callback(results, processResultSet2);

Wenn es weiterhin nicht funktioniert, poste mal den Gesamt-Code

05.10.2016 14:06 | geändert: 05.10.2016 14:08

40 Kokarde

OK; Faden verloren.
Habe deinen Code eingefügt und es sieht jetzt so aus:

<div>

<script>   
     
    // Skript bei @rushi - http://stackoverflow.com/questions/39620761/web-sql-javascript-show-all-tables-of-database
     
     // Erzeugt eine komplette Übersicht aller Tablellen in der DB und deren Inhalt
     
     var db;

    function runExample() {
      createDbAndTables();
      getAllTablesFromDB(getResultSetFromTable);
    }

    function createDbAndTables(callback) {
      db = openDatabase('MUNITION', '1.0', 'Munitionsübersicht', 2 * 1024 * 1024);
      db.transaction(function(tx) {

      });
    }

    function getAllTablesFromDB(callback) {
      db.transaction(function(tx) {
        tx.executeSql('SELECT tbl_name from sqlite_master WHERE type = "table"', [], function(tx, results) {
          callback(results, processResultSet);
     
        });
      });
    }

    function getResultSetFromTable(results, callback) {
      var length = results.rows.length;
      var j = 0;
      for (var i = 0; i < length; i++) {
        db.transaction(function(tx) {
          var k=0,tblname=results.rows[j++].tbl_name;
          tx.executeSql('SELECT * FROM ' + tblname , [], function(tx, results) {
      
            callback(tblname,results);
    
   
          });

        });

      }      

    }

    function processResultSet(tblname,results) {
      console.log('=======>>>'+tblname)
      
      var len = results.rows.length;
      var tbl = document.createElement('table');
      var trTblName = document.createElement('tr');
      var thTblName = document.createElement('th');
      thTblName.innerHTML = tblname;
      trTblName.colSpan = 2;
      trTblName.appendChild(thTblName);
      tbl.appendChild(trTblName);
        

      var trHeader = document.createElement('tr');
      var th1 = document.createElement('th');
      th1.innerHTML = '';
      trHeader.appendChild(th1);
      tbl.appendChild(trHeader);        

      for (var i = 0; i < len; i++) {
        var tr = document.createElement('tr');
        tbl.appendChild(tr);
      }
        
    
      var body = document.getElementsByTagName('X')[0];
      body.appendChild(tbl);

    }
     
     
    function processResultSet2(selectName,results) {
    var len = results.rows.length;
    var select = document.createElement('select');
    select.name = 'munitionskiste';
    for (var i = 0; i < len; i++) {
        var option = document.createElement('option');
        option.name = results.rows[i].id;
        option.innerHTML = results.rows[i].name;
        select.appendChild(option);
    }
    var form = document.getElementsByTagName('form')[0];
    form.appendChild(select);
}
     
     
     
     
     
     
     

  </script>


          <!-- Platzhalter für document.getElementsByTagName('X')[0];

          <X></X> 


          
          
  </div>

Komme nicht klar, was das mit dem Callback auf sich hat.

05.10.2016 14:20 | geändert: 05.10.2016 14:21