21
visual-foxpro #visual- foxpro

visual-foxpro - riptutorial.com fileDas Microsoft® Visual FoxPro®-Datenbankentwicklungssystem ist ein leistungsfähiges Werkzeug zum schnellen Erstellen von leistungsstarken Desktop-,

  • Upload
    hanhu

  • View
    238

  • Download
    1

Embed Size (px)

Citation preview

visual-foxpro

#visual-

foxpro

Inhaltsverzeichnis

Über 1

Kapitel 1: Erste Schritte mit visual-foxpro 2

Bemerkungen 2

Versionen 2

Examples 2

Installation oder Setup 3

Hallo Welt 3

Fügen Sie den globalen Fehlerhandler hinzu 3

Kapitel 2: Operatoren 5

Bemerkungen 5

Examples 5

Numerische Operatoren 5

Logische Operatoren 6

Zeichenoperatoren 7

Datums- und Uhrzeitoperatoren 10

Beziehungsoperatoren 12

Kapitel 3: VFP-Interop mit .NET 17

Einführung 17

Examples 17

Verwenden von wwDotNetBridge zum Ausführen von .NET-Code 17

Credits 19

Über

You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: visual-foxpro

It is an unofficial and free visual-foxpro ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official visual-foxpro.

The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/de/home 1

Kapitel 1: Erste Schritte mit visual-foxpro

Bemerkungen

Foxpro wurde Anfang der 80er Jahre (ursprünglich als FoxBase - 1984?) Von Fox-Software erstellt und auf Mac OS-, Unix-, DOS- und Windows-Plattformen unterstützt. Es war damals die schnellste Datenbank-Engine auf PCs. Später im Jahr 1992 wurde es leider von Microsoft erworben. Nach der Übernahme durch Microsoft wurden 1994 Foxpro for DOS (FPD) und Foxpro for Windows (FPW) 2.6 veröffentlicht. Ende 1995 erhielt Foxpro den Namen "Visual" und die Plattformunterstützung war nur auf Windows beschränkt. Es war auch die erste Version von Foxpro, bei der die Sprache objektorientiert war.

Microsofts offizielle Visual Foxpro-Site (im Allgemeinen nur als VFP bezeichnet) beschreibt es als:

Das Microsoft® Visual FoxPro®-Datenbankentwicklungssystem ist ein leistungsfähiges Werkzeug zum schnellen Erstellen von leistungsstarken Desktop-, Rich Client-, verteilten Client-, Client / Server- und Web-Datenbankanwendungen.

Obwohl es sich um eine alte Sprache handelt, gilt sie immer noch als die einfachste Sprache, um schnell eine datenzentrische Anwendung für den Windows-Desktop zu erstellen. Wenn Sie eine datenbasierte Anwendung für den Windows-Desktop erstellen möchten, ist die Verwendung von VFP wirklich einfach und schnell.

Versionen

Ausführung Veröffentlicht

FPW 2.6a 1994-10-28

Visual Foxpro 3.0 1995-12-16

Visual Foxpro 5.0 1997-01-24

Visual Foxpro 6.0 2000-08-18

Visual Foxpro 7.0 2002-01-04

Visual Foxpro 8.0 2003-10-25

Visual Foxpro 9.0 2004-12-13

Visual Foxpro 9.0 SP2 2007-10-21

Examples

https://riptutorial.com/de/home 2

Installation oder Setup

Detaillierte Anweisungen zum Einrichten oder Installieren von Visual FoxPro.

Hallo Welt

In allen Sprachen ist das erste Beispiel das Drucken von "Hello World". Das ist wahrscheinlich am einfachsten in VFP:

? "Hello World"

Fügen Sie den globalen Fehlerhandler hinzu

Sie können unbehandelte Fehler (Ausnahmen) in einer VFP-Anwendung auf einfache Weise abfangen, indem Sie den Befehl ON ERROR am Anfang Ihres Hauptprogramms verwenden.

Der folgende ON ERROR-Befehl ruft im aktuellen Programm eine Methode mit dem Namen "errorHandler" auf. Die von ERROR (die VFP-Fehlernummer), MESSAGE (die VFP-Fehlernachricht), PROGRAM (Name des aktuell ausgeführten Programms) und LINENO (die Zeilennummer des Fehlers) zurückgegebenen Werte werden an die errorHandler-Methode übergeben.

ON ERROR DO errorHandler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()

Eine einfache errorHandler-Methode kann wie folgt aussehen.

PROCEDURE errorHandler LPARAMETERS tnVFPErrorNumber, tcVFPErrorMessage, tcProcWithError, tnLineNumber STORE 'Error message: ' + tcVFPErrorMessage + CHR(13) + ; 'Error number: ' + TRANSFORM(tnVFPErrorNumber) + CHR(13) + ; 'Procedure with error: ' + tcProcWithError + CHR(13) + ; 'Line number of error: ' + TRANSFORM(tnLineNumber) TO lcDetails MESSAGEBOX(lcDetails, 16, "Unhandled Exception") ON ERROR * ON SHUTDOWN CLEAR EVENTS QUIT ENDPROC

Sie können auch den Fehlerhandler dazwischen ändern und wiederherstellen. An einem Punkt möchten Sie beispielsweise alle Tabellen in einem Ordner exklusiv öffnen. Wenn Sie dies nicht tun können, möchten Sie nicht fortfahren:

procedure DoSomethingWithExclusiveLock(tcFolder) local lcOldError, llInUse, ix && by default these variables have a value of .F. lcError = on('error') && save current handler on error llInUse = .T. && new handler

https://riptutorial.com/de/home 3

local array laTables[1] for ix=1 to adir(laTables, addbs(m.tcFolder) + '*.dbf')) use (addbs(m.tcFolder)+laTables[m.ix,1]) in 0 exclusive endfor on error &lcError && restore old handler if m.llInUse && couldn't get exclusive lock on all tables close databases all return endif * do whatever endproc

Tipp: Manchmal, besonders beim Debuggen, möchten Sie den Standard-Fehlerhandler wiederherstellen, der es Ihnen ermöglicht, den Code zu brechen, in dem der Fehler aufgetreten ist, und dann an einer anderen Stelle, an der der Fehler aufgetreten ist, vorübergehend Folgendes hinzuzufügen:

on error

würde das tun.

Erste Schritte mit visual-foxpro online lesen: https://riptutorial.com/de/visual-foxpro/topic/7391/erste-schritte-mit-visual-foxpro

https://riptutorial.com/de/home 4

Kapitel 2: Operatoren

Bemerkungen

In VFP werden Operatoren in folgende Gruppen eingeteilt:

Numerische Operatoren•Logische Operatoren•Zeichenoperatoren•Datums- und Uhrzeitoperatoren•Beziehungsoperatoren•

Es gibt auch Operatoren, die als Funktionen implementiert sind (wie bitweise Operationen, Objektvergleich ...).

Wir werden uns jedes Beispiel ansehen.

Examples

Numerische Operatoren

Numerische Operatoren sind die einfachsten und fast dieselben wie in anderen Sprachen.

+, -, * und /. Additions-, Subtraktions-, Multiplikations- und Divisionsoperatoren (in VFP gibt es keine Ganzzahldivision. Mit den Funktionen INT (), CEILING () und FLOOR ()) können Sie ein Ergebnis in Integer konvertieren.

% Modul-Operator.•^ und **. Befugnis der Bediener. Sie machen beide dasselbe.•(). Gruppierungsoperatoren.•Operatoren haben Vorrang. Die Reihenfolge ist:•

( ) ^ (or **) / and * - and +

? 10 / 5 + 2 && Outputs 4 ? 2 + 10 / 5 && Outputs 4 as well. Division has precedence. * Both multiplication and division have same precedence * They would be interpreted from left to right. ? 4 * 5 / 2 + 5 && Outputs 15 * Use parentheses whenever you are in doubt or want to be explicit ? ( (4 * 5) / 2 ) + 5 && Outputs 15. Explicit grouping of operations ? 4 * 5^2 && ^ has precedence, this is same as 4 * (5^2) = 100. ? (4 + 5)^2 && Using parentheses we say add 5 to 4 (9) and then square = 81.

https://riptutorial.com/de/home 5

Logische Operatoren

Logische Operatoren in VFP in der Reihenfolge ihrer Priorität sind:

Operator Beschreibung

() Klammern, Gruppenausdrücke

NICHT! Negiert den Ausdruck logisch. NICHT oder! hat keinen Unterschied

UND Logisch UND die Ausdrücke

ODER ODER die Ausdrücke logisch

<>,! =, #Überprüfen Sie die Ungleichheit. Also das gleiche wie das logische Exlusive OR - XOR

Historisch werden NOT, AND, OR als .NOT., .AND., .OR geschrieben. Sie können sie immer noch verwenden, wenn Sie möchten, aber UND, ODER, NICHT ist einfacher und sauberer.

Für falsch und wahr müssen Sie .F verwenden. und T. Literale jeweils. Sie können stattdessen nicht F und T verwenden.

* Some logical variables local llOld, llEmail && any variable declaration implicitly initializes the variable as .F. - false ? m.llOld, m.llEmail && Prints .F. .F. llOld = .T. llEmail = .F. if ( m.llOld AND m.llEmail ) ? 'Old AND should be emailed to' endif if ( m.llOld OR m.llEmail ) ? 'Old OR should be emailed to' endif if ( m.llOld AND !m.llEmail ) && Same as (m.llOld AND NOT m.llEmail) ? 'Old BUT should NOT be emailed to' endif * Above code outputs Old OR should be emailed to Old BUT should NOT be emailed to

In VFP werden logische Ausdrücke in einer Abkürzung ausgewertet. Das heißt, wenn der erste Teil der Prüfung das gesamte Ergebnis erfüllt, wird der Rest des Ausdrucks nicht einmal interpretiert. Ein Beispiel folgt:

? 1 = '2' && An obvious error. It would complain operator/operand type mismatch.

https://riptutorial.com/de/home 6

* However we could use such an expression in an if and get no error * because it is not interpreted at all * (VFP is dynamic and there is no compile time check) local llProcess llProcess = .T. if (m.llProcess OR (1='2')) ? 'Should do processing' endif * Would output Should do processing * without any error because m.llProcess true means * the whole expression would be true, thus the expression after OR * is not interpreted at all.

Ein Hindernis für Neulinge ist, dass Sie manchmal mehrere Überprüfungen benötigen, beispielsweise in einer SQL-Abfrage, die mit den Operatoren AND, OR verknüpft sind. Wenn es viele davon gibt, könnte man die Tatsache ignorieren, dass Operatoren Vorrang haben (in der Reihenfolge (), NOT, AND, OR) und denken, dass die Interpretation von links nach rechts in einer Kette erfolgen würde. Betrachten Sie ein Beispiel:

select * from myTable where !isCustomer AND debit > 5000 OR discount > 5

Was ist die Absicht dieser Abfrage? Wenn wir dies durch Gruppieren von Klammern explizit machen, heißt es:

((NOT isCustomer) AND debit > 5000) OR discount > 5

Vereinfacht sieht es aus wie "firstExpression" ODER (Rabatt> 5). Was auch immer die Absicht war, ODER würde es auswählen:

Alle Zeilen, die (Rabatt> 5) haben - und auch diejenigen, bei denen es sich um einen Kunden mit über 5000 Lastschriften handelt.

Wahrscheinlich war die Absicht "gib mir die, bei denen es KEIN Kunde UND ist (Lastschrift über 5000 ODER Rabatt über 5)". Es wäre von Anfang an klar, wenn wir Klammern verwenden würden:

select * from myTable where !isCustomer AND (debit > 5000 OR discount > 5)

Sie können Klammern für den ursprünglichen NOT-Operator verwenden, aber es ist nicht wert, wenn sein Operand ein einzelner Ausdruck ist, der mit seiner Priorität lesbar genug ist!

Zeichenoperatoren

https://riptutorial.com/de/home 7

Es gibt nur 4 Zeichenoperatoren in der Rangfolge:

Operator Beschreibung

()Klammern zum Gruppieren. Hinweis: Die VFP-Dokumentation, die ich habe, vermisst diese. Ohne diese Funktion ist der Operator fast immer unbrauchbar.

+ Verkettet (verbindet) Strings nebeneinander.

-Verknüpfen Saiten durch die nachfolgenden Leerzeichen von links Zeichenfolge rechts Zeichenfolge Ende bewegt.

$ Überprüft, ob die erste Zeichenfolge in der zweiten enthalten ist.

+ ist die einfachste und wird auch verwendet, um Zeichenfolgen in vielen anderen Sprachen zu verketten.

local firstName, lastName firstName = "John" lastName = "Smith" ? m.firstName + " " + m.lastName

Ausgaben: John Smith

- ist etwas knifflig und wenig bekannt. Es nimmt nachgestellte Leerzeichen aus der linken Zeichenfolge an und hängt diese Leerzeichen an die Zeichenfolge rechts an. Angenommen, Sie haben eine Tabelle mit Vor- und Nachnamen und jeder von ihnen hat 20 Zeichen. Wir möchten den Vor- und Nachnamen verketten, um einen vollständigen Namen zu erstellen, und wir möchten, dass die resultierende Größe festgelegt wird (in diesem Fall 20 + 20 + 1 Leerzeichen = 41). Nehmen wir an, Sie haben auch eine zweite Vorname-Spalte und wir möchten, dass der vollständige Name wie "Nachname, VornameNameName___" aussieht. Es ist am einfachsten, dies mit - Operator zu tun, aber Sie sollten sich den Trick merken, hier Klammern zu verwenden, damit wir genau das bekommen, was wir wollen:

* Create a cursor for our sample and fill in a few names Create Cursor Names (firstName c(20), midName c(20), lastName c(20)) Insert Into Names (firstName, midName, lastName) Values ('Cetin','', 'Basoz') Insert Into Names (firstName, midName, lastName) Values ('John', 'M', 'Smith') Insert Into Names (firstName, midName, lastName) Values ('John', 'F', 'Kennedy') Insert Into Names (firstName, midName, lastName) Values ('Tom', '', 'Hanks') * Select with tricky - operator Select *, ; lastName - (', '+firstName-(' '+midName)) As FullName ; from Names ; INTO Cursor crsNames ; nofilter Browse

https://riptutorial.com/de/home 8

Und die Ausgabe ist wie folgt:

Vorname midName Nachname vollständiger Name

Cetin Basoz Basoz, Cetin

John M Schmied Smith, John M

John F Kennedy Kennedy, John F.

Tom Hanks Hanks, Tom

In der Spalte fullName werden alle nachgestellten Leerzeichen bis zum Ende gepusht. Wenn Sie überprüfen, ob die Spalte fullName eine Breite von 63 Zeichen hat (3 * 20 + 3 Zeichen, die wir hinzugefügt haben).

Beachten Sie die Wichtigkeit der Gruppierung von Klammern (versuchen Sie, Klammern zu entfernen oder anders anzuordnen).

Obwohl - der Bediener in solchen Fällen versucht sein könnte zu verwenden, gibt es eine andere Seite der Münze. Dieser Operator ist VFP-spezifisch und daher ist SQL nicht portierbar. Sie können stattdessen dasselbe Ergebnis mit dieser ANSI-kompatiblen SQL erreichen:

Select *, ; CAST(RTRIM(lastName) +', '+ RTRIM(firstName) +' '+ midName as char(63)) As FullName ; from Names ; INTO Cursor crsNames ; nofilter

Letzter Operator ist $. Es wird lediglich geprüft, ob die linke Zeichenfolge Teil der rechten Zeichenfolge ist.

local upcased, digits, hexDigits upcased = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' digits = '0123456789' hexDigits = m.digits + 'ABCDEF' ? 'A' $ m.upcased && .T. ? 'a' $ m.upcased && .F. ? '1' $ m.digits && .T. ? 'F' $ m.digits && .F. ? 'F' $ m.hexDigits && .T.

Wichtig: In VFP können Sie zwar in jedem Fall (obere, untere oder gemischte) Code schreiben, bei Groß- und Kleinschreibung ist die Groß- und Kleinschreibung jedoch zu beachten. Zum Beispiel: "Smith" und "Smith" sind zwei verschiedene Werte. Oder in Ihrer Tabelle, wenn es eine Länderspalte gibt, würden Sie 'USA' nicht finden, wenn Sie mit 'usa' suchen. Gleiches gilt für den Operator $, "GE" $ "Germany" ist falsch.

Persönliche Anmerkung: Auch wenn Sie $ wegen der Einfachheit mögen und finden, dass es häufig in Microsoft-Quellcodes verwendet wird, ist es meiner Meinung nach

https://riptutorial.com/de/home 9

von sehr geringem Wert. Wenn ich an viele tausend Zeilen denke, die ich in meinem Carrier geschrieben habe, denke ich, dass ich nur sehr wenige Vorkommen in meinem eigenen Code finden würde. Fast immer gibt es eine bessere Alternative (vor allem, wenn der linke Operand kein einzelnes Zeichen ist und \ oder Groß- und Kleinschreibung wichtig ist).

Datums- und Uhrzeitoperatoren

Es gibt grundsätzlich zwei Operatoren für Datums- und Datumszeitwerte. + und - sind überladen (wahrscheinlich ein C-Ausdruck), um Datums- / Datumszeit-Berechnungen durchzuführen:

Operator Beschreibung

+Fügt Tage (Datum) oder Sekunden (Datumszeit) zu einem Datums- / Datumszeitwert hinzu.

-Ruft die Differenz zweier Datums- / Datumszeitwerte ab. Subtrahiert Tage (Datum) oder Sekunden (Datumszeit) von Datumsangaben.

+ ist das einfachere. Es hat zwei Operanden, einer ist ein Datums- oder Datums- / Zeitwert und der andere ist eine Zahl (obwohl Sie möglicherweise eine beliebige Zahl verwenden, ist dies für alle praktischen Zwecke eine Ganzzahl).

Wenn einer der Operanden ein Datum ist, wird der numerische Operand als "Tag" betrachtet:

? Date() + 10 && Get the date 10 days later * VFP is leap year aware when doing date math ? Date(2016, 2, 28) + 1 && Add 1 day to Feb 28, 2016. Returns Feb 29, 2016. ? Date(2017, 2, 28) + 1 && Add 1 day to Feb 28, 2017. Returns Mar 1, 2017.

Wenn einer der Operanden datetime ist, wird der numerische Operand als "zweiter" angesehen:

Es sind 24 * 60 * 60 = 86400 Sekunden an einem Tag

? Datetime() + 86400 && Add 1 day to current datetime.

Schreibe 4 Stunden und 15 Minuten zum 1. Januar 2016 um 14:20 Uhr

? Datetime(2016, 1, 1, 14, 20, 0) + (4 * 3600 + 15 * 60)

Ausgaben Freitag, 1. Januar 2016, 18:35:00 Uhr.

Bei einem einfachen Ausdruck mit? Hängt das, was Sie auf Ihrem Bildschirm sehen, von Ihren Datumseinstellungen ab. Wenn Sie beispielsweise nichts geändert haben, sind Ihre Datumseinstellungen im amerikanischen Stil (MDY), im 12-Stunden-Format (AM / PM) und im Jahrhundert nur die letzten 2 Ziffern.

Es gibt ein spezielles Symbol ^ für Datum und Datumsangaben, das eine

https://riptutorial.com/de/home 10

Zeichenfolge zwingt, 'streng' als Format jjjj / MM / tt [HH: mm: ss | hh: mm: ss tt] zu interpretieren. Daher kann ^ auch als Datums- / Datumszeitoperator betrachtet werden. Stellen Sie sich beispielsweise vor, dass einige Daten von einer Quelle in einem Format wie 201610082230 (yyyyMMddHHmm) eingehen. So erhalten Sie diesen Wert als gültige Datetime:

Local cSample, tSample cSample = '201610082230' tSample = Ctot(Transform(m.cSample, '@R ^9999/99/99 99:99')) ? Transform(m.tSample, '@YL')

Ausgaben (abhängig von den Einstellungen für das lange Datum Ihres Systems):

Samstag, 8. Oktober 2016, 10:30:00 Uhr

- wird zur Subtraktion verwendet. Seine Operanden sind entweder Datums- / Datums- / Zeitwerte, ODER einer ist Datums- / Datums- und der andere ist eine Zahl.

Beginnen wir mit den einfacheren Datums- / Datums- und numerischen Operanden (wie mit dem Operator +):

Wenn einer der Operanden ein Datum ist, wird der numerische Operand als "Tag" betrachtet:

? Date() - 10 && What was the date 10 days ago? ? Date(2016, 3, 1) - 1 && Returns Feb 29, 2016. ? Date(2017, 3, 1) - 1 && Returns Feb 28, 2017.

Wenn einer der Operanden datetime ist, wird der numerische Operand als "zweiter" angesehen:

? Datetime() - 86400 && Go back exactly one day

Holen Sie sich 1 Stunde und 30 Minuten her von "jetzt":

? Datetime() - (1 * 3600 + 30 * 60)

Die zweite Form besteht darin, die Differenz zwischen zwei Datums- / Datumszeitwerten zu ermitteln. Operanden sind sowohl Datum als auch Datumszeit. Sie können Datum und Datumszeit nicht gleichzeitig verwenden (Typkonvertierung nach Bedarf, VFP übernimmt dies nicht für Sie). Regeln sind wie in + und -, Operanden sind Datum, dann ist die Differenz in Tagen , Operanden sind Datum und Uhrzeit, dann ist die Differenz in Sekunden .

Wie viele Tage bis zum Neujahr (für das Jahr 2016)?

? Date(2016, 12, 31) - Date()

Wie viele Sekunden bis Mitternacht?

? Dtot(Date()+1) - Datetime()

https://riptutorial.com/de/home 11

Im letzten Beispiel haben wir die Date / Datetime-Funktion DTOT - DateToTime verwendet, um den Mitternachtswert von morgen zu ermitteln. Es gibt viele nützliche Datums- / Datums- / Uhrzeitfunktionen, die wir alle überspringen, da sie technisch nicht als Operatoren betrachtet werden (obwohl sie mit Datums- / Datumsangaben arbeiten.) Dasselbe gilt auch für andere Operatoren.

Die Datums- / Datums-Zeit-Subtraktion ist signiert . Das heißt, wenn Sie das kleinere Datum / Datum als ersten Operanden verwenden, wäre das Ergebnis negativ. Sie können die Funktion abs () verwenden, wenn Sie unabhängig von der Reihenfolge von Datum / Datumszeit ein positives Ergebnis erhalten möchten.

Beziehungsoperatoren

Von allen Operatoren sind die relationalen Operatoren die komplexesten, deshalb haben wir sie bis zum Ende belassen.

Vergleichsoperatoren werden auch als Vergleichsoperatoren bezeichnet. Sie dienen zum Vergleichen von Dingen.

Vergleichsergebnis ist boolean false oder true.

Interessanterweise sehen Sie jedoch, wenn Sie das Kontrollkästchen in der VFP-Hilfe aktivieren, nur kurze Listenoperationen und einige weitere Zeilen, als ob es sich um diese Operatoren handelt.

Nun, die Komplexität ergibt sich aus der Tatsache, dass sie für alle Typen verwendet werden, sei es numerisch, Datum, Datum / Uhrzeit, logisch oder eine Zeichenfolge oder sogar für Objekte. Darüber hinaus kann das Verhalten unangenehm aussehen, Sie erhalten nicht das, was Sie erwarten, wenn Sie nicht wissen, welche Auswirkungen die Ergebnisse haben.

Beginnen wir mit einer Liste von Vergleichsoperatoren:

Operator BeschreibungDIE MEISTEN Basisprobe

> Größer als ? 1> 2 && .F.

< Weniger als ? 1 <2 && .T.

> = Größer als oder gleich wie ? 1> = 2 && .F.

<= Weniger als oder gleich ? 1 <= 2 && .T.

= Gleich ? 1 = 1 && .T.

== Ist genau gleich (macht Sinn für Strings) ? '1' = '1' && .T.

! =, #, <>Nicht gleich (alle 3 Operatoren verhalten sich genauso, wählen Sie Ihren Favoriten)

? 1! = 1 && .F.

https://riptutorial.com/de/home 12

Obwohl Sie diese mit allen Datentypen verwenden können, sollte zwischen den Operanden eine Typkompatibilität bestehen. Beispielsweise würden Sie eine Fehlermeldung erhalten, wenn Sie versuchen, ein Datum mit einer Ganzzahl zu vergleichen.

Datum und Datumszeit können verglichen werden, obwohl sie unterschiedliche Typen sind. VFP führt die Konvertierung implizit für Sie durch.

? Date() > DateTime() && .F. ? Date() <= DateTime() && .T. ? Date() < DateTime() && .T. if it is not midnight

Wenn die Operanden numerisch sind, sind alle diese Operatoren einfach und unkompliziert. Sie funktionieren wie im mathematischen Ausdruck.

Mit den logischen Operanden. .F. gilt als kleiner als .T.

Bei Objekten vergleichen wir die Referenz des Objekts im Speicher. Daher ist der am häufigsten verwendete Vergleich das Bestimmen, ob zwei Objektvariablen auf dasselbe Objekt zeigen. dh:

local o1, o2 o1 = createobject('Label') o2 = createobject('Label') ? m.o1 = m.o2 && is o1 and o2 the same object? ? m.o1 > m.o2 && this would work too but likely you would never use * remember we are comparing their references in memory * * They are different objects, but do they have any difference in their properties? ? CompObj(m.o1, m.o2) && .T. They are identical properties wise

Der Vergleich des Zeichendatentyps, der Vergleich von Zeichenketten, ist in VFP der verwirrendste. Es funktioniert nicht wie in anderen Sprachen und / oder Datenbanken und ist für VFP (und möglicherweise auch für andere xBase-Sprachen) eindeutig.

Vor vielen Jahren habe ich sogar einige wirklich fortgeschrittene Mitglieder in der Community gesehen, die noch nicht wussten, wie diese Operatoren in VFP funktionieren. Es ist also verständlich, dass leichte Nuancen die Neulinge leicht verwirren können.

Beim Vergleich geht es im Wesentlichen darum, gleich zu sein oder nicht. Wenn sie nicht gleich sind, denken wir vielleicht über die Operatoren>, <,> =, <=, oder? Bei Strings ist es verwirrend, wenn zwei Strings als gleich betrachtet werden .

Wichtig: Bei VFP-Zeichenfolgen wird die Groß- und Kleinschreibung beachtet. 'A' und 'a' sind zwei verschiedene Zeichenfolgen. Dies ist bei vielen Datenbanken nicht der Fall, bei denen standardmäßig eine Groß- / Kleinschreibung verwendet wird. Zum Beispiel in postgreSQL oder MS SQL Server für eine Tabelle, die mit CI-Sortierung (ohne Berücksichtigung der Groß- / Kleinschreibung) erstellt wurde:

https://riptutorial.com/de/home 13

select * from myTable where Country = 'TURKEY' select * from myTable where Country = 'Turkey'

würde das gleiche Ergebnis ergeben. In VFP erhalten Sie jedoch nur die, bei denen das Gehäuse passt. VFP hat jedoch einige Kollatierungsunterstützung und führt Vergleiche zwischen Groß- und Kleinschreibung durch. (Vertrauen Sie nicht, siehe unten)

Wenn zwei Zeichenfolgen nicht gleich gut sind, sofern Sie keine Standardwerte geändert haben, werden sie basierend auf ihren ASCII-Werten verglichen.

? 'Basoz' < 'Cetin' && is true. ? 'basoz' < 'Cetin' && is false. ? 'Cetin' < 'David' && is true. ? 'Çetin' < 'David' && is false.

Die Standardeinstellung für die Sortierreihenfolge lautet "machine". Dies ist das, was Sie dann erhalten. Wenn Sie die Kollatierung in etwas anderes ändern, erhalten Sie den Vergleich basierend auf der Sortierreihenfolge der Kollatierung. Mit Sortierungs andere Einstellung als Standardmaschine sind Sie auch einen Fall Unempfindlichkeit auf dem Vergleich impliziert (traue dies für Gleichheit):

set collate to 'GENERAL' ? 'Basoz' < 'Cetin' ? 'basoz' < 'Cetin' ? 'Cetin' < 'David' ? 'Çetin' < 'David'

Jetzt sind alle diese Ausdrücke WAHR.

Persönliche Beratung: Kollationen in VFP waren nie zuverlässig genug. Ich schlage vor, dass Sie keine Kollatierungen verwenden und bei der Standardeinstellung 'MACHINE' bleiben. Wenn Sie Kollatierungen verwenden würden, sollten Sie diese zuerst prüfen, wenn Sie etwas feststellen, das hinsichtlich der Zeichendaten sehr unerwartet ist. Ich habe gesehen und gezeigt, dass es in vielen Fällen fehlschlägt, aber dann habe ich vor der VFP9-Version nicht mehr versucht, es zu verwenden. Es könnte jetzt konsistent sein, ich weiß es wirklich nicht.

In Anbetracht dessen, dass wir Ungleichheitsfälle mit Strings abdeckten, ist der schwierigste Fall der Gleichheitsfall. In VFP beeinflussen grundsätzlich zwei Einstellungen den Vergleich:

SET EXACT (Standardeinstellung ist OFF und bewirkt regelmäßige Vergleiche - außer SQL)1. SET ANSI (Standard ist AUS und bewirkt nur Vergleiche in SQL. SET EXACT hat keinen Einfluss auf Vergleiche, die innerhalb von SQL-Abfragen gemacht werden.

2.

Lesen Sie mit SET EXACT OFF den Vergleich als "beginnt die Zeichenfolge rechts mit der Zeichenfolge links"? Sie werden bis zur Länge der richtigen Saite verglichen.

? "Bobby" = "B" && Bobby starts with B, so TRUE

https://riptutorial.com/de/home 14

? "Bobby" = "Bob" && Bobby starts with Bob, so TRUE ? "Bobby" = "Bob " && Bobby starts with Bob but there is a trailing space there, FALSE ? "Bobby" = "bob" && would be true with collation set to GENERAL

Beachten Sie, dass im regulären Vergleich "Bobby" = "B" WAHR ist, aber "B" = "Bobby" ist FALSE. Mit anderen Worten, der Ort der Operanden ist wichtig.

Bei SET EXACT ON müssen die Zeichenfolgen vollständig übereinstimmen, die nachgestellten Leerzeichen werden jedoch ignoriert (wir ignorieren hier die Satzanpassung, wodurch auch die Groß- und Kleinschreibung berücksichtigt wird):

? "BOBBY" = "BOB" && FALSE ? "BOBBY" = "BOBBY" && TRUE ? "BOBBY" = "BOBBY " && TRUE ? "BOBBY " = "BOBBY" && TRUE

Nun hat SET EXACT mit SQL-Befehlen keine Auswirkung und würde sich wie SET EXACT OFF verhalten.

Select * from Customers where Country = 'U'

Wählt die Kunden aus den USA und Großbritannien jedes Land aus, das mit "U" beginnt.

In SQL sollte die Änderung der Reihenfolge der Operanden jedoch per Definition zum gleichen Ergebnis führen. Somit:

Select * from Customers where 'U' = Country

funktioniert auch auf dieselbe Weise (beachten Sie den Unterschied zu Nicht-SQL-Befehlen).

Wenn Sie genaue Übereinstimmungen implizieren möchten, können Sie ANSI aktivieren:

SET ANSI ON Select * from Customers where Country = 'USA'

bringt alle Kunden aus den USA zurück. Beachten Sie, dass die nachgestellten Leerzeichen in Landfeld ODER im rechten Ausdruck ignoriert werden. Es ist egal, wie viele Trails Sie auf beiden Seiten haben. Sie erhalten den Vergleich so, als ob es so wäre: RTRIM (Land) = RTRIM ('USA').

Obwohl es in Operatoren in VFP nicht erwähnt wird, ist ein SQL- Operator LIKE. Wenn Sie LIKE verwenden, erhalten Sie unabhängig von der Einstellung SET ANSI einen exakten Übereinstimmungsvergleich (mit LIKE-Kräften und implizitem ANSI ON-Fall - es handelt sich schließlich um einen ANSI-Operator). Beachten Sie jedoch, dass sich das Verhalten geringfügig unterscheidet. Nachgestellte Leerzeichen werden nicht ignoriert, es sei denn, die Gesamtgröße der Anhänger ist kleiner oder gleich der Feldgröße. Wenn das Feld Country beispielsweise C (10) ist, funktioniert Country = 'USA' oder Country = 'USA__', Country = 'USA___________' schlägt jedoch fehl ( Unterstriche kennzeichnen ein Leerzeichen und das letzte hat mehr als 7 Leerzeichen).

https://riptutorial.com/de/home 15

Endlich sind wir beim letzten Operator, ==. Das bedeutet genau gleich und macht es mit Strings zu verwenden. Ein Vorteil ist, dass Sie mit == immer eine genaue Übereinstimmung wünschen, unabhängig von SET EXACT oder SET ANSI-Einstellungen. Seien Sie jedoch vorsichtig, das Verhalten ist anders, wenn es sich um einen SQL-Befehl oder einen regulären Befehl handelt.

Mit SQL:

Select * from Customers where Country == 'USA'

Unabhängig von den ANSI- und EXACT-Einstellungen möchten wir alle Kunden nur aus den USA. Nachgestellte Leerzeichen auf beiden Seiten werden ignoriert.

Mit Nicht-SQL:

? m.lcString1 == m.lcString2

wäre nur dann zutreffend , wenn sie hinsichtlich ihres Mantels und ihrer Länge genau gleich sind (nachgestellte Leerzeichen werden NICHT ignoriert). Die Einstellungen von SET ANSI, EXACT oder COLLATE werden nicht beeinflusst.

Operatoren online lesen: https://riptutorial.com/de/visual-foxpro/topic/7625/operatoren

https://riptutorial.com/de/home 16

Kapitel 3: VFP-Interop mit .NET

Einführung

In diesem Thema wird die Interop zwischen VFP und .NET behandelt.

Examples

Verwenden von wwDotNetBridge zum Ausführen von .NET-Code

Mit Hilfe der wwDotNetBridge von West Wind können Sie leicht auf .NET-Code innerhalb eines VFP-Programms zugreifen.

Das Whitepaper enthält alle Details, aber dieses prägnante Beispiel soll die grundlegenden Schritte zum Ausführen einer Methode in einer .NET-Assembly veranschaulichen.

Beachten Sie, dass wwDotNetBridge direkt auf einfache Eigenschaften wie Strings, Ints usw. zugreifen kann. Um auf kompliziertere Strukturen wie Listen zugreifen zu können, müssen Sie zunächst die wwDotNetBridge-Funktion CreateArray verwenden, um die .NET-Struktur in ein VFP-COM-Array zu konvertieren unten in diesem Beispiel).

*!* Load WestWind .NET wrapper library (wwdotnetbridge.prg assumed to be in the search path) IF (!wwDotNetBridge()) RETURN .F. ENDIF lowwDotNetBridge = CREATEOBJECT("wwDotNetBridge","V4") *!* Load .NET Assembly (include full or relative path if necessary) IF !lowwDotNetBridge.LoadAssembly("SomeDotNetAssembly.dll") lcAssemblyLoadError = "LoadAssembly error: " + lowwDotNetBridge.cErrorMsg =MESSAGEBOX(lcAssemblyLoadError, MB_ICONSTOP, "Error") RETURN .F. ENDIF *!* Parameters to pass to class constructor *!* You can pass up to 5 paramenters to the constructor lcParameter1 = "StringParameter1" lcParameter2 = "StringParameter2" lnParameter3 = 3 lcParameter4 = .NULL. *!* Get an instance of the assembly class loAssemblyReference = lowwDotNetBridge.CreateInstance("MyDotNetProject.MyDotNetClass", ; lcParameter1, lcParameter2, lnParameter3, lcParameter4) IF lowwDotNetBridge.lError lcAssemblyLoadError = "An error occurred loading the class: " + lowwDotNetBridge.cErrorMsg RETURN .F. ENDIF *!* Usage Example

https://riptutorial.com/de/home 17

*!* This example runs a method that return a boolean *!* and populates a List<string> (SomeStringList). *!* *!* The assembly has a public property named "LastErrorMessage" *!* with details about any handled exceptions/problems. IF (!loAssemblyReference.SomePublicMethod()) msg = "There was a problem executing the method:" + CRLF + ; loAssemblyReference.LastErrorMessage =MESSAGEBOX(msg, MB_ICONSTOP, "Error") RETURN .F. ENDIF *!* At this point the string list (SomeStringList) should be populated *!* wwDotNetBridge can convert that list to a VFP COM array (0-based) laVFPArrayOfStrings = lowwDotNetBridge.CreateArray() laVFPArrayOfStrings.FromEnumerable(loAssemblyReference.SomeStringList) FOR x = 0 TO laVFPArrayOfStrings.Count-1 ? laVFPArrayOfStrings.Item(x) ENDFOR

VFP-Interop mit .NET online lesen: https://riptutorial.com/de/visual-foxpro/topic/9390/vfp-interop-mit--net

https://riptutorial.com/de/home 18

Credits

S. No

Kapitel Contributors

1Erste Schritte mit visual-foxpro

Cetin Basoz, Community, Steve

2 Operatoren Cetin Basoz

3VFP-Interop mit .NET

Steve

https://riptutorial.com/de/home 19