IR
irwinrodriguez.dev

In FoxCli enthalten

FoxService

Windows-Dienste, geschrieben in Visual FoxPro.

Haben Sie einen PC mit einer VFP-exe und einem Timer, den jemand offen lassen muss, um Bestellungen zu importieren, ausstehende E-Mails zu versenden oder den nächtlichen Abschluss zu machen? FoxService macht daraus einen Windows-Dienst: Er startet mit dem Rechner, läuft weiter, auch wenn sich niemand anmeldet, startet neu, wenn er abstürzt, und schreibt in die Ereignisanzeige. Sie schreiben nur die Logik, in VFP.

Er kommt mit FoxCli

FoxService gehört zum Installer und zur Lizenz von FoxCli: Er wird nicht extra gekauft. Ohne Lizenz läuft er vollständig, ohne Einschränkungen, und der Dienst meldet beim Start, dass er im Testmodus läuft.

Die Lizenz von FoxCli ansehen →

Wie man ihn schreibt

Eine Klasse in src\main.prg, und jede öffentliche Methode ist ein Job. Die *!*-Zeile darüber sagt, wann er läuft. Das ist das Beispiel, das jedes neue Projekt mitbringt: ein Import von Bestellungen, der schon beim ersten Start funktioniert.

Drei Jobs eines Dienstes: wenn eine Datei ankommt, alle 30 Sekunden und jede Nacht
DEFINE CLASS OrdersService AS FoxServiceBase OF foxservice.prg OLEPUBLIC

    *-- Every CSV that arrives in inbox\: its orders into the table.
    *!* @watch inbox *.csv
    PROCEDURE ImportOrders(tcPath, tcChange)
        ...
    ENDPROC

    *-- Every 30 seconds: how many orders are waiting.
    *!* @every 30s
    PROCEDURE CountPending
        LOCAL lnPending
        THIS.OpenOrders()
        COUNT FOR status == "P" TO lnPending
        THIS.Log("Pending orders: " + TRANSFORM(lnPending))
    ENDPROC

    *-- Every night: the summary of the day.
    *!* @daily 23:55
    PROCEDURE DailySummary
        THIS.WriteSummary()
    ENDPROC

ENDDEFINE

Wann jeder Job läuft

*!* @every 30s
In festen Abständen, in Sekunden, Minuten oder Stunden. Eine Änderung der Systemzeit verschiebt ihn nicht.
*!* @daily 04:00
Zu einer Uhrzeit, im 24-Stunden-Format und nach der Uhr des Rechners, Zeitumstellung inbegriffen. Mehrere Zeilen, mehrere Uhrzeiten.
*!* @startup
Einmal, beim Start des Dienstes: Tabellen vorbereiten, Ordner prüfen.
*!* @watch inbox *.csv
Jede Datei, die in einem Ordner ankommt. Der Dienst wartet, bis sie fertig kopiert ist, und auch die, die beim Start schon da waren, werden geliefert.
(ohne *!*-Zeile)
Ein manueller Job: Er läuft nicht von selbst, und Sie starten ihn, wann Sie wollen, aus FoxForge oder mit „invoke“.

Alles aus der VFP-IDE

Aus der Konsole oder von einem Agenten

Die CLI foxservice macht dasselbe ohne die IDE, und auf dem Server genügt die exe des Dienstes. Ihre Befehle sind auch Werkzeuge für einen KI-Agenten (foxservice_new, foxservice_build, foxservice_install…) über FoxStack, kostenlos.

foxservice new --name orders --folder C:\svc
foxservice build --folder C:\svc\orders
foxservice run --folder C:\svc\orders --for 1m
orders.exe install --account "NT SERVICE\orders" --start

Was nicht in einen Dienst passt

Ein Dienst hat weder Bildschirm noch Benutzer: keine Formulare, kein MESSAGEBOX, kein Drucken auf einen Drucker. Code, der es versucht, bleibt nicht hängen: Der Job schlägt sofort fehl, und das Log nennt die Zeile und den Grund. Ein VFP-Fehler kommt von selbst ins Log, mit seiner Nummer und seiner Zeile, und der Dienst läuft weiter, deshalb schreibt man die Jobs ohne TRY ... CATCH.

Was er braucht

Zum Programmieren Visual FoxPro 9 oder VFP Advanced 10.2 in 32 Bit, und FoxForge, das mit FoxCli installiert wird. Auf dem Server Windows mit der 32-Bit-Laufzeit von .NET 10: kein Visual FoxPro, weil seine Laufzeit im Ordner des Dienstes mitreist, und keine Lizenz, weil die Lizenz dem gehört, der kompiliert.

Das Handbuch

Das vollständige Handbuch kommt mit FoxForge, unter Hilfe > FoxService-Handbuch, auf Deutsch, Englisch und Spanisch. Es beginnt mit den ersten Schritten: dem Import von Bestellungen, Job für Job erklärt.

Häufige Fragen

Muss ich .NET oder Windows kennen?

Nein. Sie schreiben eine VFP-Klasse. Die exe des Dienstes, die FoxService im Ordner dist\ neben Ihre DLL legt, kümmert sich um Installieren, Starten und Stoppen, um die Zeitpläne und um die Ereignisanzeige. Aus FoxForge müssen Sie nicht einmal eine Konsole öffnen: Installieren, Starten und Anhalten sind Knöpfe.

Was ist der Unterschied zu FoxServer und FoxCore?

FoxServer beantwortet HTTP-Anfragen: Jemand ruft an, und Ihr Code antwortet. FoxCore führt Aufgaben im Hintergrund innerhalb Ihrer Anwendung aus, damit ihr Bildschirm solange nicht hängt. FoxService braucht keine geöffnete Anwendung: Er arbeitet von selbst, wenn seine Zeit kommt, zu einer Uhrzeit, in festen Abständen oder wenn eine Datei ankommt. Sie lassen sich zusammen nutzen, jeder mit seiner Lizenz.

Welche Lizenz brauche ich?

Die von FoxCli: FoxService ist darin und in ihrem Installer enthalten. Die Lizenz gehört dem, der kompiliert; die Server, auf denen der Dienst läuft, brauchen keine. Ohne Lizenz läuft alles, ohne Einschränkungen, und der Dienst meldet beim Start einmal, dass er im Testmodus läuft.

Unter welchem Windows-Konto läuft er?

Voreingestellt ist das Systemkonto (LocalSystem): Es erreicht jeden Ordner des Rechners, wie das Desktop-Programm, das er ersetzt. Für einen Netzwerkordner ein eigenes Konto des Dienstes (NT SERVICE\Name) oder ein Windows- oder Domänenbenutzer; das Kennwort wird beim Installieren abgefragt, ohne Echo.

Was sind die „Jobs gleichzeitig“?

Mit 1, dem voreingestellten Wert, stellen sich die Jobs an: Dauert ein Import zehn Minuten, wartet der Job, der alle 30 Sekunden läuft, und seine Runden werden solange übersprungen. Mit 2 oder mehr hält ein langer Job die kurzen nicht auf. Jeder ist ein eigenes VFP, mit seinen Variablen und seinen offenen Tabellen.

Was passiert, wenn ein Job fehlschlägt oder hängt?

Ein VFP-Fehler kommt mit seiner Nummer und seiner Zeile ins Log, der Job zählt als fehlgeschlagen, und der Dienst läuft weiter. Ein Job, der seine Höchstzeit überschreitet (eine Stunde, wenn Sie nichts anderes sagen), wird aufgefordert aufzuhören; kehrt er nicht zurück, startet sich der Dienst in wenigen Sekunden selbst neu. Dreimal hintereinander, und dieser Job wird nicht mehr eingeplant, bis Sie ihn prüfen.

Kann ich drucken?

Auf einen Drucker nicht: Ein Dienst hat keine Benutzersitzung und keine Drucker. Der Job, der es versucht, schlägt sofort fehl, und das Log sagt es.

Und einen Bericht als PDF erzeugen?

Ja, mit der Berichtslaufzeit: ReportToPdf nimmt die Seiten einer .frx, und der Dienst setzt das PDF zusammen. Die Seiten sind Bilder mit 300 dpi, der Text lässt sich also nicht markieren oder durchsuchen, und mit dieser Laufzeit läuft ein Job nach dem anderen.

Funktioniert er mit VFP Advanced?

Ja, mit VFP Advanced 10.2 in 32 Bit. Zwei Unterschiede: Es gibt keine Berichtslaufzeit, und es bleibt bei einem Job nach dem anderen.

Kann ein KI-Agent den Dienst anlegen und installieren?

Ja. Die Befehle der CLI foxservice sind MCP-Werkzeuge über FoxStack, kostenlos. Installieren braucht eine Administrator-Konsole: Hat der Agent keine, bekommt er den genauen Befehl, den ein Mensch ausführen soll.

Wenn etwas nicht zusammenpasst, schreiben Sie mir: soporte@irwinrodriguez.dev