diff options
Diffstat (limited to 'doc/eudas/eudas.hdb.14')
-rw-r--r-- | doc/eudas/eudas.hdb.14 | 724 |
1 files changed, 0 insertions, 724 deletions
diff --git a/doc/eudas/eudas.hdb.14 b/doc/eudas/eudas.hdb.14 deleted file mode 100644 index 1aa3c87..0000000 --- a/doc/eudas/eudas.hdb.14 +++ /dev/null @@ -1,724 +0,0 @@ -#limit (11.0)##pagelength (16.5)##block# -#start (2.0,0.0)# -#page (151)# -#headodd# -#center#EUDAS#right#% - -#end# -#headeven# -%#center#EUDAS - -#end# -#center#1 - -14 Ausdrücke in ELAN - - - -14.1 Was sind Ausdrücke ? - -In diesem Kapitel wollen wir uns mit ELAN-Ausdrücken beschäfti -gen, wie sie für EUDAS gebraucht werden. Natürlich kann dies keine -ernsthafte Einführung für ELAN-Programmierer sein - mit solchen -Ambitionen halten Sie sich am besten an die entsprechende ELAN- -Literatur. - Dieser Text richtet sich eher an den Benutzer, der kaum Erfah -rung mit ELAN hat, aber die Möglichkeiten von EUDAS optimal nut -zen will. Viele fortgeschrittene Fähigkeiten von EUDAS laufen ja -über ELAN-Programme. - -#on("b")#Vorkommen#off("b")# Sie haben ELAN-Ausdrücke bereits an -verschiedenen -Stellen eingesetzt, wenn Sie sich mit den vorhergehenden Kapiteln -befaßt haben. ELAN-Ausdrücke werden in nahezu allen Verarbei -tungsfunktionen benötigt. - Im Druckmuster dienen sie dazu, den Inhalt eines Feldmusters -festzulegen. Die Definition einer Abkürzung besteht immer aus dem -Namen der Abkürzung und einem Ausdruck. Ebenso wird in einer -Gruppendefinition ein Ausdruck angegeben. - Beim Kopiermuster und beim Änderungsmuster besteht jeweils -die rechte Seite einer Anweisung aus einem Ausdruck. Weiterhin -werden Ausdrücke auch in anderen ELAN-Konstruktionen benötigt, -wie zum Beispiel direkt am Anfang einer IF-Anweisung. - -#on("b")#Bedeutung#off("b")# Ein Ausdruck steht allgemein für einen Wert. Im -ein -fachsten Fall kann dies eine Konstante sein, der Wert des Aus -drucks ändert sich also nicht. Anderenfalls spricht man von einem -zusammengesetzten Ausdruck. Dessen Wert ergibt sich dann durch -die Ausführung der im Ausdruck angegebenen Operationen. Dieser -Wert kann je nach dem aktuellen Zustand des Systems verschieden -sein, da er jedes Mal neu berechnet wird, wenn er gebraucht wird. - Ein Beispiel für einen zusammengesetzten Ausdruck ist 2+2 -Dieser Ausdruck steht für den Wert 4. - Der Wert eines Ausdrucks ist das, was uns eigentlich interes -siert. Beim Druckvorgang wird dieser Wert dann gedruckt, beim -Kopieren und Verändern in ein Feld eingetragen. - -#on("b")#Zusammensetzung#off("b")# Ausdrücke lassen sich aus verschiedenen -Ele -menten zusammensetzen. Grundlage bilden die Konstanten. Konstan -ten können durch #on("i")#Operatoren#off("i")# miteinander verknüpft werden. So ist -in dem Ausdruck 2+3 das '+' ein Operator, der die Konstanten 2 -und 3 verknüpft. Das Ergebnis der Verknüpfung hängt natürlich vom -jeweiligen Operator ab. - Wie Sie schon in der Schule gelernt haben ("Punktrechnung vor -Strichrechnung"), muß man die Reihenfolge der Operatoren festlegen, -wenn mehrere Operatoren im Spiel sind. Ähnliche Regeln gibt es für -alle Operatoren in ELAN. - Wenn eine andere Reihenfolge der Operatoren erwünscht ist, -können Sie diese durch Einsatz von Klammern verändern. Auch dies -dürfte Ihnen aus der Schule noch in Erinnerung sein. Der Unter -schied in ELAN ist lediglich, daß es dort einige zusätzliche Opera -toren gibt, die Ihnen nicht aus der Mathematik vertraut sind. - Ein weiteres Konstruktionselement von Ausdrücken sind #on("i")#Funk -tionen#off("i")#. Auch diese kennen Sie aus der Schule. Lediglich die -Schreibweise muß für den "dummen" Computer etwas ausführlicher -gehalten werden (Beispiel: sin (3.14 * x)). - Die Argumente der Funktion hinter dem Funktionsnamen müssen -auf jeden Fall in Klammern stehen. In der Terminologie der Pro -grammiersprachen spricht man von #on("i")#Parametern#off("i")#. Parameter können -wieder komplexe Ausdrücke sein. Bei Funktionen mit mehreren -Parametern werden diese durch Komma getrennt: - - - min (2.5 * x, x + 1.25) - - - -14.2 Datentypen - -Bevor wir beginnen, konkrete Ausdrücke zu behandeln, müssen wir -erst das Konzept der #on("i")#Datentypen#off("i")# einführen. Grundidee dabei ist, -daß es verschiedene Klassen von Werten gibt, die nicht einfach -untereinander gemischt werden können. - So gibt es in ELAN einen grundlegenden Unterschied zwischen -#on("i")#Zahlen#off("i")# und #on("i")#Texten#off("i")#. Texte bestehen aus einer beliebigen Aneinan -derreihung von Zeichen, die im Normalfall nur für den betrachten -den Menschen eine Bedeutung haben. Mit Zahlen kann man dagegen -Berechnungen anstellen. - Der tiefere Grund für die Trennung in verschiedene Typen ist -also, daß für jeden Typ gewisse Operationen definiert snd, die nur -für diesen Typ sinnvoll sind. So ist zum Beispiel die Addition der -beiden Texte "abc" und "-/-" völlig sinnlos. - Aber nicht nur die Operationen sind verschieden, sondern auch -die interne Darstellung im Rechner. So werden der Text "1234" und -die Zahl 1234 völlig anders gespeichert, obwohl man ihnen die glei -che Bedeutung beimessen könnte. - -#on("b")#Grundtypen#off("b")# In ELAN gibt es vier verschiedene Grundtypen, -die für -uns wichtig sind. Sie können sich in ELAN auch eigene Typen -schaffen, dies geht jedoch weit über unsere Bedürfnisse hinaus. - Der in EUDAS am meisten verwendete Typ heißt #on("i")#TEXT#off("i")#. TEXT- -Objekte bestehen aus einer Folge von 0 bis 32000 Zeichen. Die Zei -chen entstammen einem Satz von 256 verschiedenen Symbolen, die -jeweils eine andere Darstellung haben. Einige der Zeichen lassen -sich überhaupt nicht darstellen, sondern führen bestimmte Funktio -nen aus (zum Beispiel Bildschirm löschen). - Sämtliche Feldinhalte einer EUDAS-Datei sind TEXTe, ebenso -die Zeilen von Textdateien. Auch Datei- und Feldnamen sind -TEXTe. Von daher besteht eigentlich kein Grund, warum Sie sich -außer zur Programmierung noch mit anderen Datentypen beschäfti -gen sollten. - Neben den Texten gibt es noch die Zahlen. Diese sind in ihrer -internen Darstellung so beschaffen, daß ein effizientes Rechnen mit -ihnen möglich ist. Andererseits können sie nicht mehr beliebige -Informationen darstellen, sondern haben eine sehr eingeschränkte -Bedeutung. - Um unterschiedichen Bedürfnissen gerecht zu werden, gibt es in -ELAN zwei verschiedene Zahltypen. Der Typ #on("i")#INT#off("i")# umfaßt nur ganze -Zahlen ohne Kommastellen. Damit die Zahl möglichst wenig Spei -cherplatz belegt, ist der Wertebereich bei den meisten Rechnern auf --32768..32767 beschränkt (die krummen Zahlen ergeben sich wegen -der Binärarithmetik des Rechners). Dieser Typ eignet sich am besten -zum Abzählen und zum Auswählen aus einer festen Anzahl von -Objekten (zum Beispiel Feld 1 bis Feld 255). - Zum eigentlichen Rechnen gibt es den Typ #on("i")#REAL#off("i")#. Dieser umfaßt -auch Kommazahlen. Genauigkeit, Wertebereich und Darstellung sind -nahezu identisch mit den Möglichkeiten eines Taschenrechners. der -Typ REAL wird immer dann verwendet, wenn mit realen Größen -(Geldbeträge, physikalische Werte) gerechnet werden muß. - Zuletzt gibt es noch den Typ #on("i")#BOOL#off("i")#. Er hat nur zwei mögliche -Werte, nämlich TRUE (wahr) und FALSE (falsch). Er wird dazu benö -tigt, Ausdrücke zu schreiben, die den Zweig einer IF-Anweisung -bestimmen. - -#on("b")#Denotation#off("b")# ELAN verfügt über einen strengen Typenschutz; -das -heißt, Objekte verschiedenen Typs dürfen nicht gemischt werden. -Daher muß schon bei der Schreibweise der Konstanten festgelegt -sein, welchen Typ die Konstante hat. - Bei Texten geschieht dies durch den Einschluß in Anführungs -striche. Die Anführungsstriche sorgen gleichzeitig auch für eine -Abgrenzung der Zeichen des Textes und des umgebenden Programms. -Sie kennen diese Schreibweise bereits von vielen Stellen in EUDAS. - Ebenfalls keine Probleme bereitet der Typ BOOL, da die -Schreibweise der beiden möglichen Werte TRUE und FALSE eindeutig -ist. - Problematisch wird es bei den Zahlen. Da die ganzen Zahlen in -den rationalen Zahlen enthalten sind, muß für die ganzen Zahlen -durch die Schreibweise festgelegt werden, zu welchem der beiden -Typen sie gehören. Man hat festgelegt, daß REAL-Zahlen immer mit -Komma geschrieben werden müssen, während Zahlen ohne Komma den -Typ INT haben (das Komma wird in ELAN bei den REAL-Zahlen in -internationaler Schreibweise als Punkt notiert). - So ist 4 eine INT-Zahl, während 4.0 den Typ REAL besitzt. -Denken Sie in Zukunft immer daran, welcher Zahltyp jeweils ver -langt wird und richten Sie die Schreibweise danach. - -#on("b")#Unterschied zu Feldtypen#off("b")# Verwechseln Sie die hier -vorgestellten -Datentypen nicht mit den Feldtypen einer EUDAS-Datei. Die Feld -typen beziehen sich immer auf den gleichen Datentyp, nämlich -TEXT. Die Feldtypen bestimmen lediglich die spezielle Behandlung -des Feldes beim Suchen und Sortieren, während Datentypen tat -sächlich Unterschiede in der Speicherung und den anwendbaren -Operationen bedeuten. - Daher können Sie Feldtypen auch nach Bedarf ändern, während -der Datentyp eines Objekts ein für alle Mal feststeht. Merken Sie -sich, daß Feldinhalte in EUDAS immer den Typ TEXT haben. - -#on("b")#Umwandlungen#off("b")# Obwohl verschiedene Datentypen nicht -miteinander -gemischt werden dürfen, können sie mit speziellen Funktionen in -einander umgewandelt werden. So ist zum Beispiel die Addition von -1 und 1.5 verboten, aber der folgende Ausdruck - - - real (1) + 1.5 - - -liefert den Wert 2.5 mit dem Typ REAL. Umgekehrt geht die Um -wandlung mit der Funktion 'int', dabei werden jedoch die Nachkom -mastellen abgeschnitten. Weitere Hinweise dazu erhalten Sie im -Abschnitt 14.4. - Wichtiger jedoch ist die Umwandlung von Zahlen in TEXT-Ob -jekte. Was Sie auf Ihrem Bildschirm oder Ausdruck sehen, sind ja -immer nur Zeichenfolgen und damit Texte. Zahlen (INT oder REAL) -in ihrer internen Darstellung können Sie prinzipiell nicht sehen. Sie -müssen zur Darstellung immer in Texte umgewandelt werden. - Auch beim Rechnen mit Werten aus EUDAS-Dateien müssen -mehrere Umwandlungen stattfinden. Der Feldinhalt, der ja ein TEXT -ist, muß zunächst in eine Zahl umgewandelt werden. Dann wird mit -dieser Zahl gerechnet. Wenn das Ergebnis wieder in ein Feld einge -tragen oder gedruckt werden soll, muß eine Rückumwandlung in -einen Text vorgenommen werden. - Die zum Umwandeln benötigten Funktionen werden ebenfalls im -Abschnitt 14.4 besprochen. - -#on("b")#Funktionsbeschreibung#off("b")# In den zwei folgenden Abschnitten -sollen -die wichtigsten Funktionen und Operatoren anhand von Beispielen -beschrieben werden. Da jede Funktion nur auf bestimmte Datentypen -angewendet werden kann, gibt es eine Notation, die genau die Form -eines Funktionsaufrufs festlegt. - - - INT PROC min (INT CONST a, b) - - -Die obige Schreibweise hat folgende Bedeutung: Spezifiziert wird die -Funktion 'min', die als Ergebnis einen INT-Wert liefert (das INT -ganz links). Die Bezeichnung PROC gibt an, daß es sich um eine -Funktion handelt. In Klammern ist dann angegeben, welche Parame -ter verwendet werden müssen. Die Funktion hat zwei Parameter, -beide vom Typ INT. Die Bezeichnung CONST gibt an, daß auch Kon -stanten verwendet werden dürfen (Normalfall). - Zu beachten ist, daß bei jedem Aufruf beide Parameter vorhan -den und vom Typ INT sein müssen. Anderenfalls gibt es eine Feh -lermeldung. - Die gleiche Schreibweise wird auch zur Spezifikation von Ope -ratoren verwendet: - - - INT OP + (INT CONST a, b) - - -Jedoch dürfen Operatoren nicht mit Parametern in Klammern ge -schrieben werden, sondern der Operator wird zwischen die Parameter -geschrieben. - Eine Besonderheit von ELAN ist es, daß es verschiedene Opera -toren und Funktionen mit gleichem Namen geben kann. Die Funktio -nen werden nur unterschieden nach dem Typ ihrer Parameter. So -gibt es nicht nur den oben genannten Operator '+', sondern auch -den folgenden: - - - REAL OP + (REAL CONST a, b) - - -Obwohl im Aussehen gleich, handelt es sich doch um verschiedene -Operatoren mit möglicherweise völlig verschiedener Wirkung. Dies -sieht man an diesem Beispiel: - - - TEXT OP + (TEXT CONST a, b) - - -Dieser Operator führt nun keine Addition aus, sondern eine #on("i")#Verket -tung#off("i")# zweier Texte. Je nach Typ der Parameter wird der entspre -chende Operator ausgesucht. - - -14.3 TEXT-Funktionen - -In diesem Abschnitt wollen wir die wichtigsten Funktionen und -Operatoren zur Behandlung von Texten beschreiben. Wie Sie noch -sehen werden, spielt dabei aber auch der Typ INT eine gewisse -Rolle. - -#on("b")#EUDAS-Abfragen#off("b")# Die wichtigste Funktion zur Abfrage von -Inhal -ten der aktuellen Datei sollten Sie bereits kennen: - - - TEXT PROC f (TEXT CONST feldname) - - -Neu ist eigentlich nur die Schreibweise der Spezifikation. Sie sollten -aber in der Lage sein, daraus einen konkreten Ausdruck zu kon -struieren. Bisher haben wir immer die Schreibweise - - - f ("Feldname") - - -verwendet. Dies ist jedoch nur ein Beispiel. Die korrekte Angabe -finden Sie oben. - Die Funktion 'f' darf natürlich nicht angewendet werden, wenn -keine Datei geöffnet ist. In die Verlegenheit kommen Sie aber nur -beim Ausprobieren, denn alle gefährlichen EUDAS-Funktionen sind -sonst gesperrt. - Falls das angegebene Feld nicht existiert, wird mit einer Feh -lermeldung abgebrochen. Beachten Sie, daß dies immer erst bei der -Ausführung festgestellt werden kann. Bei der Eingabe, zum Beispiel -eines Druckmusters, kann dies noch nicht überprüft werden. - Eine weitere Abfrage, die EUDAS während des Druckens ermög -licht, ist die Funktion - - - TEXT PROC lfd nr - - -Diese hat keine Parameter und liefert die laufende Nummer des -gedruckten Satzes. - Diese beiden Funktionen können als Ausgangsbasis dienen zur -Manipulation mit weiteren Funktionen. - -#on("b")#Verkettung#off("b")# Zur Verkettung von Teiltexten gibt es den oben -schon -beschriebenen Operator '+'. Wenn Sie mehr als zwei Texte verketten -wollen, können Sie den Operator beliebig hintereinander verwenden: - - - f ("PLZ") + " " + f ("Ort") - - -Wie in diesem Beispiel können Sie sowohl Konstanten als auch Tex -te, die von anderen Funktionen geliefert werden, verketten. Beach -ten Sie, daß die Texte immer ohne Zwischenraum aneinandergehängt -werden; daher wird im obigen Beispiel ein Leerzeichen extra ange -geben. - Wenn Sie eine bestimmte Anzahl von gleichen Zeichen haben -möchten (zum Beispiel für horizontale Linien oder große Zwischen -räume), können Sie dafür folgenden Operator verwenden: - - - TEXT OP * (INT CONST anzahl, TEXT CONST einzeltext) - - -Hier sehen Sie als Beispiel einen Operator, der mit verschiedenen -Datentypen arbeitet. Sie müssen die Parameter jedoch immer in der -angegebenen Reihenfolge benutzen. Das folgende Beispiel ist kor -rekt: - - - 20 * "-" - - -während dies nicht erlaubt ist: - - - "-" * 20 - - -Wieder können Sie diesen Operator mit anderen Funktionen verknü -pfen: - - - "!" + 10 * " " + "!" + 5 * "-" + "!" - - -Da der Multiplikationsoperator Vorrang vor der Addition hat, kom -men Sie hier sogar ohne Klammern aus (überlegen Sie sich, wo ein -Fehler auftreten würde, wenn dies nicht so wäre). Als Ergebnis -dieses komplexen Ausdrucks ergäbe sich der folgende Text: - - - "! !-----!" - - -#on("b")#Teiltexte#off("b")# Um auch Teile von Texten bearbeiten zu können, -werden -die Zeichen eines Textes von 1 an (mit INT-Zahlen) durchnumeriert. -Anhand dieser Positionen können Sie Teiltexte extrahieren. - Damit Sie die Position des letztes Zeichens (und damit die An -zahl der Zeichen) erfragen können, gibt es die Funktion - - - INT PROC length (TEXT CONST text) - - -Wieviel Zeichen in einem Feld stehen, können Sie also mit - - - length (f ("Feldname")) - - -erfahren. - Einen Teiltext bekommen Sie mit der Funktion 'subtext'. Diese -gibt es in zwei Ausführungen. - - - TEXT PROC subtext (TEXT CONST text, INT CONST anfang) - - -liefert den Teiltext von einer bestimmten Position an (einschließ -lich) bis zum Textende. Mit - - - TEXT PROC subtext (TEXT CONST t, INT CONST anf, ende) - - -können Sie auch die Position des letzten Zeichens (einschließlich) -angeben. Daher würden die beiden folgenden Aufrufe - - - subtext (f ("Feldname"), 1) - subtext (f ("Feldname"), 1, length (f ("Feldname"))) - - -den Feldinhalt unverändert liefern. Ein weiteres Beispiel: - - - subtext ("Ein Text als Beispiel", 5, 8) - - -liefert als Ergebnis "Text". - Es gibt noch den Operator 'SUB', der jeweils nur ein Zeichen -aus dem Text liefert: - - - TEXT OP SUB (TEXT CONST text, INT CONST stelle) - - -Der Aufruf ist gleichwertig zu einem Aufruf von 'subtext', in dem -beide Stellen gleich sind. - Bei beiden Funktionen wird nicht vorhandener Text einfach -ignoriert. So liefert - - - subtext ("Hallo", 4, 8) - - -das Ergebnis "lo" und - - - "Hallo" SUB 10 - - -den leeren Text "". - -#on("b")#Verschachtelte Ausdrücke#off("b")# Wie Sie bereits gesehen haben, -kann -man Ausdrücke ineinander verschachteln. Dies ist in unserem Fall -sehr nützlich, wenn Teiltexte bestimmt werden sollen, deren Posi -tion nicht konstant ist. Ein Beispiel, in dem 'length' bei der Fest -legung der Endposition verwendet wird, haben Sie weiter oben -bereits gesehen. - Als weitere Möglichkeit können Sie mit Positionen, die ja INT- -Zahlen sind, ganz normal rechnen. Folgender Ausdruck liefert zum -Beispiel die letzten drei Zeichen eines Feldes: - - - subtext (f ("Feldname"), length (f ("Feldname")) - 2) - - -Wichtig ist, daß ein Ausdruck, der wieder als Parameter für einen -anderen Ausdruck verwendet werden soll, den richtigen Typ hat, -der von dem anderen Ausdruck verlangt wird. - In dem obigen Beispiel muß als Position ein INT verwendet -werden. Diese Position wird vom Operator '-' berechnet. Es gibt -aber nur einen Subtraktionsoperator, der einen INT liefert, nämlich -den, der wiederum zwei INTs subtrahiert. Glücklicherweise sind -sowohl 'length' als auch die 2 vom Typ INT, anderenfalls wäre der -Ausdruck fehlerhaft. 'length' wiederum benötigt einen TEXT als -Parameter, der von der Funktion 'f' stammt, die als Parameter eben -falls einen TEXT verlangt. - Wie Sie sehen, kann es durchaus verwickelt zugehen, wenn ein -Ausdruck aus den verschiedensten Teilausdrücken unterschiedlichen -Typs zusammengesetzt ist. Die gleiche Überprüfung wie eben ge -schildert sollten Sie bei jedem Ausdruck vornehmen, damit keine -Fehlermeldung erscheint. - -#on("b")#Variable Positionen#off("b")# Zur Berechnung von Positionen gibt es -noch eine weitere nützliche Prozedur, nämlich - - - INT PROC pos (TEXT CONST text, teiltext) - - -Sie liefert die Position, an der der angegebene Teiltext zum ersten -Mal in dem Text vorkommt, oder 0, wenn der Teiltext nicht darin -vorkommt. So ist - - - pos ("Hallo", "l") = 3 - - -und - - - pos ("Hallo", "lo") = 4 - - -und - - - pos ("Hallo", "xx") = 0 - - -Diese Funktion kann zum Beispiel dazu verwendet werden, ein Feld -in mehrere Teile aufzuspalten. Sind zum Beispiel Name und Vorname -in einem Feld durch Leerzeichen getrennt hintereinandergeschrie -ben, liefert - - - subtext (f ("Name"), 1, pos (f ("Name"), " ") - 1) - - -den Vornamen und entsprechend - - - subtext (f ("Name"), pos (f ("Name"), " ") + 1) - - -den Nachnamen. Soll die Position erst ab einer gewissen Stelle ge -sucht werden, gibt es noch die folgende Variation der Funktion: - - - INT PROC pos (TEXT CONST text, teiltext, INT CONST ab) - - -Bei dieser Funktion wird erst ab der angegebenen Stelle einschließ -lich gesucht. - - -14.4 Rechenfunktionen - -#on("b")#Umwandlungen#off("b")# Bevor mit dem Inhalt eines Feldes gerechnet -wer -den kann (auch wenn das Feld den Feldtyp ZAHL hat), muß der Wert -des Feldinhaltes als REAL-Zahl berechnet werden. Dazu gibt es die -Funktion - - - REAL PROC wert (TEXT CONST feldname) - - -Die Funktion 'wert' ignoriert alle Sonderzeichen in dem Feld außer -dem Minuszeichen (als Vorzeichen) und dem eingestellten Dezimal -komma. Wenn das Feld 'Summe' beispielsweise "-***20,09 DM" ent -hält, ergibt sich - - - wert ("Summe") = 20.09 - - -Zum kaufmännischen Rechnen ist es manchmal erforderlich, den Wert -auf eine bestimmte Anzahl von Nachkommastellen zu runden. Diese -Anzahl kann man bei einer Variante von 'wert' als Parameter ange -ben: - - - REAL PROC wert (TEXT CONST feldname, - INT CONST kommastellen) - - -Mit den so erhaltenen Werten können Sie dann die weiter unten -beschriebenen Berechnungen durchführen. Bevor Sie das Ergebnis -jedoch drucken oder in ein Feld eintragen können, müssen Sie den -REAL-Wert wieder in einen TEXT verwandeln. Dazu dient die Funk -tion - - - TEXT PROC zahltext (REAL CONST wert, - INT CONST kommastellen) - - -Der übergebene Wert wird mit der gewünschten Anzahl von Komma -stellen als Text formatiert. Dazu wird der Wert gerundet. Außerdem -wird statt eines Punktes das eingestellte Dezimalkomma eingesetzt. -Die Länge des Textes richtet sich nach der Anzahl von benötigten -Stellen, es werden also keine führenden Nullen oder Leerzeichen -eingesetzt (dafür kann man den Text beim Drucken ja rechtsbündig -einsetzen). - Wird 0 als Kommastellen angegeben, wird auch kein Dezimal -komma erzeugt (Darstellung wie ein INT). Als Abkürzung können Sie -auch - - - TEXT PROC zahltext (TEXT CONST feldname, - INT CONST kommastellen) - - -als Ersatz für - - - zahltext (wert ("Feldname"), kommastellen) - - -verwenden. So kann ein Feld einheitlich zum Drucken formatiert -werden. - -#on("b")#Arithmetik#off("b")# Sowohl mit INT- als auch mit REAL-Zahlen -(jedoch -nicht gemischt) können Sie die üblichen Rechenoperatoren '+', '-' -und '*' verwenden. Auch Minimum ('min') und Maximum ('max') sind -für zwei Parameter dieser Typen definiert. - Lediglich die Division wird bei beiden Typen unterschiedlich -gehandhabt. Für REAL-Zahlen gibt es den Operator '/' für die -übliche Division. Da die ganzzahlige Division eine andere Bedeutung -hat, wird dafür der Operator 'DIV' verwendet. Den Rest der ganz -zahligen Division liefert 'MOD'. - 'abs' liefert den Wert eines REAL oder INT ohne das Vorzeichen. -Die Umwandlungsfunktionen 'int' und 'real' hatten wir ja bereits -weiter oben erwähnt. - Für REAL-Zahlen gibt es noch weitere mathematische Funktio -nen (Exponentialfunktion, Trigonometrie), die Sie am besten im -EUMEL-Benutzerhandbuch nachschlagen, wenn Bedarf dafür besteht. - - -14.5 Abfragen - -#on("b")#IF-Abfragen#off("b")# Wie Sie schon im vorigen Kapitel gesehen -haben, -kann man in Druckmustern auch IF-Abfragen als Ausdrücke ver -wenden. Die IF-Abfragen können zwar auch ineinander verschach -telt werden, sie dürfen jedoch nicht mehr innerhalb eines normalen -Ausdrucks angewendet werden. - Eine IF-Abfrage enthält 3 Teilausdrücke in folgender Form: - - - IF 'BOOL-Ausdruck' THEN - 'Ausdruck1' - ELSE - 'Ausdruck2' - END IF - - -Der erste Ausdruck muß einen Wert vom Typ BOOL liefern, der ent -scheidet, welcher der beiden Teilausdrücke ausgewertet wird. Wir -werden gleich noch sehen, was für Möglichkeiten es da gibt. - Die beiden Teilausdrücke dürfen auch wieder IF-Abfragen sein, -sind sie es jedoch nicht, dürfen in ihnen dann keine IF-Abfragen -mehr vorkommen. Die IF-Abfragen liegen also immer auf der äußer -sten Ebene. - Die beiden Teilausdrücke dürfen einen beliebigen Typ haben, er -muß jedoch für beide gleich sein. - Als Ergebnis der IF-Abfrage wird 'Ausdruck1' geliefert, wenn -der BOOL-Ausdruck wahr ist, sonst 'Ausdruck2'. - -#on("b")#Vergleiche#off("b")# Die wesentlichen Operationen, die boolesche -Ausdrücke -zur Verwendung in IF-Abfragen bilden, sind die Vergleichsoperato -ren: - - - = <> <= >= < > - - -Sie vergleichen jeweils zwei Elemente vom Typ TEXT, INT oder REAL -und liefern TRUE (wahr) oder FALSE (falsch). Selbstverständlich -können auch sie zwei zusammengesetzte Teilausdrücke vergleichen. - Eine Anwendung ist zum Beispiel der Test, ob ein Text in einem -anderen enthalten ist: - - - IF pos (f ("Betrag"), "DM") > 0 THEN - "deutsches Geld" - ELSE - "ausländisches Geld" - END IF - - -Die Funktion 'pos' wird hier dazu benutzt, festzustellen, ob es sich -um deutsches oder ausländisches Geld handelt. - Oft müssen jedoch mehrere Vergleiche miteinander kombiniert -werden. Zu diesem Zweck gibt es die beiden Operatoren AND (und) -und OR (oder). Damit AND das Ergebnis TRUE liefert, müssen beide -Vergleiche wahr sein, bei OR muß mindestens einer der beiden wahl -sein. - Die Reihenfolge aller dieser Operatoren ist so gewählt, daß -normalerweise keine Klammern benötigt werden. Funktionen haben -immer Vorrang vor Operatoren, bei den Operatoren kommt die Multi -plikation vor der Addition, dann kommen die Vergleiche, danach das -AND und danach das OR. Alle anderen Operatoren (#on("i")#insbesondere -SUB#off("i")#) teilen sich den letzten Rang. - Wenn Sie also in einem Ausdruck mehrere Vergleiche mit AND -und OR verknüpfen, und das OR soll stärker binden als das AND, -müssen Sie dies durch Klammern ausdrücken. - Den oben besprochenen Operator SUB sollten Sie immer in -Klammern setzen, wenn Sie ihn in einem Vergleich benutzen. Da er -die niedrigste Priorität hat, gäbe es sonst mit Sicherheit Fehler: - - - IF (f ("Name") SUB 1) = "M" THEN - "vielleicht Müller" - ELSE - "bestimmt nicht" - END IF - - -#on("b")#Refinements#off("b")# Bisher hatten wir gesagt, daß IF-Abfragen -nicht -innerhalb von anderen Ausdrücken verwendet werden dürfen. Diese -Einschränkung kann man umgehen, indem man #on("i")#Refinements#off("i")# verwen -det. - Ein Refinement hat im Druckmuster eine ähnliche Wirkung wie -eine Abkürzung, lediglich der Name darf nur mit Kleinbuchstaben -und Ziffern geschrieben sein und kann nicht als Feldmuster ver -wendet werden. - - - &abk : - subtext (f ("Name"), namensanfang) . - namensanfang : - IF pos (f ("Name"), " ") > 0 THEN - pos (f ("Name"), " ") + 1 - ELSE - length (f ("Name")) - END IF . - - -Innerhalb von Refinements dürfen auch wieder andere Refinements -verwendet werden. - Auch in Kopier- und Änderungsmustern können Sie Refinements -verwenden. Hier müssen Sie jedoch darauf achten, daß alle Refine -ments am Ende gesammelt werden und vor dem ersten Refinement -ein Punkt stehen muß. Ebenso müssen die Refinements wie im -Druckmuster durch Punkte voneinander getrennt sein: - - - "Anrede" K anrede; - . - anrede : - IF f ("m/w") = "w" THEN - "Frau" - ELSE - "Herr" - END IF . - - - |