Erstellen eines kleinen Programms
Sobald Sie die Grundbegriffe verstanden haben, ist das Programmieren ein iterativer Prozess. Sie durchlaufen die Schritte viele Male, wobei Sie den Code immer weiter ausarbeiten. Am Anfang werden Sie Ihre Programme häufig testen und neue Möglichkeiten ausprobieren. Je vertrauter Sie mit der Programmiersprache sind, desto schneller können Sie programmieren und desto mehr Tests werden Sie nur noch im Kopf ausführen.
Die grundlegenden Schritte beim Programmieren sind:
- Erarbeiten der Problemstellung
- Aufgliedern des Problems in seine Einzelteile
- Erstellen der Teile
- Testen und Korrigieren der Teile
- Zusammensetzen der Teile
- Testen des gesamten Programms
Die folgenden Hinweise sollten Sie beachten, wenn Sie mit dem Programmieren anfangen:
- Verschaffen Sie sich einen Überblick über das Problem, bevor Sie versuchen, es zu lösen. Andernfalls werden Sie viele Änderungen vornehmen, Code verwerfen, von vorn anfangen oder sich mit einem Ergebnis zufrieden geben müssen, von dem Sie nicht vollständig überzeugt sind.
- Unterteilen Sie das Problem in überschaubare Einheiten, anstatt zu versuchen, das ganze Problem auf einmal anzugehen.
- Testen und debuggen Sie während der Entwicklung Abschnitte des Codes. Führen Sie Tests durch, um herauszufinden, ob mit dem Code die gewünschten Aktionen ausgeführt werden. Unter Debuggen versteht man den Prozess des Suchens und Beseitigens von Problemen, die verhindern, dass der Code die gewünschten Aktionen ausführt.
- Verfeinern Sie die Datenerfassung und -speicherung so, dass sich die Daten mit dem Programmcode leichter bearbeiten lassen. Dies bedeutet vielfach, dass Sie Ihre Tabellen gut strukturieren müssen.
Im weiteren Verlauf dieses Abschnitts werden die einzelnen Schritte erläutert, die Sie beim Erstellen eines kleinen Visual FoxPro-Programms ausführen.
Erarbeiten der Problemstellung
Angenommen, die zu verwaltenden Daten stammen aus einer Vielzahl von Quellen. Die meisten der Daten sind rein numerisch, aber manche Daten enthalten außer Zahlen auch Gedankenstriche und Leerzeichen. Sie sollten nun alle Leerzeichen und Gedankenstriche aus den Feldern entfernen und die numerischen Daten speichern.
Statt die Leerzeichen und Gedankenstriche aus den ursprünglichen Daten zu entfernen, könnten Sie das Ziel des Programms folgendermaßen formulieren:
Ziel Ersetzen der vorhandenen Werte eines Feldes durch andere Werte, die die ursprünglichen Werte außer den Leerzeichen und Gedankenstrichen enthalten.
Diese Formulierung vermeidet die Schwierigkeiten, die sich aus dem Bearbeiten einer Zeichenfolge ergeben, deren Länge sich ändert, während Sie mit ihr arbeiten.
Aufgliedern des Problems in seine Einzelteile
Da Sie Visual FoxPro in Form von Operationen, Befehlen und Funktionen ganz bestimmte Anweisungen geben müssen, ist es erforderlich, das Problem in Einzelschritte zu unterteilen. Der erste Einzelschritt in unserem Beispielproblem besteht darin, jedes Zeichen in der Zeichenfolge zu lesen und zu analysieren. Wenn Sie nicht jedes Zeichen einzeln analysieren, können Sie nicht bestimmen, ob es gespeichert werden soll.
Beim Lesen eines Zeichens müssen Sie überprüfen, ob es sich um einen Gedankenstrich oder ein Leerzeichen handelt. Zu diesem Zeitpunkt empfiehlt es sich, die Problemstellung zu präzisieren. Was passiert, wenn Sie später Daten erhalten, die runde Klammern enthalten? Wie gehen Sie vor, wenn Währungssymbole, Kommas und Punkte entfernt werden müssen? Je allgemeiner Sie Ihren Code halten können, desto weniger Änderungsarbeit haben Sie später; im Wesentlichen geht es darum, Arbeitsaufwand zu verringern. Im Folgenden ist das Problem so formuliert, dass viel mehr unterschiedliche Daten abgedeckt sind:
Verfeinerte Zielsetzung Ersetzen der vorhandenen Werte eines Feldes durch andere Werte, die nur die numerischen Zeichen der ursprünglichen Werte enthalten.
Mit dieser Formulierung lässt sich die Lösung des Problems auf der Zeichenebene neu definieren: Wenn das Zeichen numerisch ist, soll es gespeichert werden, wenn nicht, soll das nächste Zeichen analysiert werden. Sobald Sie eine Zeichenfolge erstellt haben, die nur die numerischen Elemente der ursprünglichen Zeichenfolge enthält, können Sie die erste Zeichenfolge ersetzen und den Vorgang mit dem nächsten Datensatz wiederholen, bis alle Daten verarbeitet wurden.
Zusammenfassend lässt sich das Problem in folgende Schritte unterteilen:
- Lesen jedes Zeichens.
- Feststellen, ob das Zeichen numerisch ist.
- Ist das Zeichen numerisch, wird es in die zweite Zeichenfolge kopiert.
- Sobald alle Zeichen in der ursprünglichen Zeichenfolge so analysiert wurden, wird diese Zeichenfolge durch die neue, rein numerische Zeichenfolge ersetzt.
- Diese Schritte werden für alle Datensätze der Tabelle wiederholt.
Erstellen der Teile
Sobald klar ist, welche Schritte auszuführen sind, können Sie die einzelnen Schritte in Form von Visual FoxPro-Befehlen, -Funktionen und -Operatoren formulieren.
Da mit den Befehlen und Funktionen Daten bearbeitet werden, benötigen Sie Testdaten, mit denen Sie arbeiten können. Diese Testdaten sollten den tatsächlich zu bearbeitenden Daten möglichst ähnlich sein.
In diesem Beispiel können Sie eine Testzeichenfolge in einer Variablen speichern, indem Sie im Befehlsfenster den folgenden Befehl eingeben:
cTest = "123-456-7 89 0"
Lesen der einzelnen Zeichen
Zunächst möchten Sie ein einzelnes Zeichen der Zeichenfolge lesen. Eine Liste der Funktionen, die zum Bearbeiten von Zeichenfolgen verwendet werden können, finden Sie unter Zeichenfunktionen.
Sie werden feststellen, dass es drei Funktionen gibt, die bestimmte Teile einer Zeichenfolge zurückgeben: LEFT( ), RIGHT( ) und SUBSTR( ). Von diesen drei gibt SUBSTR( ) Zeichen von einer beliebigen Stelle der Zeichenfolge zurück.
SUBSTR( ) arbeitet mit drei Argumenten oder Parametern: der Zeichenfolge, der Anfangsposition in der Zeichenfolge und der Anzahl der Zeichen, die ab der Anfangsposition zurückgegeben werden. Wenn Sie testen möchten, ob SUBSTR( ) die gewünschte Aufgabe ausführen kann, geben Sie z. B. im Befehlsfenster die folgenden Befehle ein:
? SUBSTR(cTest, 1, 1)
? SUBSTR(cTest, 3, 1)
? SUBSTR(cTest, 8, 1)
Ausgabe
1
3
-
Im FoxPro-Hauptfenster wurden das erste, dritte und achte Zeichen der Testzeichenfolge angezeigt.
Um die gleiche Aktion mehrere Male auszuführen, verwenden Sie eine Schleife. Da die Testzeichenfolge aus einer festgelegten Anzahl von Zeichen (14) besteht, können Sie eine FOR-Schleife verwenden. Der Zähler in der FOR-Schleife wird jedes Mal erhöht, wenn der Code in der Schleife ausgeführt wird, daher können Sie den Zähler in der SUBSTR( )-Funktion verwenden. Sie könnten den Schleifenaufbau nun im Befehlsfenster testen, aber ab einem bestimmten Zeitpunkt möchten Sie sicher Ihre Arbeit speichern, damit Sie später darauf aufbauen können. Es ist nun ein günstiger Zeitpunkt, um ein neues Programm zu erstellen.
So erstellen Sie ein neues Programm
Geben Sie im Befehlsfenster den folgenden Befehl ein:
MODIFY COMMAND numonly
In dem Fenster, das daraufhin angezeigt wird, geben Sie die folgenden Codezeilen ein:
FOR nCnt = 1 TO 14 ? SUBSTR(cTest, nCnt, 1) ENDFOR
Nachdem Sie das Programm erstellt haben, können Sie es ausführen.
So führen Sie ein Programm aus
- Im geöffneten Programmfenster drücken Sie STRG+E.
- Wenn ein Dialogfeld angezeigt wird, in dem Sie gefragt werden, ob Sie das Programm speichern möchten, wählen Sie OK.
Wenn Sie das Programm ausführen, werden die einzelnen Zeichen in der Testzeichenfolge in einzelnen Zeilen im Visual FoxPro-Hauptfenster ausgegeben.
Die erste Aufgabe haben Sie jetzt ausgeführt. Sie können jetzt jedes Zeichen der Zeichenfolge lesen und analysieren.
Feststellen, ob das Zeichen numerisch ist
Nachdem Sie ein einzelnes Zeichen der Zeichenfolge gelesen haben, müssen Sie feststellen, ob es eine Zahl ist. Dies können Sie mit Hilfe der ISDIGIT( )-Funktion****herausfinden.
Geben Sie im Befehlsfenster die folgenden Befehle ein:
? ISDIGIT('2')
? ISDIGIT('-')
? ISDIGIT(SUBSTR(cTest, 3, 1))
Ausgabe
.T.
.F.
.T.
An dieser Ausgabe erkennen Sie, dass "2" eine Zahl, "-" keine Zahl und das dritte Zeichen in cTest
, 3, eine Zahl ist.
Kopieren des Zeichens in die zweite Zeichenfolge, sofern es numerisch ist
Da Sie die Zeichen nun anzeigen und so ermitteln können, ob sie numerisch sind, benötigen Sie jetzt eine Variable, in der die numerischen Werte gespeichert werden können: cNumOnly
.
Um die Variable zu erstellen, weisen Sie ihr einen Anfangswert zu (eine leere Zeichenfolge):
cNumOnly = ""
Da die FOR-Schleife die Zeichen der Testzeichenfolge nacheinander abarbeitet, empfiehlt es sich, eine weitere Variable zu erstellen, in der jedes Zeichen der Zeichenfolge temporär gespeichert wird, während diese verarbeitet wird:
cCharacter = SUBSTR(cTest, nCnt, 1)
Tipp Es ist häufig empfehlenswert, das Ergebnis einer Berechnung, Auswertung oder Funktion in einer Variablen zu speichern. Sie können dann die Variable bearbeiten, ohne die Berechnung oder Auswertung zu wiederholen.
Die folgende Codezeile kann jedes Mal, wenn eine Zahl auftritt, verwendet werden, um die Zahl an die zweite Zeichenfolge anzufügen:
cNumOnly = cNumOnly + cCharacter
Das Programm sieht jetzt folgendermaßen aus:
cNumOnly = ""
FOR nCnt = 1 TO 14
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
Testen der Teile
Wenn Sie am Ende ein paar Befehle hinzufügen, mit denen die Zeichenfolgen ausgegeben werden, und dann das Programm ausführen, können Sie beobachten, wie das Programm die Testzeichenfolge verarbeitet:
cNumOnly = ""
FOR nCnt = 1 TO 14
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? cTest
? cNumOnly
Ausgabe
123-456-7 89 0
1234567890
Die Ausgabe ist korrekt. Aber wenn Sie die Testzeichenfolge beim Testen der Teile ändern, können Probleme auftreten. Geben Sie im Befehlsfenster den folgenden Befehl ein, und führen Sie das Programm erneut aus:
cTest = "456-789 22"
Das Programm gibt eine Fehlermeldung aus. Es wurde versucht, die FOR-Schleife 14-mal auszuführen, aber die Zeichenfolge enthält nur 10 Zeichen. Sie benötigen also noch eine Möglichkeit, variierende Zeichenfolgenlängen zu berücksichtigen. Verwenden Sie LEN( ), um die Anzahl der Zeichen in einer Zeichenfolge zurückzugeben. Wenn Sie diesen Befehl in der FOR-Schleife verwenden, werden Sie feststellen, dass das Programm beide Testzeichenfolgen korrekt bearbeitet:
cNumOnly = ""
FOR nCnt = 1 TO LEN(cTest)
cCharacter = SUBSTR(cTest, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? cTest
? cNumOnly
Zusammensetzen der Teile
Um die Programmierlösung für die oben erläuterte Problemstellung zu vervollständigen, können Sie dazu übergehen, die Daten aus einer Tabelle zu lesen. Nachdem Sie eine Tabelle ausgewählt haben, können Sie die darin befindlichen Datensätze auswerten und den Programmcode auf ein Feld und nicht mehr auf eine Variable anwenden.
Erstellen Sie dazu zunächst eine temporäre Tabelle mit einer Vielzahl von Beispielzeichenfolgen. Eine solche Tabelle sollte ein Zeichenfeld mit dem Namen TestField
und vier oder fünf Datensätze enthalten:
Inhalt von TestField | |
---|---|
123-456-7 89 0 | -9221 9220 94321 99- |
456-789 22 | 000001 98-99-234 |
Wenn Sie den Feldnamen durch den Namen der Testzeichenfolge ersetzen, sieht das Programm folgendermaßen aus:
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? TestField
? cNumOnly
Sie können den Datensatzzeiger manuell verschieben, indem Sie die Tabelle durchsuchen und einen Bildlauf durch die Tabelle durchführen. So können Sie den Datensatzzeiger auf jeden Datensatz verschieben, und Sie werden dabei feststellen, dass das Programm seine Aufgabe korrekt erfüllt. Oder Sie können nun den Rest des Programms in Tabellennavigationscode einschließen:
SCAN
cNumOnly = ""
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
? TestField
? cNumOnly
?
ENDSCAN
Ausgabe
123-456-7 89 0
1234567890
456-789 22
45678922
-9221 9220 94321 99-
922192209432199
000001 98-99-234
0000019899234
Testen des ganzen Programms
Eigentlich möchten Sie die Ergebniszeichenfolge am Ende des Programms nicht auf dem Bildschirm anzeigen, sondern in der Tabelle speichern. Verwenden Sie dazu die folgende Codezeile:
REPLACE TestField WITH cNumOnly
Das komplette Programm sieht folgendermaßen aus:
SCAN
cNumOnly = ""
FOR nCnt = 1 TO LEN(TestField)
cCharacter = SUBSTR(TestField, nCnt, 1)
IF ISDIGIT(cCharacter)
cNumOnly = cNumOnly + cCharacter
ENDIF
ENDFOR
REPLACE TestField WITH cNumOnly
ENDSCAN
Dieses Programm müssen Sie jetzt nur noch mit den Beispieldaten testen, bevor Sie es auf echte Datenbestände anwenden können.
Verbessern des Fehlerverhaltens des Programms
Ein stabiles Programm arbeitet Ihren Vorstellungen entsprechend und ist auch in bestimmtem Umfang in der Lage, eventuell auftretende Probleme vorwegzunehmen und zu behandeln. Das Beispielprogramm führt zwar die gewünschten Aktionen aus, geht aber auch von Voraussetzungen aus, die zutreffen müssen, wenn das Programm korrekt arbeiten soll:
- Im aktuellen Arbeitsbereich ist eine Tabelle geöffnet.
- Die Tabelle hat ein Zeichenfeld mit dem Namen
TestField
.
Wenn im aktuellen Arbeitsbereich keine Tabelle geöffnet ist oder die Tabelle kein Zeichenfeld mit dem erwarteten Namen hat, gibt das Programm eine Fehlermeldung aus und führt seine Aufgabe nicht aus.
Programm zum Entfernen der nichtnumerischen Zeichen aus einem Feld für alle Datensätze
Code | Kommentar |
---|---|
|
Diese Variable ermittelt, ob die für die Ausführung des Programms notwendigen Bedingungen vorliegen. Zu Beginn wird die Variable auf Falsch (.F.) festgelegt, damit angenommen wird, dass die notwendigen Bedingungen nicht vorliegen. |
|
Mit diesem Codeabschnitt wird jedes Feld der aktuellen Tabelle durchsucht, bis ein Feld mit Namen TestField gefunden wird. Sobald das korrekte Feld gefunden wurde, wird lFieldOK auf Wahr (.T.) festgelegt und die Schleife mit EXIT beendet (da es unnötig ist, mit der Prüfung fortzufahren, nachdem das korrekte Feld gefunden wurde). Falls kein Feld dem Suchkriterium entspricht, bleibt lFieldOK bei der Einstellung Falsch (.F.). |
|
Der Konvertierungsabschnitt des Programms wird nur dann ausgeführt, wenn in der aktuell aktiven Tabelle das Feld TestField existiert. |
|
Der Konvertierungscode. |
|
|
|
Ende der Bedingung IF lFieldOK . |
Die Haupteinschränkung dieses Programms besteht darin, dass es nur auf ein Feld angewendet werden kann. Wenn Sie die nichtnumerischen Zeichen aus einem anderen Feld als TestField
entfernen möchten, müssen Sie das Programm bearbeiten und TestField
überall durch den Namen des anderen Feldes ersetzen.
Das Umwandeln des Programms in eine Funktion ermöglicht Ihnen, den Code allgemeiner zu formulieren und so dessen Wiederverwendbarkeit zu steigern und Zeit zu sparen.
Siehe auch
Prozeduren und benutzerdefinierte Funktionen | Zeichenfunktionen | Grundbegriffe des Programmierens | Erstellen von Programmen im Vergleich zur manuellen Eingabe | Erstellen von Programmen | LEFT( ) | RIGHT( ) | SUBSTR( ) | ISDIGIT( )