Freigeben über


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:

  1. Lesen jedes Zeichens.
  2. Feststellen, ob das Zeichen numerisch ist.
  3. Ist das Zeichen numerisch, wird es in die zweite Zeichenfolge kopiert.
  4. Sobald alle Zeichen in der ursprünglichen Zeichenfolge so analysiert wurden, wird diese Zeichenfolge durch die neue, rein numerische Zeichenfolge ersetzt.
  5. 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

  1. Geben Sie im Befehlsfenster den folgenden Befehl ein:

    MODIFY COMMAND numonly
    
  2. 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

  1. Im geöffneten Programmfenster drücken Sie STRG+E.
  2. 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
lFieldOK = .F.
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.
FOR nCnt = 1 TO FCOUNT( )
   IF FIELD(nCnt) = ;
     UPPER("TestField")
      IF TYPE("TestField") = "C"
         lFieldOK = .T.
      ENDIF
      EXIT
   ENDIF
ENDFOR
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.).
IF lFieldOK
Der Konvertierungsabschnitt des Programms wird nur dann ausgeführt, wenn in der aktuell aktiven Tabelle das Feld TestField existiert.
SCAN
   cNumOnly = ""
   FOR nCnt = 1 TO LEN(TestField)
     cCharacter = ;
    SUBSTR(TestField, nCnt, 1)
     IF ISDIGIT(cCharacter)
     cNumOnly = cNumOnly + ;
     cCharacter
     ENDIF
   ENDFOR
Der Konvertierungscode.
   REPLACE TestField WITH ;
  cNumOnly
ENDSCAN
 
ENDIF
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( )