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