Projektarbeit Einsatz des postrelationalen Datenbankmanagment Systems Caché für die Datenbankausbildung Name: André Knaupp MatrNr.: 013198 Semester: SS 2003 Projektarbeit André Knaupp INHALTSVERZEICHNIS Seite 1 EINLEITUNG ....................................................................................................4 1.1 2 3 WAS IST CACHÉ............................................................................................................4 INSTALLATION.................................................................................................6 2.1 SYSTEMVORAUSSETZUNGEN ........................................................................................6 2.2 SOFTWAREINSTALLATION ............................................................................................6 2.3 JDBC / ODBC UND CACHÉ ......................................................................................11 ARBEITEN MIT CACHÉ ...................................................................................13 3.1 CACHE STOPPEN UND STARTEN ................................................................................13 3.2 DIE DATENTYPEN .......................................................................................................15 3.2.1 Arbeiten mit den verschiedenen Datentypen..................................................................................16 3.3 DER CACHÉ SQL-MANAGER .....................................................................................17 3.3.1 User anlegen und vergeben von Rechten .......................................................................................18 3.3.2 Anmelden und Namespace Wechseln ..............................................................................................20 3.3.3 Die erste Tabelle erstellen und verwalten.......................................................................................21 3.3.4 SQL-Anweisungen ausführen ............................................................................................................23 3.3.5 Views erstellen und bearbeiten.........................................................................................................24 3.3.6 Tabellen und Daten von externen Datenbanken importieren ......................................................25 3.3.7 Trigger in Caché..................................................................................................................................26 3.4 DAS TERMINAL ...........................................................................................................29 3.4.1 Die Eingabe über die Kommandozeile .............................................................................................30 3.4.2 Importieren von Dateien....................................................................................................................32 4 3.4.2.1 Die Methode Systems.SQL.Oracle()...........................................................................32 3.4.2.2 Die Methode DDLImport(). .........................................................................................34 DER KONFIGURATIONSMANAGER ................................................................36 4.1 ERWEITERTE SQL EINSTELLUNGEN ..........................................................................37 4.2 EIN SQL-GATEWAY EINRICHTEN .............................................................................38 S e ite 2 vo n 6 1 Projektarbeit André Knaupp 5 SIEGERLISTE MIT ADO ................................................................................39 6 DER CACHÉ WIZARD IN VISUAL BASIC ......................................................40 7 FAZIT .............................................................................................................42 8 ANHANG .........................................................................................................43 8.1 ÜBUNGSAUFGABEN .....................................................................................................43 8.2 AUSGABEN ..................................................................................................................46 8.3 MUSTERLÖSUNG .........................................................................................................51 8.4 IMPORTDATEI .............................................................................................................51 8.5 SIEGERLISTE - SOURCECODE.....................................................................................58 S e ite 3 vo n 6 1 Projektarbeit André Knaupp 1 EINLEITUNG Diese Projektarbeit soll eine Einführung in das Datenbankmanagmentsystem Caché sein. Ich werde darin verschiedene Tools und Oberflächen von Caché beschreiben. Dadurch soll der Umgang mit, und der Einstieg in Caché erleichtert werden. Caché ist eine objektorientierte Datenbank in der aber auch aus relationaler Sicht heraus mit Datenbanken gearbeitet werden kann. In dieser Projektarbeit befasse ich mich hauptsächlich mit dem relationalen Teil von Caché. Die Aufgabe der Projektarbeit war eine Anleitung für die SQL-Übungsaufgaben, aus der Vorlesung Datenbankmanagmentsysteme (DABS), mit Caché zu erstellen, die bestehende Importdatei und die Musterlösung anzupassen sowie die Ergebnisse bzw. die Bildschirmausgaben zu den Aufgaben zu dokumentieren. Desweiteren habe ich noch ein kurze Installationsanleitung für Caché erstellt und mich kurz mit Triggern in Caché befasst. Zum Abschluss habe ich die Aufgabe von Übungsblatt 4 (Siegerliste) in Visual Basic programmiert, der Datenbankzugriff erfolgt über ADO. 1.1 WAS IST CACHÉ Caché wurde von InterSystems Ende 1997 auf den Markt gebracht und hat seit seiner Einführung diverse Auszeichnungen, unter anderem das Online Database Derby 1997 und 1998 sowie den Informations- Management Award 1998, gewonnen. Laut Aussage von InterSystems ist Caché so konzipiert, dass es die komplexen Anforderungen der realen Welt optimal abbilden kann. Das kann man von relationalen Datenbanken nicht immer sagen kann. Deshalb wird es von InterSystems auch als postrelationales Datenbanksystem bezeichnet. Was bedeutet postrelational? Zunächst einmal ist die Bezeichnung postrelational eine Bezeichnung auf der Zeitachse. Also könnte man alle DBMS die nach den relationalen DBMS entwickelt wurden als postrelational bezeichen. So wird dieser Begriff auch häufig verwendet. Vossen [1994] verwendet den Begriff postrelational als eine Zusammenfassung für alle Datenbanken, die nicht mehr nur auf flachen Tabellen basieren, explizit nennt er verschachtelt-relationale, multidimensionale und objektorientierte DBMS als Beispiele. Alleine die zeitlich Betrachtung würde zu kurz greifen, viel mehr sollte man sich die veränderten Anforderungen vor Augen führen welche heute an ein modernes DBMS gestellt werden. S e ite 4 vo n 6 1 Projektarbeit André Knaupp So schreibt z.B. Vaskevitch [1992] in einem Bericht für das BYTE Magazine: Relational databases still make sense for many kinds of applications that lend themselves to expressions as simple sets of simple tables. However, to build applications that reflect the real world, you will have to find a way to take another two steps forward this time to a postrelational world. In diesem Sinne verstanden, hilft das postrelationale Modell von Caché die Beziehungen der realen Welt ohne unzulässige Vereinfachung abzubilden. Caché wird häufig im Gesundheitswesen eingesetzt so z.B. an der Berliner Charité oder in den Städtischen Kliniken Dortmund. Nach Angaben von InterSystems wird das derzeit größte Client/Server System der Welt mit über 30.000 Nutzern auf einer Caché-Umgebung im Gesundheitswesen ausgeführt. Es wird aber auch in der Logistik wie zum Beispiel beim Container- und Frachtumschlag im Hamburger Hafen eingesetzt. Als Client-Technologien unterstützt Caché u.a. Java, C++, ActivX, XML, Visual Basic und Delphi. Für den SQL Zugriff unterstützt Caché ADO, ODBC und JDBC. Für die Entwicklung von Web-Anwendungen stehen dem Entwickler verschiedene Skriptsprachen unter anderem Basic und Caché ObjektScript zur Verfügung. Caché basierende Anwendungen können ohne Änderung am bestehenden Code auf eine andere Plattform portiert werden. Außerdem können die Anwendungen auf den verschiedensten Plattformen wie zum Beispiel Unix, Linux, OpenVMS und Windows ausgeführt werden. Über die Homepage von InterSystems www.cache.de kann man Caché kostenlos downloaden oder als CD bestellen. Es handelt sich dabei um eine kostenlose Single-User Version die eine umfangreiche Dokumentation und einige Tutorials enthält. Darüber hinaus hat man die Möglichkeit den Support von InterSystems in Anspruch zu nehmen oder sich Informationen aus der Newsgroup von Intersystems zu holen. Allerdings ist die kostenlose Caché Version dahingehend eingeschränkt, dass kein Networking mit anderen Caché-Systemen möglich ist und keine externen Eingabegeräte angeschlossen werden können. S e ite 5 vo n 6 1 Projektarbeit André Knaupp 2 INSTALLATION Wie schon erwähnt kann man Caché auf den verschiedensten Plattformen nutzen. Ich befasse mich in diesem Kapitel mit der Installation von CD unter Windows. Caché arbeitet mit verschiedenen Herstellern von Software der Web- und Frontendprogrammierung zusammen. Möchten Sie Caché zusammen mit anderen Produkten, z.B. mit dem Dreamweaver von Macromedia oder Visual Basic verwenden, dann stellen Sie sicher, dass diese Software installiert ist bevor Sie Caché installieren. Caché erkennt dann die benötigten Verbindungen zu den Frontend – und Web-Tools und installiert die erforderlichen Add-Ins bei der Installation gleich mit. 2.1 SYSTEMVORAUSSETZUNGEN Um Caché erfolgreich unter Windows zu installieren sollte Ihr System folgende Voraussetzung erfüllen: • • • • • Windows 95, 98, 2000 (mit Service Pack 2), NT (mit Service Pack 4, 5 oder 6), XP 64 MB Hauptspeicher 110 MB freie Festplattenkapazität davon 100MB für die Software und 10 MB für die Installation. Einen konfigurierten TCP/IP Stack Bei Installation von CD, natürlich noch ein CD-Rom- Laufwerk 2.2 SOFTWAREINSTALLATION Haben Sie Caché von der Homepage von InsterSystems heruntergeladen starten Sie die installation durch ausführen der Datei CachePCkit.exe. Wenn Sie von CD installieren möchten gehen Sie wie folgt vor: Nach dem Einlegen der CD startet das Installationsprogramm alleine. Ist die Autostart-Funktion für ihr CD-Rom-Laufwerk ausgeschaltet starten Sie die autostart.exe in Ihrem CDRom-Verzeichnis selbst. Ein Browser startet, hier können Sie sich noch einige Informationen anzeigen lassen. Da die CD sowohl die Caché Versionen für Linx und Windows enthält führen Sie nun die setup.exe im Unterverzeichnis Windows auf der CD aus. S e ite 6 vo n 6 1 Projektarbeit André Knaupp Nach dem Sie die install.exe gestartet haben erscheint ein Fenster (Abb. 1), in dem Sie die Sprache auswählen können in der Sie Caché installieren möchten. Die Auswahl hat keinen Einfluss auf die Sprache der Dokumentation, sie ist immer in englisch. Klicken Sie auf <OK> wenn Sie die Auswahl beendet haben. Abb. 1 Danach erscheint das Lizensvertragsfenster (Abb. 2). Lesen Sie alles ;) sorgfältig, wenn Sie mit dem Vertrag einverstanden sind klicken Sie <Ja>. Abb. 2 S e ite 7 vo n 6 1 Projektarbeit André Knaupp Nun werden Sie gefragt in welchen Ordner Caché installiert werden soll (Abb. 3) Abb. 3 Wählen Sie einen Ordner aus oder geben Sie einen neuen Ordner an und bestätigen Sie mit <OK>. Wenn Sie einen Ordner angegeben haben der noch nicht existiert, werden Sie gefragt ob der neue Ordner angelegt werden soll (Abb. 4) Abb. 4 Bestätigen Sie wieder mit <OK> wenn die Auswahl richtig ist. S e ite 8 vo n 6 1 Projektarbeit André Knaupp Nun müssen Sie wählen welcher Character-Support installiert werden soll, Unicode oder 8-Bit (Abb. 5). Wählen Sie 8-Bit aus wenn Sie mit Daten arbeiten bei denen Buchstaben in 8-Bit gespeichert werden, wie z.B. in der deutschen Sprache. Wählen Sie Unicode aus wenn Sie mit einer Sprache arbeiten die ihre Buchstaben im Unicodeformat speichert z.B. japanisch. Abb. 5 Als nächstes zeigt Ihnen das Installationsprogramm die einzelnen Komponenten an die installiert werden (Abb. 6). Abb. 6 S e ite 9 vo n 6 1 Projektarbeit André Knaupp Sind alle Angaben richtig bestätigen Sie mit <Weiter>. Die Installation wird beendet. Nach Beendigung der Installation haben Sie die Möglichkeit sich die Getting-Started-Page anzusehen (Abb. 7). Diese Seite ist Teil der mitgelieferten Dokumentation und beinhaltet unter anderem Anmerkungen zur aktuellen Caché Version, eine kurze Einführung in Caché, eine Installationsanleitung und ein paar Informationen über unterstützte Betriebssysteme, Web-Server, Sprachen und der Kompatibilität zu älteren Caché Versionen. Abb. 7 Klicken Sie auf <Beenden> um die Installation zu beenden. Ein Neustart von Windows ist nicht notwendig. S e ite 10 von 6 1 Projektarbeit André Knaupp 2.3 JDBC / ODBC UND CACHÉ Der ODBC Treiber von InterSystems wird bei der Installation gleich mit installiert, so dass Sie gleich starten können. Um den Caché ODBC Treiber nach Ihren Wünschen zu konfigurieren, wählen Sie über <Systemsteuerung -> Verwaltung -> Datenquellen -> SystemDSN> den Caché ODBC Treiber aus. In Abb. 7.1 sehen Sie das Caché ODBC Data Source Setup wo Sie folgende Konfigurationen vornehmen können: • Name: Spezifiziert den Namen der DSN. • Description: Optional können Sie hier noch eine Beschreibung eingeben. • Host IP Address: Die IP Adresse des Caché Hosts. • Host Port Number: Die Portnummer des Hosts. Standard bei Caché ist Port 1972. • Caché Namespace: Spezifiziert den Namespace in dem Sie arbeiten möchten. • User Name: Der Username unter dem Sie sich verbinden möchten Standardmäßig ist <_System> eingestellt. • Password: Ihr Passwort. Standardmäßig für den User _System ist hier <sys> eingetragen. • ODBC Log: Ist die Checkbox aktiviert, wird ein Logfile erzeugt welches die ODBC Client Log´s aufzeichnet. Nutzen Sie dies nur zur Fehleranalyse da diese Option die Geschwindigkeit des Zugriffs über ODBC stark vermindert. • Static Cursors: Ist die Checkbox aktiviert, ermöglicht dies die Unterstützung von statischen Cursor in Caché. • Disable Query Timeout: T • Unicode SQL Types: Aktivieren Sie diese Option nur wenn Sie mit Multibyte Charactersets arbeiten möchten wie z.B. in chinesisch, hebräisch oder japanisch. Ist die Checkbox aktiviert ignoriert der ODBC reiber die Timeout-Settings der ODBC Query. S e ite 11 von 6 1 Projektarbeit André Knaupp Nachdem Sie die ODBC Datenquelle konfiguriert haben können Sie mit dem Button <Test Connection> die Verbindung testen und prüfen ob die Datenquelle richtig funktioniert. Abb. 7.1 Der JDBC Treiber, CacheDB.jar, befindet sich nach der Installation im Verzeichnis C:\CacheSys\Dev\java\lib\. Wie eine Verbindung von einem Java-Client, zu Caché aufgebaut wird zeigt folgendes Beispiel: String url="jdbc:Cache: String username="_SYSTEM"; String password="sys"; //localhost:1972/USER"; // oder Ihr eigener Username // oder Ihr eigenes Passwort dbconnection = CacheDatabase.getDatabase(url, username, password); S e ite 12 von 6 1 Projektarbeit André Knaupp 3 ARBEITEN MIT CACHÉ In Caché gibt es grundsätzlich zwei Möglichkeiten, mit SQL-Anweisungen und relationalen Datenbanken zu arbeiten. Ich werde beide, den SQL-Manager und das Caché Terminal beschreiben. Zumindest werde ich die Teile beschreiben, die man zum Lösen der SQL-Aufgaben aus der Vorlesung DABS benötigt, denn besonders das Terminal bietet eine große Auswahl an Funktionen und Methoden um mit Caché zu arbeiten. Zum Lösen der Aufgaben reicht eines der beiden Programme. Beide haben ihre Vor.- und Nachteile bzw. Eigenheiten, auf die ich in den entsprechenden Kapiteln hinweisen werde. In Kapitel 5 werde ich kurz auf Caché Studio eingehen, damit kann man dann in Visual Basic und dem intergrierte Cache-Wizard schnell eine kleine Anwendung erstellen. Zuerst jedoch zu den Grundlagen. 3.1 CACHE STOPPEN UND STARTEN Nach der Installation erscheint in der Taskleiste ein kleiner Würfel (Abb. 8), der Caché Cube. Abb. 8 Caché startet nach der Installation automatisch. Das Caché bereits läuft erkennt man am Caché Cube in der Taskleiste, ist der Cube wie in Abb. 8 dargestellt (dunkel) dann ist Caché bereits gestartet. Um Caché zu stoppen klicken Sie mit der Maus auf den Cube, es öffnet sich das Caché-Menu (Abb. 9), wählen Sie hier <Caché stoppen>. S e ite 13 von 6 1 Projektarbeit André Knaupp Abb. 9 Cache wird gestoppt (Abb. 10). Abb. 10 Der Cube in der Taskleiste ist nun hellgrau (Abb. 11). Abb. 11 Zum Starten klicken Sie einfach wieder auf den Cube in der Taskleiste und wählen Sie den Menupunkt <Caché starten>. Es erscheint der Startbildschirm von Caché (Abb. 12). Abb. 12 S e ite 14 von 6 1 Projektarbeit André Knaupp 3.2 DIE DATENTYPEN Hier einige der Datentypen die Cache im Umgang mit SQL-Anweisungen unterstützt. • • • • • • • • • BINARY MONEY, SMALLMONEY DATE DOUBLE, FLOAT, REAL BIT, INT, INTEGER, SMALLINT, TINYINT DEC, DECIMAL, NUMBER, NUMERIC CHAR, CHARACTER, VARCHAR, VARCHAR2 TIME DATETIME, TIMESTAMP Die interne Typendarstellung in Caché weicht bei einigen von den oben genannten Datentypen ab, da Caché die verschieden Datentypen umwandelt. So werden alle CHAR-Typen als Typ der Klasse %Library.String dargestellt. Aus Datetime wird %Library.TimeStamp und Number wird als %Library.Numeric. dargestellt. Die Details der internen Darstellung kann man sich im SQL-Manager anschauen. Bleibt noch zu erwähnen das Caché die Attribute NULL, NOT NULL, DEFAULT und PRIMARY KEY unterstützt. AUTO_INCREMENT kann man nur in Verbindung mit Caché Objects benutzen. Hinweis: Im Gegensatz zu MySQL unterstützt Caché auch Constraints. Man kann aber nicht in einer SQL-Anweisung eine Tabelle um eine Spalte erweitern und gleichzeitig der Spalte ein Constraint hinzufügen. Dazu benötigt man zwei Anweisungen. Beispiel: alter table Neu add (ID varchar2 (5)) alter table Neu add (constraint fk_neu foreign key (ID) references tabelle_x (ID_x)) S e ite 15 von 6 1 Projektarbeit André Knaupp 3.2.1 ARBEITEN MIT DEN VERSCHIEDENEN DATENTYPEN Hier möchte ich ein paar Beispiele für das Arbeiten mit verschiedenen Datentypen aufführen. Besonders der Datentyp Date und Timestamp können in unterschiedlicher Weise abgefragt und in Tabellen eingefügt werden. Unter anderem werden für den Date-Typ folgende Werte unterstützt: • • • • • insert into…(…, { d '1970-05-15' },…) insert into…(…, '01/14/2003',…) insert into…(…, TO_DATE('1976.05.23', 'YYYY.MM.DD'),…) insert into…(…, TO_DATE('05.06.76', 'DD.MM.YY'),…) insert into…(…, TO_DATE('Tuesday May 30, 2000', 'DAY MONTH DD, YYYY'),…) • insert into… (…, TO_DATE('30 May 2000'),…) • zusätzlich über das Terminal noch Integer, insert into…(…, 51266,…) die Zählung beginnt am 31.12.1840, gezählt werden die Tage. Die Formatelemente sind hierbei: • • • DD MM Mon • MONTH • • YY YYYY Wert zwischen 0-31 Wert zwischen 0-12 Der Name des Monats in abgekürzter Schreibweise, Jan, Feb.... Der Name des Monats in ungekürzter Schreibweise, January.... Die zwei letzten Ziffern des Jahres Alle Ziffern des Jahres Der TimeStamp-Typ unterstützt folgende Werte: • • • insert into…(..., {ts '2002-10-24 08:01:00'},...) insert into…(..., {ts '2002-10-24 08:01:'},...) insert into…(..., '1996-08-22 15:00:00',...) Bei Numeric Datentypen wird die Anzahl der Stellen vor und nach dem Komma durch zwei mit Komma getrennt Zahlen in Klammer definiert. Bsp. Create table…(..., nummer numeric(9,2),...) Für eine Zahl mit 9 Stellen vor dem Komma und 2 danach. Führende Nullen werden nicht dargestellt nachfolgende schon. Bei Integer und Numeric kann man sowohl mit als auch ohne Hochkommas arbeiten. Stringtypen, also alle Chartypen, werden in einfachen Hochkommas eingegeben. S e ite 16 von 6 1 Projektarbeit André Knaupp 3.3 DER CACHÉ SQL-MANAGER Der SQL-Manager bietet Ihnen die Möglichkeit über eine grafische Oberfläche mit Ihren Tabellen zu arbeiten. Er bietet eine relationale Ansicht der Datenbank. Im SQL-Manager können Sie folgende Aktionen durchführen: • • • • • • • Benutzer anlegen, verwalten Rechte zuweisen und verwalten SQL-Anweisungen durchführen Views anlegen und ändern Import und Export von Daten aus bzw. in ASCII-Dateien Tabellen und deren Daten anschauen Importieren von Tabellen und Daten aus anderen Datenbanksystemen Hinweis: Der SQL-Manager unterstützt aber nicht den Import von SQL-Skript-Dateien um Tabellen anzulegen oder Daten in Tabellen einzufügen. Starten Sie den SQL-Manager durch einen Klick auf den Caché Cube und die Auswahl des Menupunktes <SQL-Manager>. Wenn Sie den SQL Manager das erste Mal starten werden Sie automatisch als User: _Sytem angemeldet. Der User: _System wird bei der Installation von Caché automatisch angelegt und hat hier kein Password. Nach dem Starten erscheint folgendes Fenster (Abb. 13). In der linken Hälfte des Fensters sieht man oben den Server (hier Server) mit dem man verbunden ist und die Ordner für Rollen und die Benutzer die auf diesem Server eingerichtet sind. Darunter folgt der Namespace (hier USER) unter dem man angemeldet ist und die Ordner für die Tabellen und Views usw. Haben Sie noch keine Tabellen erstellt fehlen die Ordner unterhalb von <USER>. Abb. 13 S e ite 17 von 6 1 Projektarbeit André Knaupp 3.3.1 USER ANLEGEN UND VERGEBEN VON RECHTEN Um sich einen eigenen Benutzer anzulegen klicken Sie mit der rechten Maustaste auf den Ordner <Benutzer> in der linken Hälfte des Fensters. Es erscheint folgendes Fenster (Abb. 14). Abb. 14 Geben Sie hier alle relevanten Daten an (Name, Kennwort und Kennwort bestätigen) und klicken Sie dann auf <OK> um den Benutzer anzulegen. Nach dem ein neuer Benutzer angelegt ist, kann man diesem im SQL-Manager Rechte zuweisen. Doppelklicken Sie hierzu auf den Ordner des neu angelegten Users. Unter <Recht> können sie dem User verschiedene Rechte, z.B. Benutzer anzulegen, zu ändern oder zu löschen, zuweisen (Abb. 15). Um Userrechte zu verwalten müssen Sie als USER: _SYSTEM angemeldet sein oder Ihrem zuvor erstellten User die Rechte vergeben. S e ite 18 von 6 1 Projektarbeit André Knaupp Abb. 15 Unter Zugriff sehen Sie ob des entsprechende Recht gewährt ist oder nicht. Unter <Objekt> werden die gewährten Rechte des USERS für Tabellen dargestellt. Hier gibt es drei Möglichkeiten : 1. Nicht gewährt 2. Gewährt 3. Gewährt mit Gewähroption (erlaubt es dem User Rechte zu vergeben S e ite 19 von 6 1 Projektarbeit André Knaupp 3.3.2 ANMELDEN UND NAMESPACE WECHSELN Wenn Sie sich unter einem anderen Username anmelden möchten wählen Sie aus dem Menu <Datei> den Menupunkt <Change Namespace>. Es erscheint der Cache Connection Manager (Abb. 16). Abb. 16 Melden Sie sich hier mit Ihrem neuen Benutzernamen und Passwort an, damit ist sichergestellt, dass Tabellen die Sie anlegen auch Ihrem Benutzer zugeordnet werden und Sie die Rechte besitzen den Zugriff auf ihre Tabellen zu verwalten. Hier können Sie auch in einen anderen Namespace wechseln z.B. <SAMPLES> um sich die mitgelieferten Beispiele anzuschauen. Um mit den Samples zu arbeiten müssen Sie sich als User <_System> anmelden. S e ite 20 von 6 1 Projektarbeit André Knaupp 3.3.3 DIE ERSTE TABELLE ERSTELLEN UND VERWALTEN Wenn Sie die erste Tabelle erstellen möchten wählen Sie aus dem Menu <Objekt> auf den Menupunkt <Abfrage>, es erscheint folgendes Fenster (Abb. 17). SQL-Anweisung ausführen Abb. 17 Beachten Sie, dass der Caché SQL-Manager kein <;> als Endekennung einer Anweisung benötigt. Geben Sie nun die entsprechende SQL-Anweisung ein. Ausgeführt wird die Anweisung durch drücken des obersten Buttons auf der rechten Seite des Fensters. War die Ausführung erfolgreich erhalten Sie eine Fertigmeldung in der unteren Hälfte des Fensters. Fehlermeldungen werden in einem Popupfenster angezeigt (Abb. 17.1). Abb. 17.1 Nachdem Sie erfolgreich die erste Tabelle erzeugt haben können Sie im SQL-Manager durch einen Doppelklick auf den Ordner <Tabellen> die Details der Tabelle anschauen (Abb. 18). S e ite 21 von 6 1 Projektarbeit André Knaupp Abb. 18 Unter <Allgemein> können Sie sich die Einzelheiten der Tabelle anschauen (Datentypen, benötigte und eindeutige Felder .....). Wenn Sie nun die Spalten ihrer Tabelle sehen, werden Sie Spalten entdecken, die nicht mit der Create-Anweisung erzeugt worden sind. Diese Spalten (in diesem Fall ID und x_classname) werden von Caché automatisch erzeugt und intern von Caché verwendet und müssen nicht bei SQL-Anweisungen berücksichtigt werden Das Register Indizes zeigt z.B. den Primary Key. Die Register Trigger und Constraints zeigen, wie die Namen schon sagen, die zu der Tabelle gehörigen Trigger und Constraints an (das Thema Trigger wird später noch genauer erläutert). Unter gespeicherte Abfragen kann man sich bereits ausgeführte SQL-Anweisungen Anzeigen lassen. Nachdem Sie die erste Tabelle, wie oben beschrieben, erstellt haben können sie weitere Tabellen auch über das Register <Abfrage> erstellen (siehe nächstes Kapitel), genau so wie bereits bei Abb. 17 beschrieben. S e ite 22 von 6 1 Projektarbeit André Knaupp 3.3.4 SQL-ANWEISUNGEN AUSFÜHREN Wenn SQL-Anweisungen mit dem SQL-Manager ausführen möchten klicken Sie, wie unter 3.3.3 beschrieben, auf den Ordner Tabellen und geben Sie die SQL-Anweisung im Register <Abfrage ausführen> ein. Starten Sie die Anweisung durch klicken auf den oberen Button auf der rechten Seite des Fensters. Die entsprechenden Abfrageergebnisse werden in der unteren Hälfte des Fenster angezeigt (Abb. 19). Fehlermeldungen werden wie in Abb. 17.1 dargestellt. SQL-Anweisung ausführen Bereits ausgeführte Anweisung durchblättern Abb. 19 Um bereits gespeicherte Anweisungen nochmals durchzuführen benutzen Sie den nach oben / nach unten Pfeil auf der rechten Seite des Fensters. Wie lange ausgeführte Anweisungen gespeichert werden, können Sie im Konfigurationsmanager einstellen, voreingestellt sind 7 Tage. Sollten Sie mit Tabellen arbeiten die viele Daten enthalten, werden nicht alle Ergebnisse bei Abfragen und nicht alle Daten beim Öffnen einer Tabelle angezeigt. Um alle Daten anzuzeigen, wählen Sie aus dem Menu <Optionen> den Menupunkt <Voreinstellungen> und ändern die Werte für Abfragen und Tabelle öffnen entsprechend ab. S e ite 23 von 6 1 Projektarbeit André Knaupp 3.3.5 VIEWS ERSTELLEN UND BEARBEITEN Natürlich kann man in Caché Views auch mit SQL-Anweisungen erstellen, trotzdem möchte ich eine weitere Methode zeigen wie man im SQL-Manager Views erstellen und bearbeiten kann. Wählen Sie dazu den Ordner <Views> aus dem Verzeichnis SQLUser mit einem rechten Mausklick aus und wählen Sie den Menupunkt <neuer View>. Der View-Wizard wird gestartet (Abb. 19.1) Abb. 19.1 Geben Sie unter<Name> den Namen der View ein und unter <View Text> die View-Anweisungen ohne den <create view ...as...> Teil. Durch bestätigen mit <OK> wird die View erstellt. Der View Text kann jederzeit bearbeitet werden, indem man die View durch einen Doppelklick im Ordner View auswählt und den Button <Ansicht bearbeiten> wählt. Es öffnet sich, wie in Abb. 19.1, ein Fenster, in dem Sie den View Text genauso ändern können wie Sie ihn erstellt haben. Den Namen der View kann man nachträglich nicht mehr ändern. S e ite 24 von 6 1 Projektarbeit André Knaupp 3.3.6 TABELLEN UND DATEN VON EXTERNEN DATENBANKEN IMPORTIEREN Der SQL-Manager bietet die Möglichkeit Tabellen und Daten von externen Datenbanken zu importieren. Dazu muss man im Konfigurationsmanager zuerst ein SQL-Gateway einrichten (siehe Kapitel 4). Ist das Gateway eingerichtet müssen Sie sich als User _System einloggen, ein Password ist hier nicht notwendig. Wählen Sie <Datenmigration> im Menu <Datei>, der Datenmigrations-Wizard wird gestartet. Klicken Sie auf <Weiter> und wählen Sie im nächsten Fenster die Verbindung aus, die Sie vorher im Konfigurationmanager eingerichtet haben. Es erscheint das in Abb. 19.2 dargestellte Fenster. Abb. 19.2 Hier können Sie die, in der externen Datenbank, enthaltenen Tabellen auswählen. Um die Daten und Tabellen zu importieren bestätigen Sie die Auswahl im nächsten Fenster mit <Fertigstellen>. Die Tabellen sind nun im SQL-Manager sichtbar. Damit andere User auf die Daten zugreifen können, müssen natürlich noch die entsprechenden Rechte vergeben werden. S e ite 25 von 6 1 Projektarbeit André Knaupp 3.3.7 TRIGGER IN CACHÉ Für Trigger gibt es im SQL-Manager keinen Wizard. Um einen Trigger zu erstellen, geben Sie die SQL-Anweisung ein wie in wie in Kapitel 3.3.4 beschrieben,. Ein wesentlicher Unterschied zu den Triggern in Oracle ist, dass Trigger in Caché nur für ein Ereignis definiert werden können. Möchte man nun insert und update Ereignisse einer Tabelle überwachen benötigt man für jedes Ereignis einen eigenen Trigger. Die Syntax für das <CREATE TRIGGER...> Kommando ist in Caché wie folgt definiert: CREATE TRIGGER Name BEFORE/AFTER Event ORDER Integer ON Table REFERENCING Alias Action • Name: • Event: Gibt den Typ des Trigger-Events an. Mögliche Werte sind, INSERT, DELETE oder UPDATE. Bei UPDATE Triggern können Sie nach UPDATE noch das Schlüsselwort OF verwenden um Spalten anzugeben die der Trigger berücksichtigen soll. • Dieser Parameter ist optional. Wenn Sie mehrere Trigger Integer: definiert haben die auf der selben Tabelle zum selben Zeitpunkt und zum gleichen Ereignis arbeiten sollen gibt dieser Parameter die Reihenfolge an in der die Trigger ausgeführt werden sollen. Wird dieser Parameter nicht gesetzt werden die Trigger in der Reihenfolge ausgeführt in der sie erstellt worden sind. • Table: • Dieser Parameter ist Optional. Er ermöglicht es Ihnen eine Alias: Referenz auf die vorhandenen (old) Werte einer Tabelle bzw. auf die neuen (new) Werte, die eingefügt werden sollen, zu erhalten. • Action: Hier folgt der Programmcode des Triggers. Sie haben die Möglichkeit, am Anfang des Programmcodes anzugeben ob Sie SQL oder COS (Caché Object Skript) als Sprache für den Programmcode des Triggers verwenden möchten. Verwenden Sie dazu die Schlüsselwörter LANGUAGE SQL oder LANGUAGE COS. Wenn Sie die Definition der Sprache weglassen, wird standardmäßig SQL verwendet. Der Name des zu erstellenden Triggers. Gibt die Tabelle an für die der Trigger erzeugt wurde. Es folgt ein Beispiel zum Aufgabenblatt 5, Aufgabe 3 der Vorlesung DABS, bei der die Auslastung einer Arena korrigiert werden soll wenn eine neue Veranstaltung eingetragen, gelöscht bzw. ein Update auf die Tabelle Veranstaltung gemacht wird. S e ite 26 von 6 1 Projektarbeit André Knaupp CREATE TRIGGER auslastung AFTER INSERT ON Veranstaltung REFERENCING NEW as NewRow BEGIN UPDATE Arena set Arena.Auslastung = Arena.Auslastung + NewRow.Dauer where Arena.Auslastung > 0 and Arena.AID = NewRow.AID; UPDATE Arena set Arena.Auslastung = 0 + NewRow.Dauer where Arena.Auslastung IS NULL and Arena.AID = NewRow.AID; END Das kleine Beispiel zeigt die etwas veränderte Syntax im Vergleich zu den Triggern in Oracle. Hinweis: Man benötigt zusätzlich noch 2 weitere Trigger für das Löschen und für den Update der Daten. Caché wandelt die <Create Trigger...> Anweisung in Caché ObjectScript Code um. Ein Beispiel von Caché ObjectScript Code zu diesem Beispiel sieht wie folgt aus: New SQLCODE,%ROWID,%ROWCOUNT &sql(UPDATE Arena set Arena.Auslastung = Arena.Auslastung + :{Dauer*N} where Arena.Auslastung > 0 and Arena.AID = :{AID*N}) If SQLCODE<0 Set %ok=0 Quit &sql(UPDATE Arena set Arena.Auslastung = 0 + :{Dauer*N} where Arena.Auslastung IS NULL and Arena.AID = :{AID*N}) If SQLCODE<0 Set %ok=0 Quit Wenn Sie Trigger benutzen möchten, die nicht wie in dem oben genannten Beispiel einfach ein UPDATE auf einer Tabelle ausführen, wenn in eine andere Tabelle etwas eingefügt wird, sondern die, wie in Triggeraufgabe 1 gefordert, Tabellen abfragen um festzustellen ob eine Arena zu einer neuen Veranstaltung passt, müssen Sie den Trigger in Cache ObjectScript programmieren. S e ite 27 von 6 1 Projektarbeit André Knaupp Folgendes Beispiel zeigt den Trigger zu Aufgabe 1 Übungsblatt 5: CREATE TRIGGER arena_passt_zu_veranst before insert on Veranstaltung LANGUAGE COS { new aid,sid,count,SQLCODE set aid = {aid} //Zugriff auf die Veranstaltungs AID set sid = {sid} //Zugriff auf die Veranstaltungs SID set count = 0 &sql(select count(*) into :count from Arena_fuer_Sport where Arena_fuer_Sport.AID = :aid and Arena_fuer_Sport.SID = :sid) if (count = 0 ) { set %ok=0 //Fehlermeldung durch Messagebox set %msg="Arena ungeeignet fuer Sportart der Veranstaltung" } } Um auf die neu einzufügenden bzw. die bereits vorhandenen Werte einer Tabelle zuzugreifen haben Sie folgende Möglichkeiten: Bei Insert Triggern: {Spaltenname*O} (*O referenziert Old Values) Bei Update Triggern: {Spaltenname*O} {Spaltenname*N} (*N referenziert New Values) Bei Delete Triggern: {Spaltenname*O} S e ite 28 von 6 1 Projektarbeit André Knaupp 3.4 DAS TERMINAL Das Terminal bietet im Wesentlichen die Möglichkeiten des SQL-Managers nur ohne grafische Oberfläche. Es gibt aber auch Einschränkungen z.B. werden Revoke Kommandos vom Terminal nicht unterstützt. Sinnvollerweise aber Grant Kommandos ???. Ein Vorteil im Vergleich zum SQL-Manager ist, dass man Dateien importieren kann um Tabellen zu erstellen und um Daten in Tabellen einzufügen. Starten Sie das Terminal durch einen Klick auf den Caché Cube und die Auswahl des Menupunktes <Terminal>. Es erscheint das Fenster aus Abb. 20 Abb.20 Im Terminal haben Sie mehrere Möglichkeiten SQL-Anweisungen einzugeben bzw. Dateien zu importieren. Um den Namespace zu wechseln, um zum Beispiel die mitgelieferten Beispiele von Caché zu bearbeiten oder anzuschauen, geben Sie an der Eingabeaufforderung <ZN Namespacename> ein. In welchem Namespace Sie sich gerade befinden, wird Ihnen an der Eingabeaufforderung angezeigt (in Abb. 20 also der Namespace USER). Hinweis: Im Terminal können Sie im Menu <Edit> den Menupunkt <User Keys...> auswählen um Shortcuts für häufig von Ihnen verwendete Eingaben zu definieren. Die bietet sich besonders dann an, wenn Sie viel mit dem Terminal arbeiten, da die Eingaben über die Kommandozeile oft lang sind. S e ite 29 von 6 1 Projektarbeit André Knaupp 3.4.1 DIE EINGABE ÜBER DIE KOMMANDOZEILE Um mit SQL-Anweisungen über die Kommandozeile arbeiten zu können geben Sie an der Eingabeaufforderung <Do $System.SQL.Shell()> ein (siehe Abb. 21). Das Sie an der Shell angemeldet sind erkennen Sie an dem doppelten >> am Zeilenanfang. Abb. 21 Nun können Sie SQL-Anweisungen eingeben (ohne <;> als Endekennung). Bestätigen Sie mit der Returntaste und geben Sie <GO> ein um die Anweisung zu auszuführen (Abb. 21.1). Das Datum wird in der Shell standardmäßig als Integer dargestellt. Die Zählung beginnt am 31.12.1840 (in Tagen), 49805 entspricht also dem Datum 12.05.1977. Wie man die Datumsdarstellung ändert wird weiter unten erläutert. Abb. 21.1 Die Shell bietet folgende Möglichkeiten: • Eingabe einer SQL-Anweisung. Nach Bestätigen mit der Returntaste wird die SQL-Anweisung in einen SQL-Buffer geschrieben. Es erscheint wieder die Eingabeaufforderung, die Zahl vor der Eingabeaufforderung gibt die Anzahl der gespeicherten SQL-Anweisungen an. Mit *SHOW kann man sich die eingegebenen Anweisungen anzeigen lassen.*CLEAR löscht den SQL-Buffer. Wenn Sie GO eingeben werden die gespeicherten Anweisungen ausgeführt. • Geben Sie EXIT ein um die Shell wieder zu verlassen und den SQL-Buffer zu löschen. S e ite 30 von 6 1 Projektarbeit André Knaupp • Um die Datumsanzeige zu ändern, standardmäßig wird in Caché das Datum als Integer angegeben, geben Sie SELECTMODE ODBC ein um die Datumsdarstellung in die gewohnte Form (ODBC Mode) bringen. Geben Sie LOGICAL an wenn Sie lieber mit Integer arbeiten. SELECTMODE ohne weitere Angaben gibt den aktuellen Modus aus. • Mit SETUSER Username Password können Sie sich einloggen, wenn Sie Username und Password weglassen wird ihnen der aktuelle User angezeigt Fehlermeldungen werden Ihnen über die Shell angezeigt (Abb. 21.2) Abb. 21.2 S e ite 31 von 6 1 Projektarbeit André Knaupp 3.4.2 IMPORTIEREN VON DATEIEN Es gibt mehrere Möglichkeiten Dateien zu importieren. Ich werde zwei Methoden der Klasse $Sytems.SQL erläutern die den Import von Dateien ermöglichen. 3.4.2.1 Die Methode Systems.SQL.Oracle() Um DDL Scripts von der Kommandozeile aus zu laden gehen Sie bitte wie in Abb. 22 dargestellt vor und geben an der Eingabeaufforderung <Do $System.SQL.Oracle()> ein. Dieses Beispiel bezieht sich auf Oracle DDL Scripts, Caché unterstützt den Import weiterer DDL Scripts schauen Sie hierzu bitte im Manual unter %System.SQL für die Details nach. Abb. 22 Nachdem Sie mit Return bestätigt haben erscheint auf dem Bildschirm eine Information welche Kommandos unterstützt werden: • • • • • • • • • • • • • • CREATE TABLE CREATE VIEW CREATE USER CREATE ROLL ALTER TABLE CREATE [ UNIQUE ] INDEX DROP TABLE DROP INDEX DROP VIEW INSERT UPDATE DELETE SET OPTION GRANT { ALTER | SELECT | INSERT | UPDATE | DELETE | REFERENCES | ALL PRIVILEGES } Außerdem werden Sie darauf hingewiesen, dass keine Delimited Identifiers unterstützt werden. Wie Sie die Unterstützung für Delimited Identifiers einschalten können Sie im Kapitel Konfigurationsmanager nachlesen. Um fortzufahren drücken Sie <y> und bestätigen Sie mit <Return>. S e ite 32 von 6 1 Projektarbeit André Knaupp Im weiteren Verlauf werden Sie aufgefordert Ihren Benutzernamen und Ihr Passwort einzugeben. Danach werden Sie nach dem Pfad der Importdatei und dem Pfad der Datei gefragt in welcher eventuelle Fehlermeldungen gespeichert werden sollen. Als Parameter geben Sie bei der Importdatei <R> ein, bei der Fehlerdatei <WNS>. Leider habe ich in der Dokumentation nichts über diese Parameter gefunden. Nun werden Sie noch gefragt ob nicht unterstützte Anweisungen in ein Logfile geschrieben werden sollen und mit welchem Begrenzerzeichen (z.B. <;>) die SQL-Anweisungen abgeschlossen sind. Als letztes müssen Sie angeben wie viele Sekunden nach einem Fehler gewartet bevor das nächste Statement ausgeführt wird. Im Fehlerfall hat man dann die Möglichkeit das Einlesen weiterer Statements mit <Q> zu unterbinden. Wenn alle Angaben und die SQL-Anweisungen fehlerlos waren sollten Sie folgenden, bzw. einen ähnlichen, Bildschirm (Abb. 22.1) nach dem importieren einer Datei erhalten. Wichtig ist hier der Returnwert des SQLCODE, 0 bedeutet wie unschwer zu erkennen ist das die Ausführung erfolgreich war. Abb. 22.1 Eine weitere Methode um DDL-Scripts zu importieren können Sie im folgenden Kapitel nachlesen. S e ite 33 von 6 1 Projektarbeit André Knaupp 3.4.2.2 Die Methode DDLImport(). Die Methode DDLImport() ist wie die Methode Oracle() für den Import von DDL-Scripts zuständig. Sie benötigt einige Parameter beim Aufruf. Ein Aufruf mit allen Parametern sieht wie folgt aus: DDLImport(DDLMode, SQLUser, infile, outfile, nosup , nosupfile, deos, errpause) Die einzelnen Parameter: • DDLMode: Hersteller der die zu importierende Datei generiert hat, bzw. dessen Syntax benutzt wurde. Dieser Parameter wird benötigt. Unterstützt werden: FDBMS Informix Interbase MSSQLServer Oracle Sybase • SQLUser: Caché SQL Benutzername, unter welchem der Import durchgeführt werden soll. Dieser Parameter wird benötigt. • Infile: Der komplette Pfad und Namen der Datei die importiert werden soll. Dieser Parameter wird benötigt • Outfile: Der komplette Pfad und Namen der Datei in der Fehler gespeichert werden soll. Standardmäßig wird der gleiche Pfad und Name des Infiles verwendet, an die Endung des Infiles wird _Errors.log angehängt. Dieser Parameter ist optional. • Nosup: Ein Flag, es kann entweder den Wert True oder False annehmen. Ist es auf True gesetzt werden nicht unterstütze Anweisungen in die Datei Nosupfile geschrieben. Dieser Parameter ist optional. • Nosupfile: Wenn das Nosup Flag auf True gesetzt wird bestimmt der Parameter Nosupfile den Dateinamen der Datei in welche die Anweisungen gespeichert werden die nicht unterstützt werden. Standardmäßig wird der gleiche Pfad und Name des Infiles verwendet an die Endung des Infiles wird _Unsupported.log angehängt. Dieser Parameter ist optional. • Deos: Ist der Begrenzer des Endes der Anweisung. Standardmäßig wird der Begrenzer gewählt der entsprechend dem in DDLMode angegebenen Herstellers genommen. Dieser Parameter ist optional. S e ite 34 von 6 1 Projektarbeit • Errpause: André Knaupp Anzahl an Sekunden die nach einem Fehler gewartet werden soll, bevor die nächste Anweisung ausgeführt wird. Standardmäßig sind 5 Sekunden eingestellt. Dieser Parameter ist optional. Ein Beispiel für den Import eines Oracle-DDL-Scripts sehen Sie in Abb. 23. Abb. 23 Sie erhalten eine Fertigmeldung nachdem die Datei importiert wurde. Nach dem Import des DDL-Scripts zur Aufgabe 1 (Aufgabenblatt 3) sollte Ihnen das Terminal die in Abb. 24 dargestellte Meldung ausgeben. Abb. 24 S e ite 35 von 6 1 Projektarbeit André Knaupp 4 DER KONFIGURATIONSMANAGER Starten Sie den Konfigurationsmanager durch einen Klick auf den Caché Cube und die Auswahl des Menupunktes <Konfigurationsmanager>. Es erscheint das Fenster aus Abb. 25. Abb. 25 Im Konfigurationsmanager können Sie unterschiedliche Einstellungen vornehmen. Unter <Allgemein> kann man festlegen ob Caché automatisch beim Systemstart gestartet werden soll oder nicht. Im Weiteren werden einige Einstellungen erläutert, die unter <Erweitert> vorgenommen werden können. S e ite 36 von 6 1 Projektarbeit André Knaupp 4.1 ERWEITERTE SQL EINSTELLUNGEN Wählen Sie den Ordner SQL um verschiedene Einstellungen vorzunehmen (Abb. 26). Man kann hier zum Beispiel die Unterstützung von Delimited Identifiers einstellen, nach welcher Zeit SQL Anweisungen im SQL-Manager gelöscht werden sollen, ob das Löschen nicht vorhandener Tabellen mit drop... zu einem Fehler führen soll oder nicht usw. Abb. 26 S e ite 37 von 6 1 Projektarbeit André Knaupp 4.2 EIN SQL-GATEWAY EINRICHTEN Wählen Sie den Ordner SQL Gateway und dort <Hinzufügen> um ein neues SQL-Gateway einzurichten (Abb. 27). Abb. 27 Nun werden Sie aufgefordert einen Namen für die Verbindung einzugeben. Danach müssen Sie noch den Data Source Name, den Benutzernamen und das Passwort eingeben. Nachdem Sie alle Angaben gemacht haben klicken Sie auf <OK> um den Konfigurationsmanager zu beenden. Um die Änderungen ohne Neustart von Caché zu aktivieren wählen Sie im folgendem Dialog (Abb. 28) <Aktivieren>. Abb. 28 S e ite 38 von 6 1 Projektarbeit André Knaupp 5 SIEGERLISTE MIT ADO Für das Programm habe ich nicht den, von Caché, installierten Wizard verwendet. Wenn man den Caché Wizard in Visual Basic verwenden möchte, sollte man Caché Studio, wie in Kapitel 6 erwähnt, verwenden. Caché Studio ist ein Tool, um objektorientiert mit Datenbanken zu arbeiten. Man kann dort z.B. SQL-Anweisungen als Methoden definieren, die dann später in Visual Basic zur Verfügung stehen. Nun zu dem von mir erstellten Programm, zur Ausgabe einer Siegerliste. Es werden die ersten drei Sieger ausgegeben. Das Programm liest zuerst alle Veranstaltungen aus bei denen es ein Finale gibt und die bereits stattgefunden hat (es sind Einnahmen vorhanden). Wenn eine Veranstaltung gewählt wurde, wird überprüft, in welcher Einheit (s oder m) die Ergebnisse gemessen werden. Handelt es sich um Sportarten die nach Sekunden gemessen wird, werden die ersten drei Sportler, der nach dem Ergebnis sortierten Liste, ausgegeben. Werden die Ergebnisse in Metern gemessen, wird die Liste absteigend sortiert, danach die ersten drei Sportler ausgegeben. Den Sourcecode finden Sie im Anhang. S e ite 39 von 6 1 Projektarbeit André Knaupp 6 DER CACHÉ WIZARD IN VISUAL BASIC Wenn Sie mit dem Caché Wizard in Visual Basic arbeiten möchten, empfiehlt es sich, Caché Studio zu verwenden. In Visual Basic kann man später die SQL-Abfragen, die man vorher in Cache Studio als Methoden definiert hat, nutzen. Ich werde hier beschreiben wie man mit Visual Basic eine Oberfläche erstellt mit der man die Tabelle Sportler verwalten kann. Starten Sie Caché Studio durch Auswahl des Menupunktes <Studio> im Caché Cube Menu. Das Studio wird gestartet (Abb.29). Projektfenster Abb. 29 Wenn Sie die Tabelle Sportler im SQL-Manager erstellt haben gehen Sie bitte wie folgt vor: • Wählen Sie mit dem einem rechten Mausklick im Projektfenster den Ordner <Klassen> aus. • Wählen Sie <Hinzufügen>. In dem Auswahlfenster wählen Sie den Namespace USER und dort die Tabelle Sportler aus. Bestätigen Sie mit <Hinzufügen>. • Sie können nun im Ordner <Klassen> die Klasse Sportler sehen. • Klicken Sie auf Sportler, wählen Sie im Menu <Klasse> den Menupunkt <Hinzufügen> und dort <Neue Abfrage>. Der Wizard wird gestartet. S e ite 40 von 6 1 Projektarbeit André Knaupp • Geben Sie nun den Namen (für das Beispiel: Suche) der Anweisung an. Klicken Sie <Weiter>. Im nächsten Fenster machen Sie keine Angaben. • Nun werden Sie aufgefordert Spalten auszuwählen. Wählen Sie alle Spalten aus, auch die interne ID von Caché. Bestätigen Sie mit <Fertig stellen>. Die SQL-Anweisung wird erstellt. • Wählen Sie nun aus dem Menu <Erstellen> den Menupunkt <Kompilieren>. • Starten Sie nun Visual Basic. Wählen Sie im Menu <Add-Ins> den Caché Form Wizard. Der Wizard begrüßt Sie. • Sie müssen sich im nächsten Fenster an Caché anmelden. Nach erfolgreicher Anmeldung wählen Sie im nächsten Fenster die Klasse Sportler aus und bestätigen Sie mit <Weiter>. • Nun übernehmen Sie alle Eigenschaften in das Formular. (Für das Beispiel wählen Sie die Reihenfolge: PID, PName, GebDat, Geschlecht und Nation). Bestätigen Sie mit <Fertig> um die Anwendung fertig zu stellen. Wenn Sie das Programm starten müssen Sie sich zunächst wieder an Caché anmelden. Nach der Anmeldung erscheint das in Abb. 30 dargestellt Fenster. Abb. 30 Alle Button´s, auch das Menu, sind voll funktionsfähig. Sie können neue Sportler eintragen und Sportler suchen um die Daten zu ändern oder zu löschen. Wenn Sie <Suche...> wählen öffnet sich ein neues Fenster. Dort können Sie unter Query Name, die vorher erstellte Abfrage, <Suche> auswählen. Mit dem Button <Query> führen Sie die Abfrage aus. Es müssten alle Sportler angezeigt werden. Durch die Auswahl eines Sportlers kehren Sie wieder zum ersten Fenster zurück um die Sportlerdaten zu bearbeiten. S e ite 41 von 6 1 Projektarbeit André Knaupp 7 FAZIT Das ist nun das Ende der Projektarbeit und wenn man die vorangegangen Seiten gelesen hat könnte man meinen, dass das eigentlich nicht so schwierig gewesen sein kann. Ich kann Ihnen aber versichern, dass das Einarbeiten in Caché nicht so einfach war wie es vielleicht den Anschein hat. Das lag zum einen daran, dass es derzeit keine verfügbare Literatur, zum Thema Caché der aktuellen Version, gibt. Genauer gesagt gibt es überhaupt nur ein Buch dessen Auflage derzeit vergriffen und die neue Auflage noch nicht erschienen ist. (Hinweis: Inzwischen gibt es die Neuauflage des Buches, siehe Literatur.) Zum anderen lag es daran, dass die meisten Entwickler objektorientiert mit Caché arbeiten und natürlich auch die Dokumentation zu Caché auch mehr für objektorientierte Anwendungsentwicklung geschrieben ist. Am meisten hat mir die Unterstützung durch die Newsgroup von InterSystems geholfen. Dort habe ich schnelle und kompetente Hilfe bekommen. Manch einer schien mir aber ziemlich verwundert, dass ich mit Caché nur für rein relationale Datenbanken nutzte. Nach der Einarbeitung bleibt zu sagen, dass Caché mit dem SQL-Manager ein gutes Tool mit grafischer Oberfläche zum Arbeiten mit relationalen Datenbanken bietet. Hier habe ich nur vermisst, dass man keine SQL-Scripte importieren kann. Aus diesem Grund ist das Terminal unerlässlich; die beiden in Kapitel 3.4.2 beschriebenen Methoden ermöglichen das Importieren von Dateien. S e ite 42 von 6 1 Projektarbeit André Knaupp 8 ANHANG 8.1 ÜBUNGSAUFGABEN 8.1.1 AUFGABENBLATT 2: ERSTELLE RELATIONALES DB-SCHEMA AUS ER-DIAGRAMM 8.1.2 AUFGABENBLATT 3: DIVERSE SQL-BEFEHLE Schreiben Sie interaktive SQL-Anweisungen für folgende Aufgaben: Die Ausgaben zu den verschiedenen Aufgaben für die Beispieldatenbank finden Sie in der Datei Ausgaben.pdf auf der CD. 1. Löschen Sie Ihre Tabellen. Kopieren Sie stattdessen meine Tabellen, indem Sie das SQL-Script import_cache.sql von CD ausführen. Benutzen Sie dazu die Methoden aus Kapitel 3.4.2 (Importieren von Dateien). Es gibt folgende Tabellen: Sportler, Sportart, Sportler_macht_Sport, Arena, Arena_fuer_Sport, Veranstaltung, Sportler_nimmtteil_Veranst. 2. Wegen feuerpolizeilichen Auflagen müssen die Plätze in allen Arenen um 7% reduziert werden. Führen Sie diese Änderung mit einem SQL-Kommando durch. 3. Wegen politischen Schwierigkeiten darf das Land Nari nicht an den Olympischen Spielen teilnehmen. Löschen Sie alle Sportler und Sportlerinnen dieses Landes. Achten Sie auf abhängige Datensätze in Verbindungstabellen. Zum Löschen der abhängigen Datensätze brauchen Sie Unterabfragen. 4. Ausgabe aller Daten aller Sportler und Sportlerinnen. 5. Name und Geburtsdatum aller Sportler und Sportlerinnen. 6. Name und Geschlecht aller Sportler und Sportlerinnen aus Deutschland sollen angezeigt werden. 7. Alle Namen von Sportlerinnen aus Deutschland sollen angezeigt werden. 8. Alle Veranstaltungen (Nr. und Bezeichnung) sollen angezeigt werden, die in der Arena, die "Am Rosenweg" liegt, stattfinden. Verwenden Sie einen JOIN, keine Unterabfragen. S e ite 43 von 6 1 Projektarbeit André Knaupp 9. Ausgabe aller verschiedenen (Hinweis: DISTINCT) Sportarten, die von Sportlern und Sportlerinnen mit der Nationalität Jamaica ausgeübt werden. Verwenden Sie einen JOIN, keine Unterabfragen. 10. Wieviele Sitzplätze hat die Arena in der die Veranstaltung "Finale 100 m Lauf Damen" stattfindet? Verwenden Sie einen JOIN, keine Unterabfragen. 11. Ausgabe aller Daten aller Sportler und Sportlerinnen (Hinweis: DISTINCT), die an einer Veranstaltung in der Arena, die "Am Rosenweg" liegt, teilnehmen. Verwenden Sie einen JOIN, keine Unterabfragen. 12. Ausgabe aller Arenen (Name, Plätze) mit den dazugehörigen Veranstaltungen (Bezeichnung), geordnet nach Beginn und Dauer (absteigend). 13. Für jede Arena soll die Zahl der Veranstaltungen die in ihr stattfinden, die Summe der Einnahmen, die durchschnittlichen, die minimalen und die maximalen Einnahmen ermittelt werden. 14. Wiederholen Sie Aufgabe 14 aber zeigen Sie nur Arenen an, in denen mindestens fünf Veranstaltungen stattfinden. (Hinweis: HAVING) 15. Nutzen Sie reguläre Ausdrücke und den Operator LIKE, um alle Sportarten zu finden, die mit einem 100 m Lauf zu tun haben, z. B. der "100 m Lauf Herren" oder der "100 m Lauf Damen ". 16. Unterabfragen: Suchen Sie nach den Namen aller Sportler und Sportlerinnen, die aus dem gleichen Land kommen wie Frau Mbenko Buri. 17. Geben Sie alle Arenen aus, die mehr Plätze bieten als der Durchschnitt der Arenen. 18. Die korrekte Verteilung der Veranstaltungen auf Arenen soll überprüft werden. Geben Sie alle Veranstaltungen aus, die in einer Arena stattfinden, die für die Sportart der Veranstaltung nicht geeignet ist. 19. Geben Sie lesendes Zugriffsrecht für Ihre Tabelle Sportler an alle anderen Caché-Benutzer. Testen Sie! Ziehen Sie es wieder zurück. Testen Sie! (Hinweis: GRANT und REVOKE) Legen Sie hierzu einen oder mehrere User im SQL-Manager an (Kap. 3.3.1). Melden Sie sich dann unter anderem Usernamen, zum Testen, an und überprüfen Sie die Zugriffsrechte. 20. Legen Sie eine Tabelle Sportlerin_tab und einen View Sportlerin_view, in denen nur Sportlerinnen enthalten sind, aufgrund der bestehenden Tabelle Sportler an. (Hinweis: in Caché kann man keine Tabelle mit create table ...as select... erstellen) Tragen Sie eine neue Sportlerin in die Tabelle Sportler ein. Prüfen Sie, ob die neuen Daten in Sportlerin_tab und Sportlerin_view S e ite 44 von 6 1 Projektarbeit André Knaupp übernommen wurden. Löschen Sie die Tabelle Sportlerin_tab und aus der Tabelle Sportler die neu eingefügte Sportlerin. 21. Geben Sie die Namen aller Sportlerinnen aus, die Leichtathletik betreiben. Nutzen Sie dazu den View Sportlerin-view (Hinweis distinct). 22. Wie speichern Sie Mannschaften mit mehreren Sportlern? 23. Gegeben ist die Relation: Veranstaltung a "ist Folgeveranstaltung von" Veranstaltung b ⊂ Veranstaltung × Veranstaltung. Dabei hat jede Veranstaltung maximal eine Folgeveranstaltung. Beispiel: Der 100 m Zwischenlauf 1 ist Folgeveranstaltung der 100 m Vorläufe 1, 2 und 3 Zeichnen Sie diese Relation in das ER-Modell ein. Realisieren Sie die Relation in der Datenbank. 24. Geben die Bezeichnung aller Veranstaltungen zusammen mit der Bezeichnung einer evtl. vorhandenen Folgeveranstaltung aus. (Hinweis: left join) S e ite 45 von 6 1 Projektarbeit André Knaupp 8.2 AUSGABEN Aufgabe 2: (nur zur Überprüfung mit: select * from Arena) AID 1 2 3 4 Aname Olympiastadion Schwimmhalle Leichtathletikstadion Sprinthalle Aufgabe 4: SID SName 1 Mueller 2 Meier 3 Mbenko Buri 4 Mendouse 5 Ruder 8 Hulb 9 Kropp 10 Ballet 11 Lebeque 12 Jao Dong 13 Jones 14 Miles 15 Davis Aufgabe 5: PName Mueller Meier Mbenko Buri Mendouse Ruder Hulb Kropp Ballet Lebeque Jao Dong Jones Miles Davis Ort Am Olympiapark Horst Buchmann Weg Am Rosenweg Horst Buchmann Weg GebDat 05/12/1977 05/11/1977 05/10/1977 05/22/1977 05/12/1979 05/11/1977 05/11/1977 05/11/1977 05/11/1977 06/12/1978 06/05/1976 11/10/1977 08/07/1977 Nation Deutschland Deutschland Luxembourg Luxembourg Luxembourg Deutschland Deutschland England Frankreich China Jamaica Jamaica Jamaica Plaetze 65100 2790 27900 9300 Geschlecht w m w m w w w w w m w m w GebDat 05/12/1977 05/11/1977 05/10/1977 05/22/1977 05/12/1979 05/11/1977 05/11/1977 05/11/1977 05/11/1977 06/12/1978 06/05/1976 11/10/1977 08/07/1977 S e ite 46 von 6 1 Projektarbeit Aufgabe 6: Pname Mueller Meier Hulb Kropp André Knaupp Geschlecht w m w w Aufgabe 7: Pname Mueller Hulb Kropp Aufgabe 8: Bezeichnung Finale Speerwurf Herren Finale Weitsprung Herren Finale Speerwurf Damen Finale Weitsprung Damen VID 13 14 15 16 Aufgabe 9: SName 100 m Lauf Herren 200 m Lauf Damen Aufgabe 10: Plaetze 9300 Aufgabe 11: SID PName 2 Meier 4 Mendouse 12 Jao Dong 1 Mueller 3 Mbenko Buri 5 Ruder 8 Hulb 9 Kropp 10 Ballet 11 Lebeque GebDat 05/11/1977 05/22/1977 06/12/1978 05/12/1977 05/10/1977 05/12/1979 05/11/1977 05/11/1977 05/11/1977 05/11/1977 Nation Deutschland Luxembourg China Deutschland Luxembourg Luxembourg Deutschland Deutschland England Frankreich Geschlecht m m m w w w w w w w S e ite 47 von 6 1 Projektarbeit André Knaupp Aufgabe 12: Aname Sprinthalle Sprinthalle Sprinthalle Sprinthalle Sprinthalle Sprinthalle Olympiastadion Olympiastadion Olympiastadion Olympiastadion Olympiastadion Olympiastadion Olympiastadion Olympiastadion Leichtathletikstadion Leichtathletikstadion Leichtathletikstadion Leichtathletikstadion Schwimmhalle Schwimmhalle Plaetze 9300 9300 9300 9300 9300 9300 65100 65100 65100 65100 65100 65100 65100 65100 27900 27900 27900 27900 2790 2790 Bezeichnung Vorlauf 1 100 m Lauf Herren Vorlauf 2 100 m Lauf Herren Halbfinale 100 m Lauf Herren Halbfinale 100 m Lauf Damen Finale 100 m Lauf Herren Finale 100 m Lauf Damen Halbfinale 200 m Lauf Herren Halbfinale 400 m Lauf Herren Finale 200 m Lauf Herren Finale 400 m Lauf Herren Halbfinale 200 m Lauf Damen Halbfinale 400 m Lauf Damen Finale 200 m Lauf Damen Finale 400 m Lauf Damen Finale Speerwurf Herren Finale Weitsprung Herren Finale Speerwurf Damen Finale Weitsprung Damen Finale 100 m Delphin Herren Finale 100 m Delphin Damen Aufgabe 13: Für die Spalten 2-6 wird im SQL-Manager die Aggregate_6 verwendet. (Ein = Einnahme) Aname COUNT(VID) SUM(EIN) Olympiastadion 8 162000.8 Schwimmhalle 4 33000.2 Leichtathletikstadion 4 39000.2 Sprinthalle 4 33000.2 Aufgabe 14: Aname Olympiastadion Spaltenüberschrift Aggregat_2 bis COUNT(VID) SUM(EIN) 8 162000.8 Aufgabe 15: SID SName 1 100 m Lauf Herren 7 100 m Lauf Damen Sportklasse Leichtathletik Leichtathletik AVG(EIN) 20250.1 16500.1 19500.1 16500.1 MIN(EIN) 10000.1 15000.1 18000.1 15000.1 MAX(EIN) 25000.1 18000.1 21000.1 18000.1 AVG(EIN) 20250.1 MIN(EIN) 10000.1 MAX(EIN) 25000.1 einzel_Mann E E Weltrekord 9,8 s 10,8 s Aufgabe 16: PName Mbenko Buri Mendouse Ruder S e ite 48 von 6 1 Projektarbeit André Knaupp Aufgabe 17: AID AName 1 Olympiastadion 3 Leichtathletikstadion Ort Am Olympiapark Am Rosenweg Plaetze 65100 27900 Aufgabe 18: VID Bezeichnung 1 Halbfinale 100 m Lauf Herren 3 Finale 100 m Lauf Herren AName Schwimmhalle Schwimmhalle Aufgabe 20: Ausgabe Sportlerin_Tab: PID PName 1 Mueller 3 Mbenko Buri 5 Ruder 8 Hulb 9 Kropp 10 Ballet 11 Lebeque 13 Jones 15 Davis GebDat 05/12/1977 05/10/1977 05/12/1979 05/11/1977 05/11/1977 05/11/1977 05/11/1977 06/05/1976 08/07/1977 Nation Deutschland Luxembourg Luxembourg Deutschland Deutschland England Frankreich Jamaica Jamaica Ausgabe Sportlerin_View: PID PName 1 Mueller 3 Mbenko Buri 5 Ruder 8 Hulb 9 Kropp 10 Ballet 11 Lebeque 13 Jones 15 Davis 18 Lydia (neue Sportlerin aus Tabelle Sportler ist sichtbar!) GebDat Nation Geschlecht 05/12/1977 Deutschland w 05/10/1977 Luxembourg w 05/12/1979 Luxembourg w 05/11/1977 Deutschland w 05/11/1977 Deutschland w 05/11/1977 England w 05/11/1977 Frankreich w 06/05/1976 Jamaica w 08/07/1977 Jamaica w 04/10/1977 Russland w Geschlecht w w w w w w w w w Aufgabe 21: PName Jones Mueller Mbenko Buri Ruder Hulb Kropp Ballet Lebeque Davis S e ite 49 von 6 1 Projektarbeit Aufgabe 24: VID Veranst 1 Halbfinale 100 m Lauf Herren 2 Halbfinale 100 m Lauf Damen 3 Finale 100 m Lauf Herren 4 Finale 100 m Lauf Damen 5 Halbfinale 200 m Lauf Herren 6 Halbfinale 400 m Lauf Herren 7 Finale 200 m Lauf Herren 8 Finale 400 m Lauf Herren 9 Halbfinale 200 m Lauf Damen 10 Halbfinale 400 m Lauf Damen 11 Finale 200 m Lauf Damen 12 Finale 400 m Lauf Damen 13 Finale Speerwurf Herren 14 Finale Weitsprung Herren 15 Finale Speerwurf Damen 16 Finale Weitsprung Damen 17 Finale 100 m Delphin Herren 18 Finale 100 m Delphin Damen 19 Vorlauf 1 100 m Lauf Herren 20 Vorlauf 2 100 m Lauf Herren André Knaupp Folgeveranst Finale 100 m Lauf Herren Finale 100 m Lauf Damen Finale 200 m Lauf Herren Finale 400 m Lauf Herren Finale 200 m Lauf Damen Finale 400 m Lauf Damen Halbfinale 100 m Lauf Herren Halbfinale 100 m Lauf Herren S e ite 50 von 6 1 Projektarbeit André Knaupp 8.3 MUSTERLÖSUNG FEHLT IN DIESER AUSGABE 8.4 IMPORTDATEI Die Importdatei habe ich etwas erweitert um bei dem Siegerlistenprogramm eine größere Auswahl an Sportarten zu haben bei denen bereits ein Finale stattgefunden hat und es mehr Teilnehmer pro Veranstaltung gibt. Die Idee meiner Frau, mit richtigen Olympiadaten zu arbeiten, habe ich aus zeitlichen Gründen verworfen ;) create table Sportler (PID varchar2 PName varchar2 GebDat date, Nation varchar2 Geschlecht varchar2 create table Sportart (SID SName Sportklasse einzel_Mannsch Weltrekord (5) (30) primary key, not null, (20), (1)); varchar2 varchar2 varchar2 varchar2 varchar2 (5) primary key, (20) not null, (20), (1), (20)); create table Arena (AID varchar2 (5) primary key, AName varchar2 (25), Ort varchar2 (50), Plaetze integer); create table Veranstaltung (VID varchar2 (5) primary key, Beginn datetime, Dauer integer, Bezeichnung varchar2 (40), Einnahme number (9,2), AID varchar2 (5) constraint findet_statt_in references Arena (AID), SID varchar2 (5) constraint fuer_Sportart references Sportart (SID)); create table Arena_fuer_Sport (SID varchar2 (5) constraint fk_Sport references Sportart (SID), AID varchar2 (5) constraint fk_Arena references Arena (AID)); create table Sportler_macht_Sport (PID varchar2 (5) constraint SID varchar2 (5) constraint create table Sportler_nimmtteil_Veranst (PID varchar2 (5) constraint VID varchar2 (5) constraint Ergebnis varchar2 (20)); fk_SportlerSport references Sportler (PID), fk_Sportart references Sportart (SID)); fk_Sportler references Sportler (PID), fk_Veranst references Veranstaltung (VID), S e ite 51 von 6 1 Projektarbeit André Knaupp insert into Sportler values ('1', 'Mueller', TO_DATE('12.05.77', 'DD.MM.YY'), 'Deutschland', 'w'); insert into Sportler values ('2', 'Meier', TO_DATE('11.05.77', 'DD.MM.YY'), 'Deutschland', 'm'); insert into Sportler values ('3', 'Mbenko Buri', TO_Date('10.05.77', 'DD.MM.YY'), 'Luxembourg', 'w'); insert into Sportler values ('4', 'Mendouse', TO_DATE('22.05.77', 'DD.MM.YY'), 'Luxembourg', 'm'); insert into Sportler values ('5', 'Ruder', TO_DATE('12.05.79', 'DD.MM.YY'),'Luxembourg', 'w'); insert into Sportler values ('6', 'Omar', TO_DATE('12.05.81', 'DD.MM.YY'), 'Nari', 'w'); insert into Sportler values ('7', 'Abdulla', TO_DATE('12.05.77', 'DD.MM.YY'), 'Nari', 'm'); insert into Sportler values ('8', 'Hulb', TO_DATE('11.05.77', 'DD.MM.YY'), 'Deutschland', 'w'); insert into Sportler values ('9', 'Kropp', TO_DATE('11.05.77', 'DD.MM.YY'), 'Deutschland', 'w'); insert into Sportler values ('10', 'Ballet', TO_DATE('11.05.77', 'DD.MM.YY'), 'England', 'w'); insert into Sportler values ('11', 'Lebeque', TO_DATE('11.05.77', 'DD.MM.YY'), 'Frankreich', 'w'); insert into Sportler values ('12', 'Jao Dong', TO_DATE('12.06.78', 'DD.MM.YY'), 'China', 'm'); insert into Sportler values ('13', 'Jones', TO_DATE('05.06.76', 'DD.MM.YY'), 'Jamaica', 'w'); insert into Sportler values ('14', 'Miles', TO_DATE('10.11.77', 'DD.MM.YY'), 'Jamaica', 'm'); insert into Sportler values ('15', 'Davis', TO_DATE('07.08.77', 'DD.MM.YY'), 'Jamaica', 'w'); insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into Sportart values ('1', '100 m Lauf Herren', 'Leichtathletik', 'E', '9,8 s'); Sportart values ('2', '200 m Lauf Herren', 'Leichtathletik', 'E', '19,8 s'); Sportart values ('3', '400 m Lauf Herren', 'Leichtathletik', 'E', '41,8 s'); Sportart values ('4', '100 m Delphin Herren', 'Schwimmen', 'E', '30,8 s'); Sportart values ('5', 'Speerwurf Herren', 'Leichtathletik', 'E', '87,85 m'); Sportart values ('6', 'Weitsprung Herren', 'Leichtathletik', 'E','7,56 m'); Sportart values ('7', '100 m Lauf Damen', 'Leichtathletik', 'E', '10,8 s'); Sportart values ('8', '200 m Lauf Damen', 'Leichtathletik', 'E', '21,8 s'); Sportart values ('9', '400 m Lauf Damen', 'Leichtathletik', 'E', '44,8 s'); Sportart values ('10', '100 m Delphin Damen', 'Schwimmen', 'E', '32,8 s'); Sportart values ('11', 'Speerwurf Damen', 'Leichtathletik', 'E', '79,85 m'); sportart values ('12', 'Weitsprung Damen', 'Leichtathletik', 'E','6,87 m'); sportart values ('13', 'Volleyball', 'Ballsport', 'M','Kuba'); insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport values values values values values values values values values values values values ('2', ('2', ('2', ('2', ('2', ('2', ('4', ('4', ('4', ('4', ('4', ('4', '1'); '2'); '3'); '4'); '5'); '6'); '1'); '2'); '3'); '4'); '5'); '6'); S e ite 52 von 6 1 Projektarbeit insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport André Knaupp values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values values ('7', '1'); ('7', '2'); ('7', '3'); ('7', '4'); ('7', '5'); ('7', '6'); ('12', '1'); ('12', '2'); ('12', '3'); ('12', '4'); ('12', '5'); ('12', '6'); ('13', '1'); ('1', '7'); ('1', '8'); ('1', '9'); ('1', '10'); ('1', '11'); ('1', '12'); ('3', '7'); ('3', '8'); ('3', '9'); ('3', '10'); ('3', '11'); ('3', '12'); ('5', '7'); ('5', '8'); ('5', '9'); ('5', '10'); ('5', '11'); ('5', '12'); ('6', '7'); ('6', '8'); ('6', '9'); ('6', '10'); ('6', '11'); ('6', '12'); ('8', '7'); ('8', '8'); ('8', '9'); ('8', '10'); ('8', '11'); ('8', '12'); ('9', '7'); ('9', '8'); ('9', '9'); ('9', '10'); ('9', '11'); ('9', '12'); ('10', '7'); ('10', '8'); ('10', '9'); ('10', '10'); ('10', '11'); ('10', '12'); ('11', '7'); ('11', '8'); S e ite 53 von 6 1 Projektarbeit André Knaupp insert insert insert insert insert insert into into into into into into Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport Sportler_macht_Sport insert insert insert insert into into into into Arena Arena Arena Arena insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport Arena_fuer_Sport values values values values ('1', ('2', ('3', ('4', values values values values values values ('11', ('11', ('11', ('11', ('14', ('15', '9'); '10'); '11'); '12'); '8'); '8'); 'Olympiastadion', 'Am Olympiapark', 70000); 'Schwimmhalle', 'Horst Buchmann Weg', 3000); 'Leichtathletikstadion', 'Am Rosenweg', 30000); 'Sprinthalle', 'Horst Buchmann Weg', 10000); values values values values values values values values values values values values values ('4', '2'); ('10', '2'); ('1', '4'); ('7', '4'); ('5', '3'); ('6', '3'); ('11', '3'); ('12', '3'); ('2', '1'); ('3', '1'); ('8', '1'); ('9', '1'); ('13', '4'); insert into Veranstaltung values ('1', '1996-08-22 15:00:00', 80, 'Halbfinale 100 m Lauf Herren', 15000.10, '2', '1'); insert into Veranstaltung values ('2', '1996-08-22 16:00:00', 90, 'Halbfinale 100 m Lauf Damen', 15000.10, '4', '7'); insert into Veranstaltung values ('3', '1996-08-23 15:00:00', 80, 'Finale 100 m Lauf Herren', 18000.10, '2', '1'); insert into Veranstaltung values ('4', '1996-08-23 16:00:00', 90, 'Finale 100 m Lauf Damen', 18000.10, '4', '7'); insert into Veranstaltung values ('5', '1996-08-24 14:00:00', 80, 'Halbfinale 200 m Lauf Herren', 22000.10, '1', '2'); insert into Veranstaltung values ('6', '1996-08-24 15:00:00', 90, 'Halbfinale 400 m Lauf Herren', 22000.10, '1', '3'); insert into Veranstaltung values ('7', '1996-08-25 14:00:00', 80, 'Finale 200 m Lauf Herren', 25000.10, '1', '2'); insert into Veranstaltung values ('8', '1996-08-25 15:00:00', 90, 'Finale 400 m Lauf Herren', 24000.10, '1', '3'); insert into Veranstaltung values ('9', '1996-08-26 15:00:00', 80, 'Halbfinale 200 m Lauf Damen', 10000.10, '1', '8'); insert into Veranstaltung values ('10', '1996-08-26 16:00:00', 90, 'Halbfinale 400 m Lauf Damen', 20000.10, '1', '9'); insert into Veranstaltung values ('11', '1996-08-27 15:00:00', 80, 'Finale 200 m Lauf Damen', 15000.10, '1', '8'); insert into Veranstaltung values ('12', '1996-08-27 16:00:00', 90, 'Finale 400 m Lauf Damen', 24000.10, '1', '9'); insert into Veranstaltung values ('13', '1996-08-28 13:00:00', 80, 'Finale Speerwurf Herren', 18000.10, '3', '5'); insert into Veranstaltung values ('14', '1996-08-28 14:00:00', 90, 'Finale Weitsprung Herren', 21000.10, '3', '6'); insert into Veranstaltung values ('15', '1996-08-29 15:00:00', 80, 'Finale Speerwurf Damen', NULL, '3', '11'); insert into Veranstaltung values S e ite 54 von 6 1 Projektarbeit ('16', '1996-08-29 16:00:00', 90, insert into Veranstaltung values ('17', '1996-08-30 15:00:00', 80, insert into Veranstaltung values ('18', '1996-08-30 16:00:00', 90, insert into Veranstaltung values ('19', '1996-08-21 15:00:00', 80, insert into Veranstaltung values ('20', '1996-08-21 16:00:00', 80, insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into André Knaupp 'Finale Weitsprung Damen', NULL, '3', '12'); 'Finale 100 m Delphin Herren', NULL, '2', '4'); 'Finale 100 m Delphin Damen', NULL, '2', '10'); 'Vorlauf 1 100 m Lauf Herren', NULL, '4', '1'); 'Vorlauf 2 100 m Lauf Herren', NULL, '4', '1'); Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst values ('2', '1', '9.89 s'); values ('4', '1', '9.9 s'); values ('7', '1', '10.1 s'); values ('12', '1', '10.2 s'); values ('13', '1', '10.11 s'); values ('2', '3', '9.8 s'); values ('4', '3', '9.87 s'); values ('7', '3', '10.05 s'); values ('12', '3', '10.1 s'); values ('13', '1', '9.83 s'); values ('1', '2', '10.2 s'); values ('3', '2', '10.25 s'); values ('5', '2', '10.3 s'); values ('6', '2', '10.4 s'); values ('8', '2', '10.35 s'); values ('9', '2', '10.4 s'); values ('10', '2', '10.18 s'); values ('11', '2', '10.15 s'); values ('1', '4', '10.0 s'); values ('5', '4', '10.12 s'); values ('6', '4', '10.25 s'); values ('8', '4', '10.12 s'); values ('9', '4', '10.5 s'); values ('10', '4', '10.1 s'); values ('11', '4', '10.11 s'); values ('2', '5', '16.89 s'); values ('4', '5', '16.9 s'); values ('7', '5', '17.1 s'); values ('12', '5', '17.2 s'); values ('2', '6', '46.89 s'); values ('4', '6', '46.9 s'); values ('7', '6', '47.1 s'); values ('12', '6', '47.2 s'); values ('2', '7', '16.8 s'); values ('4', '7', '16.99 s'); values ('7', '7', '17.12 s'); values ('12', '7', '17.11 s'); values ('2', '8', '46.77 s'); values ('4', '8', '46.89 s'); values ('7', '8', '47.01 s'); values ('12', '8', '47.02 s'); values ('1', '7', '18.2 s'); values ('3', '7', '18.25 s'); values ('5', '7', '18.3 s'); values ('6', '7', '19.42 s'); values ('8', '7', '19.35 s'); values ('9', '7', '19.4 s'); S e ite 55 von 6 1 Projektarbeit insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst André Knaupp values ('10', '7', '18.18 s'); values ('11', '7', '19.15 s'); values ('1', '8', '48.2 s'); values ('3', '8', '48.25 s'); values ('5', '8', '48.3 s'); values ('6', '8', '49.42 s'); values ('8', '8', '49.35 s'); values ('9', '8', '49.46 s'); values ('10', '8', '48.18 s'); values ('11', '8', '49.15 s'); values ('1', '9', '18.2 s'); values ('3', '9', '18.25 s'); values ('5', '9', '18.3 s'); values ('6', '9', '19.42 s'); values ('8', '9', '19.35 s'); values ('9', '9', '19.4 s'); values ('10', '9', '18.18 s'); values ('11', '9', '19.15 s'); values ('14', '9', '19.43 s'); values ('15', '9', '19.44 s'); values ('1', '10', '48.2 s'); values ('3', '10', '48.25 s'); values ('5', '10', '48.3 s'); values ('6', '10', '49.42 s'); values ('8', '10', '49.35 s'); values ('9', '10', '49.46 s'); values ('10', '10', '48.18 s'); values ('11', '10', '49.15 s'); values ('1', '11', '18.12 s'); values ('3', '11', '18.15 s'); values ('5', '11', '18.13 s'); values ('8', '11', '19.25 s'); values ('9', '11', '19.24 s'); values ('10', '11', '18.1 s'); values ('11', '11', '19.1 s'); values ('1', '12', '48.12 s'); values ('3', '12', '48.2 s'); values ('5', '12', '48.3 s'); values ('6', '12', '49.21 s'); values ('8', '12', '49.33 s'); values ('10', '12', '48.28 s'); values ('11', '12', '49.14 s'); values ('2', '13', '87.77 m'); values ('4', '13', '86.5 m'); values ('7', '13', '87.73 m'); values ('12', '13', '87.58 m'); values ('2', '14', '7.89 m'); values ('4', '14', '7.98 m'); values ('7', '14', '7.67 m'); values ('12', '14', '7.85 m'); (pid, vid) values ('1', '15'); (pid, vid) values ('3', '15'); (pid, vid) values ('5', '15'); (pid, vid) values ('8', '15'); (pid, vid) values ('9', '15'); (pid, vid) values ('10', '15'); (pid, vid) values ('11', '15'); S e ite 56 von 6 1 Projektarbeit insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into into into Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst Sportler_nimmtteil_Veranst André Knaupp (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, (pid, vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) vid) values values values values values values values values values values values values values values values values values values ('1', '16'); ('3', '16'); ('5', '16'); ('8', '16'); ('9', '16'); ('10', '16'); ('11', '16'); ('2', '17'); ('4', '17'); ('7', '17'); ('12', '17'); ('1', '18'); ('3', '18'); ('5', '18'); ('8', '18'); ('9', '18'); ('10', '18'); ('11', '18'); S e ite 57 von 6 1 Projektarbeit André Knaupp 8.5 SIEGERLISTE - SOURCECODE Dim con As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset Private Sub CmdStart_Click() Dim auswahl As String IF CmbSportart.Text <> "Bitte auswählen" Then 'Siegerfelder einblenden Me.Lbl1Sieger.Visible = True Me.Lbl2Sieger.Visible = True Me.Lbl3Sieger.Visible = True Me.TxtName1.Visible = True Me.TxtName2.Visible = True Me.TxtName3.Visible = True Me.TxtNation1.Visible = True Me.TxtNation2.Visible = True Me.TxtNation3.Visible = True Me.TxtErgebnis1.Visible = True Me.TxtErgebnis2.Visible = True Me.TxtErgebnis3.Visible = True 'auswahl trimmen um aktuelle Sportart festzustellen auswahl = Trim(CmbSportart.Text) 'Fehlerbearbeitung On Error GoTo ergebnis_error 'SQL-String - aufsteigend sortieren cmd.CommandText = "Select ToNumber(Ergebnis) As ErgSort,RIGHT(Ergebnis,1) As einheit, " & _ "Ergebnis, Pname, Nation from Sportler, Sportler_nimmtteil_Veranst SNT, Sportart SA, " & _ "Veranstaltung VA where SName = '" & auswahl & "' and VA.SID = SA.SID " & _ "and VA.VID = SNT.VID "and VA.Bezeichnung like '%Finale%' " & _ "and SNT.PID = Sportler.PID order by ErgSort" 'Ausführen der Abfrage cmd.ActiveConnection = con Set rst = cmd.Execute rst.MoveFirst 'wenn ein Datensatz vorhanden ist IF Not rst.EOF Then 'wenn Ergebnis nach Metern gemessen wird muss umsortiert werden IF rst!Einheit = "m" Then 'SQL-String - absteigend sortieren cmd.CommandText = "Select ToNumber(Ergebnis) as ErgSort,RIGHT(Ergebnis,1) as einheit, " & _ "Ergebnis, Pname, Nation from Sportler, Sportler_nimmtteil_Veranst SNT, Sportart SA, " & _ "Veranstaltung VA where SName = '" & auswahl & "' and VA.SID = SA.SID " & _ "and VA.VID = SNT.VID and VA.Bezeichnung like '%Finale%' " &_ "and SNT.PID = Sportler.PID order by ErgSort desc" S e ite 58 von 6 1 Projektarbeit André Knaupp cmd.ActiveConnection = con Set rst = cmd.Execute End IF rst.MoveFirst i=1 'die ersten drei Sieger ausgeben Do While i <= 3 And Not rst.EOF And Not rst.BOF IF i = 1 Then Me.TxtName1.Text = rst!Pname Me.TxtNation1.Text = rst!Nation Me.TxtErgebnis1.Text = rst!Ergebnis End IF IF i = 2 Then Me.TxtName2.Text = rst!Pname Me.TxtNation2.Text = rst!Nation Me.TxtErgebnis2.Text = rst!Ergebnis End IF IF i = 3 Then Me.TxtName3.Text = rst!Pname Me.TxtNation3.Text = rst!Nation Me.TxtErgebnis3.Text = rst!Ergebnis End IF i=i+1 rst.MoveNext Loop Else MsgBox "Keine Ergebnisse vorhanden ! " End IF End IF Exit Sub ergebnis_error: 'Siegerfelder ausblenden Me.TxtName1.Text = "" Me.TxtName2.Text = "" Me.TxtName3.Text = "" Me.TxtNation1.Text = "" Me.TxtNation2.Text = "" Me.TxtNation3.Text = "" Me.TxtErgebnis1.Text = "" Me.TxtErgebnis2.Text = "" Me.TxtErgebnis3.Text = "" Me.CmbSportart.Text = "Bitte auswählen" Select Case Err.Number ' Fehlernummer auswerten. Case 94 MsgBox "Es sind noch keine Ergebnisse vorhanden!" Case 3021 MsgBox "Kein Sportler hat die Sportart belegt!" Case Else MsgBox "sonstiger Fehler!" ' Andere Fälle hier bearbeiten... End Select Exit Sub End Sub S e ite 59 von 6 1 Projektarbeit André Knaupp Private Sub Form_Load() Dim i As Integer i=0 'Connectionstring zusammenbauen Const ConnectString = "uid=Andre; pwd=123; dsn=CacheWeb_User" With con 'Verbindung herstellen .ConnectionString = ConnectString .ConnectionTimeout = 10 .Open End With 'Siegerfelder ausblenden Me.Lbl1Sieger.Visible = False Me.Lbl2Sieger.Visible = False Me.Lbl3Sieger.Visible = False Me.TxtName1.Visible = False Me.TxtName2.Visible = False Me.TxtName3.Visible = False Me.TxtNation1.Visible = False Me.TxtNation2.Visible = False Me.TxtNation3.Visible = False Me.TxtErgebnis1.Visible = False Me.TxtErgebnis2.Visible = False Me.TxtErgebnis3.Visible = False 'Fehlerbearbeitung On Error GoTo sportart_error cmd.CommandText = "Select SName from Sportart, Veranstaltung " & _ "where Sportart.SID = Veranstaltung.SID " & _ "and Veranstaltung.Bezeichnung like '%Finale%' " & _ "and Veranstaltung.Einnahme is not NULL order by SName" 'Ausführen der Abfrage cmd.ActiveConnection = con Set rst = cmd.Execute rst.MoveFirst 'Ausgabe der Sportarten While Not rst.EOF CmbSportart.AddItem rst!SName, i i=i+1 rst.MoveNext Wend Exit Sub 'Fehlerbearbeitung sportart_error: Select Case Err.Number ' Fehlernummer auswerten. Case 3021 MsgBox "Es hat noch kein Finale stattgefunden!" Case Else MsgBox "sonstiger Fehler" ' Andere Fälle hier bearbeiten... End Select S e ite 60 von 6 1 Projektarbeit André Knaupp Exit Sub End Sub Private Sub CmdBeenden_Click() rst.Close con.Close Unload Me End Sub S e ite 61 von 6 1