Abfrage der aktiven Computer bzw. Sessions in MEDISTAR-SQL

Gut versteckt findet sich in MEDISTAR ein Dialogfenster für die Eingabe von SQL-Anfragen. Nützlich ist dieser Programmbestandteil durch seine Makrofähigkeit. Ich habe mir ein Makro gebaut, dass sich nach nur einem Klick zu diesem Dialog durchhangelt und abfragt, welche Benutzer bzw. Arbeitsplätze gerade MEDISTAR verwenden. Das ist nützlich vor irgendwelchen Arbeiten an der Datenbank (z.B. Updates, Backups, etc.), um noch geöffnete Tasks zu finden.

Sie gelangen zu dem Abfragefenster durch Eingabe der folgenden Befehle:

  • PSH“ um das Systemkommandofenster zu öffnen.
  • Dort führen Sie den Befehl „swrp sqlexec“ aus.
  • Nach Eingabe des Master-Passworts öffnet sich das SQL-Anfragefenster.
  • select distinct machine from v$session where username='MSUSER'” entlockt dem System die gewünschte Information.

PS: In OPHTHALMOSTAR 2.0 (coming soon!) sind die Makros natürlich eingebaut.

SQL-Anfrage

MEDISTAR-SQL-Server richtig neustarten

Wenn der Computer, auf dem die Oracle-Datenbank läuft, heruntergefahren wird, besteht die Gefahr, dass die Oracle-Datenbank nicht sauber geschlossen werden kann, weil Windows vor dem Herunterfahren geöffneten Programmen nur wenig Zeit zum Schließen gibt.

Am besten wird die Datenbank vor dem Shutdown sauber heruntergefahren – das beschleunigt den späteren  Neustart!

Mit Hilfe eines Powershell-Skripts lässt sich der Vorgang automatisieren.

Screenshot
MSOraStop.ps1
################################################################################
# Zweck: Fährt die Datenbank herunter und beendet MEDISTAR- und Oracle-Dienste.
# Autor: Wilhelm Happe, © 2012
################################################################################
# Starte ggfs. erneut mit Administratorrechten
$id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$princ = New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$princ.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
{$ps = [System.Diagnostics.Process]::GetCurrentProcess()
 $psi = New-Object System.Diagnostics.ProcessStartInfo $ps.Path
 $script = $MyInvocation.MyCommand.Path; $prm = $script
 foreach($a in $args) {$prm += ' ' + $a};
 $psi.Arguments = $prm; $psi.Verb = "runas"
 [System.Diagnostics.Process]::Start($psi) | Out-Null; return;}
 
$ErrorActionPreference = "SilentlyContinue" # gilt für alle folgenden Befehle
 
If (Get-Process 'oracle' -ea 0) {
	$Password = "XXXXXXXX"  # PASSWORT BITTE ANPASSEN
	$SqlFile = "${env:temp}\Temp.sql" # Datei für SQL-Anweisungen
	"shutdown normal;", "exit;" -join "`n" | Set-Content $SqlFile
	sqlplus sys/$Password as sysdba '@'$SqlFile
	Remove-Item -Path $SqlFile} # Datei löschen
Else {Write-Warning "Es ist keine Oracle-Instanz verfügbar!"}
 
Function Dienst-Stoppen {param([string]$sName)
	$s = Get-Service -display $sName -ea SilentlyContinue
	If (!$s) {Write-Warning "$sName ist nicht installiert."}
	Else {Stop-Service -inputobject $s -passthru -ea 0
		If (!$?) {Write-Host "$sName wurde nicht beendet!"}}}
 
Write-Host "`nDie MEDISTAR-Dienste werden beendet.`n"
Stop-Process -processname dscm
Dienst-Stoppen -sName "MEDISTAR ISAM"
Dienst-Stoppen -sName "MEDISTAR RPCI"
Dienst-Stoppen -sName OracleOraDb11g_home1TNSListener
Dienst-Stoppen -sName OracleServiceMEDISTAR
Dienst-Stoppen -sName OracleDBConsolemedistar
Dienst-Stoppen -sName OracleMTSRecoveryService
 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Fertig!"
$objForm.AutoSize = $True
$objForm.AutoSizeMode = "GrowAndShrink"
$objForm.StartPosition = "CenterScreen"
$objForm.FormBorderStyle = "FixedToolWindow"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$script:x = $objListBox.SelectedItem;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})
$objForm.Controls.Add($objLabel)
$objListBox = New-Object System.Windows.Forms.ListBox
$objListBox.AutoSize = $True
$objListBox.Add_MouseDoubleClick({$script:x = $objListBox.SelectedItem;$objForm.Close()})
$lbItem = @(
	($myInvocation.MyCommand.Name + " beenden"),
	"Computer neustarten",
	"Computer herunterfahren")
For($i=0; $i -lt $lbItem.Count; $i++) {[void] $objListBox.Items.Add($lbItem[$i])}
$objListBox.SelectedIndex = 0
$objListBox.Height = $objListBox.PreferredHeight
$objForm.Controls.Add($objListBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
[Environment]::NewLine; Write-Host $x
Switch ($x) {
	$lbItem[1] {Restart-Computer}
	$lbItem[2] {Stop-Computer}
	default    {Exit}}

Klicken Sie hier, um das Skript herunter zu laden.

MEDISTAR-SQL-Datensicherung automatisieren

Unter MEDISTAR-SQL gibt es einen Backup-Dienst, der automatisch eine Siche­rung der Datenbank erstellt und im Ordner …\MEDISTAR\Sicherung ablegt. Damit liegt aber keineswegs eine ausreichende Datensicherung vor. Schließlich befinden sich die Backupdateien noch auf der Festplatte, auf der MEDISTAR und Oracle-Datenbank installiert sind. Bei einem Crash wären Original und Backup futsch.

Man ist also selbst dafür verantwortlich, dass diese Dateien auf einem anderen Medium gesichert werden. Das lässt sich mit Windows-Bordmitteln ein­rich­ten. Hierzu lassen wir z.B. auf einem Arbeitsplatz-PC eine Batch-Datei laufen, die an jedem Wochentag einen anderen Ordner für die Sicherung verwendet.

MSBackup.cmd
@echo off
set Heading=MEDISTAR-Backup-Sicherung
title=%Heading%
 

:: Pfade bitte individuell anpassen!
set MSPath=\\Server\d%%\MEDISTAR
set BackupDrive=E:

:: Wochentag ermitteln. Geht nicht mit CMD-Befehlen, daher VBS.
echo Wscript.Echo WeekdayName(Weekday(now,0),false,0) > %~n0.vbs
FOR /F "usebackq" %%a IN (`cscript.exe %~n0.vbs //nologo`) DO set weekday=%%a
del %~n0.vbs

:: LogDatei nicht in BackupFolder speichern; ROBOCOPY würde sie löschen!
set BackupFolder=%BackupDrive%\%~n0%weekday%
set TmpFile=%BackupDrive%\%~n0%weekday%.tmp
set LogFile=%BackupDrive%\%~n0%weekday%.log
set Options=/MIR /R:1 /W:1 /NC /NDL /NP /NS /TEE /FFT /Log+:%TmpFile%

:: MEDISTAR-Backup um Makrodateien und Patientenlisten ergänzen.
xcopy /d /h /i /f /k %MSPath%\INST\*.mac    %MSPath%\Sicherung\INST\*.*
xcopy /d /i /y /f /k %MSPath%\PARA\PLPARA.* %MSPath%\Sicherung\PARA\*.*

:: LogDatei anlegen, ggfs. überschreiben. Synchronisieren mit ROBOCOPY.
echo %Heading% am %weekday%, den %date% um %time:~0,8% Uhr. > "%TmpFile%"
robocopy %MSPath%\Sicherung %BackupFolder% %Options%

:: ASCII (TmpFile) nach Unicode (LogFile) umwandeln. TmpFile entsorgen.
cmd /u /c type %TmpFile% > %LogFile%
del %TmpFile%

:: LogDatei anzeigen und Batchdatei beenden ohne zu warten.
start %LogFile%

Wenn die Batchdatei richtig eingerichtet ist, wollen wir das DOS-Fenster nicht mehr sehen – wir bekommen ja nach erfolgter Datensicherung die Logdatei angezeigt. Aus diesem Grund starten wir die Batchdatei ohne sichtbares Fenster mit einem kleinen VB-Skript.

MSBStart.vbs
‚ Dieses VisualBasic-Skript startet MSBackup ohne sichtbares Fenster.
‚ Bitte beachten Sie, dass das Skript nicht MSBackup.vbs heißen darf,
‚ weil MSBackup.vbs von der Batchdatei gleichen Namens gelöscht wird!
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "MSBackup.cmd", 0, False
WshShell.Popup "MSBackup wird ausgeführt. Bitte warten...", 3, "Info"

Der dritte Schritt besteht darin, dass die Datensicherung täglich 10 oder 15 Minuten nach der Backup-Erstellung durch den MEDISTAR-Backup-Dienst mit Hilfe der Windows-Aufgabenplanung automatisch startet. Damit das VB-Skript die Batchdatei findet, muss unter «Starten in (optional)» der Pfad angegeben werden. Administratorrechte («mit höchsten Privilegien») sind erforderlich.

Weitere Informationen zu robocopy finden Sie hier.

MEDISTAR-SQL bzw. Oracle-Dienste schneller starten

Praxen, die ihren Server/Hauptrechner nicht ständig durchlaufen lassen, erleben jeden Morgen, dass es etliche Minuten dauert, bis alle Oracle-Dienste hochgefahren sind und MEDISTAR starten kann. Bis vor kurzem kam es zu Fehlermeldungen, wenn vorzeitig versucht wurde, MEDISTAR zu starten. Mit den letzten Updates scheint die zulässige Wartezeit für die die Bereitstellung der Dienste verlängert worden zu sein.

Es gibt aber ein paar Stellschrauben für die Beschleunigung des Vorgangs:

  • Der Dienst „OracleDBConsolemedistar‟ wird für die Ausführung des „Oracle Enterprise Manager Database Control‟ benötigt, einer Browser-basierten, graphischen Bedienoberfläche zur Verwaltung der Datenbank. Der Manager und somit auch der Dienst werden im normalen Betrieb nicht verwendet. Es empfiehlt sich deshalb, den Starttyp dieses Dienstes auf „manuell‟ zu setzen.
    Das gleiche gilt für den Dienst „OracleMTSRecoveryService‟, auch wenn er relativ wenig Zeit zum Starten benötigt. Dieser Dienst stellt Funktionen für den Microsoft-Transaction-Server zur Verfügung, der entweder auf dem Computer nicht vorhanden ist oder nicht genutzt wird.
  • Starttyp des Dienstes auf manuell ändern

  • In der Server-Konfigurationsdatei „listener.ora‟ lässt sich der Pfad zu den Diensten angeben. Dadurch wird eventuell ein wenig Zeit eingespart. Die Datei befindet sich in folgendem Ordner:
    D:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN
    Hier können Sie folgende Zeilen hinzufügen. Die Kommentarzeilen (#) können Sie weglassen.

    # SID_LIST_LISTENER section for listener named LISTENER (default)
    # SID_LIST list of SID descriptions.
    # SID_DESC service information for a specific database instance
    # SID_NAME the Oracle System Identifier (SID) of the instance
    # ORACLE_HOME the Oracle home location of the service

    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = MEDISTAR)
    (ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
    )
    )

Übrigens prüft mein Tool MSHotkey auf Wunsch, ob die Dienste auf dem Server bereitstehen. Erst danach wird die Autostart-Funktion für den ersten MEDISTAR-Task ausgeführt.

Tipps für die MEDISTAR-SQL-Installation (Oracle Database)

Da ich MEDISTAR-SQL nicht nur in der Praxis installiert habe, sondern auch auf meinem Heimrechner, konnte ich einige Erfahrungen sammeln.

Installation auf einem NICHT-Server-Betriebssystem
Auf beiden Rechnern konnte sich MEDISTAR am Ende der Installation nicht mit der Oracle-Datenbank verbinden.
Die Ursache war ein zu korrigiernder Eintrag in einer Konfigurationsdatei für den Authentifizierungs-Service von Oracle. In der Datei sqlnet.ora (Pfad: D:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN) musste die Zeile
SQLNET.AUTHENTICATION_SERVICES= (NTS)
in
SQLNET.AUTHENTICATION_SERVICES= (NONE)
geändert werden. Diese Änderung ist wahrscheinlich nur dann erforderlich, wenn die Installation auf einen NICHT-Server-Betriebssystem erfolgt.

32Bit und 64Bit-Version
In der Praxis läuft auf dem Hauptrechner ein 32Bit-Windows. Zuhause benutzte ich Windows 7 in der 64Bit-Version. Auf der meiner Installations-DVD befindet sich nur die 32Bit-Version. Ich habe sie auf die Festplatte kopiert und den Oracle-Ordner mit den von der Oracle-Webseite heruntergeladenen 64Bit-Dateien überschrieben. Wenn man dann die Install.exe übergeht und gleich im Ordner „Setup“ die Setup.exe startet, funktioniert die Installation.

Erfassen neuer Patienten
Nach der Installation ist das Erfassen neuer Patienten nicht möglich. Beim Versuch erscheint die Fehlermeldung: „Die Datenansicht für Praxis 1 ist nicht eingetragen. Es können daher für diese Praxis keine Patienten angelegt werden.“
Lösung: Index – Installation | Festlegung Passwörter: Freigabe Praxen: Alle Praxen markieren und freigeben.

Default-Wert für die Lebensdauer der Datenbank-Passwörter
Die unter Oracle vergebenen Kennworte laufen gemäß Voreinstellung nach 180 Tagen ab. Das würde ohne Korrektur bedeuten, dass 6 Monate nach der Installation nichts mehr läuft.
Lösung: Win+R, cmd eingeben, SQL-Plus aufrufen:
sqlplus sys/Passwort as sysdba (Passwort bitte anpassen)
Einstellungen prüfen:
select username, expiry_date, profile from dba_users;
Wenn bei den Usern sys, system und msuser ein Expiry-Date steht (s. Bild), muss dies geändert werden:
alter profile default limit password_life_time unlimited;

Expiry-Date

Benutzername und Passwort für Installation
Eigentlich sollte während der skriptgesteuerten Installation keine Nachfrage nach Benutzernamen und Passwort erfolgen. Nach einem vorhergehenden gescheiterten Installationversuch kann es aber offenbar dazu kommen. Bei mir funktionierte die Eingabe des Benutzernamens „system“. Das Passwort für diesen Benuzter habe ich der Datei D:\MEDISTAR\INST\sql.ini entnommen.

MEDISTAR-SQL und Oracle-Datenbank – erste Erfahrungen

Seit einer Woche läuft in meiner Praxis die neue MEDISTAR-Version. Die Installation gelang im zweiten Versuch. Anschließend befanden sich 5,9 GB mehr Daten auf der Festplatte. OK, ein gewisser Anteil besteht aus Sicherungskopien, die später gelöscht werden können.

Was hat sich geändert?
Nach dem Hochfahren des Rechners bzw. Servers dauert es mehrere Minuten, bis die neuen Dienste gestartet sind. Erst wenn diese Dienste laufen, kann MEDISTAR gestartet werden.

Die auffälligste Änderung besteht darin, dass eine MD-Zeile nun über 1000 Zeichen erfassen kann. Die Position des Umbruchs („weicher Umbruch“) kann über einen Schieberegler eingestellt werden. Dieses an und für sich positive Feature ist aber noch nicht konsequent umgesetzt worden: bei der Übernahme der Zeilen in die Brieftextverarbeitung werden sie zerstückelt, d.h. es werden Semikolons eingefügt. Bei K- und Y-Zeilen erfolgt kein weicher Umbruch. Was zunächst nach Bug aussieht, geschieht aus Rücksicht auf alte Formularprogramme.

Besonders positiv fällt auf, dass Patientenlisten nun viel schneller erstellt werden. Ich vermute, dass dies auch für die Patientenmarker-Funktion zutrifft.

Die befürchtete Verlangsamung auf den Arbeitsplatzrechnern ist nicht eingetreten. Der älteste Rechner in meiner Praxis ist 10 Jahre alt (Pentium 1 GHz, 256 MB Arbeitsspeicher). Obwohl der Hardware-Check zur Entsorgung rät, lässt sich weiterhin mit ihm arbeiten, selbstverständlich unter der Voraussetzung, dass der Hauptrechner/Server schnell genug arbeitet.

Wenn ein Patient in einer Patientenliste angeklickt wird, ist es nicht mehr möglich direkt in den MDs zu landen.

Für die Datensicherung wurde in MEDISTAR eine neue Funktion eingebaut. Der „MEDISTAR Backup Dienst“ arbeitet im Hintergrund und sichert z.B. nachts die Einträge der Oracle-Datenbank und die ISAM-Datenbanken. Die Sicherungsdateien werden im Ordner D:\MEDISTAR\Sicherung abgelegt.
Die Datensicherung ist durch das nebeneinander von Oracle-Datenbank und ISAM-Datenbanken komplizierter geworden. Der nützliche Backup-Dienst sieht derzeit nur eine Sicherung pro Tag vor. Der Vorteil des Online-Backups (Datensicherung im laufenden Betrieb) existiert derzeit nicht, da sich Oracle- und ISAM-Sicherung auf dem gleichen Stand befinden müssen. Für Großpraxen spielt das wahrscheinlich eine untergeordnete Rolle, da dort die Ausfallsicherung über RAID-Systeme erfolgt.

PS: Bitte beachten Sie, dass sich dieser Bericht auf den Stand vom August 2010 bezieht. Sowohl die Installationsroutine wie auch das Programm selbst werden ständig weiterentwickelt.