diff --git a/WEGA/contrib/ingres/dbs/ing_src/teil1/deck b/WEGA/contrib/ingres/dbs/ing_src/teil1/deck new file mode 100644 index 0000000..b09c158 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_src/teil1/deck @@ -0,0 +1,61 @@ +.so /z/ing_src/macdoc +.nf + + + + + + + + + +############################################################## +############################################################## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ### # # ##### ###### ###### ## +## # ## # # # # # # # ## +## # # # # # # # # # ## +## # # # # # #### # # ###### ## +## # # # # # # # # # # ## +## # # ## # # # # # # ## +## ### # # ##### ####### ###### ###### ## +## ## +## ## +## ## +## ## +## ## +## ##### ##### # ##### ## +## # # # # # # # ## +## # # # # ## +## ###### ##### # ##### ## +## # # ### # # # ## +## # # ### # # # # # ## +## ##### ### ##### # ##### ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +############################################################## +############################################################## +.fi +.bp diff --git a/WEGA/contrib/ingres/dbs/ing_src/teil1/einlei b/WEGA/contrib/ingres/dbs/ing_src/teil1/einlei new file mode 100644 index 0000000..c19d21f --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_src/teil1/einlei @@ -0,0 +1,336 @@ +.so /z/ing_src/macdoc +.TL +Anwenderhandbuch zu \*(yy\ 6.3/3 +f\o'u"'r \*(xx\-Systeme +.LP +.AU +J\o'o"'rg Wenzlaff +Rolf Morgenstern +.DS C +Zentralinstitut f\o'u"'r Kybernetik +und Informationsprozesse der +Akademie der Wissenschaften +Kurstrasse 30 - 34 +Berlin +1080 +.DE +.DS C +VEB Kombinat EVK +- ODV - +Jagdweg 1 +Olbernhau +9332 +.DE +.AB +Das vorliegende Anwenderhandbuch soll +als Unterlage f\o'u"'r den lernenden und als +Nachschlage\%werk f\o'u"'r den erfahrenen +Anwender dienen. Es dokumentiert die Version +6.3 Release 3. Es werden Grundkenntnisse zu +\*(xx\ - kompatiblen Be\%triebs\%sys\%te\%men vorausgesetzt. +Das interaktive relationale Datenbanksystem +\*(yy\ 6.3/3 l\o'a"'sst sich auf verschiedenen Ebenen +nutzen. Vorgestellt werden M\o'o"'glichkeiten f\o'u"'r +Recherchen, zeit- und speicherplatzoptimale Dateistrukturen, +Ablage von Kommandofolgen in Dateien, Einordnung von +\*(yy\-Kommandos (EQUEL und AMX) in C-Programme, Nutzung +von Shell-Kommandos, Zugriffs- und Sicherungsmassnahmen. +Mit der Beschreibung und Untersetzung durch Beispiele zum +AMX-Compiler, zum Report- und zum Eingabe- Generator wird +das Handbuch vervollst\o'a"'ndigt. +\*(yy\ 6.3/3 ist so konzipiert, dass seine Nutzung auch +bei geringem Fachwissen durchaus sinnvoll ist. Die +Gefahr von Datenverlusten wird im Zusammenhang mit +einem ausgefeilten Datenschutz- und -sicherungsmechanismus +\o'a"'usserst gering gehalten. +.sp 3 +\*(xx\ ist ein Warenzeichen der AT&T Bell Laboratorien. +.AE +.bp +.ds LH Referenz_Manual +.ds CH - % - +.ds RH \f3Einfuehrung\f1 +.ds LF \*(vv\ +.LP +.SH +.ft B +Anwenderhandbuch Teil I +.ft R +.LP +.sp 10 +.SH +.ft B +0. Vorbemerkung +.ft R +.LP +Das Handbuch gliedert sich in 3 Teile. +Im Teil 1 wird das Referenz-Manual +vorgestellt und einige grunds\o'a"'tzliche +Ausf\o'u"'hrungen zu den \*(yy\ 6.3/3-Komponenten Monitor- und +Makroprozessor gegeben, die f\o'u"'r das Verst\o'a"'ndnis +und die Anwendung der Anfragesprache (Query Language = QUEL) +von Bedeutung sind. Im Teil 2 werden die +im Referenz-Manual beschriebenen Be\%standteile +ausf\o'u"'hrlicher dokumentiert und +zus\o'a"'tzliche Informationen bereitgestellt, +um Zusammenh\o'a"'nge zwischen einzelnen Komponenten +deutlicher zu gestalten. +Es sei darauf +verwiesen, dass die im Anwenderhandbuch verwendeten +Datenbanken als Demonstrations\%beispiele +in der Vertriebsversion mit ausgeliefert werden. +Nach dem \o'U"'berfliegen von Teil 1 wird dem lernenden Anwender +unbedingt das Studium des 1. Kapitels im Teil 2 empfohlen, +um gewisse Zusammenh\o'a"'nge zu erkennen. +Die vertiefenden und erweiternden Ausf\o'u"'hrungen +mit Demon\%strations\%beispielen im Teil 3 +sind in erster Linie +f\o'u"'r Programmierer gedacht. +.LP +Es wurde versucht, das Studium der Dokumentation +f\o'u"'r den Lernenden zu erleichtern, +indem die \o'U"'berschriften nach folgenden +Kriterien gekennzeichnet wurden: +.IP * +Abschnitt enth\o'a"'lt allgemein interessierende +Informationen, die f\o'u"'r einen \o'U"'berblick unerl\o'a"'sslich sind +.IP ** +Abschnitt enth\o'a"'lt Informationen f\o'u"'r anspruchsvolle +Anwender (bspw. Datenbankadministrator), +die \o'u"'ber Grundkenntnisse zur Programmierung +und umfassendere Kenntnisse zum Betriebssystem bzw. +zur Shell verf\o'u"'gen. +.IP *** +Abschnitt enth\o'a"'lt Informationen f\o'u"'r Programmierer, +den \*(yy\-Systemadministrator. +.LP +\*(yy\ 6.3/3 beruht auf dem Modell der +klassischen Relationentheorie +die im Anwenderhandbuch jedoch nicht ausgef\o'u"'hrt wird. +.LP +Es gelten folgende Begriffsanalogien: +.DS I + +---------------------------- +Relation | Tupel | Dom\o'a"'ne + Tabelle | Zeile | Spalte + Datei | Satz | Feld +---------------------------- +.DE +.bp +.NH 1 +.ft B +Referenz-Manual * +.ft R +.LP +.sp 10 +Das \*(yy\ 6.3/3 Referenz-Manual +ist in 5 Kapitel unterteilt: +.IP QUEL + beschreibt die Nutzung des interaktiven Systems +nach Start von +.ft B +quel +.ft R +(unix), also die +Statements der Anfragesprache QUEL und den interaktiven +Terminal-Monitor mit seinem Makro-Prozessor. +.IP \*(xx\ + beschreibt die \*(yy\-Programme, die durch +eine interaktive Shell direkt als \*(xx\-Kommandos +ausf\o'u"'hrbar sind, darunter auch das +Kommando +.ft B +quel +.ft R +(unix) selbst. +.IP REPORT + beschreibt die Sprache zur Generierung von +Drucklisten und wird aufgrund des Umfangs als eigenst\o'a"'ndiges +Kapitel behandelt. +.IP FILES + beschreibt die aus Anwendungssicht +wichtigen Files von \*(yy\. +.IP ERROR + enth\o'a"'lt eine Auflistung der nach +Anwender\%fehl\%bedie\%nungen m\o'o"'glichen +Fehlermeldungen mit deren Erl\o'a"'uterungen. +.LP +Die Abschnitte in den Kapiteln dieses Handbuchs +sind mit +.IP +KAPITEL (unten rechts) +.RE +und +.IP +ABSCHNITT (oben rechts) +.RE +gekennzeichnet, um ein +schnelles Auffinden zu erm\o'o"'glichen. +.LP +F\o'u"'r die Kapitel QUEL, \*(xx\ und REPORT wird +zu Beginn jeweils eine Einf\o'u"'hrung gegeben, um die Einordnung +der Kommandos zu erleichtern. Diese Einf\o'u"'hrung ist wie ein +Abschnitt ge\%kennzeichnet, aber nicht so gegliedert. +.LP +Nachfolgend die allgemeine +Gliederung im Sinne des Manuals: +.bp +.sp 1 +.ft B +NAME +.ft R +.IP +Name \- Kurzbezeichnung des Inhalts +.RE +.sp 1 +.ft B +SYNOPSIS +.ft R +.IP +Hier wird die Syntax des Kommandos/Statements +angegeben. +.IP +Als Metasymbole werden verwendet: +.RE +.DS L + + | Alternative + [..] wahlweise kein- oder einmal + {..} wahlweise kein- oder mehrmals + <..> manchmal zur Hervorhebung einer + syntaktischen Variablen + +.DE +.IP +Alle anderen Sonderzeichen und fettgedruckten Bezeichner +sind terminale Symbole (m\o'u"'ssen so und nicht +anders geschrieben werden). Kleingeschriebene, +nicht fettgedruckte W\o'o"'rter stehen f\o'u"'r +syntaktische Variable, deren Belegung im folgenden +Abschnitt BESCHREIBUNG erl\o'a"'utert wird. +.IP +Die Mehrzahl der syntaktischen Variablen wird +im Ab\%schnitt +.ft B +quel +.ft R +eingef\o'u"'hrt. Insbesondere: +.RS +.IP +.ft B + +.ft R +\ \ \ Name der aufliegenden Datenbank +.br +.ft B + +.ft R +\ \ Name einer Relation, Tabelle +.br +.ft B + +.ft R +\ \ Name einer Dom\o'a"'ne einer Relation + +.RE +.LP +.ft B +BESCHREIBUNG +.ft R +.IP +Hier wird die Syntax erg\o'a"'nzt und eine semantische +Beschreibung gegeben. +.RE +.sp 1 +.ft B +NACHRICHTEN +.ft R +.IP +Hier werden die Nachrichten erl\o'a"'utert, +die nicht im Kapitel ERROR zu finden sind, +oder die eine besondere Bedeutung haben. +.IP +Nachrichten, die Folgen technischer Fehler sind +und i.d.R. zu einem Systemabbruch f\o'u"'hren, +werden in dieser Dokumentation nicht behandelt. +.RE +.sp 1 +.ft B +BEISPIEL[E] +.ft R +.IP +Hier werden Beispiele angegeben, +die den Rahmen dieses Nachschlagewerkes nicht sprengen. +.IP +Viele Beispiele beziehen sich auf eine +Personal-Relation, die pro Mitarbeiter einen Satz +mit den Spalten. +.RE +.DS + + +Relation: personal +--------- +Besitzer: ing_db +Tupellaenge: 30 +Verfallsdatum: Tue Apr 26 19:56:39 1988 +Tupelanzahl: 25 +Speicherstruktur: HEAP +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +------------------------------------------- + num i 2 + name c 20 + gehalt i 2 + leiter i 2 + gebdat i 2 + einstdat i 2 +------------------------------------------- +.DE +.IP +hat. +.RE +.sp 1 +.ft B +SIEHE AUCH +.ft R +.IP +Hier werden andere Abschnitte aufgez\o'a"'hlt, +auf die Bezug genommen wurde. +.RE +.sp 1 +.ft B +HILFEN +.ft R +.IP +Hier werden gewisse Besonderheiten, +insbesondere der Implementation beschrieben. +.IP +Um mit \*(yy\ arbeiten zu k\o'o"'nnen, +muss jeder Nutzer +durch den \*(yy\-Administrator in das usersfile +eingetragen werden +(s. +.ft B +users +.ft R +(files)). +.IP +Zur Einf\o'u"'hrung in dieses Handbuch beginne man mit den +Ab\%schnitten +.ft B +Anfragesprache +.ft R +, +.ft B +Datenbank-Unix-Kommandos +.ft R +und +.ft B +Der interaktive Terminal-Monitor +.ft R +.RE +.ds RF \f3QUEL\f1 +.bp diff --git a/WEGA/contrib/ingres/dbs/ing_src/teil2/quel b/WEGA/contrib/ingres/dbs/ing_src/teil2/quel new file mode 100644 index 0000000..37510dc --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_src/teil2/quel @@ -0,0 +1,2223 @@ +.so /z/ing_src/macdoc +.NH 1 +.ds RH \f3QUEL\f1 +.ds RF \f3\*(yy\f1 +.ds CH - % - +.ds LH Anwendung +.ds LF \*(vv +.pn 162 +.LP +.bp +.NH 1 +.ft B +Anwenderdokumentation +.br + \*(yy\ 6.3/3 - Teil II +.ft R +.sp 5 +.nf +############################################################# +############################################################# +## ## +## ## +## ## +## ## +## ## +## ## +## ### # # ##### ###### ###### ## +## # ## # # # # # # # ## +## # # # # # # # # # ## +## # # # # # #### # # ###### ## +## # # # # # # # # # # ## +## # # ## # # # # # # ## +## ### # # ##### ####### ###### ###### ## +## ## +## ## +## ## +## ## +## ####### ####### ### # ##### ## +## # # # # # # ## +## # # # # # ## +## # ##### # # ##### ## +## # # # # # ## +## # # # # # ## +## # ####### ### ####### ####### ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +## ## +############################################################# +############################################################# + +.fi +.bp +.NH 2 +.ft B +Anwendung der QUEL * +.ft R +.LP +.sp 10 +Dieser Einf\o'u"'hrungskurs beschreibt, wie das \*(yy\ 6.3-DBS +anzuwenden ist. +Sie sollten in der Lage sein, den angegebenen +Beispielen zu folgen und die gleichen Ergebnisse zu erhalten. +Die Datenbank "demo" ist in der ausgelieferten +Vertriebsversion enthalten. +Nach den \o'U"'bungen in diesem Kapitel sind sie in der +Lage die anschliessenden beiden Kapitel besser +zu verstehen. Es empfiehlt sich auch, das Referenz-Manual +noch einmal gr\o'u"'ndlich zu lesen. +.LP +Die Daten-Manipulations-Sprache, die von +\*(yy\ 6.3 unterst\o'u"'tzt wird, nennt sich +QUEL (Query Language) bzw. in Kurzform Query. +Eine vollst\o'a"'ndige Information zur QUEL wird +im \*(yy\ 6.3-Referenz-Manual (Teil I) gebracht. +Dieser Kurs beabsichtigt nicht, jedes +Detail von \*(yy\ 6.3 zu ber\o'u"'hren. +Es wird aber versucht, sie zu bef\o'a"'higen, +die QUEL aktiv zu beherrschen und auf dieser +Basis Schritt f\o'u"'r Schritt in die Geheimnisse +von \*(yy\ 6.3 einzusteigen. +.LP +Fangen wir mit dem Eintritt in \*(xx\, dem +Time-Sharing-System, unter dem \*(yy\ 6.3 l\o'a"'uft, an. +Wenn irgend m\o'o"'glich, benutzen sie ein Terminal, +das \o'u"'ber Gross- und Kleinbuchstaben verf\o'u"'gt, +anderenfalls werden sie ein schweres Leben haben. +Wenn sie an einem Terminal arbeiten, das nur +Grossbuchstaben hat, geben +sie "\\\\" anstelle "\\" f\o'u"'r Beispiele dieses +Einf\o'u"'hrungskurses ein. +.LP +Nach Eintritt in das Mehrnutzersystem (Eingabe des "login"-Namens) +wird auf dem Terminal die Bereitschaft mit "%" angezeigt. +(Durch \o'A"'nderung von PS1 im .profile "/mnt/ing_db/.profile" auf +"%" erhalten sie \o'U"'bereinstimmung mit den angef\o'u"'hrten +Beispielen, wobei "%" vom Terminal ausgegeben wird !) +Um \*(yy\ 6.3 zu nutzen, geben sie beispielsweise das Kommando: +.DS L + +% quel dt + +.DE +.LP +Das veranlasst \*(xx\, die Datenbank "demo" zur +Nutzung durch \*(yy\ 6.3 bereitzustellen. +Nach einigen Sekunden erscheint folgendes: +.DS L + +ING_db version 6.3/3 login +Tue Aug 30 14:52:23 1985 + +ING_db> +* + +.DE +.LP +(Sofern sys/etc/dayfile nicht leer ist +bzw. die Ausgabe nicht unterdr\o'u"'ckt wird, wird vor +ING_db> noch +der Inhalt dieses File's angegeben.) +Die ersten beiden Zeilen beinhalten die \*(yy\ 6.3-Version +(in diesem Fall "Version 6.3") und das aktuelle Datum. +Danach folgt die Ausgabe des "dayfile", +das Mitteilungen +- bezogen auf \*(yy\ 6.3 - enth\o'a"'lt. +Das I N G - d b > zeigt an, dass \*(yy\ 6.3 +bereit ist, ihre Kommandos anzunehmen. +.LP +Der Monitor +erinnert mit einem Stern ("*") am Zeilenanfang daran, +dass \*(yy\ 6.3 +auf eine Eingabe wartet. +.br +Wenn Sie den Monitor zur Ausf\o'u"'hrung der Query +angewiesen haben, erscheint die Ausschrift +Zu Beginn arbeiten wir mit einer Relation "teile", die +folgende Struktur hat: +.DS L + +* help teile +* \eg + +I N G - d b . . . + +Relation: teile +--------- +Besitzer: ing_db +Tupellaenge: 34 +Verfallsdatum: Tue Apr 26 19:57:10 1988 +Tupelanzahl: 13 +Speicherstruktur: HEAP +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +------------------------------------------- + tnum i 2 + tname c 20 + farbe c 8 + gewicht i 2 + menge i 2 +------------------------------------------- + +ING-db: +.DE +.LP +Geben sie das Kommando: +.DS L + +* print teile +* \eg + +I N G - d b . . . + +.DE +.LP +Die Zeile "print teile" fordert eine Anzeige von +Daten, die in der Datenbank gespeichert sind. +Das "\\g" weist den Monitor zur Ausf\o'u"'hrung der +Query an. +Die Mitteilung +.br +"I N G - d b . . . " +.br +informiert, dass \*(yy\ 6.3 ihre Query ausf\o'u"'hrt. +Der Ausschrift wird noch der Maschinentyp vorangestellt. +Das Ergebnis sieht dann so aus: +.DS L + +Relation: teile + + +|tnum |tname |farbe |gewich|menge | +|--------------------------------------------------| +| 1|Zentraleinheit |rosa | 10| 1| +| 2|Hauptspeicher |grau | 20| 32| +| 3|Plattenspeicher |schwarz | 685| 2| +| 4|Magnetbandspeicher |schwarz | 450| 4| +| 5|Magnetbaender |grau | 1| 250| +| 6|Zeilendrucker |gelb | 578| 3| +| 7|Zeilendruckerpapier |weiss | 15| 95| +| 8|Terminals |blau | 19| 15| +| 13|Lochbandleser |schwarz | 107| 0| +| 14|Lochbandstanzer |schwarz | 147| 0| +| 9|Konsolpapier |weiss | 2| 350| +| 10|Kartenleser |grau | 327| 0| +| 11|Kartenstanzer |grau | 427| 0| +|--------------------------------------------------| + +ING_db: +* + +.DE +.LP +Das, was auf Ihrem Terminal angezeigt wurde, ist die "teile"- Relation. +Intuitiv, eine Relation ist nicht mehr, als eine Tabelle +mit Zeilen und Spalten. +.LP +In diesem Fall ist der Name der Relation "teile". +Sie hat f\o'u"'nf Spalten (, wir nennen sie Dom\o'a"'nen,) +bezeichnet mit "tnum" (Teile-Nummer), "tname" (Teile-Bezeichnung), +"farbe", "gewicht" und "menge" (Bestand). +Jede Zeile der Relation (genannt Tupel) +repr\o'a"'sentiert einen Eintrittspunkt (Satz), +der in diesem Fall ein Teil +f\o'u"'r eine Computer-Installation bezeichnet. +Eine Relation kann bis zu 49 Dom\o'a"'nen und eine +im Grunde genommen unbegrenzte Zahl von Tupeln haben. +.LP +Beachten sie, nachdem die Query ausgef\o'u"'hrt ist, +gibt \*(yy\ 6.3 +.ft B +"ING_db:" +.ft R +aus, w\o'a"'hrend anfangs nach dem +Eintritt +.ft B +"ING_db>" +.ft R +angezeigt wurde. +Wenn sie eine Query eingeben, legt sie \*(yy\ 6.3 +in einem "Arbeitsspeicher" ab. +Wenn sie +eine Query falsch eingegeben haben, k\o'o"'nnen sie mit "\\r", +also "reset" (dh. l\o'o"'schen) den Arbeitsspeicher l\o'o"'schen. +(Sp\o'a"'ter werden wir Wege kennen lernen, +um Fehler zu editieren, so, als +w\o'u"'rden wir die eingegebene Query korrigieren.) +.LP +Jederzeit k\o'o"'nnen sie sich den Arbeitsspeicher +durch Eingabe von "\\p" ansehen. +Versuchen sie "\\p": +.DS L + +* \ep +print teile +ING-db: +* + +.DE +.LP +Der aktuelle Inhalt des Arbeitsspeichers +wird angezeigt. +Versuchen sie jetzt "\\r": +.DS L + +* \er +ING_db> +* + +.DE +.LP +Der Arbeitsspeicher ist jetzt leer. +Solange +\*(yy\ 6.3 "ING_db:" ausgibt, +ist der Arbeitsspeicher nicht-leer; +solange \*(yy\ 6.3 "ING_db>" ausgibt, ist er leer. +.LP +Nachdem eine Query ausgef\o'u"'hrt wurde, +gibt \*(yy\ 6.3 normalerweise "ING_db:" aus. +Wenn sie dann eine neue Query eingeben, l\o'o"'scht \*(yy\ 6.3 +automatisch die vorhergehende, obwohl +sie nicht nach jeder Query "\\r" eingegeben haben. +Das wird sp\o'a"'ter noch erkl\o'a"'rt. +.LP +Die Verwendung des "retrieve"-Kommandos erlaubt uns, +spezifische Queries \o'u"'ber Relationen zu schreiben. +Als Beispiel wollen wir \*(yy\ 6.3 +veranlassen, nur "tname" als Dom\o'a"'ne aus der "teile"- +Relation auszugeben. +Geben sie das Kommando: +.DS L + +* range of t is teile +* retrieve (t.tname) +* \eg + +I N G - d b . . . + +|tname | +|--------------------| +|Zentraleinheit | +|Hauptspeicher | +|Plattenspeicher | +|Magnetbandspeicher | +|Magnetbaender | +|Zeilendrucker | +|Zeilendruckerpapier | +|Terminals | +|Lochbandleser | +|Lochbandstanzer | +|Konsolpapier | +|Kartenleser | +|Kartenstanzer | +|--------------------| +13 tuples touched + +ING_db: +* + +.DE +.LP +Die Ausgabe beschr\o'a"'nkt sich auf die Dom\o'a"'ne +"tname" aus der Relation "teile". +Dazu ben\o'o"'tigten wir zwei Schritte. +Zuerst haben wir eine sogenannte "Tupel-Variable" +deklariert und ihren Bereich der Relation "teile" zugewiesen. +.DS L + +range of t is teile +.DE +.LP +Damit ist gemeint, dass der Buchstabe "t" die Relation +"teile" repr\o'a"'sentiert. +Man kann sich das als eine Markierung +vorstellen, die die Relation "teile" eine Stufe +niedriger einordnet. +\*(yy\ 6.3 merkt sich die Verbindung, sodass, +wenn "t" einmal als Bereich \o'u"'ber "teile" +deklariert wurde, eine Wiederholung der Deklaration +nicht notwendig ist. +Das ist, wie wir sp\o'a"'ter sehen werden, \o'u"'blich, +falls wir mit mehr als einer Relation arbeiten. +.LP +Als n\o'a"'chstes benutzten wir das +"retrieve"-Kommando. +Seine Form ist +.DS L + +retrieve ( listen sie hier, wonach sie suchen ) + +.DE +.LP +"t" referenziert durch sich selbst die Relation "teile". +"t.tname" referenziert die Dom\o'a"'ne "tname" der Relation +"teile", sozusagen: +.DS L + +retrieve (t.tname) + +.DE +meint die Recherche nach der Dom\o'a"'ne +"tname" der Relation "teile". +.LP +Versuchen wir +nach "tname" und "farbe" zu recherchieren: +.DS L + +* retrieve t.tname, t.farbe +* \eg + +I N G - d b . . . + +2500: syntax error on line 1 +last symbol read was: . + +ING_db: +* + +.DE +.LP +Ungl\o'u"'cklicherweise haben wir einen Fehler gemacht. +\*(yy\ 6.3 teilt uns mit, dass es einen Syntax-Fehler +auf der ersten Zeile der Query gefunden hat. +"Syntax error" bedeutet, dass wir etwas eingegeben +haben, was \*(yy\ 6.3 nicht wiedererkennen bzw. interpretieren +kann. +Der Fehler trat auf Zeile 1 auf. +\*(yy\ 6.3 f\o'u"'hrt einen manchmal undeutlichen +Versuch zur Diagnose des Problems durch. +Sofern m\o'o"'glich, teilt uns \*(yy\ 6.3 mit, +was es gelesen hat, bevor es durcheinander kam. +.LP +In diesem Fall ist der Fehler der, dass die Liste der +Rechercheobjekte +(, die sogenannte "target_list",) in Klammern eingeschlossen +werden muss. +Die korrekte Query ist: +.DS L + +* retrieve (t.tname, t.farbe) +* \eg + +I N G - d b . . . + +|tname |farbe | +|-----------------------------| +|Zentraleinheit |rosa | +|Hauptspeicher |grau | +|Plattenspeicher |schwarz | +|Magnetbandspeicher |schwarz | +|Magnetbaender |grau | +|Zeilendrucker |gelb | +|Zeilendruckerpapier |weiss | +|Terminals |blau | +|Lochbandleser |schwarz | +|Lochbandstanzer |schwarz | +|Konsolpapier |weiss | +|Kartenleser |grau | +|Kartenstanzer |grau | +|-----------------------------| +13 tuples touched + +ING_db: +* + +.DE +.LP +Sie k\o'o"'nnen durch Hinzuf\o'u"'gung einer +"Qualifikation" an die Query einschr\o'a"'nken, +welche Tupel ausgegeben werden sollen. +Beispielsweise, um die Namen und Farben +nur der Teile zu erhalten, die grau sind, +geben sie ein: +.DS L +* retrieve (t.tname, t.farbe) +* where t.farbe = "grau" +* \eg + +I N G - d b . . . + +|tname |farbe | +|-----------------------------| +|Hauptspeicher |grau | +|Magnetbaender |grau | +|Kartenleser |grau | +|Kartenstanzer |grau | +|-----------------------------| +4 tuples touched + +ING-db: +* + +.DE +Beachten sie, dass \*(yy\ 6.3 nur die Teile angibt, wo "t.farbe" +gleich "grau" ist. +Beachten sie auch, dass grau in Anf\o'u"'hrungsstrichen ("grau") +stehen muss. +Das ist notwendig. +Der einzige Weg, \*(yy\ 6.3 zur Erkennung von Zeichenketten zu +veranlassen (z.B. Worte), ist, sie in +Anf\o'u"'hrungsstriche einzuschliessen. +.LP +Was ist, wenn wir die Bezeichnungen der Teile wissen wollen, +die grau oder rosa sind? +Wir brauchen nur an die vorhergehende Query den +Ausdruck +.DS L + +or t.farbe = "rosa" + +.DE +anh\o'a"'ngen. +Erinnern sie sich, wie auch immer, +wenn die n\o'a"'chste Zeile eingegeben wurde, +beginnt \*(yy\ 6.3 eine neue Query und wird automatisch +den Arbeitsspeicher l\o'o"'schen. +Der Arbeitsspeicher kann nur +.ft B +gerettet +.ft R +werden, wenn die n\o'a"'chste Zeile mit einem solchen Kommando +wie "\\p" oder "\\g" beginnt. +(Es gibt noch andere M\o'o"'glichkeiten, wie wir +sp\o'a"'ter sehen werden.) +Wenn so ein Kommando eingegeben wird, +ist die vorhergehende Query gerettet und +anschliessend kann an diese Query angeh\o'a"'ngt werden. +.LP +Wir geben ein: +.DS L + +* \ep +retrieve (t.tname, t.farbe) +where t.farbe = "grau" +ING-db: +* + +.DE +.LP +Sie k\o'o"'nnen die vorhergehende Query sehen. +Jetzt geben sie ein: +.DS L + +* or t.farbe = "rosa" +* + +.DE +\*(yy\ 6.3 h\o'a"'ngt die letzte Zeile an das Ende der Query an. +Sie k\o'o"'nnen sich davon \o'u"'berzeugen, indem sie +den Arbeitsspeicher ausgeben: +.DS L + +* \ep +retrieve (t.tname, t.farbe) +where t.farbe = "grau" +or t.farbe = "rosa" +ING-db: +* + +.DE +Jetzt starten wir die Query: +.DS L + +* \eg + +I N G - d b . . . + +|tname |farbe | +|-----------------------------| +|Zentraleinheit |rosa | +|Hauptspeicher |grau | +|Magnetbaender |grau | +|Kartenleser |grau | +|Kartenstanzer |grau | +|-----------------------------| +5 tuples touched + +ING-db: +* +.DE +.LP +Die Regeln dazu, wann der Arbeitsspeicher gel\o'o"'scht +ist, m\o'o"'gen anfangs etwas verwirrend erscheinen. +Im Allgemeinen wird \*(yy\ 6.3 genau das tun, +was sie erwarten, ohne dass sie viel daran denken. +.LP +Wir haben die verwendeten Qualifikationen "or" und "=" gesehen. +Im Allgemeinen kann eine der folgenden verwendet werden: + +.DS L + and + or + not + = (equal) + != (not equal) + > (greater than) + >= (greater than or equal) + < (less than) + <= (less than or equal) +.DE +.LP +Die Wertigkeit bestimmt sich in der Reihenfolge, +wie die Qualifikationen angegeben sind (d.h. von links nach rechts). +Klammern k\o'o"'nnen verwendet werden, +um Zusammenh\o'a"'nge in der gew\o'u"'nschten +Reihenfolge zu gruppieren. +.LP +\*(yy\ 6.3 kann Berechnungen mit den, in der +Relation gespeicherten Daten ausf\o'u"'hren. +Beispielsweise beinhaltet die Relation +"teile" den Bestand und das Gewicht f\o'u"'r jedes +Tupel. +Wir m\o'o"'chten das Gesamtgewicht f\o'u"'r +jede Gruppe von Teilen wissen (,d.h. Gewicht multipliziert +mit Bestand). +.LP +Um die Bezeichnung, die Teile-Nummer und das +Gesamtgewicht f\o'u"'r jedes Teil zu erhalten, +geben wir ein: +.DS L + +* retrieve (t.tname, t.tnum, t.menge * t.gewicht) +* \eg + +I N G - d b . . . + +2500: syntax error on line 1 +last symbol read was: * + +ING_db: +* + +.DE +Ein anderer Fehler! +Das Problem besteht darin, dass nach Ausf\o'u"'hrung +einer Rechnung \*(yy\ 6.3 nicht weiss, wie es die entstandene +Dom\o'a"'ne bei der Ausgabe bezeichnen soll. +F\o'u"'r eine einfache Dom\o'a"'ne +nutzt \*(yy\ 6.3 den Dom\o'a"'nen-Namen als Titel +(\o'U"'berschrift in der Kopfzeile). +Wie auch immer, sie m\o'u"'ssen eine neue Dom\o'a"'ne +gr\o'u"'nden, um den Titel zu spezifizieren: +.DS L + + tot = t.menge * t.gewicht + +.DE +Die allgemeine Form ist: +.DS L + + title = expression + +.DE +Zum Beispiel: +.DS L + + name = t.tname + berechnung = t.gewicht / 2000 * (t.menge + 2) + +.DE +Wir wollen uns noch mit dem Fehler, der eine Korrektur +der Query erfordert, besch\o'a"'ftigen. +Solange die erste Zeile nach einer Query +nicht mit "\\p" oder "\\g" beginnt, wird +\*(yy\ 6.3 automatisch den Arbeitsspeicher l\o'o"'schen +und die vorhergehende Query ist f\o'u"'r +uns verloren. +.DS L +* retrieve (t.tname, t.tnum, tot=t.menge * t.gewicht) +\eg + +I N G - d b . . . + +|tname |tnum |tot | +|----------------------------------| +|Zentraleinheit | 1| 10| +|Hauptspeicher | 2| 640| +|Plattenspeicher | 3| 1370| +|Magnetbandspeicher | 4| 1800| +|Magnetbaender | 5| 250| +|Zeilendrucker | 6| 1734| +|Zeilendruckerpapier | 7| 1425| +|Terminals | 8| 285| +|Lochbandleser | 13| 0| +|Lochbandstanzer | 14| 0| +|Konsolpapier | 9| 700| +|Kartenleser | 10| 0| +|Kartenstanzer | 11| 0| +|Hauptspeicher | 2| 640| +|Kartenleser | 10| 0| +|----------------------------------| +13 tuples touched + +ING_db: +* + +.DE +Ausser der Multiplikation unterst\o'u"'tzt \*(yy\ 6.3 +bspw. die Operatoren +.DS ++ Addition +- Subtraktion (und Bin\o'a"'rnegation) +/ Division +* Multiplikation +** Exponentation (z.B. 3**10) +abs Absolutwert (z.B. abs(p.qoh - 50) ) +mod Modulo-Division (Divisionsrest) +.DE +und einige andere mehr. +\o'U"'berpr\o'u"'fen sie bitte im \*(yy\ 6.3-Referenz-Manual diese +kurze Darstellung und vervollst\o'a"'ndigen sie, +was unterst\o'u"'tzt wird. +.LP +Wenn wir anschliessend die Teile-Nummer 2 oder 10 +ausw\o'a"'hlen wollen, dann k\o'o"'nnen wir die Qualifikation +.DS L + + where t.tnum = 2 or t.tnum = 10 +.DE +angeben. +.LP +.ft B +VORSICHT: +.ft R +Wenn wir gerade damit beginnen "where t.tnum .... " +einzugeben, wird \*(yy\ 6.3 das als Beginn einer neuen Query +verstehen und den Arbeitsspeicher +l\o'o"'schen. +Um das zu umgehen, k\o'o"'nnen sie "\\p" eingeben und ein +anschliessendes "append"-Kommando garantiert +("\\a" (append)), dass, was immer sie eingeben, dem Inhalt des +Arbeitsspeichers hinzugef\o'u"'gt wird. +Dieses Kommando wird nur ben\o'o"'tigt, nachdem +zwischenzeitlich eine Query zur Ausf\o'u"'hrung +angewiesen wurde. +Zum anderen werden Daten automatisch hinzugef\o'u"'gt. +Versuchen sie folgendes: +.DS L + +* \ea +* where t.tnum = 2 or t.tnum = 10 +* \eg + +I N G - d b . . . + +|tname |tnum |tot | +|----------------------------------| +|Hauptspeicher | 2| 640| +|Kartenleser | 10| 0| +|----------------------------------| +2 tuples touched + +ING_db: +* + +.DE +Um alle Teile-Nummern gr\o'o"'sser als 2 und kleiner, +gleich 10 auszuw\o'a"'hlen, folgendes: +.DS L + +* retrieve (t.tname, t.tnum, tot=t.menge * t.gewicht) +* where t.tnum > 2 and t.tnum <= 10 +* \eg + +I N G - d b . . . + +|tname |tnum |tot | +|----------------------------------| +|Plattenspeicher | 3| 1370| +|Magnetbandspeicher | 4| 1800| +|Magnetbaender | 5| 250| +|Zeilendrucker | 6| 1734| +|Zeilendruckerpapier | 7| 1425| +|Terminals | 8| 285| +|Konsolpapier | 9| 700| +|Kartenleser | 10| 0| +|----------------------------------| +8 tuples touched + + ING_db: +* + +.DE +.LP +Nun wollen wir Unterst\o'u"'tzung, um die +vorhergehende Query so zu \o'a"'ndern, dass sie die +Ergebnisse der Teile-Nummern zwischen 5 und 10, +anstelle von 2 und 10 liefert. +Sie w\o'a"'ren sicher ver\o'a"'rgert, wenn +sie nur ein Zeichen \o'a"'ndern m\o'u"'ssten, sollen +aber daf\o'u"'r die ganze Query nocheinmal eingeben. +Deshalb gestattet +\*(yy\ 6.3 die Verwendung des \*(xx\-Texteditors, +um Korrekturen und/oder Hinzuf\o'u"'gungen +zu Ihrem Arbeitsspeicher vorzunehmen. +Jederzeit k\o'o"'nnen sie "\\e" eingeben, +der \*(yy\ 6.3-Monitor schreibt ihren Arbeitsspeicher auf ein +File und ruft das \*(xx\-Programm "ed". +Zum Beispiel: +.DS L + +* \ee +>>ed +83 + +.DE +Die ">>ed"-Mitteilung sagt Ihnen, dass sie jetzt den +Editor nutzen. +Die Zahl 83 ist die Anzahl der Bytes in Ihrem Arbeitsspeicher. +.LP +Wir k\o'o"'nnen nun die Query editieren und +2 auf 5 \o'a"'ndern. +Die \*(xx\-Dokumentation +(Manual 1, "ed") beschreibt, wie der +Texteditor zu nutzen ist. +Aber wir wollen lieber etwas doppelt bringen und zeigen +einige Editor-Kommandos, um zu illustrieren, +wie zu editieren ist: +.DS L + +1p +retrieve (t.tname,t.tnum,tot = t.menge * t.gewicht) +2p +where t.tnum > 2 and t.tnum <= 10 +s/2/5/p +where t.tnum > 5 and t.tnum <= 10 +w +83 +q +* + +.DE +Ganz kurz, was ereignet sich. +"1p" und "2p" gibt die Zeilen 1 und 2 aus. +"s/2/5/p" ersetzt 5 durch 2 auf der aktuellen Zeile +(Zeile 2) und gibt diese Zeile anschliessend aus. +"w" schreibt die Query zur\o'u"'ck in den \*(yy\ 6.3-Arbeitsspeicher. +.LP +Innerhalb des Editors k\o'o"'nnen sie alle "ed"-Kommandos, +ausser "e" (,es ver\o'a"'ndert den File-Namen) verwenden. +Wenn sie mit "quit" den Editor (q-Kommando) verlassen, +sind sie wieder zum Monitor zur\o'u"'ckgekehrt. +Beachten sie, dass vor einem "q"-Kommando ein +"w"-Kommando gegeben werden muss, +um den Arbeitsspeicher zur\o'u"'ckzuschreiben +(Aber keine Angst! Der Editor erinnert sie daran, wenn +sie es vergessen haben!). +.LP +Um sich zu vergewissern, dass die Query korrekt ist, und um +sie auszuf\o'u"'hren, geben sie ein: +.DS L +* \ep\eg +retrieve (t.tname,t.tnum,tot = t.menge * t.gewicht) +where t.tnum > 5 and t.tnum <= 10 + +I N G - d b . . . + + +|tname |tnum |tot | +|----------------------------------| +|Zeilendrucker | 6| 1734| +|Zeilendruckerpapier | 7| 1425| +|Terminals | 8| 285| +|Konsolpapier | 9| 700| +|Kartenleser | 10| 0| +|----------------------------------| +5 tuples touched + +ING_db: +* + +.DE +.LP +Wir nehmen an, dass ihr +Interesse, soweit es die Relation "teile" betrifft, ersch\o'o"'pft +ist. Sehen wir uns deshalb +eine neue Relation, genannt "lieferung" an. +Geben sie ein: +.DS L + +* print lieferung +* \eg + +I N G - d b . . . + + +lieferung relation + +|lnum |tnum |bnum |liefdat |menge | +|------------------------------------| +| 475| 1| 1001|73-12-31| 1| +| 475| 2| 1002|74-05-31| 32| +| 475| 3| 1001|73-12-31| 2| +| 475| 4| 1002|74-05-31| 1| +| 122| 7| 1003|75-02-01| 144| +| 122| 7| 1004|75-02-01| 48| +| 122| 9| 1004|75-02-01| 144| +| 440| 6| 1001|74-10-10| 2| +| 241| 4| 1001|73-12-31| 1| +| 62| 3| 1002|74-06-18| 3| +| 475| 2| 1001|73-12-31| 32| +| 475| 1| 1002|74-07-01| 1| +| 5| 4| 1003|74-11-15| 3| +| 5| 4| 1004|75-01-22| 6| +| 20| 5| 1001|75-01-10| 20| +| 20| 5| 1002|75-01-10| 75| +| 241| 1| 1005|75-06-01| 1| +| 241| 2| 1005|75-06-01| 32| +| 241| 3| 1005|75-06-01| 1| +| 67| 4| 1005|75-07-01| 1| +| 999| 10| 1006|76-01-01| 144| +| 241| 8| 1005|75-07-01| 1| +| 241| 9| 1005|75-07-01| 144| +|------------------------------------| + + ING_db: +* + +.DE +Die "lieferung"-Relation beinhaltet "lnum" (, die +Lieferer-Nummer), +"tnum" (, die Teile-Nummer des gelieferten Teils), +"bnum" (, die Bestellnummer), +"liefdat" (, das Lieferdatum) +und "menge" (, die Liefermenge). +.LP +Um herauszufinden, welche Teile von der Lieferer-Nummer 122 +geliefert werden, geben sie ein: +.DS L + +* retrieve (l.tnum) where l.lnum = 122 +* \eg + +I N G - d b . . . + +2109: line 1, Variable 'l' not declared in RANGE statement + +ING_db: +* + +.DE +Wir haben die Tupel-Variable "l" +(, d.h. l.tnum) verwendet, ohne \*(yy\ 6.3 mitzuteilen, was +"l" repr\o'a"'sentiert. +Wir haben die Bereichsdeklaration "range" vergessen. +Korrigieren wir die Query wie folgt: +.DS L + +* range of l is lieferung +* retrieve (l.tnum) where l.lnum = 122 +* \eg + +I N G - d b . . . + + +|tnum | +|------| +| 7| +| 7| +| 9| +|------| +3 tuples touched + +ING_db: +* + +.DE +Die Lieferer-Nummer 122 liefert die Teile-Nummern 7, 7 und 9. +Beachten sie, dass 7 zweimal aufgelistet wurde. +Bei der Recherche nach Tupeln \o'u"'ber das Terminal ist es +effizienter f\o'u"'r \*(yy\ 6.3, +.ft B +nicht +.ft R +nach doppelten Tupeln suchen zu +m\o'u"'ssen. +\*(yy\ 6.3 ist in der Lage doppelte Tupel zu l\o'o"'schen. +Wir wollen darauf sp\o'a"'ter zur\o'u"'ckkommen. +.LP +Wir wissen jetzt, dass der Lieferer 122 die +Teile-Nummern 7 und 9 liefert. +Wenn sie diese Query nicht einige hundert +mal abarbeiten, wissen sie sicher nicht, +was mit den Teile-Nummern 7 und 9 gemeint ist. +Wir k\o'o"'nnen das einfach herausfinden, +wenn wir die Query +.DS L + +* retrieve (t.tname) where t.tnum = 7 or +* t.tnum = 9 +* \eg + +I N G - d b . . . + +|tname | +|--------------------| +|Zeilendruckerpapier | +|Konsolpapier | +|--------------------| +2 tuples touched + + ING_db: +* + +.DE +abarbeiten. +Nach zwei Queries wissen wir die Teile-Bezeichnung +der Teile, die der Lieferer 122 liefert. +Wir k\o'o"'nnen dasselbe in einer Query erreichen, +wenn wir fragen: +.DS L + +* retrieve (t.tname) where t.tnum = l.tnum +* and l.lnum = 122 +* \eg + +I N G - d b . . . + + +|tname | +|--------------------| +|Zeilendruckerpapier | +|Zeilendruckerpapier | +|Konsolpapier | +|--------------------| +3 tuples touched + + ING_db: +* + +.DE +Beachten sie, dass "Zeilendruckerpapier" doppelt vorkommt. +Schauen sie sich schliesslich die Query an. +Sie bemerken, dass die Dom\o'a"'ne "tnum" +sowohl in der Relation +"teile", als auch in "lieferung" vorkommt. +Mit der Aussage "t.tnum = l.tnum" verbinden wir logisch +die beiden Relationen. +.LP +Um alle Lieferer, die die Zentraleinheit +liefern, zu finden, +folgende Unterst\o'u"'tzung. +Wir wissen, wie wir nach "l.lnum" recherchieren. +Wir m\o'o"'chten aber nur jene "l.lnum"'s wissen, wo die korrespondierende +"l.tnum" gleich der Teile-Nummer der Zentraleinheit +ist. +.LP +Wenn wir den "t.tname" finden, der gleich "Zentraleinheit" +ist, dann haben wir die korrekte Teile-Nummer "t.tnum". +Schliesslich m\o'o"'chten wir "l.tnum = t.tnum", +die Query lautet: +.DS L + +* retrieve (l.lnum) where +* l.tnum = t.tnum and t.tname = "Zentraleinheit" +* \eg + +I N G - d b . . . + +|lnum | +|------| +| 475| +| 475| +| 241| +|------| +3 tuples touched + + ING_db: +* + +.DE +Wir wollen die Relationen "teile" und "lieferung" +verlassen und etwas anderes probieren. +Zuerst k\o'o"'nnen wir feststellen, welche anderen +Relationen die Datenbank besitzt, wenn wir eingeben: +.DS L + +* help \eg +I N G - d b . . . +help \eg +K1630 / EVK Olbernhau - k 1630 / DBA ing_db +DB nicht parallel verwendbar +keine QRYMOD-Unterstuetzung +Seitengroesse 1024 Byte + + Relation Besitzer Typ +---------------------------------------------- + attribute ing_db Systemkatalog + relation ing_db Systemkatalog + indexes ing_db Systemkatalog + integrities ing_db Systemkatalog + lager ing_db Systemkatalog + personal ing_db Nutzerkatalog + lieferant ing_db Systemkatalog + abt ing_db Systemkatalog + teile ing_db Nutzerkatalog + artikel ing_db Systemkatalog + protect ing_db Systemkatalog + lieferung ing_db Nutzerkatalog + tree ing_db Systemkatalog +---------------------------------------------- + +ING-db: +* + +.DE +Schauen wir uns die Relation "personal" an. +Sofern wir nichts \o'u"'ber die Relation wissen, +k\o'o"'nnen wir das "help"-Kommando nutzen, um etwas +dar\o'u"'ber zu erfahren. +Geben sie ein: +.DS L + +* help personal +* \eg + +I N G - d b . . . + +relation: personal +--------- +Besitzer: ing_db +Tupellaenge: 30 +Verfallsdatum: Tue Apr 26 11:01:30 1988 +Tupelanzahl: 25 +Speicherstruktur: HEAP +Relationentyp: Nutzerrelation + + Domaenenname Typ Laenge Schluessel. + ---------------------------------------- + num i 2 + name c 20 + gehalt i 2 + leiter i 2 + gebdat i 2 + einstdat i 2 + ---------------------------------------- + +ING_db: +* + +.DE +Das "help"-Kommando listet \o'U"'bersichtsinformationen +zur Relation "personal" aus, +weiterhin zu jedem Attribut, seinem +Typ und seiner L\o'a"'nge. +.LP +\*(yy\ 6.3 unterst\o'u"'tzt drei Datentypen: Integerzahlen, +Gleitkommazahlen und Zeichenketten. +Zeichenketten-Dom\o'a"'nen k\o'o"'nnen von 1 bis 255 Zeichen +lang sein. +Integer-Dom\o'a"'nen k\o'o"'nnen 1, 2, oder 4 Bytes lang sein. +Das bedeutet, dass Integerzahlen einen Wertebereich von +127, \%32767 und \%2147483647 maximal annehmen k\o'o"'nnen. +Gleitkommazahlen k\o'o"'nnen entweder 4 oder 8 Bytes lang sein. +Beide erhalten einen Maximalwert von \o'u"'ber 10**38; +mit 7 oder 17 Ziffern genauer Abbildung. +.LP +Um alle Dom\o'a"'nen anzusehen, k\o'o"'nnen wir das "print"-Kommando +oder das "retrieve"-Kommando nutzen +und geben jede Dom\o'a"'ne in der "target_list" an. +\*(yy\ 6.3 verschafft uns einen Weg, mit wenig Arbeitsaufwand, +das zu realisieren. +Versuchen sie folgendes: +.DS L + +* range of p is personal +* retrieve (p.all) +* \eg + +I N G - d b . . . + +|num |name |gehalt|leiter|gebdat|einstd| +|-------------------------------------------------------| +| 157|Schmidt, Petra | 1200| 199| 1940| 1960| +| 1110|Kayser, Helmut | 600| 33| 1952| 1973| +| 35|Loda, Dieter | 500| 32| 1952| 1974| +| 129|Thoms, Rolf | 1000| 199| 1941| 1962| +| 13|Wunsch, Peter-Paul | 900| 199| 1928| 1958| +| 215|Mueller, Ernst | 700| 10| 1950| 1971| +| 55|Malter, Juergen | 1200| 199| 1920| 1969| +| 26|Schneider, Peter | 1300| 199| 1930| 1970| +| 98|Weise, Juergen | 900| 199| 1935| 1969| +| 32|Heine, Rolf | 905| 199| 1929| 1967| +| 33|Ernst, Eva | 1010| 199| 1931| 1963| +| 199|Gruene, Peter | 1700| 0| 1920| 1952| +| 4901|Baum, Klaus | 837| 32| 1956| 1975| +| 843|Schmidt, Hermann | 1120| 26| 1936| 1956| +| 2398|Warnke, Peter | 788| 26| 1940| 1959| +| 1639|Maerz, Udo | 1116| 55| 1947| 1970| +| 5119|Mueller, Petra | 1362| 55| 1939| 1963| +| 37|Neumann, Inge | 1198| 26| 1950| 1974| +| 5219|Weber, Franz | 1337| 33| 1944| 1959| +| 1523|Zeidler, Fritz | 1686| 129| 1928| 1949| +| 430|Moser, Otto | 1567| 129| 1938| 1959| +| 994|Schulze, Ernst | 1564| 129| 1944| 1970| +| 1330|Fleischer, Karl | 877| 13| 1952| 1971| +| 10|Rose, Peter | 1590| 199| 1927| 1953| +| 11|Rose, Petra | 1206| 0| 1931| 1951| +|-------------------------------------------------------| +25 tuples touched + +ING_db: +* + +.DE +"all" ist ein Schl\o'u"'sselwort, das bei +\*(yy\ 6.3 angewendet wird, um alle Dom\o'a"'nen zu erhalten. +F\o'u"'r die Dom\o'a"'nen ist eine besondere Reihenfolge +nicht sichergestellt. +Die vorhergehende Query ist \o'a"'quivalent zu: +.DS L + + range of p is personal + retrieve (p.num, p.name, p.gehalt, p.leiter + p.gebdat, p.einstdat) + +.DE +Wir wollen nach dem Gehalt von Peter Wunsch recherchieren. +An diesem Punkt ist es g\o'u"'nstig, +\o'u"'ber Gross- und Kleinbuchstaben zu verf\o'u"'gen. +Wenn sie an einem Grossbuchstaben-Terminal arbeiten, +geben sie einen einfachen "\\" vor jenen Buchstaben, die +sie in Grossbuchstaben umwandeln wollen. +Damit m\o'u"'sste an einem Grossbuchstaben-Terminal +"\\WUNSCH, \\PETER" eingegeben werden. +Wenn sie an einem Gross-/Kleinbuchstaben-Terminal +arbeiten, benutzen sie die Umschalttaste (u.U. auch SHIFT) +um Grossbuchstaben zu schreiben. +.LP +Starten sie die Query: +.DS L + +* retrieve (p.name,p.gehalt) +* where p.name = "Wunsch, Peter" +* \eg + +I N G - d b . . . + + +|name |gehalt| +|---------------------------| +|---------------------------| + +ING_db: +* + +.DE +Das Ergebnis ist leer. +Es gibt keinen "p.name", der die Qualifikation erf\o'u"'llt. +Das befremdet, weil wir wissen, dass es einen Peter Wunsch gibt. +Jedoch weiss \*(yy\ 6.3 nicht, dass "Peter-Paul" +und "Peter" semantisch das Gleiche ist. +.LP +Um in dieser Situation die korrekte Antwort +zu erhalten, m\o'u"'ssen sie die speziellen +"pattern matching"-Zeichen (Vergleichsmuster), +die \*(yy\ 6.3 bereith\o'a"'lt, verwenden. +Ein solches Zeichen ist "*". +Es ist irgendeiner Zeichenkette von 0 bis mehreren Zeichen +ebenb\o'u"'rtig. +Versuchen sie es: +.DS L + +* retrieve (p.name,p.gehalt) +* where p.name = "Wunsch, P*" +* \eg + +I N G - d b . . . + + +|name |gehalt| +|---------------------------| +|Wunsch, Peter-Paul | 900| +|---------------------------| +1 tuples touched + +ING_db: +* + +.DE +.LP +Probieren wir damit etwas anderes. +.DS L + +* retrieve (p.name, p.gehalt) where p.name = "Rose, P*" +* \eg + +I N G - d b . . . + +|name |gehalt| +|---------------------------| +|Rose, Peter | 1590| +|Rose, Petra | 1206| +|---------------------------| +2 tuples touched + +ING-db: +* +.DE +Im ersten Fall ersetzt "*" die Zeichenkette "eter" und +im zweiten Fall "etra". +.LP +Hier ein anderes Beispiel. +Finden sie die Geh\o'a"'lter der +Personen, deren Vorname "Peter" ist: +.DS L + +* retrieve (p.name,p.gehalt) +* where p.name = "*, Peter*" +* \eg + +I N G - d b . . . + +|name |gehalt| +|---------------------------| +|Wunsch, Peter-Paul | 900| +|Schneider, Peter | 1300| +|Gruene, Peter | 1700| +|Warnke, Peter | 788| +|Rose, Peter | 1590| +|---------------------------| +5 tuples touched + + ING_db: +* + +.DE +Beachten sie, wenn wir nach p.name = "*, Peter" +gefragt h\o'a"'tten, w\o'a"'re das 1. Tupel nicht +ausgew\o'a"'hlt worden. +Ebenso ignoriert +\*(yy\ 6.3 "blanks" +in irgendeinem Zeichenkettenvergleich, +egal ob sie "pattern matching" anwenden oder nicht. +Das bedeutet, dass die folgenden +Varianten alle das gleiche Ergebnis bringen: +.DS L + + p.name = "Rose,Peter" + p.name = "Rose, Peter " + p.name = "R o s e,Peter" + +.DE +Einzelne Zeichen oder Bereiche von Zeichen k\o'o"'nnen +in eckige Klammern ([]) eingeschlossen werden. +Zum Beispiel, finde alle Personen, deren Namen mit +"B" bis "F" beginnen: +.DS L + +* retrieve (p.name,p.gehalt) +* where p.name = "[B-F]*" +* \eg + +I N G - d b . . . + +|name |gehalt| +|---------------------------| +|Ernst, Eva | 1010| +|Baum, Klaus | 837| +|Fleischer, Karl | 877| +|---------------------------| +3 tuples touched + +ING_db: +* + +.DE +Beachten sie, dass die letzte Query auch auf einem +anderen Weg realisiert werden k\o'o"'nnte: +.DS L + +* retrieve (p.name,p.gehalt) +* where p.name >"A*" and p.name <"G*" +* \eg + +I N G - d b . . . + +|name |gehalt| +|---------------------------| +|Ernst, Eva | 1010| +|Baum, Klaus | 837| +|Fleischer, Karl | 877| +|---------------------------| +3 tuples touched + + ING_db: +* + +.DE +Die beiden Ergebnisse sind identisch; +jedoch ist der zweite Weg in der Ausf\o'u"'hrung +f\o'u"'r \*(yy\ 6.3 effizienter. +.LP +Es gibt drei Typen von "pattern matching"-Konstruktionen. +Alle drei Typen k\o'o"'nnen in einer Kombination f\o'u"'r +Zeichenketten-Vergleiche genutzt werden. +Das sind: + +.IP * 5 +\o'A"'quivalent zu einer beliebig langen Zeichenkette; +.IP ? 5 +\o'A"'quivalent zu einem Zeichen (nicht "blank") +.IP [] 5 +Kann irgendein Zeichen \o'u"'berdecken, das in +Klammern eingeschlossen ist. +Wenn zwei Zeichen durch Binde\%strich (-) getrennt werden, +dann wird jedes Zeichen, das zwischen +beiden in der alphabetischen Folge stehen w\o'u"'rde +\o'u"'berdeckt. +.RE +.LP +Die spezielle Bedeutung der "pattern matching"-Zeichen +kann durch die Kaschierung +mit "\\" aufgehoben werden. +Damit referenziert "\\*" nur das Zeichen +"*". +.LP +Wir wenden uns nun den Aggregat-Operatoren, +die \*(yy\ 6.3 unterst\o'u"'tzt, zu. +Sie bef\o'a"'higen den Nutzer, Berechnungen auf +Dom\o'a"'nen einer Relation vorzunehmen. +Zum Beispiel ist einer dieser Aggregat-Operatoren Durchschnitt (avg) +="average". +Um das durchschnittliche Gehalt f\o'u"'r alle +Angestellten zu berechnen, geben wir ein: +.DS L + +* retrieve (dgehalt=avg(p.gehalt)) +* \eg + +I N G - d b . . . + + +|dgehalt | +|----------| +| 1126.520| +|----------| +1 tuples touched + +ING_db: +* + +.DE +Der Name "dgehalt" +ist willk\o'u"'rlich, aber notwendig; +\*(yy\ 6.3 ben\o'o"'tigt +.ft B +einen +.ft R +Namen +f\o'u"'r irgend\%einen Ausdruck in der "target_list" +(anders als f\o'u"'r eine einfache Dom\o'a"'ne). +.LP +Wir k\o'o"'nnen auch das niedrigste (Minimum) und h\o'o"'chste (Ma\%ximum) +Gehalt finden: +.DS L + +* retrieve (mingeh=min(p.gehalt),maxgeh=max(p.gehalt)) +* \eg + +I N G - d b . . . + + +|mingeh|maxgeh| +|-------------| +| 500| 1700| +|-------------| +1 tuples touched + +ING_db: +* + +.DE +Wenn wir die Namen der Angestellten wissen wollen, die das +niedrigste und h\o'o"'chste Gehalt beziehen, dann +m\o'u"'sste die Query lauten: +.DS L + +* retrieve (p.name, p.gehalt) +* where p.gehalt = min(p.gehalt) or p.gehalt = max(p.gehalt) +* \eg + +I N G - d b . . . + +|name |gehalt| +|---------------------------| +|Loda, Dieter | 500| +|Gruene, Peter | 1700| +|---------------------------| +2 tuples touched + +ING_db: +* + +.DE +\*(yy\ 6.3 unterst\o'u"'tzt folgende Aggregat-Operatoren: +.DS L + + count Z\o'a"'hle Tupel + min Minimum der Dom\o'a"'ne + max Maximum der Dom\o'a"'ne + avg Berechne Durchschnitt + sum Summiere Tupel entsprechend Dom\o'a"'ne + any logischer Wert entsprechend Qualifikation + +.DE +Wir wollen jetzt eine Query vorstellen, die je Angestelltem +das Durch\%schnittsgehalt \o'u"'ber alle Angestellten +auslistet: +.DS L + +* retrieve (p.name,pergeh=avg(p.gehalt)) +* \eg + +I N G - d b . . . + +|name |pergeh | +|-------------------------------| +|Schmidt, Petra | 1126.520| +|Kayser, Helmut | 1126.520| +|Loda, Dieter | 1126.520| +|Thoms, Rolf | 1126.520| +|Wunsch, Peter-Paul | 1126.520| +|Mueller, Ernst | 1126.520| +|Malter, Juergen | 1126.520| +|Schneider, Peter | 1126.520| +|Weise, Juergen | 1126.520| +|Heine, Rolf | 1126.520| +|Ernst, Eva | 1126.520| +|Gruene, Peter | 1126.520| +|Baum, Klaus | 1126.520| +|Schmidt, Hermann | 1126.520| +|Warnke, Peter | 1126.520| +|Maerz, Udo | 1126.520| +|Mueller, Petra | 1126.520| +|Neumann, Inge | 1126.520| +|Weber, Franz | 1126.520| +|Zeidler, Fritz | 1126.520| +|Moser, Otto | 1126.520| +|Schulze, Ernst | 1126.520| +|Fleischer, Karl | 1126.520| +|Rose, Peter | 1126.520| +|Rose, Petra | 1126.520| +|-------------------------------| +25 tuples touched +ING_db: +* + +.DE +Ein Aggregat-Operator erzeugt immer einen einfachen Wert. +Um die letzte Query auszuf\o'u"'hren, bildet +\*(yy\ 6.3 das Durch\%schnittsgehalt zun\o'a"'chst zu jedem +Namen ("p.name") ab. +.LP +Aggregat-Operatoren k\o'o"'nnen ihre eigene Qualifikation haben. +Zum Beispiel k\o'o"'nnen wir eine Liste \o'u"'ber alle +Angestellten herstellen und das Durchschnittsgehalt f\o'u"'r +alle Angestellten \o'u"'ber 50 (Jahre) berechnen +und eintragen: +.DS L + +* retrieve (p.name,pergeh= +* avg(p.gehalt where 1985-p.gebdat > 50)) +* \eg + +I N G - d b . . . + +|name |pergeh | +|-------------------------------| +|Schmidt, Petra | 1277.444| +|Kayser, Helmut | 1277.444| +|Loda, Dieter | 1277.444| +|Thoms, Rolf | 1277.444| +|Wunsch, Peter-Paul | 1277.444| +|Mueller, Ernst | 1277.444| +|Malter, Juergen | 1277.444| +|Schneider, Peter | 1277.444| +|Weise, Juergen | 1277.444| +|Heine, Rolf | 1277.444| +|Ernst, Eva | 1277.444| +|Gruene, Peter | 1277.444| +|Baum, Klaus | 1277.444| +|Schmidt, Hermann | 1277.444| +|Warnke, Peter | 1277.444| +|Maerz, Udo | 1277.444| +|Mueller, Petra | 1277.444| +|Neumann, Inge | 1277.444| +|Weber, Franz | 1277.444| +|Zeidler, Fritz | 1277.444| +|Moser, Otto | 1277.444| +|Schulze, Ernst | 1277.444| +|Fleischer, Karl | 1277.444| +|Rose, Peter | 1277.444| +|Rose, Petra | 1277.444| +|-------------------------------| +25 tuples touched + +ING_db: +* + +.DE +Im Gegensatz zur vorhergehenden Query folgendes Beispiel. +Wir wollen die Namen derjenigen Angestellten \o'u"'ber f\o'u"'nfzig +suchen und das Durchschnittsgehalt f\o'u"'r alle berechnen. +.DS L + +* retrieve (p.name,pergeh=avg(p.gehalt)) +* where 1985-p.gebdat > 50 +* \eg + +I N G - d b . . . + +|name |pergeh | +|-------------------------------| +|Wunsch, Peter-Paul | 1126.520| +|Malter, Juergen | 1126.520| +|Schneider, Peter | 1126.520| +|Heine, Rolf | 1126.520| +|Ernst, Eva | 1126.520| +|Gruene, Peter | 1126.520| +|Zeidler, Fritz | 1126.520| +|Rose, Peter | 1126.520| +|Rose, Petra | 1126.520| +|-------------------------------| +9 tuples touched + +ING_db: +* + +.DE +Es gibt einen bedeutenden Unterschied zwischen den beiden +letzten Queries. +Der Aggregat-Operator ist vollst\o'a"'ndig in sich abgeschlossen. +Er wird nicht durch die Qualifikation der +Query als Ganzes beeinflusst. +.LP +Im ersten Fall wurde der Durchschnitt nur f\o'u"'r +die Angestellten \o'u"'ber f\o'u"'nfzig berechnet und +\o'u"'ber alle Angestellten durchsucht. +Im zweiten Fall jedoch, wurde der Durchschnitt f\o'u"'r alle +Angestellten berechnet, aber nur f\o'u"'r die Angestellten +\o'u"'ber f\o'u"'nfzig eingetragen. +.LP +Wenn wir eine Liste aller Angestellten \o'u"'ber 50 zusammen +mit dem durchschnittlichen Gehalt w\o'u"'nschen, +kombinieren wir die vorhergehenden zwei Queries zu einer. +Diese Query k\o'o"'nnte sein: + +.DS L +* retrieve (p.name, pergeh= +* avg(p.gehalt where 1985 - p.gebdat > 50)) +* where 1985 - p.gebdat > 50 +* \eg + +I N G - d b . . . + +|name |pergeh | +|-------------------------------| +|Wunsch, Peter-Paul | 1277.444| +|Malter, Juergen | 1277.444| +|Schneider, Peter | 1277.444| +|Heine, Rolf | 1277.444| +|Ernst, Eva | 1277.444| +|Gruene, Peter | 1277.444| +|Zeidler, Fritz | 1277.444| +|Rose, Peter | 1277.444| +|Rose, Petra | 1277.444| +|-------------------------------| +9 tuples touched + +ING_db: +* + +.DE +Es ist manchmal gebr\o'a"'uchlich, dass doppelte Werte gel\o'o"'scht +werden, bevor ein Aggregat-Operator ausgef\o'u"'hrt wird. +Wenn sie beispielsweise wissen m\o'o"'chten, wieviele Leiter +("leiter") es gibt, wird die +folgende Query die richtige Antwort geben: + +.DS L +* retrieve (chefs = count(p.leiter)) +* \eg + +I N G - d b . . . + + +|chefs | +|-------------| +| 25| +|-------------| +1 tuples touched + +ING_db: +* + +.DE +Beachten sie, dass "count" mitteilt, wieviele Tupel es in +"personal" gibt. +Was wir wissen wollten, war, +wieviele Leiter ("p.leiter") es gibt. +.LP +\*(yy\ 6.3 stellt drei spezielle Formen von +Aggregat-Operatoren zur Verf\o'u"'gung. + +.DS L + countu z\o'a"'hlt unikate (einmalig vorkommende) + Werte + avgu Durchschnitt \o'u"'ber unikate Werte + sumu summiert unikate Werte +.DE +.LP +Interessanterweise werden "minu", "maxu" und "anyu" nicht +ben\o'o"'tigt. +Ihre Werte sind die gleichen, unabh\o'a"'ngig davon, ob +doppelte Tupel vorkommen oder nicht. +.LP +Die korrekte Query, um die Anzahl der "leiter" zu finden, ist: + +.DS L +* retrieve (chefs=countu(p.leiter)) +* \eg + +I N G - d b . . . + + +|chefs | +|-------------| +| 9| +|-------------| +1 tuples touched + +ING_db: +* + +.DE +Eine andere Erleichterung, die \*(yy\ 6.3 unterst\o'u"'tzt, sind die +sogenannten Aggregat-Funktionen. +Aggregat-Funktionen gruppieren Daten +in Kategorien und unterst\o'u"'tzen separate Zusammenfassungen +zu jeder Kategorie. +.LP +Was ist zum Beispiel, wenn +wir f\o'u"'r die Angestellten, die zum selben +Leiter geh\o'o"'ren, das Durchschnittsgehalt ermitteln wollen? +Die Query w\o'u"'rde sein: +.DS L + +* retrieve (p.name,leiteravg=avg(p.gehalt by p.leiter)) +* \eg + +I N G - d b . . . + +|name |leiteravg | +|-------------------------------| +|Mueller, Ernst | 700.000| +|Gruene, Peter | 1453.000| +|Rose, Petra | 1453.000| +|Loda, Dieter | 668.500| +|Baum, Klaus | 668.500| +|Kayser, Helmut | 968.500| +|Weber, Franz | 968.500| +|Fleischer, Karl | 877.000| +|Maerz, Udo | 1239.000| +|Mueller, Petra | 1239.000| +|Schmidt, Hermann | 1035.333| +|Warnke, Peter | 1035.333| +|Neumann, Inge | 1035.333| +|Schmidt, Petra | 1111.667| +|Thoms, Rolf | 1111.667| +|Wunsch, Peter-Paul | 1111.667| +|Malter, Juergen | 1111.667| +|Schneider, Peter | 1111.667| +|Weise, Juergen | 1111.667| +|Heine, Rolf | 1111.667| +|Ernst, Eva | 1111.667| +|Rose, Peter | 1111.667| +|Zeidler, Fritz | 1605.667| +|Moser, Otto | 1605.667| +|Schulze, Ernst | 1605.667| +|-------------------------------| +25 tuples touched + +ING_db: +* + +.DE +Die erste Person ist allein und +ihr Einkommen betr\o'a"'gt 700.00 M. +Die n\o'a"'chsten zwei Personen haben den selben Leiter und +das Durchschnittseinkommen betr\o'a"'gt 1453.00 usw. +.LP +Noch einmal, wenn wir die gleiche Liste eben +f\o'u"'r jene Angestellten \o'u"'ber 50 sehen m\o'o"'chten: +.DS L + +* retrieve (p.name,leiteravg=avg(p.gehalt by p.leiter)) +* where 1985-p.gebdat > 50 +* \eg + +I N G - d b . . . + +|name |leiteravg | +|-------------------------------| +|Gruene, Peter | 1453.000| +|Rose Petra | 1453.000| +|Wunsch, Peter-Paul | 1111.667| +|Malter, Juergen | 1111.667| +|Schneider, Peter | 1111.667| +|Heine, Rolf | 1111.667| +|Ernst, Eva | 1111.667| +|Rose, Peter | 1111.667| +|Zeidler, Fritz | 1605.667| +|-------------------------------| +9 tuples touched + +ING_db: +* + +.DE +Aggregat-Funktionen (im Gegensatz zu Aggregat-Operatoren) sind +nicht vollst\o'a"'ndig in sich abgeschlossen. +Die Dom\o'a"'nen, auf die die Daten gruppiert sind +(, durch die sogenannte "by_list"), sind logisch +mit den restlichen Dom\o'a"'nen der Query +verkn\o'u"'pft. +.LP +In diesem letzten Beispiel referenziert "p.leiter" in +der "by_list" zu den selben Tupeln wie +"p.name" in der "target_list". +.LP +Wenn wir das Durchschnittsgehalt nach Leitern nur f\o'u"'r +die Leiter 33 und 199 berechnen wollen, +erg\o'a"'be sich diese Query: +.DS L + +* retrieve (p.name,leiteravg= +* avg(p.gehalt by p.leiter)) +* where p.leiter = 199 or p.leiter = 33 +* \eg + +I N G - d b . . . + +|name |leiteravg | +|-------------------------------| +|Kayser, Helmut | 968.500| +|Weber, Franz | 968.500| +|Schmidt, Petra | 1111.667| +|Thoms, Rolf | 1111.667| +|Wunsch, Peter-Paul | 1111.667| +|Malter, Juergen | 1111.667| +|Schneider, Peter | 1111.667| +|Weise, Juergen | 1111.667| +|Heine, Rolf | 1111.667| +|Ernst, Eva | 1111.667| +|Rose, Peter | 1111.667| +|-------------------------------| +11 tuples touched + + +ING_db: +* + +.DE +Nehmen wir an, wir wollen herausfinden, +wie viele Personen bei jedem Leiter +arbeiten und weiterhin wollen wir nur +die Personen einbeziehen, die +bereits vor 1970 dort arbeiteten. +.DS L + +* retrieve (p.leiter,mitarb=count(p.name by p.leiter where +* p.einstdat < 1970)) +* \eg + +I N G - d b . . . + + +|leiter|mitarb | +|--------------------| +| 0| 2| +| 10| 0| +| 13| 0| +| 26| 2| +| 32| 0| +| 33| 2| +| 55| 1| +| 129| 2| +| 199| 8| +|--------------------| +9 tuples touched + +ING_db: +* + +.DE +Beachten sie, dass die Leiter 32, 10 und 13 keine +Angestellten haben, die vor 1970 +dort angefangen haben. +Jetzt nehmen wir an, dass wir das Durchschnittsgehalt +f\o'u"'r diese Angestellten wissen wollen. +\o'A"'ndern sie einfach "count" in "avg" und starten sie die Query. +.DS L +* retrieve (p.leiter,mitarb=avg(p.gehalt by p.leiter where +* p.einstdat < 1970)) +* \eg + +I N G - d b . . . + +|leiter|mitarb | +|-----------------| +| 0| 1453.000| +| 10| 0.000| +| 13| 0.000| +| 26| 954.000| +| 32| 0.000| +| 33| 1337.000| +| 55| 1362.000| +| 129| 1626.500| +| 199| 1088.125| +|-----------------| +9 tuples touched + +ING_db: +* + +.DE +Beachten sie, was \*(yy\ 6.3 f\o'u"'r die +Leiter 32, 10 und 13 macht. +Das Durchschnitsgehalt f\o'u"'r diese Angestellten +ist tats\o'a"'chlich nicht +definiert, weil es keine Angestellten gibt, die vor 1970 +angefangen haben. +\*(yy\ 6.3 wandelt undefinierte Werte immer +in Null. +.LP +Wenn sie die Nullwerte von der Ausgabe entfernen wollen, +kann das durch Hinzuf\o'u"'gung einer Qualifikation +zur Query erfolgen. +Die folgende Query wird nur die Durchschnittsgeh\o'a"'lter +finden, die einen Wert gr\o'o"'sser Null haben. +.DS L + +* retrieve (p.leiter,mitarb=avg(p.gehalt by p.leiter where +* p.einstdat < 1970)) +* where avg(p.gehalt by p.leiter where p.einstdat < 1970) > 0 +* \eg + +I N G - d b . . . + +|leiter|mitarb | +|-----------------| +| 0| 1453.000| +| 26| 954.000| +| 33| 1337.000| +| 55| 1362.000| +| 129| 1626.500| +| 199| 1088.125| +|-----------------| +6 tuples touched + +ING_db: +* + +.DE +Bis jetzt haben wir die Rechercheergebnisse direkt auf dem Terminal +ausgegeben. +Sie k\o'o"'nnen die Ergebnisse auch in eine neue Relation +retten bzw. sichern. +Das wird realisiert, wenn sie sagen: +.DS L + + retrieve into steigerung ( ... ) + where . . . + +.DE +Die Regeln sind genau die gleichen, als w\o'u"'rden sie \o'u"'ber +das Terminal recherchieren. +\*(yy\ 6.3 gr\o'u"'ndet die neue Relation mit den +korrekten Dom\o'a"'nen und gibt die Ergebnisse +der Query in diese Relation. +.LP +Als Beispiel gr\o'u"'nden +wir eine neue Relation "steigerung", die nur die Angestellten +enth\o'a"'lt, die mehr als 1000 M verdienen: +.DS L + +* retrieve into steigerung (p.all) +* where p.gehalt > 1000 +* print steigerung +* \eg + +I N G - d b . . . + +Relation: steigerung +K 1630 \*(yy\ EVK Olbernhau - K1630 + +|num |name |gehalt|leiter|gebdat|einstd| +|-------------------------------------------------------| +| 10|Rose, Peter | 1590| 199| 1927| 1953| +| 11|Rose, Petra | 1206| 0| 1931| 1951| +| 26|Schneider, Peter | 1300| 199| 1930| 1970| +| 33|Ernst, Eva | 1010| 199| 1931| 1963| +| 37|Neumann, Inge | 1198| 26| 1950| 1974| +| 55|Malter, Juergen | 1200| 199| 1920| 1969| +| 157|Schmidt, Petra | 1200| 199| 1940| 1960| +| 199|Gruene, Peter | 1700| 0| 1920| 1952| +| 430|Moser, Otto | 1567| 129| 1938| 1959| +| 843|Schmidt, Hermann | 1120| 26| 1936| 1956| +| 994|Schulze, Ernst | 1564| 129| 1944| 1970| +| 1523|Zeidler, Fritz | 1686| 129| 1928| 1949| +| 1639|Maerz, Udo | 1116| 55| 1947| 1970| +| 5119|Mueller, Petra | 1362| 55| 1939| 1963| +| 5219|Weber, Franz | 1337| 33| 1944| 1959| +|-------------------------------------------------------| +15 tuples touched + +ING_db: +* + +.DE +Durch ein "retrieve into" wird nichts gedruckt bzw. ausgegeben. +Wir haben ein "print"-Kommando eingef\o'u"'gt, um +die Ergebnisse zu sehen. +Die Relation, die durch ein "retrieve into" benannt wird, +darf vorher nicht existieren. +Wenn wir beispielsweise versuchen, +die selbe Query zu wiederholen: +.DS L + +* \eg + +I N G - d b . . . + +2135: line 1, You cannot duplicate the name of an +existing relation(steigerung) + +ING_db: +* + +.DE +.LP +Es gibt zwei spezielle Merkmale zu "retrieve into". +Erstens wird die Relation automatisch sortiert +und doppelte Tupel gel\o'o"'scht. +Zweitens wird die Relation Bestandteil der Datenbank +und sie werden ihr Eigent\o'u"'mer. +Wenn sie nicht wollen, dass sie erhalten bleibt, denken sie daran, +dass sie gel\o'o"'scht werden muss. +Der Ablauf zum L\o'o"'schen einer Relation wird +etwas sp\o'a"'ter erl\o'a"'utert. +.LP +Bisher haben wir nur Daten gesucht, aber niemals +welche ge\o'a"'ndert. +\*(yy\ 6.3 unterst\o'u"'tzt drei Aktualisierungskommandos: +"append", "replace" und "delete". +.LP +Beispielsweise wollen wir "Heinz Heinrich" zur +Liste der Angestellten auf "steigerung" hinzuf\o'u"'gen und ihm +ein Gehalt von 1000 M zuordnen: +.DS L + +* append to steigerung(name = "Heinrich, Heinz",gehalt = 1000) +* \eg + +I N G - d b . . . + +1 tuples touched + +ING_db: +* + +.DE +Beachten sie, dass wir nur zwei Werte spezifizierten, +obwohl "steigerung" aus sechs Dom\o'a"'nen besteht. +Das ist sch\o'o"'n! +\*(yy\ 6.3 setzt automatisch numerische Dom\o'a"'nen +auf Null und Zeichenkettendom\o'a"'nen auf "blank", +wenn sie nicht spezifiziert wurden. +.LP +Beachten sie auch, dass \*(yy\ 6.3 nach der Query nichts +ausgibt. +Das trifft f\o'u"'r alle Aktualisierungskommandos zu. +.LP +Wir wollen jedem in "steigerung" 10% Gehaltszuschlag geben. +Um das zu tun, ersetzen wir "gehalt" durch das Produkt aus +1,1 mal Wert. +Geben sie die Query ein: +.DS L + +* range of s is steigerung +* replace s(gehalt = s.gehalt * 1.1) +* \eg + +I N G - d b . . . + +16 tuples touched + +ING_db: +* + +.DE +W\o'a"'hrend das "append"-Kommando erwartet, dass sie einen +Relationen-Name (d.h. "append to steigerung") angeben, erwartet das +"replace"- und "delete"-Kommando eine +Tupel-Variable. +Bemerken sie, dass das Kommando lautet: +.DS L + + replace s ( . . . ) + where . . . + +und nicht: + + replace steigerung ( . . . ) + where . . . + +.DE +Geben sie die Ergebnisse der beiden +letzten Aktualisierungen aus: +.DS L + +* print steigerung +* \eg + +I N G - d b . . . + + +Relation: steigerung + + +|num |name |gehalt|leiter|gebdat|einstd| +|-------------------------------------------------------| +| 10|Rose, Peter | 1749| 199| 1927| 1953| +| 11|Rose, Petra | 1326| 0| 1931| 1951| +| 26|Schneider, Peter | 1430| 199| 1930| 1970| +| 33|Ernst, Eva | 1111| 199| 1931| 1963| +| 37|Neumann, Inge | 1317| 26| 1950| 1974| +| 55|Malter, Juergen | 1320| 199| 1920| 1969| +| 157|Schmidt, Petra | 1320| 199| 1940| 1960| +| 199|Gruene, Peter | 1870| 0| 1920| 1952| +| 430|Moser, Otto | 1723| 129| 1938| 1959| +| 843|Schmidt, Hermann | 1232| 26| 1936| 1956| +| 994|Schulze, Ernst | 1720| 129| 1944| 1970| +| 1523|Zeidler, Fritz | 1854| 129| 1928| 1949| +| 1639|Maerz, Udo | 1227| 55| 1947| 1970| +| 5119|Mueller, Petra | 1498| 55| 1939| 1963| +| 5219|Weber, Franz | 1470| 33| 1944| 1959| +| 0|Heinrich, Heinz | 1100| 0| 0| 0| +|-------------------------------------------------------| + + +ING_db: +* + +.DE +Nun wollen wir denjenigen, der am wenigsten verdient, entlassen: +.DS L + +* delete s where s.gehalt = min(s.gehalt) \eg +I N G - d b . . . + +1 tuples touched + +ING_db: +* + +.DE +Beachten sie, dass das "delete"-Kommando eine +Tupel-Variable (d.h. "delete s") erwartet +und keinen Relationen-Name. +.LP +Was ist, wenn wir wissen wollen, wer mehr als +Otto Moser verdient? Mit Heinz Heinrich k\o'o"'nnen wir nicht +mehr arbeiten, den haben wir entlassen. +Die Query, die das erledigt, ist recht schwierig. +Zuerst ben\o'o"'tigen wir eine neue Tupel-Variable, genannt +"o", die auf auf dem Bereich "steigerung" liegt +und benutzt wird, um Otto zu referenzieren. +"o.name" muss auf "Moser, Otto" gesetzt werden. +Danach m\o'u"'ssen wir eine Tupel-Variable "s" +nutzen, die die gesamte Relation durchforscht. +Jedesmal, wenn wir "s.gehalt > o.gehalt" +finden, dann verdient "s.name" mehr als Otto. +.LP +Die vollst\o'a"'ndige Query ist: +.DS L + +* range of o is steigerung +* retrieve (s.name, sgeh=s.gehalt,ottogeh=o.gehalt) +* where s.gehalt > o.gehalt +* and o.name = "Moser, Otto" +* \eg + +I N G - d b . . . + +|name |sgeh |ottoge| +|----------------------------------| +|Rose, Peter | 1749| 1723| +|Gruene, Peter | 1870| 1723| +|Zeidler, Fritz | 1854| 1723| +|----------------------------------| +3 tuples touched + +ING_db: +* + +.DE +Wenn wir Otto Moser 50 M mehr geben wollen, als +irgendeinem anderen, dann muss die Query lauten: +.DS L + +* replace s(gehalt = max(s.gehalt) + 50) +* where s.name = "Moser, Otto" +* \eg + +I N G - d b . . . + + +ING_db: +* + +.DE +Schliesslich wollen wir noch eine Relation, +f\o'u"'r die sie Eigent\o'u"'mer sind, +l\o'o"'schen-geben sie das Kommando: +.DS L + +* destroy steigerung +* \eg + +I N G - d b . . . + +ING_db: +* + +.DE +Wir sind jetzt fertig und verlassen \*(yy\ 6.3. +Das kann durch Eingabe eines +"end-of-file" (CONTROL_c) +oder g\o'u"'nstiger durch Verwendung des "\\q"- +Kommandos erreicht werden: +.DS L + +* \eq +* ING-db Version 6.3/3 logout +K1630 / EVK Olbernhau - K1630 +Wed May 4 19:58:00 1988 +Auf Wiedersehen ing_db -- Kommen Sie bald wieder +.DE +.LP +Als "ing_db" wird immer der Nutzername eingetragen, ggfs. +aber eben auch ing_db. + + diff --git a/WEGA/contrib/ingres/dbs/ing_src/teil3/amxzip b/WEGA/contrib/ingres/dbs/ing_src/teil3/amxzip new file mode 100644 index 0000000..7ab4cb8 --- /dev/null +++ b/WEGA/contrib/ingres/dbs/ing_src/teil3/amxzip @@ -0,0 +1,1284 @@ +.so /z/ing_src/macdoc +.pn 320 +.NH 1 +.NH 1 +.NH 1 +.ds RH \f3AMX/ZIP\f1 +.ds RF \f3\*(xx\f1 +.ds LH Beispiele +.ds LF \*(vv +.ds CH - % - +.bp +.NH 2 +.ft B +Terminkontrolle ** +.ft R +.LP +.sp 10 +.NH 3 +.ft B +Vorbemerkung +.ft R +.LP +Um sich sinnvoll in ein \*(xx-System einzuordnen, +sollte das Prinzip des "Werkzeugkastens" auch in der +Anwenderebene durch\%ge\%standen werden - n\o'a"'mlich kleine Programme +mit exakt abgegrenzten Leistungen zu schaffen und diese +zu einem Paket verbinden. +Nachfolgend wird auszugsweise ein Projekt vorgestellt, +das die Nutzung von AMX und ZIP veranschaulicht. +.LP +Als Bedingungen seien gestellt: +.br +Die Terminkontrolle ist schirmorientiert zu l\o'o"'sen. +Bei Bedarf k\o'o"'nnen Protokolle gedruckt werden. +Die zu kontrollierende Einheit besteht aus einer +Basis-Massnahme und keiner oder beliebig vielen Festlegungen. +W\o'a"'hrend des Kontrollvorganges sollen die Basis-Massnahmen +gezeigt (entsprechend vorzugebender Eingrenzungen), +ge\o'a"'ndert oder als realisiert markiert werden - Festlegungen +sollen gezeigt, korrigiert, als realisiert markiert oder neu +hinzugef\o'u"'gt werden. Neben der M\o'o"'glichkeit \o'u"'ber +Zieltermine zu recherchieren, kann nach dem Kreis der, +f\o'u"'r die Reali\%sierung der Massnahme Verantwortlichen +(Gruppe oder Einzelperson) oder nach dem Kreis, der eine +Massnahme ausgel\o'o"'st hat (Gruppe oder Einzelperson) - gegen\o'u"'ber +dem der recherchierende Leiter also rechenschaftspflichtig ist - +eingegrenzt werden. Es existiert eine Nomenklatur, die Struktureinheiten +ordnet bzw. gruppiert. +.NH 3 +.ft B +Relationen +.ft R +.LP +Innerhalb der Datenbank +.ft B +terkon +.ft R +werden folgende Relationen verwendet: +.br +.ft B +basis +.ft R +enth\o'a"'lt die Basis-Massnahmen. +\o'U"'ber die Massnahme-Nummer +.ft B +mnr +.ft R +werden die dazugeh\o'o"'rigen Festlegungen identifiziert. +.ft B +vongrup +.ft R +gibt Auskunft, durch welche Struktureinheit (auch \o'u"'bergeordnete +Organe) die Massnahme veranlasst wurde (Gruppe), +.ft B +vonpart +.ft R +grenzt innerhalb der Gruppe auf einen konkreten Partner ein. +.ft B +angrup +.ft R +bzw. +.ft B +anpart +.ft R +geben an, wer die Massnahme verantwortlich zu realisieren hat (Gruppe bzw. +Partner). +.ft B +edat +.ft R +ist das Rechnerdatum, zu dem die Massnahme erfasst wurde und +.ft B +termin +.ft R +der vorgegebene Zieltermin. Die Angabe +.ft B +festanz +.ft R +gilt als Hinweis auf die aktuelle Anzahl von Festlegungen, +ist der Wert -1 sind alle Festlegungen realisiert (Hinweis +zum Austragen). +Der eigentliche Text wird vierzeilig in +.ft B +tx1..tx4 +.ft R +abgelegt. +.DS L + +Relation: basis +--------- P8000 / EVK Olbernhau +Besitzer: kodir +Tupellaenge: 218 +Verfallsdatum: Tue Jan 1 00:00:00 1991 +Tupelanzahl: 131 +Speicherstruktur: HEAP +Pages: 1 + 46 +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +-------------------------------------------- + mnr i 4 + edat i 4 + vongrup i 2 + vonpart i 2 + angrup i 2 + anpart i 2 + tx1 c 49 + tx2 c 49 + tx3 c 49 + tx4 c 49 + termin i 4 + festanz i 2 +-------------------------------------------- + +.DE +.ft B +festl +.ft R +enth\o'a"'lt die zur Basis-Massnahme geh\o'o"'rigen Festlegungen. +.ft B +fnr +.ft R +nummeriert innerhalb der Massnahme-Nummer, +.ft B +vgrup +.ft R +und +.ft B +vpart +.ft R +geben die Verantwortlichkeit und +.ft B +kgrup +.ft R +bzw. +.ft B +kpart +.ft R +die Kontrollpflicht an. Mit +.ft B +realis +.ft R +wird ein Kennzeichen f\o'u"'r gegebene Realisierung (=1) +gesetzt. +.DS L + +Relation: festl +--------- P8000 / EVK Olbernhau +Besitzer: kodir +Tupellaenge: 216 +Verfallsdatum: Tue Jan 1 00:00:00 1991 +Tupelanzahl: 26 +Speicherstruktur: HEAP +Pages: 1 + 11 +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +-------------------------------------------- + mnr i 4 + fnr i 2 + tx1 c 49 + tx2 c 49 + tx3 c 49 + tx4 c 49 + termin i 4 + vgrup i 2 + vpart i 2 + kgrup i 2 + kpart i 2 + realis i 2 +-------------------------------------------- + +.DE +.ft B +partn +.ft R +enth\o'a"'lt die Nomenklatur und Bezeichnungen der Struktureinheiten, +die an der Terminkontrolle teilhaben. +Mit +.ft B +grup +.ft R +wird eine Gruppe, mit +.ft B +fein +.ft R +ein Partner bestimmt. +.DS L + +Relation: partn +--------- P8000 / EVK Olbernhau +Besitzer: kodir +Tupellaenge: 28 +Verfallsdatum: Tue Jan 1 00:00:00 1991 +Tupelanzahl: 56 +Speicherstruktur: HEAP +Pages: 1 + 1 +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +-------------------------------------------- + grup i 2 + fein i 2 + bez c 24 +-------------------------------------------- + +.DE +.ft B +mafenr +.ft R +ist eine tempor\o'a"'re Relation, die jeweils alle Massnahme-Nummern, sich +qualifizierender Tupel der Relation +.ft B +basis +.ft R +bzw. die dazugeh\o'o"'rigen Festlegungs-Nummern der Relation +.ft B +festl +.ft R +enth\o'a"'lt. +.DS L + +Relation: mafenr +--------- P8000 / EVK Olbernhau +Besitzer: kodir +Tupellaenge: 6 +Verfallsdatum: Tue Jan 1 00:00:00 1991 +Tupelanzahl: 0 +Speicherstruktur: HEAP +Pages: 1 + 0 +Relationentyp: Nutzerrelation + + Domaenname Typ Laenge Schluessel +-------------------------------------------- + mnr i 4 + fnr i 2 +-------------------------------------------- +.DE +.NH 3 +.ft B +Steuerprogramm +.ft R +.LP +Um die relativ langen Zeilen der Quellprogramme noch +einigermassen \o'u"'bersichtlich darstellen zu k\o'o"'nnen, +wurden nachfolgend \et durch drei Leerzeichen ersetzt. +.LP +Das Hauptmenue steht in der Prozedur +.ft B +hauptm.c. +.ft R +Hier das Hauptprogramm: +.sp 2 +.nf +/* Hauptmenue zur Terminkontrolle in hauptm.c */ +/* Pfadname in cmd.c definiert */ + +# include +# include +# include "/z/zip/inkeys.h" + +char command[65]; + +main() +{ + char *cmd(); + + initzip(); + + if (!system(cmd("part"))) goto fehler; + for (;;) + { + switch(hauptm()) + { + case 1: + while (system(cmd("kontr"))) + { + system(cmd("teko")); + system(cmd("delmaf")); + } + system(cmd("fanze")); + break; + case 2: + system(cmd("eiko")); + system(cmd("fanze")); + break; + case 3: + while (system(cmd("druw"))) + { + system("modifyr terkon mafenr heapsort mnr fnr"); + system("nq -nb newpg"); + if (!system(cmd("druk"))) + { + perror("Systemfehler"); + sleep(5); + break; + } + clear(); refresh(); + } + system(cmd("delmaf")); + break; + case 4: + system(cmd("nomenkl")); + if (!system(cmd("part"))) goto fehler; + break; + case 5: + crmode(); noecho(); + clear(); + refresh(); + nocrmode(); echo(); + endwin(); + exit(0); + default: + goto fehler; + } + } +fehler: + crmode(); noecho(); + clear(); + refresh(); + nocrmode(); echo(); + endwin(); + printf("*** System-Fehler ***\en"); + exit(-1); +} +.fi +.LP +.ft B +initzip() +.ft R +ist eine Prozedur aus libzip.a, die die Initia\%lisierung +des Paketes +.ft B +curses +.ft R +und des Paketes +.ft B +zip +.ft R +veranlasst. Die Auswahl erfolgt \o'u"'ber die Prozedur hauptm(), +indem die gew\o'u"'nschte Zeile mit der Kursortaste (\o'|v') angefahren +und mit -> angeklickt wird. +Um einen \o'U"'berblick bez\o'u"'glich der Lei\%stung der +einzelnen Programme zu verschaffen wird nachfolgend die +Menue-Prozedur +.ft B +hauptm.c +.ft R +gezeigt: +.sp 2 +.nf + +/* Hauptmenue zur Terminkontrolle */ + +# include +# include "/z/zip/inkeys.h" + +# define Fragen 5 +# define Beginn 5 + +extern char *SO, *SE; + +hauptm() +{ + static char *men[] = { +"? Kontrolle von Faelligkeiten mit Aenderungsmoeglichkeit.. ", +"? Erfassung neuer Basis-Massnahmen (auch mit Festlegungen) ", +"? Druck von Protokollen (auch mit Eingrenzungen).......... ", +"? Aenderung und Ergaenzung der Nomenklatur (Partner)...... ", +"? Beendigung der Arbeit................................... " + }; + int inp; + int aus; + int zl, sp, spa; + char buf[80]; + + crmode(); + clear(); + datum(12, 5); + move(2, 5); + addstr("TERMINKONTROLLE Hauptmenue"); + zl = Beginn; sp = 5; + for (inp = 0; inp < Fragen; inp++) + { + move(zl+inp, sp); + strcpy(buf, SO); + strcat(buf, men[inp]); + strcat(buf, SE); + addstr(buf); + } + move(zl, sp-1); + refresh(); + noecho(); + + for (;;) + { + aus = 0; + switch(inp = ZZgetchx()) + { + + case CCdo: + getyx(stdscr, zl, spa); + if (zl < (Fragen+Beginn-1)) move(++zl, spa); + break; + case CCup: + getyx(stdscr, zl, spa); + if (zl > Beginn) move(--zl, spa); + break; + case CCri: + nocrmode(); echo(); + aus = zl - Beginn + 1; + move(zl, sp+1); + addstr(men[aus-1]); + refresh(); + return(aus); + default : + continue; + } + refresh(); + } +} +.fi +.LP +Mit der Prozedur hauptm() wird eine Leistung beschrieben, die +in der Regel die ZIP-Prozedur menzip() ausf\o'u"'hrt - der einzige +Unterschied besteht darin, dass das f\o'u"'hrende Fragezeichen nach +dem Anklicken durch die nachfolgende Zeichenkette (normale +Darstellung) \o'u"'berschrieben wird. +Die Pointer *SO und *SE stammen aus der termcap und realisieren +das Ein- und Ausschalten einer inversen Darstellung der Terminal\%ausgabe. +.ft B +ZZgetchx() +.ft R +bietet die M\o'o"'glichkeit, in der termcap definierte Steuerfolgen +auszuwerten - hier CCdo (Cursor down), CCup (Cursor up) usw. - +und entsprechende Reaktionen des Programms zu gestalten. Die +Prozedur steht in libzip.a, die entsprechenden Definitionen +zu CCdo, CCup usw. in inkeys.h. +Mit getyx() aus curses l\o'a"'sst sich die aktuelle Kursorposition +auf dem Standard-Screen (stdscr) erfragen und auf die nachfolgenden +beiden Parameter zur\o'u"'ck\%schreiben. +.NH 3 +.ft B +Kontroll-Menue +.ft R +.LP +Das Programm +.ft B +teko +.ft R +wird nach dem Programm +.ft B +kontr +.ft R +gerufen. Mittels kontr wird eine Abfrage zur Qualifikation +(Eingrenzung) der Massnahmen bzw. Festlegungen realisiert. +Es entsteht die Relation +.ft B +mafenr, +.ft R +die eingangs alle eingegrenzten Massnahmen anbietet. Wird +teko durch einen Abbruch vorzeitig verlassen, ist diese +Relation mit delmaf wieder zu l\o'o"'schen. +.ft B +teko +.ft R +wird nachfolgend komplett gezeigt, Bezugspunkte f\o'u"'r +Erl\o'a"'uterungen werden laufend nummeriert (n) und als Kommentar +gekennzeichnet. +.sp 2 +.ft B +teko.x: +.ft R +.nf + +## shared terkon + +/* Menue 1 - Kontr.-Menue: Eingangsrelation mafenr aus kontr */ +/* Kontrolle von Festlegungen und Basis-Massnahmen; */ +/* Basis-Massnahmen koennen geaendert, Festlegungen geaendert*/ +/* und neue hinzugefuegt werden; */ + +# include + +## long MNR; +## int GRUP; +## int FEIN; +## int FNR; +## char BEZ[24]; +## char TX1[49]; +## char TX2[49]; +## char TX3[49]; +## char TX4[49]; +## long EDAT; +## long TERMIN; +## int VGRUP; +## int VPART; +## int AGRUP; +## int APART; +## int FESTL; +## int REALIS; + +char DATUM[9]; +char SLE[15]; +char ANTW[2]; +char mess[25]; +int VON; +int clr; +int zl, sp; +int anzfest; + +amx() +{ +/* (1) */ + static char *bas[] = { + "Weiter.............. ", + "Realisiert.......... ", + "Aendern............. ", + "Festl. zeigen/aend.. ", + "Festlegungen zufueg. ", + "Abbruch............. " + }; + static char *fest[] = { + "Weiter.............. ", + "Realisiert.......... ", + "Aendern............. ", + "Festlegungen zufueg. " + }; + static char *festzu[] = { + "Festlegungen zufueg. ", + "Abbruch............. " + }; + + int c; + int d; + int flag; + int flagm; + int flagf; + int end_fl; + int bas_fl; + int maxfnr; + int t_count; + long old_mnr; + + +initzip(); + +## open basis +## open partn +## open festl +## open mafenr + +## use (+basis,partn,+festl,+mafenr) + +zyk: + + end_fl = 0; +## scan mafenr (MNR=$mnr, FNR=$fnr) +## { + ++end_fl; +## } + if (!end_fl) + { +/* (2) */ + melde(); + goto end; + } + if (MNR == old_mnr) goto zyfest; + clr = 0; + flag = 0; + +## scan basis $mnr=MNR (TX1=$tx1,TX2=$tx2,TX3=$tx3,TX4=$tx4, +## TERMIN=$termin,VGRUP=$vongrup, +## VPART=$vonpart,AGRUP=$angrup,APART=$anpart,FESTL=$festanz) +## { + ++flag; + anzfest = FESTL; +/* (3) */ + abas(); + getyx(stdscr, zl, sp); + move(2, 52); + if (anzfest == -1) + sprintf(mess, "Festlegungen realisiert"); + else + sprintf(mess, "%2d Festlegung(en) ! ", anzfest); + addstr(mess); + refresh(); + move(zl, sp); + c = menzip(bas, 6, 3, 52); + switch(c) + { + case 2: /* B.-M. loeschen vorbereiten */ + ZZbeep(); + okay(1,0); + if (ANTW[0] == 'j' || ANTW[0] == 'J') + { + ZZbeep(); + FESTL = -1; + } + break; + case 3: /* B.-M. korrigieren */ + dbas(); /* Bereich fuer B.-M. loeschen */ +/* (5) */ + if (!ebas()) c = 1; + break; + default: + break; + } + if (c == 2 || c == 3) + { +## replace ($mnr=MNR,$tx1=TX1,$tx2=TX2,$tx3=TX3,$tx4=TX4, +## $termin=TERMIN,$vongrup=VGRUP,$edat=EDAT, +## $vonpart=VPART,$angrup=AGRUP,$anpart=APART,$festanz=FESTL) + } + +## } + switch(c) + { + case 6: goto end; + case 1: + case 2: + case 3: +## scan mafenr $mnr=MNR +## { +## delete +## } + goto zyk; + default : + break; + + } + d = 0; + flagf = 0; +zyfest: + switch(c) + { + case 4: + if (FNR) /* Ueber Festl. recherchiert */ + { +## scan mafenr $mnr=MNR (FNR=$fnr) +## { + +## scan festl $mnr=MNR, $fnr=FNR (TX1=$tx1,TX2=$tx2,TX3=$tx3, +## TX4=$tx4,TERMIN=$termin,VGRUP=$vgrup, +## VPART=$vpart,AGRUP=$kgrup,APART=$kpart,REALIS=$realis) +## { + dfest(); + afest(); + d = menzip(fest, 4, 13, 52); + switch(d) + { + case 1: break; + case 2: ZZbeep(); + okay(1,0); + if (ANTW[0] == 'j' || ANTW[0] == 'J') + { + ZZbeep(); + REALIS = 1; + } + case 3: if (!REALIS) kfest(); +## replace ($mnr=MNR,$fnr=FNR,$tx1=TX1,$tx2=TX2,$tx3=TX3, +## $tx4=TX4,$termin=TERMIN,$vgrup=VGRUP, +## $vpart=VPART,$kgrup=AGRUP,$kpart=APART,$realis=REALIS) + break; + case 4: c = 5; + goto zyfest; + } +## } +## delete +## } + } + else /* Keine Festl.-Nr.: Recherche BMn. */ + { + ++flagf; +## scan festl $mnr=MNR (FNR=$fnr,TX1=$tx1,TX2=$tx2,TX3=$tx3, +## TX4=$tx4,TERMIN=$termin,VGRUP=$vgrup, +## VPART=$vpart,AGRUP=$kgrup,APART=$kpart,REALIS=$realis) +## { + dfest(); + afest(); + d = menzip(fest, 4, 13, 52); + switch(d) + { + case 1: break; + case 2: REALIS = 1; + case 3: if (!REALIS) kfest(); +## replace ($mnr=MNR,$fnr=FNR,$tx1=TX1,$tx2=TX2,$tx3=TX3, +## $tx4=TX4,$termin=TERMIN,$vgrup=VGRUP, +## $vpart=VPART,$kgrup=AGRUP,$kpart=APART,$realis=REALIS) + break; + case 4: c = 5; + goto zyfest; + } +## } + } + break; + case 5: + ++flagf; +zyzuf: if (d == 4) + { + maxfnr = 1; +## scan festl $mnr=MNR (FESTL=$fnr) +## { + if (FESTL > maxfnr) maxfnr = FESTL; +## } + } + TX1[0] = '\e0'; + TX2[0] = '\e0'; + TX3[0] = '\e0'; + TX4[0] = '\e0'; + FNR = maxfnr + 1; + kfest(); +## append festl ($mnr=MNR,$fnr=FNR,$tx1=TX1,$tx2=TX2,$tx3=TX3, +## $tx4=TX4,$termin=TERMIN,$vgrup=VGRUP, +## $vpart=VPART,$kgrup=AGRUP,$kpart=APART,$realis=REALIS) + if ((d = menzip(festzu, 2, 13, 52)) == 1) + { + d = 4; + goto zyzuf; + } + break; + default: break; + } + if (flagf) + { +## scan mafenr $mnr=MNR +## { +## delete +## } + flagf = 0; + } + goto zyk; + +end: + +## commit + +## close partn +## close basis +## close festl +## close mafenr + +} + +/* (4) */ +ks_part() +{ + +## scan partn $grup=GRUP, $fein=FEIN (BEZ=$bez) +## { +## } +} + +.fi +.LP +Die Datenbank wird f\o'u"'r mehrere Nutzer gleichzeitig +ge\o'o"'ffnet (shared). Dabei sind die Relationen +.ft B +basis, festl +.ft R +und +.ft B +mafenr +.ft R +zum Lesen und Schreiben sowie +.ft B +partn +.ft R +nur zum Lesen verf\o'u"'gbar (use). +Die lokalen Vereinbarungen +.ft B +(1) +.ft R +repr\o'a"'sentieren jeweils ein +Menue, das mit menzip() zur Anzeige kommt. +.LP +Die Prozedur +.ft B +melde() +.ft R +bei +.ft B +(2) +.ft R +teilt bei den Phasen, die mehrere Sekunden keine Ver\o'a"'nderungen +am Bildschirm veranlassen, mit, dass der Rechner arbeitet. Die +Prozedur beinhaltet lediglich eine Positionierung mit move(), +nachdem vorher mit getyx() die aktuelle Kursor-Position gesichert +wurde und gibt die Zeichenkette +.ft B +Ich arbeite! +.ft R +mit addstr() +aus - die Prozeduren entstammen +curses. +.sp 2 +.nf +/* Ausschrift einer Meldung am Bildschirm */ + +# include + +melde() +{ + int zl, sp; + + getyx(stdscr, zl, sp); + move(15, 1); + addstr(" Ich arbeite ! "); + refresh(); + move(zl, sp); +} +.fi +.LP +Die Prozedur +.ft B +abas() +.ft R +bei +.ft B +(3) +.ft R +fasst einige Positionierungen und ZIP-Prozeduren +zusammen. +.sp 2 +.nf + +/* Anzeige Basis-Massnahmen */ + +# include + +extern int GRUP, VGRUP, FEIN, VPART, AGRUP, APART; +extern long TERMIN; +extern char DATUM[9]; +extern char SLE[15]; +extern int clr; +extern int anzfest; +extern char mess[25]; + +abas() +{ + emnr(clr++, 0); + tocdat(&TERMIN, DATUM); + dfest(); + strcpy(SLE, "Basis-Massn."); + bas(clr, -1); + tobdat(DATUM, &TERMIN); + move(8, 0); + refresh(); + strcpy(SLE, "Aufgst. durch"); + GRUP = VGRUP; + FEIN = VPART; + ks_part(); + kvekop(clr, 0); + strcpy(SLE, "Realis. durch"); + GRUP = AGRUP; + FEIN = APART; + ks_part(); + kvekop(clr, 0); + APART = FEIN; + refresh(); +} +.fi +.LP +abas() soll die Basis-Massnahmen entsprechend der, in +der Relation mafenr vorgegebenen Reihenfolge anzeigen. +Um dies etwas zu verdeutlichen, sehen wir uns den Aufbau +der oberen H\o'a"'lfte des Bildschirms an: +.sp 2 +.DS L ++-----------------------------------------------------------+ +Massnahme-Nr.: 9999999999 >>>> TERMINKONTROLLE <<<< + +Text Basis-Massn. : 1 Festlegung(en) ! +>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aa< +--------------------+ +>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aa< |Weiter..............| +>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aa< |Realisiert..........| +>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aa< |Aendern.............| +Termin(tt.mm.jj) : 28.02.89< |Festl. zeigen/aend..| +\&.Aufgst. durch > Partner: Kombinatsd.. |Festlegungen zufueg.| +\&.Realis. durch > Partner: Direktor T.. |Abbruch.............| + +--------------------+ ++-----------------------------------------------------------+ +.DE +.LP +Die Abbildung wurde nicht +v\o'o"'llig korrekt wiedergegeben, weil eine +Breite von 80 Zeichen den rechten Rand beim Druck zu weit +\o'u"'berschreitet. Das invers zu zeigende Menue aus der +Zeichenkettenvariablen +.ft B +*bas +.ft R +wurde gerahmt dargestellt. In der Regel wird der untere Teil +des Bildschirms - sofern Festlegungen vorhanden sind - +beim Anklicken der 4. Zeile des Menues mit der analogen Darstellung +zur Festlegung gef\o'u"'llt. Das Menue 'Weiter' zeigt +die n\o'a"'chste Massnahme. Das Anklicken von 'Realisiert' +ist mit einer R\o'u"'ckversicherung verbunden - die Frage +.ft B +Okay (j/n)? +.ft R +muss mit 'j' beantwortet werden, bevor die Massnahme +tats\o'a"'chlich zum L\o'o"'schen markiert wird. Ein Piepton +(ZZbeep()) best\o'a"'tigt die L\o'o"'schvormerkung. +.LP +Zur\o'u"'ck zu abas(). +.ft B +curses.h +.ft R +wurde eingezogen, um die Makros aus curses +.ft B +move() +.ft R +und +.ft B +refresh() +.ft R +verf\o'u"'gbar zu haben. +Die Prozedur +.ft B +emnr() +.ft R +ist aus ZIP entstanden und zeigt die Massnahme-Nr. an. +Der Erarbeitungsweg wird gezeigt. +.br +Mit dem Editor ist folgendes File +.ft B +emnr_m +.ft R +zu erstellen: +.sp 1 +.DS L + +Massnahme-Nr.: #999999999 >>>> TERMINKONTROLLE <<<< + +.DE +Die Erzeugung des Quell- und Objektcodes erfolgt mit +dem Aufruf: + +zip -l ../LIBTERM emnr + +Die Maskenidentifikation '_m' darf nicht im Aufruf +angegeben sein, sonst wird der gesamte Name als Basisname +interpretiert. Im Dialog antworten sie in dieser Reihenfolge: +.nf +l +MNR +n +.fi +.LP +Zur Verdeutlichung wird das entstehende _i-File +gezeigt, das f\o'u"'r eventuelle Modifikationen genutzt werden kann +und \o'u"'ber den stattgefundenen Dialog informiert. +.DS L + +emnr -l ../LIBTERM +long MNR n n +.DE +.LP +.ft B +tocdat() +.ft R +wandelt die intern \o'u"'bliche long-Darstellung (Zeit, Datum) in +die normale Darstellung des Datums (tt.mm.jj). +.ft B +dfest() +.ft R +l\o'o"'scht auf dem Bildschirm den Bereich, auf dem Festlegungen +dargestellt werden, um zu vermeiden, dass eine m\o'o"'glicherweise +von der vorausgegangenen Massnahme abgebildete Festlegung stehen +bleibt. Die ZIP-Prozedur +.ft B +bas() +.ft R +rea\%lisiert die Anzeige der n\o'a"'chsten 6 Zeilen, wobei das +2. Argument '-1' die Prozedur veranlasst, unabh\o'a"'ngig von +einer gew\o'u"'nschten Korrekturart, die Variablen nur auszuschreiben. +Die Maske +.ft B +bas_m +.ft R +sieht so aus: +.DS L + +Text #aaaaaaaaaaaa: +>#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< +>#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< +>#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< +>#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa< +Termin(tt.mm.jj) : #aaaaaaa< + +.DE +Aus dem _i-File wird ersichtlich, welche Variablen verwendet und +wie sie behandelt werden sollen: +.DS L + +bas -a 2 -pl ../LIBTERM +char SLE[15] n n +char TX1[49] j n +char TX2[49] j n +char TX3[49] j n +char TX4[49] j n +char DATUM[9] j testdat() w + +.DE +Die Maske wird auf dem Bildschirm nach der 2. Zeile angeh\o'a"'ngt (-a 2) +und die Variable DATUM[9] einer Pr\o'u"'fung mit +.ft B +testdat() +.ft R +unterzogen (g\o'u"'ltiges Datum) - diese Pr\o'u"'fung wird nur bei einer +Korrektur des alten Wertes angestossen. +.ft B +tobdat() +.ft R +ist die Umkehrung von tocdat(). +.LP +Mit +.ft B +refresh() +.ft R +werden die, auf der Speicherfl\o'a"'che stdscr vorgenommenen \o'A"'nderungen +sichtbar gemacht - dieser Algorithmus hilft, insgesamt ein ruhiges +Abbilden auf dem Schirm zu realisieren und die Kursorbewegungen zu +optimieren. Die Prozedur +.ft B +ks_part() +.ft R +- es geht noch um abas() - +stammt aus teko.x (4). +AMX-Statements k\o'o"'nnen nicht in separat zu \o'u"'bersetzenden Prozeduren +verwendet werden, der AMX-Compiler generiert ein main(). Das gezeigte +Beispiel weist auf eine sehr effiziente Anwendung von AMX hin, +mit der differenzierte und relativ komplizierte Einsatzf\o'a"'lle +l\o'o"'sbar sind. +ks_part() sucht zum angegebenen Schl\o'u"'ssel f\o'u"'r GRUP und FEIN +die Bezeichnung aus der Relation partn. Die Ausgabe der Bezeichnung +erfolgt mit +.ft B +kvekop(). +.ft R +Im Gegensatz zu bas() kann kvekop() nicht durch eine fest eingestellte +Zeilennummer zur Positionierung \o'u"'bersetzt werden, da es zweimal bei +Basis-Massnahmen und zweimal bei Festlegungen benutzt wird. +F\o'u"'r solche Anwendungsf\o'a"'lle ist die Option -z von ZIP gedacht, +wie am Beispiel nocheinmal gezeigt werden soll: +.DS L + +\&.#aaaaaaaaaaaaa >Partner: #aaaaaaaaaaaaaaaaaaaaaaa + +.DE +Aus kvekop_i wird der Aufruf deutlich: +.DS L + +kvekop -zl ../LIBTERM +char SLE[15] n n +char BEZ[24] n n + +.DE +.LP +Nachdem abas() abgearbeitet ist, wird \o'u"'ber die Anzahl der +Festlegungen informiert. Die Verwendung von curses schliesst +direkte Ausgaben auf den Schirm (printf()) aus, deshalb +erfolgt erst der Aufbau der Zeichenkette mit sprintf() und +anschliessend die Ausgabe mittels addstr(). +.LP +.ft B +menzip() +.ft R +ist in das Paket ZIP eingegliedert und gestattet eine freie +Postionierung eines Menues - das seitliche Ausrutschen der +Zeichenketten bei \o'U"'berschreitung der Spalte 80 wird nicht +kontrolliert, ebenso sollte die Spalte 80 selbst nicht benutzt +werden, weil einige Terminaldriver dort eigenwillig reagieren. +Die Argumente f\o'u"'r menzip() haben folgende Bedeutung: +.IP 1.Argument: +Variable, in der die auszugebende Zeichenkette +definiert ist. +.IP 2.Argument: +Zeilenzahl des Menues; +.IP 3.Argument: +Zeilennummer des Bildschirms, ab der das Menue geschrieben werden +soll, zusammen mit der Spaltennummer ergibt das die linke obere +Ecke des Menues. +.IP 4.Argument: +Spaltennummer des Bildschirms, mit 1 beginnend. +.LP +Sofern das benutzte Terminal invers schreiben kann, wird das +Menue so ausgegeben und die angeklickte Zeile auf normal +gewandelt. +.LP +Mit der Prozedur +.ft B +ebas() +.ft R +(5) k\o'o"'nnen Basismassnahmen korrigiert werden, insoweit unterscheidet +sie sich von abas(). Durch die Korrektur ist ausserdem denkbar, +dass w\o'a"'hrend einer Eingabe mit zweimal Interrupt (bspw. DEL) +abgebrochen wird und der R\o'u"'ckkehrcode der ZIP-Prozedur +im Hauptprogramm behandelt werden muss. +Nachfolgend die Prozedur: +.nf + +/* Erfassung oder Korrektur von Basis-Massnahmen */ + +# include + +extern int GRUP, VGRUP, FEIN, VPART, APART, VON, AGRUP; +extern long TERMIN; +extern char DATUM[9]; +extern char SLE[15]; +extern char ANTW[2]; +extern int clr, anzfest; +extern char mess[25]; + +ebas() +{ + tocdat(&TERMIN, DATUM); + move(1, 0); + emnr(clr, 0); +wdh: + strcpy(SLE, "Basis-Massn."); + if (!bas(clr, 1)) return(0); + tobdat(DATUM, &TERMIN); + move(2, 52); + sprintf(mess, "%2d Festlegung(en)!", anzfest); + addstr(mess); + move(8, 0); + refresh(); + strcpy(SLE, "Aufgst. durch"); + GRUP = VGRUP; + VON = 0; + if (!verkog(clr, 0)) return(0); + VGRUP = GRUP; + VON = 1; + FEIN = VPART; + if (!verkop(clr, 0)) return(0); + VPART = FEIN; + strcpy(SLE, "Realis. durch"); + GRUP = AGRUP; + VON = 0; + move(10, 0); + refresh(); + if (!verkog(clr, 0)) return(0); + AGRUP = GRUP; + FEIN = APART; + VON = 1; + if (!verkop(clr, 0)) return(0); + APART = FEIN; + okay(1, 0); + if (ANTW[0] == 'n' || ANTW[0] == 'N') goto wdh; + else ZZbeep(); + return(1); +} +.fi +.LP +Innerhalb von ebas() sind die ZIP-Prozeduren +.ft B +verkog() +.ft R +f\o'u"'r die Eingabe des Gruppenschl\o'u"'ssels und +.ft B +verkop() +.ft R +f\o'u"'r die Eingabe des Partnerschl\o'u"'ssels interessant, weil hier +\o'u"'ber eine Hilfe (Eingabe von ?) aus der Relation partn +die Schl\o'u"'sseltabelle f\o'u"'r Gruppen bzw. Partner innerhalb der +gew\o'a"'hlten Gruppe angezeigt werden k\o'o"'nnen. +Als Beispiel wird verkog() vorgestellt: +.DS L +Maske: + +#aaaaaaaaaaaaaa > Gruppe: #9 + +verkog_i: + +-zhl ../LIBTERM verkog +char SLE[15] n n +int GRUP j n s_part() p +.DE +.LP +Die Hilfe wird in diesem Fall \o'u"'ber +.ft B +s_part() +.ft R +realisiert. +.nf + +/* Nutzt das File 'partner' aus 'part.x', zeigt fuer Hilfe +** die Gruppenuebersicht bzw. die Partner zur Gruppe an ! +*/ + +# include + +extern int GRUP; +extern int VON; + +s_part() +{ + FILE *fp, *fopen(); + int zl = 8; + int count = 14; + int fein, grup; + char bez[24]; + char buf[29]; + +if ((fp = fopen("/z/ing_db/work/termin/partner", "r")) == NULL) +{ + echo(); nocrmode(); + perror("partner not found"); + exit(0); +} +while (fscanf(fp, "%d %d ", &grup, &fein) != EOF) +{ + if (fgets(bez, 24, fp) == NULL) break; + if (!VON) + { + if (!fein) + { + move(zl, 50); addstr(" "); + sprintf(buf,"%2d %s", grup, bez); + move(zl, 51); addstr(buf); + } + else continue; + } + else + { + if (GRUP == grup) + { + move(zl, 50); addstr(" "); + sprintf(buf, "%2d %s", fein, bez); + move(zl, 51); addstr(buf); + } + else continue; + } + ++zl; + if (!(--count)) + { + refresh(); + getchar(zl); + zl = 8; + count = 14; + } +} +refresh(); +fclose(fp); +} +.fi +.LP +Der scan() aus ks_part() k\o'o"'nnte auf den ersten Blick +eigentlich auch hier genutzt +werden, analog m\o'u"'sste anstelle des fscanf() die Prozedur ks_part() +stehen und die in der Qualifikation geforderten Werte in einer +Schleife aktua\%li\%siert werden. +Allerdings w\o'a"'re die Formulierung der Qualifikation '$grup=GRUP, $fein=FEIN' +zu differenzieren und damit drei scan() erforderlich. +Die Kopie der Relation partn in ein \*(xx -File +ist in diesem Fall doch der geringere Aufwand. +Da maximal 14 Zeilen, beginnend ab 6, geschrieben werden k\o'o"'nnen, wird +mit getchar(zl) die Ausgabe gestoppt und nach Eingabe eines beliebigen +Zeichens fortgesetzt. +.LP +Einige wesentliche Dinge sind damit erkl\o'a"'rt. +Da der Rahmen des Anwenderhandbuches durch weitergehende Beschreibungen +gesprengt w\o'u"'rde, muss hier das Kapitel abgebrochen werden.