POS as a Service
Die das Produkt POS-GX, also den POS Fat-Client der Firma HIS GmbH, kennen und verwenden, wissen um das Problem, dass der FAT-Client immer einen angemeldeten Benutzer und eine spezielle Konfiguration (von uns „Fensterloser Client“ genannt) benötigt, um für die Online-Module („QIS“) korrekt zu funktionieren.
Bei einer falschen Datebankabfrage öffnet der „Fensterlose Client“ ein Fehlerfenster und es sind keine „Eingaben“ mehr möglich; d.h. auch Stapelverarbeitung (z.B. Import von Studienleistungen) bleiben stehen – bis jemand das Fehlerfenster manuell durch das Klicken von „OK“ schliesst.
Eine Möglichkeit dieses Problem zu umgehen ist folgende:
Der „Fensterloser Client“ kann mit der Option TCP beim Starten dazu gezwungen werde, sich im Fehlerfehler selbst zu beenden.
Beispielcode:
„C:Program FilesHISHISPOS-GXpos32.exe“ all DB=POSTGRESQL;DSN=<DATA-SOURCE>;UID=<LOGIN-ACCOUNT>;PWD=<PASSWORD>;TCP
Was im ersten Moment keine größere Besserung mit sich zu bringen scheint, kann aber durchaus in Verwendung eines Batch-Scriptes, dass den „Fensterloser Client“ nach dem Beenden neu startet, sinnvoll sein.
Beispielcode:
:a
start „POS_CLIENT “ /w „C:Program FilesHISHISPOS-GXpos32.exe“ all DB=POSTGRESQL;DSN=<DATA-SOURCE>;UID=<LOGIN-ACCOUNT>;PWD=<PASSWORD>;TCP
goto a
Beschreibung:
Sobald der Client durch eine ungültige „Eingabe“ beendet wird, reagiert das Batchscript und startet ihn neu. Problem ist, dass alle weiteren Jobs in der Queue bei einem Neustart eliminiert werden.
Eine weitere Möglichkeit, die auftretenden Fehlermeldungen zu unterdrücken, ist ein Tool namens „AutoIt“.
Dieses Tool bietet die Möglichkeit, auf sich öffnende Fenster zu „lauschen“ und ist direkt nach dem Öffnen z.B. gleich wieder schliessen.
Eine Beispiel Konfiguration könnte so ausehen:
<blockquote>
wincloser.au3
————-
while 1
sleep(100)
$TITLE = WinGetTitle(„“)
$TEXT = WinGetText(„“)
$KNOWN = „0“
if (StringRegExp($TITLE,“(Fehler*)“)) then
Winclose($TITLE)
$KNOWN = „1“
Endif
if (StringRegExp($TITLE,“(Error*)“)) then
Winclose($TITLE)
$KNOWN = „1“
Endif
if (StringRegExp($TITLE,“(ODBC*)“)) then
Winclose($TITLE)
$KNOWN = „1“
Endif
if ( $TITLE == „“) Then
$KNOWN = „1“
Endif
Endif
if ( $KNOWN == 0 ) Then
FileWrite(„C:POS-GX-new-window.txt“,$TITLE & @CRLF)
FileWrite(„C:POS-GX-new-window.txt“,$TEXT & @CRLF & @CRLF)
Endif
Wend
</blockquote>
Mit WinGetTitle(„<string>“) wird überprüft, ob ein geöffnetes Fenster einen Teil des Suchstrings enthält. In diesem Fall Wird jedes Fenster zuerst überprüft und in die Variable „$TITLE“ geschrieben.
Diese Variable wird anschliessend über eine Regular Expression auf die Inhalte „Fehler“ oder „Error“ untersucht. Sollten diese Strings im Titel auftauchen, wird das Fenster mit der Funktion WinClose() sofort geschlossen. Sollte ein nicht bekanntes Fenster aufgehen wird dieses in die Datei „POS-GX-new-window.txt“, um es später noch zur Regular Expression hinzufgen zu können.
Trotzdem muss immer noch ein Benutzer am System angemeldet sein, unter dessen Kennung der „Fensterloser Client“ läuft. Auch diesem Problem kann in Verbindung mit dem „Windows Resource Kit“ Toolkit von Microsoft umgangen werden:
Nach der Installation des „Windows Resource Kit“ liegen im Installationsverzeichnis zwei EXE-Dateien die hierfür benötigt werden:
1. INSTSRV.EXE -> Tool zum Anlegen eines neuen Diensten (Service) unter Windows
2. SRVANY.EXE -> Tool zum Starten von Software als Dienst die keine Eigene Funktion dafür mitbgringen
Zunächst muss der Service mittels den oben genannten EXE Dateien angelegt werden:
<path-to-instsrv>instsrv.exe <Service-Name> <path-to-srvany>srvany.exe
Beispiel:
„C:WRKinstsrv.exe“ posd „C:WRKsrvany.exe“
Hierbei wird ein Service mit dem namen „posd“ angelegt der beim starten das Tool srvany aufruft.
Bis hierhin sind die Schritte noch identisch. Ab hier muss unterschieden werden ob man mit dem „Batch-Script“ oder mit „AutoIt“ arbeitet.
Batch-Script:
Nun muss SRVANY noch mitgeteilt werden, dass es den „Fensterloser Client“ starten soll – und zwar mit Hilfe eines Registryeintrages, der nicht auf pos32.exe, sondern auf das Batch-Script zeigt:
REGEDIT4
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesposdParameters]
„Application“=“C:\POS-WEBSERV.bat“
„AppDirectory“=“C:\Program Files\HIS\HISPOS-GX“
„AppParameters“=““
Beschreibung:
– der Wert in den eckigen Klammern beschreibt den Ort in der Registry zum Ablegen der nachfolgenden Werte; hier ist darauf zu achten, dass der Teil bis „posd“ der Pfad zu den Service-Einträgen von Windows ist und der Wert „posd“ der (frei wählbare) Name des Services
-„Application“ beschreibt das zu startenden Programm
-„ApplicationDirectory“ beschreibt, in welchem Verzeichnis das Programm laufen soll
-„AppParameters“ beschreibt optionale Parameter, die man dem Programm-Aufruf anhängen könnte
Nun muss der Service noch auf der Eingabeaufforderung mit „net start posd“ gestartet werden.
Nach dem Starten sollte unter der Prozessliste ein Prozess namens pos32.exe vom Benutzer SYSTEM auftauchen.
Beim Beenden des Service muss man auf die Reihenfolge achten, da ja noch das Batch-Script mitläuft:
1. Den Service beenden (um das Batch-Script zu beenden) mit „net stop posd“
2. Den pos32.exe Prozess händisch beenden
AutoIt:
Für AutoIt braucht es zwei Dienste, die im Hintergrund laufen müssen. Der erste Service ist wieder POS, der zweite Service ist AutoIt.
POS wird diesmal direkt, also ohne Batch-Script, in die Registry eingetragen.
WICHTIG: Die Option TCP darf nun nicht mehr als Option an POS-GX angehängt werden, da der Client sich auch im Fehlerfall nicht beenden soll – für das „Wegklicken“ der Fehlermeldungen sorgt ja AutoIt.
Hier die Konfiguration in einem Installations-Batchscript zusammengefasst:
posd.bat
——–
@echo off
echo.
if „%1“ == „stop“ goto stop
echo Einrichten des Service „posd“
echo ———————————————————————-
echo Anhalten und Deinstallieren mit dem Aufruf „posd stop“
echo Pfadangaben notfalls ergaenzen
echo.
echo Installieren des Service…
„C:WRKtoolsinstsrv.exe“ posd „C:WRKtoolssrvany.exe“
echo.
echo Installieren der Registry-Werte…
regedit posd.reg
echo.
echo Starten des Service…
net start posd
goto ende
:stop
echo Anhalten und Deinstallieren des Service „posd“
echo ———————————————————————-
echo Stoppen des Service…
net stop posd
echo.
echo Deinstallieren des Service und der Registry-Werte…
„C:WRKtoolsinstsrv.exe“ posd remove
:ende
echo.
echo *** Fertig ***
echo.
pause
posd.reg
——–
REGEDIT4
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesposdParameters]
„Application“=“C:\Program Files\HISHISPOS-GX\pos32.exe“
„AppDirectory“=“C:\Program Files\HIS\HISPOS-GX“
„AppParameters“=“all DB=POSTGRESQL;DSN=<DATA-SOURCE>;UID=<USER>;PWD=<PASSWORD>“
Genauso für AutoIt
closerd.bat
———–
@echo off
echo.
if „%1“ == „stop“ goto stop
echo Einrichten des Service „closerd“
echo ———————————————————————-
echo Anhalten und Deinstallieren mit dem Aufruf „closerd stop“
echo Pfadangaben notfalls ergaenzen
echo.
echo Installieren des Service…
„C:WRKtoolsinstsrv.exe“ closerd „C:WRKtoolssrvany.exe“
echo.
echo Installieren der Registry-Werte…
regedit closerd.reg
echo.
echo Starten des Service…
net start closerd
goto ende
:stop
echo Anhalten und Deinstallieren des Service „closerd“
echo ———————————————————————-
echo Stoppen des Service…
net stop closerd
echo.
echo Deinstallieren des Service und der Registry-Werte…
„C:WRKtoolsinstsrv.exe“ closerd remove
:ende
echo.
echo *** Fertig ***
echo.
pause
closerd.reg
————-
REGEDIT4
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicescloserdParameters]
„Application“=“C:\Program Files\AutoIt3\AutoIt3.exe“
„AppDirectory“=“C:\Program Files\AutoIt3“
„AppParameters“=“C:\wincloser.au3“
Damit ist es möglich, sämtliche Betriebsarten des POS „fensterlosen Clients“ und von AutoIt zu nutzen, um das Ziel „Bestätigen des Fehlermeldungs-Fensters“ zu erreichen. Die optimalste Lösung stellt sicherlich der Betrieb beider Software-Komponenten als Windows-Service dar, denn damit muss kein Benutzer am System angemeldet sein, um POS und AutoIt zu starten.