MEDISTAR-SQL-Backup einlesen bzw. importieren

Vor gut einem Jahr habe ich bereits an dieser Stelle eine Batchdatei publiziert, die den Import der MEDISTAR-SQL-Sicherung automatisiert. Den gleichen Job erledigt das nachfolgende Powershell-Skript noch ein bisschen komfortabler.
Das Skript importiert den Datenbank-Dump (ORACLE_EXP.DMP) und kopiert die ISAM-Datenbankdateien in die entsprechenden Ordner.
Die Angaben in den ersten beiden Zeilen müssen individuell angepasst werden.

MSImport.ps1
# Zweck:  Importiert ISAM-Datenbanken und Oracle-Dump in eine bestehende
#         MEDISTAR-Installation. Vorhandene Daten werden überschrieben.
 
$DumpFolder = "T:\Sicherung"
$Password = "XXXXXXXX"
$DumpFile = "ORACLE_EXP.DMP"
$MediStar = "${env:MEDISTARDIR}"
 
$ErrorActionPreference = "SilentlyContinue"
$Host.UI.RawUI.WindowTitle = "Wiederherstellung der MEDISTAR-SQL-Sicherung"
 
Function Script-Exit {param([string]$Msg, $Sec) "`n";
  For ($Sec; $Sec -ge 0; $Sec --)
    {Write-Host "`r$Msg Skript wird beendet ($Sec)" -NoNewline;
    Start-Sleep 1}; Exit}
 
If (!(Test-Path -path $DumpFolder\$DumpFile)) {
  # 16 = Desktop, 17 = Computer, 18 = Netz
  $DumpFolder = 17; $Description = "Bitte wählen Sie den Ordner aus,`n" + `
  "der die Datei $DumpFile enthält."}
Else {$Description = "$DumpFile befindet sich im Ordner $DumpFolder.`n" + `
  "Sie können den Import starten. Klicken Sie auf OK."}
$Object = New-Object -comObject Shell.Application
$Folder = $Object.BrowseForFolder(0, $Description, "&H200", $DumpFolder)
If ($Folder -eq $null) {Script-Exit -Msg "Abbruch durch Benutzter." -Sec 3}
Else {$DumpFolder = $Folder.Self.Path; Write-Host "DumpFolder: $DumpFolder"}
If (!(Test-Path -path $DumpFolder\$DumpFile))
  {Script-Exit -Msg "$DumpFile nicht gefunden!" -Sec 3}
Else {Write-Host "$DumpFile gefunden."}
 
$Message = "Beim Restore werden die vorhandenen Daten gelöscht!"
$Object = New-Object -comObject wscript.shell
$Result = $Object.Popup($Message, 0, $myInvocation.MyCommand.Name, 1)
If ($Result -eq 2) {Script-Exit -Msg "Abbruch durch Benutzter." -Sec 3}
 
$CopyFrom = Get-Childitem $DumpFolder | where {$_.psIsContainer -eq $true}
ForEach ($Item in $CopyFrom) {
  $Item = -join ($DumpFolder, "\", $Item, "\*.*")
  $Folder = Split-Path (Split-Path $Item) -leaf
  If (Test-Path "$MediStar\$Folder") {
    Copy-Item -path $Item -dest $MediStar\$Folder -force -passthru}}
 
$SqlFile = "${env:temp}\Temp.sql"
@"
drop user msuser cascade;
commit;
CREATE or REPLACE DIRECTORY imp_dir AS '$DumpFolder';
exit;
"@ | Set-Content $SqlFile
sqlplus sys/$Password as sysdba '@'$SqlFile
 
impdp system/$Password directory=imp_dir dumpfile=$DumpFile full=yes `
logfile=imp_medistar.log
 
"shutdown immediate;", "startup;", "exit;" -join "`n" | Set-Content $SqlFile
sqlplus sys/$Password as sysdba '@'$SqlFile
 
Remove-Item -Path $SqlFile
Write-Host "Fertig. $DumpFolder\imp_medistar.log wird gestartet."
Invoke-Expression $DumpFolder\imp_medistar.log

Sie können die Datei auch herunterladen.

eGK-Kartenterminal in MEDISTAR konfigurieren

Ab Oktober soll sie kommen, die neue elektronische Gesundheitskarte. Hier beschreibe ich die Installation eines neuen Lesegerätes (ORGA 6041).

  • Treiber von CD installieren
  • Lesegerät anstecken (USB-A, Stromversorgung)
  • Angezeigten Port merken (z.B. COM4)
  • In MEDISTAR Befehl «IDN», Schnittstelle: CRO eintragen
  • In MEDISTAR Befehl «IMKT», Port eintragen (z.B. 4)
  • Die MEDISTAR-Konfiguration muss für jeden Task erfolgen!

Festlegung Dateinamen


Kartenterminal konfigurieren

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.

Gibt es geöffnete bzw. laufende MEDISTAR-Taks?

Das folgende Problem dürfte vielen MEDISTAR-Anwendern bekannt sein: In der Mittagpause soll eine Datensicherung erfolgen. Damit alle ISAM-Datenbanken gesichert werden können, müssen alle Tasks geschlossen sein.

Das folgende VB-Skript ermöglicht von einem beliebigen PC aus zu prüfen, ob es geöffnete Tasks im Netzwerk gibt. Dazu versucht es, die Datei «psync.ism» zu kopieren. Solange ein Task geöffnet ist, wird der Zugriff verweigert.

TaskTest.vbs
'Bitte in nachfolgender Zeile den Pfad anpassen.
testFile = "\\Server\d%\MEDISTAR\PDATEN\PSYNC.ISM"
strInfo = "Prüfung auf offene MEDISTAR-Tasks"
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
If objFS.FileExists(testFile) Then
  Set objFile = objFS.GetFile(testFile)
  objFile.Copy(Left(objFile.Path,InStrRev(objFile.Path, "\")) & "PSYNC.BAK")
  If Err.Number > 0 Then  'Zugriff verweigert'
    MsgBox "Es ist noch mindestens ein Task geöffnet!", 48, strInfo
  Else
    WshShell.Popup "MEDISTAR wurde überall beendet.", 3, strInfo
  End If
Else
  MsgBox testFile & vbCrLf & "Die Datei wurde nicht gefunden.", 16, strInfo
End If

Kennen Sie eine andere Möglichkeit?

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.

Schneller Wechsel zwischen ein- und beidseitigem Drucken

In vielen Praxen steht ein Laserdrucker, der von allen Arbeitsplätzen erreichbar ist (Netzwerkdrucker). Moderne Drucker verfügen über eine Duplexeinheit, d.h. sie können Papier beidseitig bedrucken. Das ist ökologisch.

Um zwischen Duplexfunktion und einfachem Ausdruck schnell wechseln zu können, empfiehlt es sich den Drucker auf allen Arbeitsplätzen zweimal zu installieren. Anschließend wird die Voreinstellung bei einem Drucker auf «Duplex» und bei dem anderen auf «Einfach» gestellt.

foobar2000-Musicplayer einrichten

Wem iTunes zu mächtig und Windows-Mediaplayer zu kompliziert ist, spielt Musik am PC mit foobar2000 ab.

Die folgenden Einstellungen (Preferences) bringen dem Player unter anderem einen komfortablen Umgang mit Bewertungen (Rating) bei. Voraussetzung ist die In­stal­lation der Komponente Quick Tagger. Traytip
Display | Default User Interface • Minimize to notification area
• Show balloon tooltip on song change
Display | Default User Interface: Playback state display formatting Windows title:

[%artist% - ]%title%

StatusBar:

%codec%[-%codec_profile%] | $caps(%channels%) | $insert(%filesize_natural%, ,$sub($len(%filesize_natural%),2)) | %bitrate% kBit/s | $div(%samplerate%,1000)$ifgreater($len(%samplerate%),3,.$substr(%samplerate%,$sub($len(%samplerate%),2),$sub($len(%samplerate%),2)),) kHz [| %playback_time%/%length%] | %path%

Notification area icon tooltip:

[%artist% - ]%title%$crlf()%codec%[-%codec_profile%] | $caps(%channels%) | %bitrate% kBit/s | $div(%samplerate%,1000)$ifgreater($len(%samplerate%),3,.$substr(%samplerate%,$sub($len(%samplerate%),2),$sub($len(%samplerate%),2)),) kHz$crlf()Length: %length% m:s | Rating: $pad($repeat(★,%rating%), 5,✩)
Display | Default User Interface | Playlist View Custom Columns:
$pad($repeat(★,%rating%),5,✩)
Keyboard shortcuts Global Hotkeys einrichten:
Playback / Previous
Playback / Next
Playback / Play or Pause
Playback / Volume Up
Playback / Volume Down
Playback / Volume Mute
Playback / Seek / Back by 5 Seconds
Playback / Seek / Ahead by 5 Seconds
Open Containg Folder
View / Show Now Playing
View / Activate or Hide
Tagging / Quick Tagger / Set <Rating> to /0
Tagging / Quick Tagger / Set <Rating> to /1
Tagging / Quick Tagger / Set <Rating> to /2
Tagging / Quick Tagger / Set <Rating> to /3
Tagging / Quick Tagger / Set <Rating> to /4
Tagging / Quick Tagger / Set <Rating> to /5
File / Exit
Media Library | Library viewer selection playlist • Enabled
• Activate when changed
Media Library | Album list : Views by rating

$pad($repeat(★,%rating%),5,✩)|[%album artist% - ]%album%|[[%discnumber%.]%tracknumber%. ][%track artist% - ]%title%

by path

$directory_path(%path_sort%)|%filename_ext%

by codec

%codec%|[%artist% - ]%title%
Playback • Resume playback after restarting foobar2000
• Cursor Follows Playback
Tools |Tagging | Quick Tagger Fields:
Rating | 0;1;2;3;4;5• Require confirmation before processing more than «1» tracks
Advanced | Display| Properties Dialog |Standard Fields Am Ende der Zeile einfügen: Rating=RATING;

Es ist mit foobar2000 auch möglich, intelligente Wiedergabelisten zu erstellen. Erstellen Sie zum Beispiel in der Album list
View: by rating und Filter: %rating% GREATER 3.
Anschließend wählen sie im Kontextmenü der Album list (rechte Maustaste): «Send to new playlist». Bei späteren Veränderungen der Bewertungen wird diese Wiedergabeliste automatisch aktualisiert.

Falls Audio-CDs zum Beispiel als MP3-Dateien auf dem Computer gespeichert werden (Rip), ist im dafür zuständigen Dialog u.a. folgende Einstellung sinnvoll:
Converter Setup: Output path | Output style and file name formatting | Convert each track to an individual file – Name format:
[%album artist%\]%album%\%tracknumber% %title%