Moduswechselbetrieb - ein Vorschlag

Fragen, Anregungen oder Tipps und Tricks? Hier ist der erste Anlaufpunkt.
Nicht sicher, wo ein Thema hingehört? Hier hinein - wir kümmern uns! :)

Moderator: Forum Moderatoren

Forumsregeln
TM-Startforum - "offen für alle Themen".
Beiträge, die in einen anderen Bereich passen, werden bei Bedarf verschoben.
Antworten
rudi_ratlos
Beiträge: 11
Registriert: Freitag 27. Juni 2008, 23:04
17

Moduswechselbetrieb - ein Vorschlag

Beitrag von rudi_ratlos »

Guten Morgen,
ich habe die Zeit des Quartalsupdates genutzt, um ein C-Programm, das seit zwei Jahren unser Leben erleichtert, in RapidBatch umzuschreiben. Eine kleine und sehr einfach zu erlernende Skriptsprache, mit der sich schnell und unkompliziert Programme erstellen lassen. Den Vorteil sehe ich hier darin, dass sich der Benutzer nicht wirklich um Datensicherheit oder welche nun die aktuellere Datenbank ist, kümmern muß. In der Hektik des Alltags ist schnell einmal ein aktuelle Datenbank überschrieben ..
Beantworte gerne Fragen dazu. Da sich im Forum Tabulatoren nur mit Mühe setzen lassen, kann ich das Original in lesbarerer Form auch gerne zuschicken.

:-) Rudi Ratlos

rem ===============================================================================
rem Kurzbeschreibung Aufruf des Programms "Turbomed" in Abhängigkeit von der
rem vorhandenen Umgebung (Netzwerkumgebung oder Einzelplatz)
rem Auch als "Moduswechselbetrieb" bezeichnet
rem -------------------------------------------------------------------------------
rem Version 01.00
rem Datum 30.06.2008
rem Autor Rainer Sonnberg
rem ===============================================================================




rem ===============================================================================
rem Funktionsdefinitionen




rem -------------------------------------------------------------------------------
rem Funktion MakeDateVisible
rem Stellt das Datum in der Form TT.MM.JJJJ dar

func MakeDateVisible: [Datum]
getcharat [MonatEins] = [Datum],'1'
getcharat [MonatZwei] = [Datum],'2'
getcharat [TagEins] = [Datum],'3'
getcharat [TagZwei] = [Datum],'4'
getcharat [JahrEins] = [Datum],'5'
getcharat [JahrZwei] = [Datum],'6'
getcharat [JahrDrei] = [Datum],'7'
getcharat [JahrVier] = [Datum],'8'
[VisibleDate] = [TagEins] # [TagZwei] # '.' # [MonatEins] # [MonatZwei] # '.' # [JahrEins] # [JahrZwei] # [JahrDrei] # [JahrVier]
ret [VisibleDate]
endfunc





rem -------------------------------------------------------------------------------
rem Funktion MakeDateMath
rem Baut das Datum so zusammen, das es rechen- und vergleichbar ist (JJMMTT)

func MakeDateMath: [MathDate]
getcharat [MonatEins] = [MathDate],'1'
getcharat [MonatZwei] = [MathDate],'2'
getcharat [TagEins] = [MathDate],'3'
getcharat [TagZwei] = [MathDate],'4'
getcharat [JahrEins] = [MathDate],'5'
getcharat [JahrZwei] = [MathDate],'6'
getcharat [JahrDrei] = [MathDate],'7'
getcharat [JahrVier] = [MathDate],'8'
[MathDate] = [JahrEins] # [JahrZwei] # [JahrDrei] # [JahrVier] # [MonatEins] # [MonatZwei] # [TagEins] # [TagZwei]
ret [MathDate]
endfunc





rem -------------------------------------------------------------------------------
rem Funktion MakeTimeVisible
rem Stellt die Zeit in der Form hh:mm:ss dar

func MakeTimeVisible: [Zeit]
getcharat [StundeEins] = [Zeit],'1'
getcharat [StundeZwei] = [Zeit],'2'
getcharat [MinuteEins] = [Zeit],'3'
getcharat [MinuteZwei] = [Zeit],'4'
getcharat [SekundeEins] = [Zeit],'5'
getcharat [SekundeZwei] = [Zeit],'6'
[TimeVisible] = [StundeEins] # [StundeZwei] # ':' # [MinuteEins] # [MinuteZwei] # ':' # [SekundeEins] # [SekundeZwei]
ret [TimeVisible]
endfunc





rem -------------------------------------------------------------------------------
rem Funktion MakeTimeMath
rem Stellt die Zeit in der Form hhmmss dar

func MakeTimeMath: [MathTime]
getcharat [StundeEins] = [MathTime],'1'
getcharat [StundeZwei] = [MathTime],'2'
getcharat [MinuteEins] = [MathTime],'3'
getcharat [MinuteZwei] = [MathTime],'4'
[MathTime] = [StundeEins] # [StundeZwei] # [MinuteEins] # [MinuteZwei]
ret [MathTime]
endfunc



rem ===============================================================================
rem Hier beginnt das eigentliche Programm

rem Diese beiden Variablen sind zu setzen fuer die richtigen Pfade
[PathLaptop]= 'C:\Turbomed\PraxisDB\objects.dat'
[PathServer]= 'Z:\PraxisDB\objects.dat'



rem -------------------------
rem Schritt 1 - Daten sammeln
rem -------------------------

rem Datum und Uhrzeit der letzten Veraenderung der Praxis-DB auf dem Laptop
getfiletime [TimeLaptop] = [PathLaptop]
getfiledate [DateLaptop] = [PathLaptop]

rem Wenn kein Datum zurückkomt, ist etwas faul und das Programm endet hier
if [errorcode] < '0'
echo 'Praxisdatenbank auf dem Laptop nicht gefunden, Programm wird beendet'
halt
endif


rem Laptop o.k., jetzt den Server testen
getfiletime [TimeServer] = [PathServer]
getfiledate [DateServer] = [PathServer]



rem -------------------------
rem Schritt 2 - Einzelplatz
rem -------------------------

rem "getfiledate [DateServer]" hat einen Fehler zurückgeliefert ==> kein
rem Server vorhanden ==> Einzelplatzmodus
if [errorcode] < '0'
echo 'Server nicht gefunden' # [crlf] # 'Turbomed wird im Einzelplatzmodus gestartet'

rem Dieser Systembefehl kopiert in das TM-Programmverzeichnis die Konfiguration für den
rem Einzelplatzmodus
call 'cmd.exe /C copy /Y C:\TurboMed\Programm\Einzelplatz\local.ini C:\TurboMed\Programm\local.ini','HIDE'

rem Wenn das geklappt hat, kann TM gestartet und das Programm selbst beendet werden
if [errorcode] ! '0'
echo 'Beim Erstellen der Konfiguration ist ein Fehler aufgetreten' #[crlf]# [crlf]# 'Informieren Sie den Systemadministrator'
else
call 'C:\TurboMed\Programm\turbomed.exe','SHOW'
halt
endif
endif



rem -------------------------
rem Schritt 3 - Mehrplatzplatz
rem -------------------------

rem Wenn wir bis hierher kommen, besteht eine Verbindung zum Server in der Praxis
rem bedeutet, wir müssen die Datums- und Zeitwerte berechnen

rem Erst die Datenbank auf dem Laptop
MakeDateVisible [MathDateLaptop] = [DateLaptop]
MakeTimeVisible [MathTimeLaptop] = [TimeLaptop]
[CompareValueLaptop]= [MathDateLaptop] # ' ' # [MathTimeLaptop]

MakeDateVisible [MathDateServer] = [DateServer]
MakeTimeVisible [MathTimeServer] = [TimeServer]
[CompareValueServer]= [MathDateServer] # ' ' # [MathTimeServer]


rem Jetzt zeigen wir dem User kurz den Status
echo 'Datenbank auf dem Server: ' # [CompareValueServer] # [crlf] # 'Datenbank auf dem Laptop: ' # [CompareValueLaptop]

rem Jetzt die Berechnung, ob überhaupt gestartet werden darf
MakeDateMath [MathDateLaptop] = [DateLaptop]
MakeTimeMath [MathTimeLaptop] = [TimeLaptop]
[LaptopDateTime]= [MathDateLaptop] # [MathTimeLaptop]

MakeDateMath [MathDateServer] = [DateServer]
MakeTimeMath [MathTimeServer] = [TimeServer]
[ServerDateTime]= [MathDateServer] # [MathTimeServer]


if [ServerDateTime] >= [LaptopDateTime]
echo 'Mehrplatzsystem wird gestartet'
call 'cmd.exe /C copy /Y C:\TurboMed\Programm\Mehrplatz\local.ini C:\TurboMed\Programm\local.ini','HIDE'
if [errorcode] ! '0'
echo 'Beim Erstellen der Konfiguration ist ein Fehler aufgetreten' #[crlf]# [crlf]# 'Informieren Sie den Systemadministrator'
else
call 'C:\TurboMed\Programm\turbomed.exe','SHOW'
halt
endif
else

rem Wenn wir bis hier kommen, gibt es ein Problem: Es besteht eine Netzwerkverbindung ,
rem zum Server in der Praxis, aber die Datenbank auf dem Laptop ist aktueller. Was tun ?
echo 'Es besteht eine Verbindung zum Server, ' # [crlf] # 'aber die Datenbank auf dem Laptop ist aktueller !!' # [crlf] # [crlf] # 'Bitte Administrator benachrichtigen !'
endif

end
Benutzeravatar
wahnfried
Beiträge: 3180
Registriert: Freitag 13. Januar 2006, 23:46
19
Wohnort: Braunschweig

scheinbare Sicherheit?

Beitrag von wahnfried »

Hallo Rudi_Rastlos

Zwei Defizite hätte ich mit Ihrem von der Theorie her gut durchdachten System:

Es speichert nicht die Global/Lokal.ini des gerade verlassenen Modus ab, um Veränderungen der Grundeinstellungen zu sichern, die bis zum Moduswechsel erfolgt waren. Außerdem holt es sich nur die Lokal.ini, so dass nur ein Teil der Grundeinstellungs-Möglichkeiten verändert wird. Das funktioniert nur, wenn man sich sicher ist, nichts mehr an den Grundeinstellungen zu verändern. Ein Problem wäre es sicher nicht, vor dem Importieren der Lokal.ini UND Global.ini das entsprechende Paar des zu verlassenden Modus auch in dem dafür vorgesehenen Ordner abzuspeichern.

Das mit dem Vergleichen der Datei-Zeit bzw. -Datum funktioniert nur, wenn nicht gleichzeitig in der Praxis und auf dem Laptop gearbeitet worden war, sondern ausschließlich entweder-oder. Sobald getrennt voneinander (z.B. beim Hausbesuch, aber die Praxis arbeitet auch) an beiden Plätzen Daten gesammelt wurden, wäre es dem Zufall überlassen, ob die Meldung „Datenbank auf dem Laptop ist aktueller“ wirklich etwas anderes zu bedeuten hat als der spontane Start des Netzwerkmodus. Wenn der Server in der Praxis etwas später heruntergefahren wurde als das Hausbesuchs-Laptop, kommt beim Start am Netzwerk keine Meldung. Trotzdem hätte man Daten auf dem Laptop, die noch nicht auf dem Server vorhanden sind und nach dem nächsten Spiegeln der Serverdatenbank auf das Laptop verloren wären.

Und was wäre, wenn zwar NUR das Laptop Daten gesammelt hätte, aber vor dem Start des Laptop am Netzwerk bereits TurboMed auf dem Server gestartet ist, dann wäre trotzdem die Datenbank auf dem Server neuer, damit keine Meldung.

Das heißt: ich könnte mich nicht auf die Meldungen verlassen, vielleicht würden diese mich sogar in trügerischer Sicherheit wiegen, dass nichts verloren gehen könne, weil keine Warnmeldung kam??

Daher würde ich weiterhin für nötig halten:

Der User des Laptop bestimmt selbst, welchen Modus er starten will. Hat er versehentlich den falschen gewählt, sieht er es entweder an den Hintergrundfarben oder der Netzwerkmodus startet nicht, weil kein Server von TurboMed gefunden wurde, und dann reicht mir dazu auch die Fehlermeldung von TurboMed. Brauche nicht noch eine durch ein noch so schönes Programm erzeugte turbomed-unabhängige Meldung. Aber es kann ja sein, dass zum Erzeugen der Export_nach_Hausbesuch-Datei selbst bei bereits am Netzwerk angeschlossenem Notebook bewusst der Einzelplatz-Modus gewählt werden soll...

-Ob dies nun durch feste Startverknüpfungen „Einzelplatz-Modus“ und „Netzwerk-Modus“ geschieht oder durch eine Moduswechsel-Batch (die den aktuell voreingestellten Modus analysiert und den jeweiligen anderen Modus vorbereitet/aktiviert), wäre dabei Geschmackssache. Bei der Moduswechsel-Batch nach Wahnfried geht eben KEINE Veränderung der Grundeinstellungen des jeweiligen Modus verloren, wenn dort etwas angepasst/verändert wurde.
-Durch die Abspeicherung von Lokal.ini UND Global.ini ist es möglich, auch die Datensicherungspfade modusspezifisch zu gestalten, so dass beim Beenden des TurboMed-Einzelplatz-Modus eine automatische Datenspiegelung auf einen Spiegelungsordner auf dem Laptop erfolgen kann (ohne Sicherung oder sogar auch mit automatischer Sicherung auf einen zweiten Sicherungsordner auf dem Laptop), womit die Gefahr des Überschreibens von im Einzelplatz-Modus gesammelten Daten durch eine „Datenspiegelung im Betrieb des Praxis-Netzwerkes“ wesentlich verringert wird, da diese Daten eben auf dem Laptop doppelt oder dreifach vorhanden sind...

Wer definierte Startverknüpfungen für Einzelplatz- bzw. Netzwerk-Modus benutzt, kann die Datenspiegelung mit dem Netzwerkmodus verknüpfen. Wer die Moduswechselbatch benutzt, sollte die Datenspiegelung zum selbstgewählten Zeitpunkt selbst auslösen, da der Netzwerkmodus nicht über die Moduswechselbatch gestartet werden würde (da diese zu oft bei nicht vorhandener Netzwerkanbindung ausgelöst wird).

Viele Grüsse, Wahnfried
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot], Bing [Bot], Google [Bot], Semrush [Bot] und 52 Gäste