Freigeben über


Grundbegriffe des Programmierens

Beim Programmieren werden Daten gespeichert, und diese Daten werden mit einer Reihe von Anweisungen bearbeitet. Die Daten und Datenspeichercontainer sind gewissermaßen die Rohstoffe des Programmierprozesses. Die Tools, mit denen Sie diese "Rohstoffe" bearbeiten, sind Befehle, Funktionen und Operatoren.

Speichern von Daten

Bei den Daten, mit denen Sie arbeiten, handelt es sich wahrscheinlich um die unterschiedlichsten Typen wie Zeitangaben, Geld, zählbare Elemente, Datumsangaben, Namen, Beschreibungen und so weiter. Jede Information lässt sich einem bestimmten Datentyp zuordnen und gehört zu einer Kategorie von Daten, die Sie in ähnlicher Weise bearbeiten. Sie könnten direkt mit diesen Daten arbeiten, ohne sie zu speichern, dann können Sie jedoch die Flexibilität und Leistungsfähigkeit von Visual FoxPro nur noch zu einem geringen Teil nutzen. Visual FoxPro bietet Ihnen eine Vielzahl von Speichercontainern, die Ihnen mehr Möglichkeiten an die Hand geben, Daten schnell zu bearbeiten.

Der Datentyp bestimmt, wie ein Datenelement gespeichert wird und wie es genutzt werden kann. So können Sie z. B. zwei Zahlen miteinander multiplizieren, nicht aber zwei Zeichen. Andererseits können Sie Zeichen in Großbuchstaben drucken, nicht aber Zahlen. Einige der wichtigsten in Visual FoxPro verwendeten Datentypen finden Sie in nachstehender Tabelle.

Datentypen

Typ Beispiele
Numerisch 123
3.1415
– 7
Zeichen "Test String"
"123"
"01/01/98"
Logisch .T. (Wahr)
.F. (Falsch)
Datum

DatumZeit

{^1998-01-01}

{^1998-01-01 12:30:00 p}

Datencontainer

Mit Hilfe von Datencontainern können Sie dieselben Bearbeitungsschritte mit vielen Datenelementen ausführen. Wenn Sie beispielsweise die Stunden addieren, die ein Mitarbeiter gearbeitet hat, das Ergebnis mit dem Stundenlohn multiplizieren und anschließend die abzuführenden Steuern abziehen, können Sie das auszuzahlende Gehalt des Mitarbeiters ermitteln. Sie müssen diese Berechnung jedoch für jeden Mitarbeiter und für jede Zahlungsperiode erneut durchführen. Wenn Sie diese Informationen in Containern speichern und die Bearbeitungsschritte mit den Containern ausführen, können Sie die alten Daten einfach durch die neuen Daten ersetzen und dasselbe Programm immer wieder ausführen. In der nachstehenden Tabelle finden Sie einige der wichtigsten Datencontainer von Visual FoxPro:

Typ Beschreibung
Variablen Einzelne Datenelemente, die im RAM (Random Access Memory = Arbeitsspeicher) des Computers gespeichert sind.
Datensätze in Tabellen Mehrere Zeilen mit vorher festgelegten Feldern, von denen jedes eine bestimmte Information enthalten kann. Tabellen werden auf dem Datenträger gespeichert.
Arrays Mehrere Datenelemente, die im RAM gespeichert sind.

Bearbeiten von Daten

Container und Datentypen sind die Grundbausteine, die Sie zum Bearbeiten von Daten benötigen. Außerdem benötigen Sie Operatoren, Funktionen und Befehle.

Verwenden von Operatoren

Operatoren dienen dazu, Daten miteinander zu verbinden. Im Folgenden sind die Operatoren aufgelistet, die in Visual FoxPro am häufigsten verwendet werden.

Operator Gültige Datentypen Beispiel Ergebnis
= Alle
? n = 7
Gibt .T. zurück, wenn der in der Variablen n gespeicherte Wert 7 beträgt, andernfalls .F.
+ Numerisch, Zeichen, Datum, DatumZeit
? "Fox" + "Pro"
Gibt "FoxPro" zurück
! oder NOT Logisch
? !.T.
Gibt .F. zurück
*, / Numerisch
? 5 * 5
? 25 / 5
Gibt 25 zurück
Gibt 5 zurück

Anmerkung   Ein Fragezeichen (?) vor einem Ausdruck bewirkt, dass ein Zeilenvorschubzeichen sowie das Ergebnis des Ausdrucks im aktiven Fenster ausgegeben werden, welches normalerweise das FoxPro-Hauptfenster ist.

Achten Sie darauf, dass Sie zusammen mit einem Operator nur einen Datentyp verwenden können. Mit den folgenden Anweisungen werden zwei numerische Datenelemente in zwei Variablen gespeichert. Den Variablen wurden Namen zugewiesen, die mit n beginnen, so dass auf den ersten Blick zu erkennen ist, dass sie numerische Daten enthalten; Sie könnten den Variablen jedoch auch Namen zuweisen, die aus beliebigen Kombinationen aus alphanumerischen Zeichen und Unterstrichen bestehen.

nFirst = 123
nSecond = 45

Mit den folgenden Anweisungen werden zwei aus Zeichen bestehende Datenelemente in zwei Variablen gespeichert. Den Variablen wurden Namen zugewiesen, die mit c beginnen, um zu kennzeichnen, dass sie Zeichen enthalten.

cFirst = "123"
cSecond = "45"

Die folgenden zwei Operationen, Addition und Verkettung, führen zu unterschiedlichen Ergebnissen, da in den Variablen Daten unterschiedlichen Typs gespeichert sind.

? nFirst + nSecond
? cFirst + cSecond

Ausgabe

168
12345

Da cFirst Daten vom Typ Zeichen und nSecond Daten vom Typ Numerisch enthält, die Datentypen also nicht übereinstimmen, verursacht der folgende Befehl einen Fehler:

? cFirst + nSecond

Sie können dieses Problem mit Hilfe von Konvertierungsfunktionen lösen. STR( )gibt z. B. die Zeichenfolge zurück, die einem numerischen Wert entspricht, undVAL( ) gibt die numerischen Daten zurück, die einer Zeichenfolge von Zahlen entsprechen. Diese Funktionen und LTRIM( ), eine Funktion, die führende Leerzeichen löscht, ermöglichen es Ihnen, die folgenden Operationen auszuführen:

? cFirst + LTRIM(STR(nSecond))
? VAL(cFirst) + nSecond

Ausgabe

12345
168

Verwenden von Funktionen

Funktionen geben Daten mit einem bestimmten Typ zurück. Beispielsweise geben die im vorherigen Abschnitt verwendeten Funktionen STR( ) und VAL( ) Zeichen bzw. numerische Werte zurück. Wie bei allen Funktionen werden diese Rückgabetypen zusammen mit den Funktionen dokumentiert.

Sie haben fünf Möglichkeiten, eine Visual FoxPro-Funktion aufzurufen:

  • Sie können den Rückgabewert einer Funktion einer Variablen zuweisen. Mit der folgenden Codezeile speichern Sie das aktuelle Systemdatum in der Variablen dToday:

    dToday = DATE( )
    
  • Sie können den Funktionsaufruf in einen Visual FoxPro-Befehl aufnehmen. Mit dem folgenden Befehl wird das Standardverzeichnis auf den Wert festgelegt, der von der GETDIR( )-Funktion zurückgegeben wird:

    CD GETDIR( )
    
  • Sie können den Rückgabewert im aktiven Ausgabefenster ausgeben. Mit der folgenden Codezeile wird die aktuelle Systemzeit im aktiven Ausgabefenster ausgegeben:

    ? TIME( )
    
  • Sie können die Funktion aufrufen, ohne den Rückgabewert zu speichern. Mit dem folgenden Funktionsaufruf wird z. B. die Einfügemarke deaktiviert:

    SYS(2002)
    
  • Sie können die Funktion in eine andere Funktion einbetten. Mit der folgenden Codezeile wird der Wochentag ausgegeben:

    ? DOW(DATE( ))
    

Einige in diesem Abschnitt verwendete Funktionen sind:

Funktion Beschreibung
ISDIGIT( ) Gibt Wahr (.T.) zurück, wenn das am weitesten links befindliche Zeichen einer Zeichenfolge eine Zahl ist; andernfalls wird Falsch (.F.) zurückgegeben.
FIELD( ) Gibt den Namen eines Feldes zurück.
LEN( ) Gibt die Anzahl der Zeichen in einem Zeichenausdruck zurück.
RECCOUNT( ) Gibt die Anzahl der Datensätze der aktuell aktiven Tabelle zurück.
SUBSTR( ) Gibt die angegebene Anzahl Zeichen aus einer aus Zeichen bestehenden Zeichenkette zurück, wobei an einer angegebenen Position in der Zeichenkette begonnen wird.

Verwenden von Befehlen

Ein Befehl bewirkt, dass eine bestimmte Aktion ausgeführt wird. Für jeden Befehl gilt eine ganz bestimmte Syntax, durch die festgelegt ist, welche Bestandteile des Befehls angegeben werden müssen, damit der Befehl korrekt ausgeführt werden kann. Darüber hinaus gibt es für viele Befehle optionale Klauseln, mit denen Sie genauer angeben können, was Sie mit dem Befehl erreichen möchten.

Mit dem Befehl USE können Sie beispielsweise Tabellen öffnen und schließen:

USE-Syntax Beschreibung
USE
Schließt die Tabelle im aktuellen Arbeitsbereich.
USE customer
Öffnet die CUSTOMER-Tabelle im aktuellen Arbeitsbereich, wobei jede Tabelle geschlossen wird, die im Arbeitsbereich bereits geöffnet war.
USE customer IN 0
Öffnet die CUSTOMER-Tabelle in dem Arbeitsbereich mit der nächsten verfügbaren Nummer.
USE customer IN 0 ;
  ALIAS mycust
Öffnet die CUSTOMER-Tabelle im Arbeitsbereich mit der nächsten verfügbaren Nummer und weist dem Arbeitsbereich den Alias mycust zu.

Einige in diesem Abschnitt verwendete Befehle sind:

Befehl Beschreibung
DELETE Markiert einen angegebenen Datensatz einer Tabelle zum Löschen.
REPLACE Ersetzt den im Datensatzfeld gespeicherten Wert durch einen neuen Wert.
GO Setzt den Datensatzzeiger auf eine festgelegte Position in der Tabelle.

Steuern des Programmablaufs

Visual FoxPro enthält eine spezielle Kategorie von Befehlen, die andere Befehle und Funktionen "umschließen" und bestimmen, wann und wie oft diese Befehle und Funktionen ausgeführt werden. Diese Befehle ermöglichen bedingte Verzweigungen und Schleifen, zwei äußerst leistungsfähige Programmiertools. Das folgende Programm veranschaulicht bedingte Verzweigungen und Schleifen. Diese Begriffe werden nach dem Beispiel ausführlicher erläutert.

Angenommen, Sie haben 10.000 Mitarbeiter und möchten jeder Person, die 30.000 DM oder mehr verdient, eine Gehaltserhöhung von 3 % und jeder Person, die weniger als 30.000 DM verdient, eine Gehaltserhöhung von 6 % gewähren. Mit dem folgenden Beispielprogramm können Sie diese Aufgabe erfüllen.

Das Programm geht davon aus, dass eine Tabelle mit dem numerischen Feld salary im aktuellen Arbeitsbereich geöffnet ist. Weitere Informationen zu Arbeitsbereichen finden Sie unter Arbeiten mit Tabellen im Abschnitt "Arbeiten mit mehreren Tabellen".

Beispielprogramm für Gehaltserhöhung

Code Kommentar
SCAN
Der Code zwischen SCAN und ENDSCAN wird so oft ausgeführt, wie Datensätze in der Tabelle vorhanden sind. Jedes Mal, wenn der Code ausgeführt wurde, wird der Datensatzzeiger auf den nächsten Datensatz der Tabelle verschoben.
   IF salary >= 30000.00
      REPLACE salary WITH ;
         salary * 1.03
Wenn in einem Datensatz das Gehaltsfeld (salary) einen Wert größer als oder gleich 30.000 enthält, wird dieser Wert durch ein Gehalt ersetzt, das 3 % höher ist.

(Das Semikolon (;) nach WITH zeigt an, dass der Befehl auf der nächsten Zeile fortgesetzt wird.)

   ELSE
      REPLACE salary WITH ;
         salary * 1.06
Wenn in einem Datensatz das Gehaltsfeld einen Wert kleiner als oder gleich 30.000 enthält, wird dieser Wert durch ein Gehalt ersetzt, das 6 % höher ist.
   ENDIF
ENDSCAN
Ende der bedingten IF-Anweisung.

Ende des Codes, der für jeden Datensatz der Tabelle ausgeführt wird.

In diesem Beispiel werden Befehle für eine bedingte Verzweigung und eine Schleife verwendet, um den Ablauf des Programms zu steuern.

Bedingte Verzweigung

Mit Hilfe der bedingten Verzweigung können Sie prüfen, ob bestimmte Bedingungen erfüllt sind, und je nach Ergebnis der Prüfung unterschiedliche Operationen ausführen. In Visual FoxPro gibt es zwei Befehle, die das bedingte Verzweigen ermöglichen:

Der Code zwischen der ersten Anweisung und der ENDIF- oder ENDCASE-Anweisung wird nur ausgeführt, wenn eine logische Bedingung den Wert Wahr (.T.) zurückgibt. Im Beispielprogramm wird der IF-Befehl verwendet, um zwischen zwei Zuständen zu unterscheiden: Der Lohn ist entweder größer als bzw. gleich 30.000 DM oder kleiner als 30.000 DM. Je nach Zustand werden verschiedene Aktionen ausgeführt.

Im folgenden Beispiel wird keine Aktion ausgeführt, wenn der in der Variablen nWaterTemp gespeicherte Wert kleiner als 100 ist:

* set a logical variable to true if a condition is met.
IF nWaterTemp >= 100
   lBoiling = .T.
ENDIF

Anmerkung   Ein Sternchen am Anfang einer Zeile in einem Programm kennzeichnet eine Kommentarzeile. Kommentare geben dem Programmierer einen Hinweis darauf, was die einzelnen Codesegmente bewirken, und werden von Visual FoxPro ignoriert.

Falls mehrere mögliche Bedingungen zu überprüfen sind, ist ein DO CASE ... ENDCASE-Block möglicherweise effizienter und einfacher zu überblicken als mehrere IF-Anweisungen.

Schleifen

Schleifen ermöglichen es Ihnen, eine oder mehrere Codezeilen so oft wie nötig auszuführen. In Visual FoxPro gibt es drei Befehle, die es ermöglichen, Schleifen zu definieren:

Verwenden Sie SCAN, wenn für jeden Datensatz einer Tabelle eine Reihe von Aktionen ausgeführt werden soll, also wie im oben beschriebenen Beispielprogramm. Dank der SCAN-Schleife reicht es aus, wenn Sie den Code nur einmal schreiben; Sie können ihn dann für jeden Datensatz ausführen, während der Datensatzzeiger die Tabelle durchläuft.

Verwenden Sie FOR, wenn Sie wissen, wie oft der jeweilige Codeabschnitt ausgeführt werden muss. Sie wissen beispielsweise, dass eine Tabelle eine bestimmte Anzahl von Feldern enthält. Mit der Visual FoxPro-Funktion FCOUNT( ) können Sie die Anzahl der Felder zurückgeben lassen, und mit einer FOR-Schleife können Sie die Namen aller Felder der Tabelle ausgeben:

FOR nCnt = 1 TO FCOUNT( )
   ? FIELD(nCnt)
ENDFOR

Verwenden Sie DO WHILE, wenn Sie einen Codeabschnitt ausführen möchten, solange eine bestimmte Bedingung erfüllt ist. In diesem Fall wissen Sie zwar nicht, wie oft der Code ausgeführt werden muss, aber Sie wissen, wann die Ausführung beendet werden soll. Angenommen, Sie haben eine Tabelle mit den Namen und Initialen bestimmter Personen, und Sie möchten die Namen der Personen anhand ihrer Initialen nachschlagen. In diesem Fall tritt ein Problem auf, sobald Sie versuchen, den Namen einer Person hinzuzufügen, deren Initialen mit denen des Namens einer anderen Person identisch sind, die bereits in der Tabelle enthalten ist.

Sie können dieses Problem lösen, indem Sie eine Zahl zu den Initialen hinzufügen. Die Kennung für Michael Suyama wäre dann MS, während die nächste Person mit denselben Initialen, Margaret Sun, die Kennung MS1 erhält. Würden Sie anschließend einen Eintrag für Michelle Smith der Tabelle hinzufügen, so wäre ihre Kennung MS2. Eine DO WHILE-Schleife ermöglicht Ihnen, die korrekte Zahl zu finden, die jeweils an die Initialen angehängt werden muss.

Beispielprogramm mit DO WHILE zur Erstellung einer eindeutigen Kennung

Code Kommentar
nHere = RECNO()
Speichert die Position eines Datensatzes.
cInitials = LEFT(firstname,1) + ;
   LEFT(lastname,1)
nSuffix = 0
Gibt die Initialen einer Person aus den Anfangsbuchstaben der Felder firstname und lastname zurück.

Erstellt eine Variable, in der die Zahl gespeichert wird, die, falls erforderlich, an das Ende der Initialen der Person angehängt wird.

LOCATE FOR person_id = cInitials
Prüft, ob in der Tabelle eine weitere Person mit den gleichen Initialen vorkommt.
DO WHILE FOUND( )
Falls in einem weiteren Datensatz der Tabelle der Wert für person_id mit dem Wert von cInitials identisch ist, gibt die FOUND( )-Funktion Wahr (.T.) zurück, und der Code in der DO WHILE-Schleife wird ausgeführt.
Wird keine Entsprechung gefunden, wird stattdessen die Codezeile nach ENDDO ausgeführt.
   nSuffix = nSuffix + 1
   cInitials = ;
      LEFT(cInitials,2);
      + ALLTRIM(STR(nSuffix))
Bereitet ein passendes Suffix vor und hängt es an die Initialen an.
   CONTINUE
CONTINUE bewirkt, dass der letzte LOCATE-Befehl erneut ausgewertet wird. Das Programm prüft, ob der neue Wert in cInitials bereits im person_id-Feld eines anderen Datensatzes vorhanden ist. Wenn dies der Fall ist, gibt FOUND( ) weiterhin Wahr (.T.) zurück, und der Code in der DO WHILE-Schleife wird erneut ausgeführt. Ist der neue Wert in cInitials wirklich eindeutig, gibt FOUND( ) Falsch (.F.) zurück, und es wird die auf ENDDO folgende Codezeile ausgeführt.
ENDDO
Ende der DO WHILE-Schleife.
GOTO nHere
REPLACE person_id WITH cInitials
Kehrt zum Datensatz zurück und speichert die eindeutige Kennung im person_id-Feld.

Da Sie nicht im Voraus wissen, wie oft bereits vergebene Kennungen gefunden werden, verwenden Sie die DO WHILE-Schleife.

Siehe auch

Erstellen eines kleinen Programms | Arbeiten mit Tabellen | SCAN ... ENDSCAN | FOR ... ENDFOR | DO WHILE ... ENDDO-Befehl | IF ... ELSE ... ENDIF | DO CASE ... ENDCASE-Befehl | GETDIR( ) | USE-Befehl