Flexible Modulprogrammierung mit ADIMENS Talk Teil 2: Erfassen von Datensätzen

Es freut mich, Sie zu diesem 2. Teil der flexiblen Modulprogrammierung mit ADIMENS Talk begrüßen zu dürfen. Nachdem Sie sich ein Anwendungsproblem mittels dieser Datenbank-Abfragesprache erstellen wollen, wird es natürlich Zeit zu erfahren, wie man Daten erfassen, ändern, löschen und abspeichern kann.

Die einführenden Grundlagen und Befehle vom 1. Teil werden dabei vorausgesetzt. Natürlich können Sie auch ohne diesen einführenden Teil alle Befehle ausprobieren und das Modul für das Erfassen von Datensätzen programmieren. Das Anwendungsprogramm soll in der Praxis eingesetzt werden. Dort muß es den gestellten Anforderungen genügen. Das heißt nichts anderes, als daß wir uns erst einmal Gedanken über den Aufbau eines Datenbanksystems im allgemeinen und über die nötigen konzeptionellen Phasen der Planung und Organisation im besonderen machen müssen.

Kennzeichen relationaler Datenbanksysteme

Ohne auf die Relationentheorie und den Aufbau näher einzugehen, ist es dennoch notwendig, die wichtigsten Eigenschaften kennenzulernen, da die Erstellung der Datenstrukturen und die konzeptuellen Schritte weitgehend davon abhängig sind. Der Begriff relational stammt aus der Mathematik und zwar aus der Relationentheorie. Danach ist eine Relation eine sogenannte “Menge von Tupeln”, d.h. eine Tabelle, die aus einer Anzahl gleichartiger Zeilen - den Tupeln - besteht. Wenn wir diesen Begriff in die Datenverarbeitung übertragen, so stellt eine Datei mit mehreren Datensätzen solch eine Relation dar.

Die Datenbank soll dabei stets ein Abbild der Realität bleiben. Da sich die Wirklichkeit jedoch im Laufe der Zeit verändert, ergibt sich für die Datenbank die Notwendigkeit. daß sie an eine veränderte Umwelt angepaßt werden muß. Eine Änderung in der Umwelt kann z.B. zur Folge haben, daß Felder bz». die Datensätze der Datenbank oder Attribute bzw. Tupel der Datenbank verändert »erden müssen. Da bei einem relationalen Datenbanksystem die Informationen in einfachen Tabellen gespeichert werden, wird das Festlegen der Struktur sehr einfach. Die Datenstruktur wird mit dem Programmteil INIT erstellt.

Hier stellt sich sofort die Frage:
Wie ist ein Datenfeld bzw. ein Merkmal bei ADIMENS charakterisiert?

Das Merkmal besteht aus einem Merkmalsnamen und einem Merkmalsfeld. Die Spalte der Tabelle wird gekennzeichnet durch den Merkmalsnamen, auf englisch auch “attribute” genannt. Die Daten in einem Merkmalsfeld werden als Merkmalsausprägung bezeichnet.

Die Zusammenfassung aller Merkmalsausprägungen einer Bildschirmmaske bildet einen Datensatz (siehe Abb. 1).

Weiterhin kann sich nach einiger Zeit die Notwendigkeit ergeben, daß neue logische Strukturen, d.h. Abhängigkeiten zwischen Datensätzen, in die Datenbank einzufügen sind oder bestehende Strukturen verändert werden müssen.

Außerdem kann es erforderlich werden, daß bestehende Formate von Satztypen bzw. Feldtypen nach einiger Zeit verändert werden müssen.

Diese Änderungen führen alle zu einer Aktualisierung der Datenbank. Das Datenbanksystem ADIMENS unterstützt die dazu erforderlichen Pflegeprozesse. Eine wesentliche Forderung an ein Datenbanksystem ist die Gewährleistung der Datenintegrität. Das bedeutet ganz allgemein Korrektheit und Vollständigkeit der abgespeicherten Daten.

Es gibt außerdem bei ADIMENS noch Merkmale, von denen Datensätze aufgerufen werden können und solche, von denen aus dies nicht möglich ist.

Damit kann das Datenbanksystem die Tabelle nach den vereinbarten Merkmalen ordnen. Diese nennt man Schlüsselmerkmale. Außerdem ist es nicht sinnvoll, in einer Datei alle Daten zusammenzufassen, die in irgendeiner Beziehung zueinander stehen. Auf der anderen Seite ist es aber wichtig, sich zu einem bestimmten Datensatz weitere Informationen aus anderen Dateien anzeigen lassen zu können. Es müssen deshalb Verbindungen zwischen den Dateien vorhanden sein. Sie sind über einzelne Merkmale möglich, die beim Vereinbaren der Datenbankstruktur als Verbindungsschlüssel festgelegt werden.

Abb.1 : Grundbegriffe bei Datenbanken

Unter einer Datenbank ist also die Gesamtheit aller physischen Datensätze zu verstehen. Die Menge aller Datensätze mit demselben Namen bezeichnet man als Datei oder Datenbestand.

Wenn wir dies zusammenfassen wollen, so ist es mit Hilfe des Datenbanksystemes ADIMENS möglich, eine große Anzahl von unterschiedlich strukturierten Daten zu speichern, die in verschiedene Dateien untergliedert sind.

Bei relationalen Datenbanken wie ADIMENS werden die logischen Beziehungen zwischen Daten verschiedener Relationen über den Dateninhalt selbst dargestellt. Zum Beispiel kann über eine Systemnummer die Verknüpfung zwischen einer Lieferantendatei und einer Meßwert-Erfassungsdatei hergestellt werden, wenn dieselbe Nummer in beiden Tabellen auftaucht. Genauso kann dann in derselben Datei über die Bearbeitungsnummer in der bestehenden Paßwortdatei verknüpft werden.

Mit dieser Eigenschaft lassen sich problemlos neue Relationen (Dateien) erstellen und in die existierende Datenbank integrieren, ohne die vorhandenen Datenbestände zu beeinflussen. So haben auch Sie die Möglichkeit, Datenbanken zu generieren, die für Ihren speziellen Fall maßgeschneidert werden.

Aufbau von Datenbanksystemen

Nachdem Sie die Datenstruktur festgelegt haben, müssen die gespeicherten Daten Ihrem Anwendungsprogramm zur Verfügung gestellt werden.

Der Zugriff auf die Daten erfolgt dabei nicht mittels Adressen, sondern durch ihre teilweise Beschreibung auf einer höheren logischen Ebene.

Die Abfragesprache, auch Query Language genannt, ist eine Sprache, bei der man nur formulieren muß, welche Daten gewünscht werden, ohne daß eine Prozedur erstellt werden muß, an der man absehen könnte, auf welche Art und Weise nach den Daten gesucht wird.

Wir müssen uns keine Gedanken darüber machen, welche Umformungsalgorithmen auf den unteren Ebenen in das vorliegende Datenbanksystem implementiert worden sind, die eine Optimierung der konkreten Abfrage erreichen (siehe Abb.2).

Das Speichern und Verwalten der Daten auf den physischen Speichern sowie das Bereitstellen für den jeweiligen Anwendungsprozeß geschieht mit Hilfe des softwaremäßig realisierten Datenbanksystem ADIMENS.

Konzeptionellen Schritt

Der Wert einer Datenbank zeigt sich erst in der Praxis. Soll sie den dort gestellten Anforderungen gerecht werden, so ist bei der Datenbankkonzeption größte Sorgfalt geboten. Das heißt nichts anderes, als daß bei der Erarbeitung dieser Konzeption in wohlüberlegten Schritten vorzugehen ist. Die wichtigsten Punkte einer solchen Vorgehensweise werden in diesem Teil aufgezeigt.

Durch die Repräsentation einer Datei durch eine Bildschirmmaske ist es möglich, relativ leicht die Arbeit mit den Dateien nachzuvollziehen.

Die Aufteilung der Merkmale auf die Masken ist zunächst so vorzunehmen, daß der Benutzer bei den verschiedenen Tätigkeiten möglichst wenig zwischen den Masken wechseln muß, d.h. daß Ein-und Ausgabevorgänge möglichst jeweils nur über eine Maske erfolgen. Dies kann allerdings dazu führen, daß Masken recht viele Merkmale enthalten, die Datensätze also recht umfangreich sind.

Auf der anderen Seite muß auch beachtet werden, daß je mehr Dateien eine Datenbank besitzt, desto geringer die Übersichtlichkeit und desto höher folglich der Einarbeitungsaufwand ist.

Abb.2 : Aufbau eines Datenbanksystems

Man muß hier mit Rücksicht auf die Übersichtlichkeit und den dabei erforderlichen Einarbeitungsaufwand einerseits und den Umfang der Datensätze andererseits einen optimalen Kompromiß suchen.

Ein sehr einfaches Kriterium zur praxisgerechten Bildung von Dateien liefert die Unterscheidung zwischen Stamm- und Bewegungsdaten. Stammdaten sind Daten von relativ langer Gültigkeitsdauer (Teil der geometrischen und technologischen Daten, Lieferanten-Adressen, Preislisten usw.), auf die häufig mehrere Beteiligte zugreifen.

Bewegungsdaten geben den Ist-Wert bzw. Ist-Zustand einer sich laufend ändernden Größe und Situation an (Lagerbestände, Statistiken, Messungen in der Werkzeuginstandhaltung).

Stamm- und Bewegungsdaten werden in der Regel besser in getrennten Dateien erfaßt, da sie meist auch von verschiedenen Personen oder zumindest zu verschiedenen Zeitpunkten eingegeben bzw. genutzt werden.

Eine Datei mit Bewegungsdaten dürfte sehr viel häufiger genutzt werden als eine Datei, die nur Stammdaten enthält.

Wenn das Aussehen ihrer geplanten Dateien nun in etwa feststeht, ist die Grundsatzentscheidung zu treffen, ob die Datenbank stufenweise oder zu einem festen Termin auf einmal eingeführt werden soll. Je umfangreicher und komplexer die verschiedenen Arbeitsabläufe sind, desto eher ist eine schrittweise Einführung zu empfehlen.

Das Baukastenprinzip in Abb.3 zeigt den Einstieg und die Erweiterung einer Werkzeugdatenbank, welche sich z.B. in einem Unternehmensbereich ergeben könnte.

Abb.3 : Baukastenprinzip bei der Einführung der Dateien

Erfassen von Daten

Nach diesem Abschnitt der Erklärungen kommen wir zur eigentlichen Aufgabe, ein flexibles Modul für das Erfassen von Daten zu schreiben. Um mit diesen Daten arbeiten zu können, müssen Sie zuerst eine gemeinsame Datenbasis erstellen. Der Programmteil INIT dient dabei zum Definieren der Datenbank, welche wir im folgenden mit BEISPIEL kennzeichnen wollen.

Für das Modul zum Erfassen von Datensätzen legen wir vorerst nur die Datei ADRESSEN an, welche die Lieferantenadressen beinhalteten soll. (s.Abb.4)

Online-Programme

Begünstigt durch die hohe Rechenleistung des Atari-Computers herrscht allgemein der Trend vor, neue Programme so zu schreiben, daß die Daten direkt erfaßt und sofort verarbeitet werden können, um permanent die aktuellsten Informationen verfügbar zu haben.

Man spricht dann von einer Online-Verarbeitung. Um diese zu realisieren, müssen neben einer ausreichenden Systemleistung vor allem geeignete Befehle zur direkten Datenerfassung angeboten werden. Mit ADIMENS Talk werden Ihnen Möglichkeiten geboten, Daten über die Tastatur zu erfassen und in eine Datenbank aufzunehmen. Neben den Befehlen ACCEPT und WAIT läßt sich auch noch eine Maske mit dem Befehl GET und dem Folgebefehl READ günstig formatieren.

Bei der Programmierung der Menüsteuerung wurde gezeigt, daß der SAY-Befehl dazu dient, eine Maske optisch zu gestalten. Mit dem GET-Befehl lassen sich Merkmalsausprägungen oder Variableninhalte einer Maske bearbeiten. Das Einlesen von Daten ist mit dem GET-Befehl nicht möglich, sondern kann nur mit dem weiter unten beschriebenen READ-Be-fehl erfolgen. Werden in der Maske Variablen verwendet, so müssen diese zuvor (z.B. mit dem STORE-Befehl) eingeführt werden.

Um die Daten eines Merkmals ausgeben zu können, muß zuvor ein Datensatz aus dieser Datei geladen worden sein. Denn nur, wenn sich Merkmale oder Variablen bereits im Speicher befinden, können die entsprechenden Daten in der Maske auch bearbeitet odereingelesen werden. Dabei ist wichtig, daß bei der Verwendung des GET-Befehls der ursprüngliche Datentyp der Variablen oder des Merkmals erhalten bleibt.

Alle GET-Anweisungen innerhalb eines Programms werden zunächst intern zwischengespeichert. Abgearbeitet werden sie über den Befehl READ.

Dadurch wird es möglich, wie gewohnt mit den Pfeiltasten auf einzelne Merkmale zu positionieren und Inhalte zu ergänzen oder zu korrigieren.

Modulstruktur-Diagramm

Ein Modulstruktur-Diagramm wird sehr häufig dazu verwendet, die Moduln, die Aufrufe vom Hauptprogramm und den Variablentransport bei diesen Aufrufen darzustellen. Abb.5 zeigt einen allgemeinen Aufbau von einem Modulstruktur-Diagramm.

Abb.5 : Allgemeiner Aufbau eines Modulstruktur-Diagrammes

Indizieren von Dateien

Das folgende Modul w ird an dem Untermodul zur Erfassung der Lieferanten-Daten erklärt. Es sollen also Stammdaten erfaßt werden. Das Programm LERFASSE.TLK wird von dem Programm STAMM mit DO "LERFASSE" aufgerufen. Nach den üblichen Festlegungen der Schalterstellungen wird die Datenbasis BEISPIEL und die Datei ADRESSEN geöffnet. Nachdem die Kopfzeile programmiert wurde, wird die DO WHILE-Schleife solange durchlaufen, bis die Variable wahl 1 den Wert "" hat.

Die Datei ADRESSE wird nach der Lieferanten-Nummer “LNUMMER” indiziert. Dieses Merkmal wurde in ADIMENS INIT als Schlüsselmerkmal (INDEX) vereinbart. Insbesondere das schnelle Suchen mit der Funktion FIND und alle Positionierungsbefehle zum Vor-und Zurückblättern beziehen sich auf dieses angegebene Schlüsselmerkmal.

Eine sortierte Datei repräsentiert immer nur eine Sortierrichtung, auch w enn diese mit mehreren Schlüsseln zustande gekommen ist. Mit der Schalterstellung kann man die Sortierrichtung mittels dem Befehl SET ALL (F2) vom Talk Menü aus verändern. SORTDOWN - ON kehrt die Laufrichtung bei der Positionierung innerhalb der Datei um. SORTDOWN -OFF bedeutet eine normale lexikographische Einstellung.

Selbstverständlich kann man für Auswertungen und Berichte jede beliebige Sortierung in eine temporäre Datei vornehmen. Dies wird auch noch in einer der nächsten Folgen Bestandteil eines Moduls sein. Aber diese sollte dann wirklich nur für eine einmalige Auswertung benutzt und nicht ständig parallel zur ursprünglichen Datei geführt werden, um unnötige bzw. sogar gefährliche Redundanzen in der Datenbank zu vermeiden. D.h. das Aktualisieren der Daten hat stets und ausschließlich in der "Stammdatei" zu erfolgen und nicht in einer temporären Datei.

Die Redundanz (Mehrfachspeicherung) der Daten sollte auf ein nützliches Maß reduziert werden. Redundanzfreiheit bedeutet natürlich Einsparung an Speicherplatz. hat aber auch den wichtigen Effekt, daß zu einem Teil automatisch Inkonsistenzen in den gespeicherten Daten verhindert werden. Zurück zur Indexdatei. Sie ist gewissermaßen eine Teilkopie der Stammdatei, die pro Satz nur noch ein einziges Datenfeld enthält, und die nach diesem Feld, dem sogenannten Schlüssel, sortiert ist. Bildlich gesprochen stellt eine Indexdatei eine einzige sortierte Spalte aus der Stammdatei her.

Das wesentliche an der Indexdatei ist, daß sie Zeiger, englisch: Pointer, enthält, die von dem einzelnen Feld der Indexdatei auf den zugehörigen Satz in der Stammdatei weisen und diesen bei Bedarf für eine Bearbeitung automatisch aufrufen.

Datenbank = BEISPIEL

1.) ADRESSEN

LNUMMER INTEGER 6   INDEX
LNAME   CHAR 5  INDEX
LFIRMA  CHAR 15
SYSTEMNUMMER    CHAR 8  INDEX
LSTRASSE    CHAR 30
LPLZ    INTEGER 4
LORT    CHAR 20
LTELEFON    CHAR 16
LLETZTE-BESTELLUNG DATE 8

Abb.4 : So sieht unsere Beispieldatei ADRESSEN aus

In unserem Beispiel wird die Datei nach der Lieferanten-Nummer indiziert. Danach kann mit dem Befehl LAST der letzte Datensatz als aktueller Datensatz zur Verfügung gestellt werden. Die Lieferanten-Nummer dieses Datensatzes wird in die Variable VLNUMMER abgespeichert. Die Variablen der Merkmalsnamen werden mit dem Buchstaben V vor dem Merkmalsnamen bezeichnet. Diese Konvention wird im folgenden beibehalten. Eine Variable mit dem 1. Buchstaben V beinhaltet die Merkmalsausprägung des Merkmalsnamens ohne V. Die letzte Datensatznummer wird abgespeichert, und die Variable NR beinhaltet die neue Lieferanten-Nummer um Eins gegenüber der alten Nummer erhöht.

Es werden dann verschiedene Fälle untersucht. Einerseits werden die alten Merkmalsausprägungen in die Merkmalsfelder eines neuen Datensatzes abgespeichert, wenn ein Datensatz erfaßt wurde. Beim erstmaligen Erfassen wird dieser Fall abgewiesen, da die Variable CARRY im Menü auf “F" gesetzt wurde. Andererseits wird der Inhalt des letzten Datensatzes gelöscht und die Variablen für die Merkmalsausprägungen deklariert.

Nachdem die Datensätze der Datei gezählt wurden und die neue Lieferanten-Nummer und das aktuelle Datum in die Merkmalsfelder ersetzt werden, erfolgt der Aufbau der Eingabemaske mit dem SAY-GET-PICTURE-Befehl. Die Merkmalsausprägungen werden mit dem Befehl READ eingelesen.

Man hat nun unterschiedliche Fälle zu berücksichtigen. Zum einen kann das Erfassen der Datensätze abgebrochen oder sie können abgespeichert werden. Die weiteren Möglichkeiten lassen sich sehr schön aus dem Struktogramm ablesen (siehe Abb.6). Listing 1 zeigt das vollständige Programmlisting.

Abb.6: Struktogramm vom Modul für das Erfassen von Daten

Programm Ablauf Im Hauptmenü wählt man den Punkt Stammdaten aus. Danach kommt man ins Menü Stammdaten. Abb.7 zeigt den modulartigen Aufbau der Unterprogramme. Es werden hier überall von der Struktur her die gleichen Programme verwendet. Damit können Sie gemäß diesem Aufbau Ihre individuellen Anwendungsfälle umschreiben.

Nachdem Sie die Zahl 1 gedrückt haben, baut sich die Eingabe-Maske auf dem Bildschirm auf. Ganz unten sieht man eine Menüleiste. Dort hat man die Möglichkeit, sich über die Funktionstasten F01 die Dateninhalte des Merkmals, auf dem sich gerade der Cursor befindet, anzeigen zu lassen. Oder mit der Funktionstaste F10 wird die Eingabe abgebrochen, und es erfolgt sofort die Meldung, ob die Eingabe richtig ist oder nicht. Ist sie richtig, wird der Datensatz abgespeichert, ansonsten wird erneut die Eingabe des Datensatzes ermöglicht.

Geht man den herkömmlichen Weg, so wird man wirklich einen neuen Lieferanten-Datensatz erfassen wollen. Mit den Cursortasten kann man in der Eingabemaske von Merkmalsfeld zu Merkmalsfeld springen. Hat man in einem Merkmalsfeld Daten eingetragen, so werden sie mit < RETURN > beendet. Schließt man das letzte Merkmalsfeld mit < RETURN > ab, erscheint die Sicherheitsabfrage, ob die Eingabe richtig ist. Mit “J” für JA werden die Daten abgespeichert. Die Eingabe “Q” erlaubt es, den Programmteil zu verlassen. Drückt man irgendeine andere Taste, hat man die Möglichkeit einen neuen Datensatz zu bearbeiten, ohne daß der alte abgespeichert wird. Der Anwender besitzt nun nun folgende Auswahlmöglichkeiten:

Es werden hier bewußt Eingaben über die Funktionstasten verlangt, um zu vermeiden, daß Eingaben, die vorher gemacht wurden und sich reflexartig wiederholen, zu ungewollten Programmabläufen führen.Mit der Hilfe des PICTURE-Formates wird sichergestellt, daß die erfaßten Daten stets im selben Format gespeichert werden. Unkorrekt formatierte Daten werden richtiggestellt oder zurückgewiesen.

Abb.7: Der modulartige Aufbau der Unterprogramme

Zusammenfassung

In diesem Teil wurde gezeigt, wie man die AD1MENS Talk-Kommandos zur On-Line-Verarbeitung einsetzen kann. Die Details finden Sie in den Struktogrammen oder in den gut kommentierten Programmlistings. Über die Befehle zur reinen Datenbankmanipulation hinaus bietet ADIMENS Talk eine Reihe weiterer Befehle, die eine Programmierung auf einem hohen Sprachniveau erlauben. Außerdem wurden einige Programmroutinen aufgezeigt, die bestimmte Hilfsfunktionen übernehmen können, und die sich bei entsprechender Anpassung ihrer Variablen leicht in andere Programme integrieren lassen. Fragen der Datensicherheit und der Datensicherung stellen sich in der nächsten Folge, bei der ein Startprogramm erstellt wird, das die Zugriffskontrolle auf bestimmte Daten unterschiedlicher Bearbeiter erlauben wird.

/*  PROGRAMM LERFASSE. TLK  */
/***************************************************/
/* Dies ist ein Beispiel für ein Programmodul zum  */
/* Erfassen von neuen Datensätzen                  */
/* Copyright by Hans-Ulrich Mayer                  */
/***************************************************/

/**** 1 ****/
/* FESTLEGUNG DER SCHALTERSTELLUNGEN */
/* Löschen des Bildschirmes */
CLEAR
/* Unterdrücken der automatischen Maskenanzeige */
SET AUTOSC OFF
/* Die Sonderregelungen für die Funktion FIND sind abgeschaltet */
SET DBASE OFF /* DATENBANK ÖFFNEN */
OPEN "BEISPIEL"
/* DATEI ÖFFNEN */
USE ADRESSEN 
/**** 1 ****/

/********************************************************/

/**** 2 ****/
/* MENÜAUSGABE - Aufbau der Kopfzeile */
CLEAR
/* aktuelle Datumsanzeige und der Uhrzeit */
§ 02    ,00 SAY " Datum "
§ 03    ,00 SAY DATE ()
§ 02    ,72 SAY "Uhrzeit"
§ 03    ,72 SAY TIME ()
§ 01    ,00 SAY BILD1 + BILD1
§ ROW() ,TAB SAY ” DATEN ERFASSUNG **V1.01***"
§ ROW()+1, TAB SAY "flexible Anwendungsprogrammierung mit ADIMENS Talk"
§ ROW()+1,00    SAY BILD2 + BILD2
§ ROW()+1,02    SAY " ERFASSEN neuer Lieferanten ADRESSEN "
§ ROW()+1,00    SAY BILD1 + BILD1

/**** 2 ****/

/********************************************************/
/* DURCHLAUFE die Schleife SOLANGE die Variable wahl 1 =" " ist */

DO WHILE ( WAHL1 = " " )

/********************************************************/

    /**** 3 ****/
    /* LÖSCHEN des Mittelstückes */
    §07,00 CLEAR
    /* INDIZIEREN DER DATEI nach d. Lieferanten Nummer */ 
    INDEX LNUMMER
    /* POSITIONIERUNG DES DATENSATZES auf das Ende der Datei */
    LAST
    STORE LNUMMER TO VLNUMMER 
    STORE STR(VLNUMMER+1,6,0) TO NR 
    /**** 3 ****/

/********************************************************/
/* Untersuchung der verschiedenen Fälle - die Datensätze werden unterschiedlich aufbereitet */

DO CASE
    /* Fall 1: Bei CARRY = "W" werden die Daten in den nächsten Datensatz */ 
    /* übernommen. Ansonsten ist der Datensatzinhalt leer.*/
    CASE ( CARRY = "W" )
    /* Die alten Merkmalsausprägungen werden in das Merkmalsfeld des */ 
        /* neuen Datensatzes abgespeichert. */
        STORE LNAME     TO VLNAME
        STORE LFIRMA    TO VLFIRMA
        STORE LSTRASSE  TO VLSTRASSE 
        STORE LPLZ      TO VLPLZ
        STORE LORT      TO VLORT
        STORE LTELEFON  TO VLTELEFON 
        STORE SYSTEMNUMMER TO VSYSTEMNUMMER

    CASE ( CARRY ="N" )
        /* Die eingefügten Merkmale in den Merkmalfelder bleiben in den */ 
        /* Variablen abgespeichert. N : = nochmals */
    OTHERWISE
        /* Inhalt des Datensatzes löschen */
        NEW
        /* Variablendeklaration lokal */
        STORE SPACE(15) TO VLNAME
        STORE SPACE(15) TO VLFIRMA
        STORE SPACE(30) TO VLSTRASSE
        STORE 0 TO VLPLZ
        STORE SPACE (20)    TO VLORT
        STORE SPACE(08) TO VSYSTEMNUMMER
        STORE "_______________" TO VLTELEFON
    ENDCASE

/********************************************************/

    /**** 4 ****/
    /* Anzahl der Datensätze in der Datei ermitteln */ 
    COUNT ALL TO VLRECNR
    /* Einträgen der neuen Lieferanten Nummer */
    REPLACE LNUMMER WITH INT(NR), LLETZTE_BESTELLUNG WITH DATE()
    /* AUFBAU der Eingabe Maske */
§ 06,50 SAY "Lieferanten Nummer :"+ TRIM(STR(LNUMMER ,6,0))
§ 07,50 SAY "Datensatz Nummer :"+ TRIM(STR(VLRECNR+1,6,0))
§ ROW()+1,00 SAY BILD1 + BILD1 
§ ROW()+1,TAB1 SAY "Firma : " GET VLFIRMA 
§ ROW() , TAB1+25 SAY "Name : " GET VLNAME
§ ROW()+2,TAB1 SAY "Strasse : " GET VLSTRASSE 
§ ROW()+2, TAB1 SAY "PLZ : ” GET VLPLZ PICTURE "####"
§ ROW(), TAB1 + 14 SAY "Wohnort : " GET VLORT
§ ROW()+2,TAB1 SAY "Telefon : " GET VLTELEFON 
§ ROW()+3,03 SAY "Systemnummer des Artikels :"GET VSYSTEMNUMMER 
§ ROW()+0,45 SAY "Letzte Bestellung am : " GET LLETZTE_BESTELLUNG
§ ROW()+1,00 SAY BILD1 + BILD1

/* Einlesen der Merkmalsausprägungen */
READ
/* VARIABLEN ZUWEISUNG */
STORE SPACE (1) TO WAHL2 
STORE "F" TO CARRY
/**** 4 ****/

/********************************************************/
/* DURCHLAUFE die Schleife SOLANGE die Variable wahl2 = " " */
DO WHILE ( WAHL2 = " " ) 
/********************************************************/

/**** 5 ****/
§ 22,03 WAIT "-> 'Q' QUIT ALLES RICHTIG ? (J/N) " TO MSG
/**** 5 ****/

/********************************************************/
/* Untersuchung der verschiedenen Fälle */
DO CASE
    /* FALL 1: Die Daten sollen abgespeichert werden */ 
    CASE UPPER (MSG) = "J"
        /* Die lokalen Variablen werden in die Merkmalsfelder abgespeichert. */ 
        /* Einfügen des Datensatzes in die Datei */
        REPLACE LNAME   WITH    VLNAME
        REPLACE LFIRMA  WITH    VLFIRMA
        REPLACE LSTRASSE WITH   VLSTRASSE 
        REPLACE LPLZ    WITH    VLPLZ
        REPLACE LORT    WITH    VLORT
        REPLACE LTELEFON WITH   VLTELEFON 
        REPLACE SYSTEMNUMMER WITH VSYSTEMNUMMER 
        /* Meldung, daß die Daten abgespeichert werden */ 
        §21,00 CLEAR
        §22,17 SAY "Die Daten werden abgespeichert ! ! ! " 
        INSERT
        STORE SPACE (1) TO WAHL3

        /********************************************************/
        /* DURCHLÄUFE die Schleife SOLANGE wahl3 = " " */ 
        DO WHILE ( WAHL3 = " " )
        /********************************************************/
        /**** 6 ****/
        /* Eingabe wahl3 *
        § 22,00 SAY "F1 = Nächster Datensatz"
        § 22,25 SAY "F2 = Datensatz übernehmen"
        § 22,53 WAIT"F10= Programm verlassen" TO WAHL3
        /**** 6 ****/

        /* UNTERSCHEIDUNG d . verschiedenen Fälle */
        DO CASE
            /* FALL1 : */
            CASE WAHL3 = "F01"
                STORE "F"   TO  CARRY
                STORE SPACE (1) TO WAHL1 
                STORE "Q"   TO  WAHL3
            /* FALL2
            CASE WAHL3 = "F02"
                STORE "W" TO CARRY 
                STORE SPACE (1) TO WAHL1 
                STORE "Q" TO WAHL3 /* FALL3 : */
            CASE WAHL3 = "F10"
                STORE "Q" TO WAHL1 
                STORE "Q" TO WAHL3 
            OTHERWISE
                /* Erzeugen einer Falschmeldung mit Warnton */
                BELL
                § 21,17 SAY " FALSCHE EINGABE ! !"
                § 21,40 SAY " Bitte wiederholen " 
                STORE SPACE (1) TO WAHL3
            ENDCASE

        /***************************************/
        /*        BEENDEN der Schleife         */
        ENDDO
        /***************************************/

        /**** 7 ****/
        /* VARIABLEN ZUWEISUNG um die Schleife verlassen zu können */
        STORE "Q" TO WAHL2
        /**** 7 ****/

    /* FALL2 : */
    CASE UPPER (MSG) = "N"
        STORE "Q" TO WAHL2
        /* Die Datensätze bleiben mit der gleichen Variablen belegt */
        STORE "N" TO CARRY

    /* FALL3 : */
    CASE UPPER (MSG) = "Q"
        STORE "Q" TO WAHL1 
        STORE "Q" TO WAHL2 
        STORE "Q" TO WAHL3

    OTHERWISE
        /* Erzeugen einer Falschmeldung mit Warnton */ 
        BELL
        § 21,21 SAY " FALSCHE EINGABE ! ! ! Bitte wiederholen "
        STORE SPACE(1) TO WAHL2 
    ENDCASE

/*********************************************/
/* BEENDEN der Schleife */
ENDDO
/*********************************************/

/* RESET der Variablen auf den Ausgangszustand */
STORE "F" TO CARRY 
STORE " " TO WAHL1
/* DATEI SCHLIESSEN */
CLOSE

Listing 1 : Erfassen von Datensätzen
Hans-Ulrich Mayer



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]