SQL-Tutorial
Zurück Nach oben


Tutorial: Erstellen einer Eingabemaske für Datenbankzugriffe    

Dieses Tutorial zeigt Ihnen wie Sie eine Datenbank gestützte Applikation erstellen.
Für jeden Step ist ein entsprechender Signalgraph gespeichert.
Die entsprechenden Beispiel-Signalgraphen befinden sich:
Für Vollversion in  .\iconnect\examples\advanced\sql\db_step01.tc2.
Für Demoversion in .\iconnect\examples\demo\sql\db_step01.tc2.

Step 1
Datenbankzugriff mittels SQLEntry Modul.

Vorraussetzung: Falls die Datenbank 'Tutorial' noch nicht mittels ODBC Manager registriert ist, so können Sie dies mit den folgende Anweisungen selber vornehmen.
Dazu starten Sie in der Systemsteuerung den ODBC Administrator, betätigen den Button 'Hinzufügen...', wählen 'Microsoft Access-Treiber' und drücken fertigstellen.
Nun geben Sie als Datenquellennamen 'Tutorial' an. Schließlich drücken sie den Button 'Auswählen' und geben die Datenbank 'Tutorial.mdb' an.
Diese Datenbank besitzt eine Tabelle mit dem Namen 'Tabelle'.
Die Tabelle besitzt folgende Felder:

ID: Primärschlüsselfeld (Ganzzahl)
DOUBLE: Feld mit Fließkommazahlen
Datum: DateTime Feld, welches Zeit und Datum speichert
BOOL: Speichert einen binären Wert: (1/0)
Integer: Ganzzahl
Text: Zeichenkette

 

Zur Funktionsweise des Signalgraphen:

Das im Signalgraph verwendete SQL Kommando lautet:
SELECT * FROM Tabelle
Dieses wählt alle Spalten und Zeilen der Tabelle aus.
Für jede Spalte der Tabelle erzeugt das SQLEntry Modul einen Ausgang.
Somit hat das hier verwendete SQLEntry Modul folgende Ausgänge:

Ausgänge Beschreibung
Error: Gibt Fehlermeldungen des SQLEntry Moduls und des ODBC Treibers aus.
ID: Gibt den Primärschlüssel der gewählten Ergebniszeile aus.
DOUBLE: Gibt das Feld 'DOUBLE' der gewählten Ergebniszeile aus.
Datum: Gibt das Feld 'Datum' der gewählten Ergebniszeile aus.
BOOL: Gibt das Feld 'BOOL' der gewählten Ergebniszeile aus.
Integer: Gibt das Feld 'Integer' der gewählten Ergebniszeile aus.
Text: Gibt das Feld 'Text' der gewählten Ergebniszeile aus.
<: Gibt eine 1 aus, wenn die erste Zeile der Ergebnistabelle ausgewählt wird.
>: Gibt eine 1 aus, wenn die letzte Zeile der Ergebnistabelle ausgewählt wird.
Count: Gibt die Anzahl der Einträge der ausgewählten Tabelle aus.
Changes: Gibt eine 1 aus wenn sich die Anzahl der Einträge geändert hat.

Bedienhinweise:
Nach dem Start des Signalgraphen führt das SQLEntry Modul den eingestellten SQL-Befehl aus.
Da die Datenbank mehrere Ergebniszeilen zurückliefert, können Sie über den Indexeingang bestimmen, welche Ergebniszeile auf die Augänge kopiert wird.
In diesem Signalgraphen können Sie mit dem Spin Modul den Index der Zeile bestimmen der ausgegeben werden soll.
Der Reload Button ist mit dem Refresh Eingang des SQLEntry moduls verdrahtet, dieser bewirkt, dass der SQL-Befehl nochmals ausgefürt wird.

Step 2
Ergebniszeilen aus einer Ergebnistabelle auswählen
Konstruktionshinweise:
(Konstruktionshinweise beziehen sich immer auf den Editiermodus des Signalgraphen)
Jedes Modul im Signalgraph bekommt automatisch einen Namen zugewiesen.
Sie können aber jedem Modul zusätzlich einen eigenen Namen geben. Dazu klicken Sie im Editiermodus mit der rechten Maustaste auf das gewünschte Modul und wählen im Kontextmenu die Option 'Symbolischer Modulname...'
Um zwischen der Ansicht der automatisch vergebenenen und den selber definierten Modulnamen zu wechseln, wählen Sie aus der Menuleiste die Opion Ansicht|Symbolische Modulnamen.

Das hier verwendete SQLEntry Modul hat den Namen 'Suchen' und verwendet folgendes SQL-Kommando:
SELECT [Tabelle].[ID] FROM Tabelle
wählt die Spalte (=alle Felder) 'ID' der Tabelle aus.

Bedienhinweise:
(Bedienhinweise beziehen sich auf den Laufzeitmodus des Signalgraphen)
Wenn Sie auf den Indexeingang eine -1 geben, sammelt das SQLEntry Modul alle Werte der Ergebnistabelle und gibt diese getrennt durch '\n\r' (Trennzeichen Zeilenvorschub) auf einmal aus.
Sie können im TextDisp sehen, dass jeder Wert des Feldes 'ID' aus der Ergebnistabelle ausgegeben wird. Dies geschieht nur wenn sie eine -1 auf den Indexeingang legen, ansonsten wird nur die durch den Index gewählte Ergebniszeile ausgegeben.
Da im SQLEntry Modul der Parameter 'Index mit Null beginnen' nicht gewählt ist, erscheint für Index = 0 keine Ausgabe.
Step 3
Ergebnisse einer Datenbankanfrage schnell ausgeben. (z.B. eine Listbox befüllen)
Konstruktionshinweise:
Die Ergebniszeilen aus dem SQLEntry Modul 'Suchen' werden an eine Listbox übergeben.
Aus diesen ListBox-Einträgen kann einer ausgewählt werden.
Der ausgewählte Eintrag wird an das SQLEntry Modul 'Daten einlesen' geschickt.
Das SQLEntry Modul mit dem Namen 'Daten einlesen' verwendet folgendes SQL Kommando:
SELECT * FROM Tabelle WHERE ID = #Auswahl=1
Erläuterung zu diesem SQL-Befehl:
Dieser Befehl liest alle Daten aus der Tabelle, die zum gewählten Eintrag 'ID' gehören.
Diese Einträge werden danach an den entsprechenden Ausgängen des Moduls ausgegeben.
(Wurde vom Eingang 'Auswahl' noch kein Wert gelesen, so wird der Wert 1 benutzt. )
Das Spin-Eingabefeld wird mit dem Parameter: 'Beim Laden deaktivieren' abgeschaltet.
Bedienhinweise
:
Mit dem Button Reload wird der SQL-Befehl des SQL-Moduls 'Suchen' wiederholt, das Suchergebnis wird somit nochmals in die ListBox-Liste geschrieben. Einträge können deshalb doppelt erscheinen.
Mit dem Button Reset können sie die Listbox leeren.
Durch Anklicken eines Listbox-Eintrages werden die dazugehörigen Datenbank-Felder ausgegeben.
Das Spin-Eingabefeld ist deaktiviert  und dient somit nur als Anzeige, der Inhalt kann nicht verändert werden.
Step 4
Erstellen einer Bildschirmmaske mit dem InputManager.
Konstruktionshinweise:
Dazu verknüpfen Sie alle Ausgänge des SQLEntry Moduls 'Daten lesen' mit einem EditLine Modul.
Jedes EditLine Module benötigt folgende Parameter:
Input: extern,
Typ: UBYTE[],
Bezeichner: Text.
Den Data Eingang jedes EditLine Moduls verknüpfen Sie mit einem Ausgang des SQLEntry Moduls.
Den EXT Eingang verknüpfen Sie mit dem Ausgang des InputManager Moduls.
Dazu setzen Sie die Anzahl der Ausgänge des InputManagers auf 10.
Im InputManager Ausgabefenster bestimmen Sie den Platz und die Größe der Eingabe-Felder und beschriften diese entsprechend.
Bedienhinweise:
Wenn Sie den Signalgraphen nun starten werden die Primärschlüssel der Tabelle ausgelesen und in der Listbox dargestellt.
Durch Anwählen eines Eintrages aus der Listbox werden die dazugehörigen Informationen in die Eingabe-Felder des Inputmanagers eingetragen.
Mit dem ClearList-Button löschen Sie die ListBox,
mit dem Reload-Button laden Sie Inhalt der ListBox erneut.
Das Spin-Eingabefeld ist deaktiviert und dient somit nur als Anzeige, der Inhalt kann nicht verändert werden.
Step 5
Datensätze in Datenbank speichern.
Konstruktionshinweise:
Um die Änderungen die Sie in der Eingabemaske vornehmen, auch speichern zu können, verwenden Sie noch ein weiteres SQLEntry Modul.
Dieses SQLEntry Modul 'Speichern' benötigt folgende Parameter:
SQL Befehl: 'SELECT * FROM Tabelle'
Keine Dateneingänge erzeugen: ausschalten.

Nun verdrahten Sie die Ausgänge der EditLine Module mit den entsprechenden Eingängen des SQLEntry Modul 'Speichern'.
Der Primärschlüssel 'ID' dient dazu die Einträge eindeutig zu spezifizieren; d.h. Einträge die den selben Primärschlüssel verwenden, überschreiben sich gegenseitig.
Bedienhinweise:
Wenn der Signalgraph läuft, werden eingegebene Daten gespeichert.
Änderungen werden übernommen sobald ein Eingabefeld seinen Fokus verliert; d.h. der Eingabe-Cursor auf ein anderes Eingabefeld gesetzt wird.)
Der Reload Button löscht zuerst die ListBox, danach befüllt er diese wieder mit neuen Werten.
Step 6
Bildschirmmaske um Speichern Button erweitern.
Konstruktionshinweise:
Damit Sie Änderungen komfortabel vornehmen können, sollten Sie einen Speichern Button einfügen, damit können Sie bestimmen, wann die Änderung gespeichert werden sollen.

Um einen Speichern-Button einzufügen, müssen Sie ein ParamBuf Modul zwischen den Eingabe Feldern (EditLine) und dem Speichern Modul (SQLEntry) setzen.
Den Ok Eingang verdrahten Sie mit einem Button 'Store record'.
Bedienhinweise
Sie können nun einen Eintrag aus der Listbox auswählen, die angezeigten Daten ändern, und mit dem Speichern Button sichern.
Wenn Sie für den Eintrag ID einen neuen Wert angeben, erzeugen Sie einen neuen Datenbank-Eintag (Datensatz).

Step 7
Eingabemaske um Löschen-Funktion erweitern.
Konstruktionshinweise:
Hierfür benötigen Sie ein weiteres ParamBuf-Modul, welches den Primärschlüssel des zuletzt ausgewählten Datensatzes speichert. Also verdrahten sie den Dateneingang des ParmBuf Moduls mit dem Ausgang des EditLine Moduls 'ID'.
Den OK Eingang dieses ParamBuf Moduls verdrahten Sie mit dem Button 'Delete'.
Den Ausgang der ParamBuf Moduls verdrahten sie mit einem SQLEntry Modul 'Löschen'.
Dieses benötigt die Parameter:
SQL-Befehl: 'DELETE * FROM Tabelle',
Primärindex verwenden: aktiviert.
Bedienhinweise:
Nach Betätigen des 'Löschen' Buttons wird der Datensatz mit der angegebenen 'ID' gelöscht. Falls kein Datensatz mit der 'ID' existiert, wird eine Fehlermeldung auf den Spy ausgegeben.
Nach dem Löschen ist der Inhalt der ListBox veraltet, um diesen zu aktualisieren betätigen Sie den 'Refresh List' Button.
Step 8
Aktuellen Datensatz in ASCII-Format speichern.
Konstruktionshinweise:
Um einen Datensatz  zu speichern, benötigen Sie ein SaveBin-Modul.
Um die gelesenen Daten aus der Datenbank zu formatieren eignet sich das Interpret Modul am besten.
Folgendes Interpret-Programm formatiert die Ausgaben des Datenbank Moduls und gibt diese an das SaveBin Modul weiter:

input trigger ID( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
input trigger Double( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
input trigger Datum( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
input trigger BOOL( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
input trigger Integer( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
input trigger TEXT( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
output o( "TYPEINFO", "TypeInfo", "UBYTE[]", "Text" );
output oClose( "TYPEINFO", "TypeInfo", "SWORD[1]", "BIN" );
execute
{
o << "ID : "; o << ID; o << "\r\n";
o << "Double : "; o << Double; o << "\r\n";
o << "Datum : "; o << Datum; o << "\r\n";
o << "BOOL : "; o << BOOL; o << "\r\n";
o << "Integer : "; o << Integer; o << "\r\n";
o << "Text : "; o << TEXT; o << "\r\n";
oClose[0] = 1;
}

Das SaveBin Modul benötigt folgende Parameter:
Signaltyp: UBYTE[]
Bezeichner: Text
Dateiname: .\recent_trans.txt
Bedienhinweise:
Der zuletzt angezeigte Datensatz wird in der angegebenen Datei gespeichet.
Step 9
Drucken des Datensatzes

Konstruktionshinweise:
Um einen Datensatz auszugeben verwenden Sie die von SaveBin gespeicherte ASCII Datei.
Der Druckvorgang wird mit einem Start Modul ausgeführt.
Das Start Modul benötigt dazu folgende Parameter:
Typ: Ausführbares Programm
Parameter: notepad /p recent_trans.txt
Unsichtbar öffnen: aktiviert.

Hierbei ist recent_trans.txt der Name der zu druckenden Datei. Dieser muss mit dem Dateinamen übereinstimmen der im SaveBin Modul angegeben ist.
Bedienhinweise:
Mit dem Button der an den Triggereingang T des Start Moduls angeschlosssen ist, starten Sie den Ausdruck.
Step 10
Listbox automatisch aktualisieren.
Konstruktionshinweise:
Um Änderungen in der Datenbank mittels externer DB-Applikationen z.B. MS-ACCESS sofort zu aktualisieren, aktivieren Sie den Parameter 'Auf externe Änderungen prüfen' des SQLEntry Moduls 'Speichern'.
Verdrahten Sie alle Changes Ausgänge aller SQLEntry-Module mit einem Join-Modul. Den Ausgang des Join Moduls verdrahten Sie mit dem Refresh Eingang des SQLEntry Moduls 'Suchen'. Somit werden bei jeder Änderung die Listbox Einträge neu eingelesen.
Bedienhinweise:
Bisher mussten Sie nach dem Löschen oder Einfügen von Datensätzen die Listbox manuell aktualisieren, um eine korrekte Liste der vorhandenen Datensätze zu erhalten, dies geschieht nun automatisch.
Step 11
Strukturieren des Signalgraphen mit Makros, Sicherheitsabfragen einbauen.
Konstruktionshinweise:
Man sollte möglichst viele Funktionen als Makros realisieren, um die Übersichtlichkeit zu erhöhen.
Auch können Sie die Anzahl von Neuverdrahtungen bei Änderungen des Signalgraphen reduzieren.

Im Beispiel DB_Step11.tc2 wird das Makro MessageMakro.tc2 eingefügt, welches einige Buttons der Eingabemaske verwaltet. Diese Buttons sind mit einer Checkbox logisch verknüpft. Somit können Sicherheitsabfragen eingeblendet werden.
Mit dem 'Schliessen' Button können Sie den Signalgraphen beenden, dazu verwenden Sie ein Stop Modul, dieses benötigt folgende Parameter:
Signalgraph stoppen,
Signalgraph nach stoppen speichern und schliessen. 

Bedienhinweise:
Wenn Sie den Button 'Warnungen ausgeben' aktivieren, so wird vor dem Drucken, Löschen und Speichern von Datensätzen eine Sicherheitsabfrage eingeblendet. Diese muss bestätigt werden, damit der jeweilige Vorgang tatsächlich durchgeführt wird. Diese zusätzliche Sicherheitsabfrage kann auch vor dem Schliessen des Signalgraphen mit dem 'Schliessen' Button angezeigt werden.
Step 12
Verwenden eines Nicht-Primärschlüssels in der AuswahlBox.
Konstruktionshinweise:
Um die Namen welche in der Spalte Text der Tabelle gespeichert sind, in der Listbox anzuzeigen verwendet das SQLEntry Modul 'Suchen' folgendes SQL Kommando:
SELECT [Tabelle].[Text] FROM Tabelle.
In der ListBox erscheinen nun anstatt der Primärschlüsselwerte 'ID', die Namen der Spalte 'Text'.
Da hier Datensätze mehrfach vorhanden sein können, wird der Index Eingang des SQLEntry Nachfolgemoduls 'Datensätze einlesen' mit einem Spin Modul verdrahtet.
Somit können Sie, falls ein Name mehrfach vorhanden ist, über den Index auswählen, welcher Datensatz angezeigt werden soll.
Bedienhinweise:
Die Daten zu den angezeigten Namen können Sie wie oben bereits erwähnt durch Anklicken ausgewählen.
Mit dem aktiven Spin-Eingabefeld können Sie Mehrfachnennungen anzeigen.
Falls für den eingestellten Index kein Wert existiert, bleiben die Anzeige unverändert und eine entsprechende Meldung wird im Spy-Fenster angezeigt.
Sie sollten Index auf eins (1) zurücksetzten, falls Sie Einfachnennungen anzeigen wollen.