4. Die Lehre von Ausgabe von mehrdimensionalen Arrays
und Rekonvertierung
Einleitung
Die Ausgabe von Datenwerten aus einer Datenbank mit Jascript ist so
vielfältig möglich, dass hier nur ein Teilbereich angeschnitten werden
kann. Der Sternenhimmelstuermer nimmt als Grundlage die Beispieldemonstration
aus der letzten Lektion und passt die dann an.
Der Grundcode wurde in der letzten Abhandlung bis ins Detail erläutert. Der
Sternenhimmelstuermer erklärt das nicht nochmal, da die Abhandlungen
eben modular aufgebaut sind...
Änderungen werden hingegen natürlich erläutert.
Was meint der Sternenhimmelstuermer mit Rekonvertierung? In der letzten
Lektion wurde
erläutert, wie man mit einer vier Zeilen langen Batch leicht
textbasierte Datenbanken wie *.txt, *.csv usw. mit unterschiedlichen
Separatoren (Komma, Semikolon, Doppelpunkt, Leerzeichen) in ein Array
konvertiert.
Das Gegenteil, also den Export eines Arrays in eine texbasierte
Datenbank mit unterschiedlichen Separatoren führt man dann
natürlich mit Javascript durch. Das ist nützlich, wenn die
Originaldatei verlorengeht oder man eben ein umfassendes Array
geschrieben hat und die Werte mit einem Programm benutzen oder
auswerten will.
Inhaltsangabe
Rekonvertierung durch Ausgabe aller Datensätze in Textärea
ein wenig schöner in der Form der Ausgabe: Im div
Container
Ausgabe des Arrays in einer E-Mail
Rekonvertierung durch Ausgabe aller Datensätze in Textärea
Ziel dieses Kapitals ist die Ausgabe aller Datenwerte eines Arrays in
datenbankkonformer Schreiweise, als Seperator nehmen wir ein Semikolon
und als Ziel erstmal eine Textärea
Ausgabe der gesamten Datenbank (Array) in einer Textärea. Hier die
lauffähige Demo.
<html>
<head>
<meta
name="generator" content="HTML Studio">
<title>Datenbankabfrage Demo</title>
<meta
name="author" content="Sternenhimmelstuermer">
<meta
name="description" content="datenbank">
<SCRIPT
LANGUAGE="JavaScript"><!--
var datenbank = new Array();
datenbank[0] = new
Array("Meyer","Uwe","Berlin","030/ 36 35");
datenbank[1] = new
Array("Müller","Anton","Berlin","030 37 33");
datenbank[2] = new
Array("Meyer","Werner","Berlin","030 38 33");
function db()
{
var ergebnis
= ""
for (var
i=0;i<3;i++) {
ergebnis+=
datenbank[i] + "\n"
}
document.datenbankForm.Antwort.value
= ergebnis
}
//--></SCRIPT>
</head>
<body>
<center>
<FORM
NAME="datenbankForm">
<div>Ein Kleiner
Datenbanktest<div>
<br>
<br>
<div>Druecken Sie den
Ergebnisbutton. Alle Daten werden gedruckt.</div>
<P>
<INPUT TYPE="BUTTON"
onClick="db()" VALUE="Ergebnis">
Antwortfeld: <textarea name="Antwort"
id=Antwort cols="40" rows="10"></textarea></P>
</FORM></center>
</body>
</html>
Erklärung des Codes
function db() {
var ergebnis
= ""
for (var
i=0;i<3;i++) {
ergebnis+=
datenbank[i] + "\n"
}
document.datenbankForm.Antwort.value
= ergebnis
}
Das ist also der rudimantär veränderte Codeteanteil in der
Funktion im Haedbereich. Ausgelöst wird die Funktion durch
Anklicken des Ergebnisbutton im Body : <INPUT TYPE="BUTTON" onClick="db()" VALUE="Ergebnis">.
ergebnis = ""
ist die leere Variable, die durch Schleifendurchläfe mit Inhalt gefüllt
wird. Wir lassen die Schleife von 0 bis drei viermal durchlaufen for (var i=0;i<3;i++) {. Da könnte
auch: for (var i=0;i<datenbank.length;i++) { drinstehen, was der
Länge des Arrays des Arrays entspricht.
ergebnis+=
datenbank[i] + "\n" ist die die wichtigste Zeile. Hier
bestimmen wir Das bei jedem Durchlauf die Variable Ergebnis ergebnis um einen
Datensatz erweitert wird(+):
Die Erweiterung ist immer ein Datensatz datenbank[i] ,
also der komplette Inhalt des äußeren Arrays. datenbank[0] - datenbank[4] . Dabei
beinhaltet das Array datenbank[0]
z. B. die Datensätze datenbank[0][0] Meyer, datenbank[0][1] Uwe, datenbank[0][2] Berlin, und datenbank[0][3] die Telefonnummer.
Das war jetzt nur Wiederholung...
Wozu + "\n" ?
Ist eigentlich völlig unnötig! Bei jedem Zeilendurchlauf wird eine
neue Zeile ausgegeben und \n
erzwingt einen Zeilenumbruch, den wir eigentlich nicht brauchen. Sie
sollten den Schalter aber kennen!
Der Separator ist ein Komma. Aber woher kommt der Separator her. Der
steht bereits im Array datenbank[0] ! So, jetzt spielen wi
mal ein wenig an der Ausgabe herum, um einen anderen Separator zu
setzen:
ergebnis+= datenbank[i][0]
+ ";" + datenbank[i][1] + ";" + datenbank[i][2] + ";" + datenbank[i][3]
+ "\n"
Das würde dann die einzelnen Werte ausgeben. Jetzt machen Sie das
mal spaßeshalber ohne den Schalter \n.
Der Internetexplorer so wie der Firefox setzen am Ende der
Telefonnummer automatisch einen Zeileneinschub und die letzten zwei
Zahlen landen dann am Anfang der nächsten Zeile, obwohl noch jede Menge
Platz ist.
Damit wäre eine Ausgabe als Datenbank zerstört. Natürlich könnte da
auch ein Leerzeichen oder Doppelpunkt als Separator stehen.
Der Separator - das Semikolon - wird wie ganz normaler Text behandelt
und deshalb in Anführungszeichen gesetzt. Die Reihenfolge der
Datenbankwerte ist egal.
Hey, damit ist fast alles erklärt!
document.datenbankForm.Antwort.value
= ergebnis
Das ist nur noch der Pfad zur Textaerea mit der ID bzw. Namen Antwort, dessen Wert unsere
Variable ergebnis nach vier
Schleifendurchläufe annimmt.
Jetzt kommt ein Sprung zum Body:
Antwortfeld: <textarea name="Antwort"
id=Antwort cols="40" rows="10"></textarea></P>
Das ist eine einfache Textarea mit zehn Reihen und 40
Zeichen in der Breite. Antwort ist wieder ID und Name. Javascript
funktioniert bei sämtlichen Ausgabeformen gleich: Sie haben einen
Bereich in einem Dokument mit einer ID, Adressieren diesen
Bereich und geben den Inhalt, der meistens in einer Variablen steht.
ein wenig schöner in der Form der Ausgabe: Tabelle im
Div-Container
Der Sternenhimmelstuermer steht auf Ausgabe im selben Textdokument.
Alles andere wirkt unseriös (Popup mit document.write-Methode) oder
billig (Alert-Methode). Also gilt es in der gültigen Form eine Tabelle
einzufügen - was relativ schwer ist.
Es wird hier nur eine Methode vorgestellt, obwohl es mit InnerHTML
klappt, aber diese Methode ist nicht zu empfehlen, da Tabellen nach
diesen komischen Javascriptmodellen (DOM) im wahrsten Sinne eine Klasse
für sich darstellen:
Demo
<html>
<head>
<meta
name="generator" content="HTML Studio">
<title>Datenbankabfrage Demo</title>
<meta
name="author" content="Sternenhimmelstuermer">
<meta
name="description" content="datenbank">
<SCRIPT
LANGUAGE="JavaScript"><!--
var datenbank = new Array();
datenbank[0] = new
Array("Meyer","Uwe","Berlin","030/ 36 35");
datenbank[1] = new
Array("Müller","Anton","Berlin","030 37 33");
datenbank[2] = new
Array("Meyer","Werner","Berlin","030 38 33");
function db()
{
node =
document.getElementById("Antwort");
node.appendChild(Tabellenausgabe());
}
function Tabellenausgabe() {
var Tabelle = document.createElement("table");
var Tbody = document.createElement("Tbody");
for (var i=0;i<3;i++) {
Reihe = document.createElement("tr");
Zelle =
document.createElement("td");
ZellenInhalt =
document.createTextNode(datenbank[i][0] + ";" + datenbank[i][1] + ";" +
datenbank[i][2] + ";" + datenbank[i][3]);
Zelle.appendChild(ZellenInhalt);
Reihe.appendChild(Zelle);
Tbody.appendChild(Reihe);
}
Tabelle.appendChild(tbody);
Tabelle.setAttribute("border",1);
Tabelle.style.bordercolor = 'black';
Tabelle.style.backgroundColor = 'yellow';
return Tabelle;
}
//--></SCRIPT>
</head>
<body>
<center>
<FORM
NAME="datenbankForm">
<div>Ein Kleiner
Datenbanktest<div>
<br>
<br>
<div>Druecken Sie den
Ergebnisbutton.Alle Daten werden gedruckt.</div>
<INPUT TYPE="BUTTON" onClick="db()"
VALUE="Ergebnis">
Antwortfeld: <div ID="Antwort">Hier
steht die Antwort</div>
</FORM></center>
</body>
</html>
Fangen wir mal im Body an: Da steht ein DIV-Container mit einer ID
Antwort und als Text ein Platzhalter: <div
ID="Antwort">Hier steht die
Antwort</div>
Das ist jetzt nichts neues von der Syntax. Wir haben einen Container
und ein DIV-Element ist ein wenig flexibler in der Aufnahme von
Objekten wie Tabellen. Über den Button wird wieder unsere
Datenbankfunktion db() aufgerufen.
{
node =
document.getElementById("Antwort");
node.appendChild(Tabellenausgabe());
}
Am Anfang wird wieder definiert: Wir ziehen uns mit node in Kombination
mit getElementByID also den DIV-Container. node ist dabei so eine Art
Hilfe, um "Knotenpunkte" im HTML-Dokument anzusprechen.
Diese Knotenpunkte haben unter anderen appendchild als Tochterobjekt
(append child heißt "hinzugefügtes Kind" übersett), was mit der
Funktion Tabellenausgabe() neu
verknüpft wird. Einfach gesagt: Wir ziehen uns einen bestehenden
Container aus dem Body des HTML-Dokumentes (als Kindobjek)t und füllen
ihn mit der erstellten Tabelle (createElement)) als Ergebnis, die wir
in der darauffolgenden folgenden Kind-Funktion erstellen. Dann
wird das Kind als Familienmitglied hinzugefügt und im Container
angezeigt. Drücken Sie mehrmals den Ergebnisbutton vergrößert sich die
Familie in der Ausgabe.
node.appendChild(Tabellenausgabe()); ist also
die Geburt des Kindes in der Tochterfunktion Tabellenausgabe()
function Tabellenausgabe() {
var Tabelle =
document.createElement("table");
var Tbody = document.createElement("Tbody");
Wir kreieren innerhalb des Containers eine Tabelle mit
einem Body. Das muss der Funktion mal wieder gesagt werden, die
als dumme/-er Tochter/Sohn nur eine Hülle ohne Inhalt ist, die wie
üblich gefüllt wird.
for (var i=0;i<3;i++) {
Die For-Schleife bleibt genauso simple und wurde mehrmals erklärt...
Reihe = document.createElement("tr");
Zelle =
document.createElement("td");
ZellenInhalt =
document.createTextNode(datenbank[i][0] + ";" +
datenbank[i][1] + ";" + datenbank[i][2] + ";" + datenbank[i][3]);
Zelle.appendChild(ZellenInhalt);
Reihe.appendChild(Zelle);
Tbody.appendChild(Reihe);
}
Jetzt wird Stück für Stück der Tabelle zusammengesetzt. Für eine Reihe
wird die Variable Reihe vegeben: <tr>...für eine Zelle
<td>...,dann den Zelleninhalt mit demselben Text, den wir zuvor
im letzten Kapitel als ergebnis+
deklariert hatten - ziemlich einfach also. Die Schleife läuft also für
0-3 durch...
Das war die erste Hälfte.
Wozu jetzt nochmal dieser append-Teil? Append heißt "Hinzufügen" und
darum geht es jetzt: Dem createElement ("table"), also der Tabelle wird
im neu geschaffenen Körper die Reihe, Zelle und Zelleninhalt
zugeordnet.
}
Tabelle.appendChild(Tbody);
Tabelle.setAttribute("border",1);
Tabelle.style.bordercolor = 'black';
Tabelle.style.backgroundColor = 'yellow';
return Tabelle;
Dann werden dem Body des Kindobjektes noch schnell einige
Attribute bzw. der Style zugeordnet. Anmerkung: Nur mit der Tabelle.style.backgroundColor
= 'yellow'; -Methode wird zur Zeit Internet Explorer
und Firefox und Chrome eine Farbe zugeordnet. Bei der Farbvergabe mit
Attribute scheitert der Internetexplorer kläglich und die Tabelle
bleibt farblos - Deshalb immer mit Browsern überprüfen..
Nachdem das Layout vergeben wurde, wird mit return Tabelle das Tochterobjekt an
das Elternobjekt vererbt und damit die Daten im DIV-Container hinzugefügt.
Da steht nun die Tabelle.
Die ganze Ausgabe können Sie natürlich nach Lust und Laune über mehrere Zellen oder
Reihen verteilen, wie Sie es im Beispiellink ohne weitere Erklärungen
nachvollziehen können - einfach mal in den Quellcode schauen...
Mit VB-Script geht das ehrlich gesagt leichter, aber das ist
Geschmackssache.
Ja, der Programmieraufwand ist erstmal ein wenig höher, aber bei
mehreren Datensätzen lohnt sich das ohne Zweifel!
Ausgabe des Arrays in einer E-Mail
Nun, eigentlich schade, dass man Arrays nicht Abfragen kann und danach
Datensätze versenden kann. Nein, geht natürlich, wenn man den passenden
Pfad parat hat. Diesmal fand der Autor bei Self-Html einen
Lösungsansatz, der für unsere Verhältnisse angepasst werden muss. Qichtig war dabei nur ein Pfad...
Schauen Sie sich erstmal die Demo an.
Danach gibt es den Quellcode:
<html>
<head>
<meta name="generator" content="HTML Studio">
<title>Datenbankabfrage Demo</title>
<meta name="author" content="Sternenhimmelstuermer">
<meta name="description" content="datenbank">
<SCRIPT LANGUAGE="JavaScript"><!--
var datenbank = new Array();
datenbank[0] = new Array("Meyer","Uwe","Berlin","030/ 36 35");
datenbank[1] = new Array("Müller","Anton","Berlin","030 37 33");
datenbank[2] = new Array("Meyer","Werner","Berlin","030 38 33");
function db() {
var ergebnis = ""
for (var i=0;i<3;i++) {
ergebnis+= datenbank[i] + "\n"
}
document.datenbankForm.Antwort.value = ergebnis
betreffzeile="Betrefftext";
text=" Der Inhalt der Datenbank ist:" + ergebnis + " Ende mit einzelner Ausgabe: " + datenbank[0][0] ;
location.href="mailto:meine@adresse.de?subject="+betreffzeile+"&body="+text;
}
//--></SCRIPT>
</head>
<body>
<center>
<FORM NAME="datenbankForm">
<br>
<br>
<div>Druecken Sie den Ergebnisbutton.Alle Daten werden gedruckt und eine email mit Daten im Body geöffnet.</div>
<P>
<INPUT TYPE="BUTTON" onClick="db()" VALUE="Ergebnis">
Antwortfeld: <textarea name="Antwort" id=Antwort cols="40" rows="10"></textarea></P>
</FORM></center>
</body>
</html>
Der blaue Teil ist die Datenbank, der grüne Teil wurde im ersten
Kapitel ausführlich erklärt und der rote Teil wird jetzt erklärt.
Wir haben also die Variable ergebnis, die sämtliche Datenbankinhalte
enthält. Das ist eigentlich schon fast zu viel an Daten für die
folgende Methode, die eigentlich für einzelne Werte einer Datenbank
konzipiert ist:
betreffzeile="Betrefftext";
text=" Der Inhalt der Datenbank ist:" + ergebnis + " Ende mit einzelner Ausgabe: " + datenbank[0][0] ;
location.href="mailto:meine@adresse.de?subject="+betreffzeile+"&body="+text;
}
Die erste Zeile ist wieder eine Variable für den Betreffstext.
Natürlich könnte man hier bereits eine Datenbangangabe verbraten - in
der Art:
betreffzeile= "Guten Tag Herr" + datenbank[0][0] ;
Man könnte natürlich vorher wieder eine Variable schaffen, in der die Nachnamen abgelegt sind...
text=" Der Inhalt der Datenbank ist:" + ergebnis + " Ende mit einzelner Ausgabe: " + datenbank[0][0] ;
Dasselbe in grün - Verzeihung rot: Der Text unserer E-Mail wird wieder
in einer Variablen verpackt: Das ist jetzt wirklich Anfängerwissen,
aber in diesem Fall haben wir eben zwei Variablen hereingepackt. Einmal
die Datensätze insgesamt und als Bonus eben einen Wert aus der
Datenbank einzeln.
location.href="mailto:meine@adresse.de?subject="+betreffzeile+"&body="+text;
Das ganze als location.href zu
deklarieren und dann Adresseingabe, Nachrichtentitel und Body als
Variablen zu deklarieren, ist genial. Dadurch kann man auch als
Javascriptlaie schnell zum Ziel kommen... Ist eigentlich nicht weiter
erklärungsbedürftig, da die schreibweise - wenn man Sie als Vorlage hat
- eigentlich simpel ist.
Es wird nur eine E-Mail generiert mit Überschrift, Text und Adresse.
Mit Phonegap können Sie z. B. so Daten aus einer App exportieren.
Verstanden, was Sie damit für Möglichkeiten auch unter Phone 7 oder 8
haben?
Intuitive Programmierer sind eben oftmals überlegen, weil Sie nur die
Möglichkeiten und nicht die Schranken sehen...-:) Egal, damit ist jetzt
wirklich fast alles über Arrays gesagt...