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 | {^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 |
|
Gibt .T. zurück, wenn der in der Variablen n gespeicherte Wert 7 beträgt, andernfalls .F. |
+ | Numerisch, Zeichen, Datum, DatumZeit |
|
Gibt "FoxPro" zurück |
! oder NOT |
Logisch |
|
Gibt .F. zurück |
*, / | Numerisch |
|
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 |
---|---|
|
Schließt die Tabelle im aktuellen Arbeitsbereich. |
|
Öffnet die CUSTOMER-Tabelle im aktuellen Arbeitsbereich, wobei jede Tabelle geschlossen wird, die im Arbeitsbereich bereits geöffnet war. |
|
Öffnet die CUSTOMER-Tabelle in dem Arbeitsbereich mit der nächsten verfügbaren Nummer. |
|
Ö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 |
---|---|
|
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. |
|
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.) |
|
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. |
|
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 |
---|---|
|
Speichert die Position eines Datensatzes. |
|
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. |
|
Prüft, ob in der Tabelle eine weitere Person mit den gleichen Initialen vorkommt. |
|
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. |
|
Bereitet ein passendes Suffix vor und hängt es an die Initialen an. |
|
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. |
|
Ende der DO WHILE-Schleife. |
|
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