swetrain
Goto Top

Zugriff auf andere Access-Datenbank

Guten Morgen liebe Access-Gemeinde,

ich hätte eine kleine Frage:

wie kann ich aus einer Datenbank (Acc 2003) herausfinden, welches Control, bzw. welcher Bericht in einer ANDEREN Access-Datenbank den Focus hat.
Falls ein Control den Focus hat, möchte ich auch den Wert auslesen.
Im Beispielcode unten schaffe ich das für die eigene Datenbank, nicht jedoch für eine andere.

Konkret also:
Was muss vor "Screen" stehen, damit sich das auf eine andere Datenbank bezieht?

Hintergrund meiner Frage:
Ich habe eine Frontend.mdb mit 5 Backends auf einem TS unter 2008R2 laufen.
Die Backends liegen auf einem Fileserver, das Frontend im Homelaufwerk der User.
Aus Sicherheitsgründen wird die TS-Session nach 7 Minuten Inaktivität geschlossen.
Dadurch zerschiesst es mir regelmässig (jedoch leider nicht konkret reproduzierbar) verschiedene Backend-Datenbanken.

Um dem Zuvor zu kommen, habe ich in meinem Frontend ein unsichtbares Formular "_frm_Closer", in welchem alle 45 sec. geprüft wird, welches Feld, bzw. welcher Report gerade den Focus hat und was ggf. der Wert des Feldes ist.
Das ganze wird dann in ungebundene Felder geschrieben und mit den vorherigen 9 Werten verglichen.
Sind alle 9 Werte identisch, wird davon ausgegangen, dass der User in den letzten 6,75 Minuten nichts an der Datenbank gemacht hat und sie wird geschlossen.
In der eigenen Datenbank funktioniert das wunderbar, die Anzahl der zerschossenen Datenbanken geht quasi gegen 0 %.

Einen Haken hat die Sache jedoch:
Immer wieder kommt es vor, dass beim Ausdrucken (und nur da), anstelle des Berichts, der gedruckt werden soll, das unsichtbare Formular gedruckt wird. Ich habe keine Ahnung, wieso dies der Fall ist. Ich habe sowohl beim Öffnen des Formulars, als auch beim Öffnen der Berichte immer stehen:
Forms("_frm_Closer").Visible = False
Leider ist auch da nicht reproduzierbar, wann genau anstelle des Berichts das Formular gedruckt wird.

Als mögliche Lösung habe ich daher gedacht, packe ich das "Schließformular" in eine andere Datenbank, die dann beim Start der eigentlichen Datenbank mit geöffnet wird und von extern dann die Datenbank überwacht.

Evtl. habt Ihr ja da aber auch noch ganz andere Vorschläge/Ideen, ich bin für jede Info dankbar.
Und hier zur Erinnerung nochmal die Frage:
Was muss vor "Screen" stehen, damit sich das auf eine andere Datenbank bezieht?

Viele Grüsse

Jochen


Sub Test

strDB = CurrentProject.Path & "\Orga-FE.mdb"

Set db = DBEngine.Workspaces(0).OpenDatabase(strDB)

' geht nicht:
' db.screen

' strWas = getArt

Select Case strWas
Case "Form"
Me.strObject000 = Screen.ActiveForm.Name
Me.strsubForm000 = Screen.ActiveControl.Parent.Name
Me.strControl000 = Screen.ActiveControl.Name
intControlType = Screen.ActiveControl.ControlType
Select Case intControlType
Case 104 'Button, nichts machen
Me.strValue000 = ""
Case 106 'Checkbox
Me.strValue000 = Nz(Screen.ActiveControl.Value, 0)
Case 107 'Optionsfeld
Me.strValue000 = Nz(Screen.ActiveControl.Value, 0)
Case 109 'Textfeld
Me.strValue000 = Nz(Screen.ActiveControl.Text, 0)
Case 110 'Listfeld
Me.strValue000 = Nz(Screen.ActiveControl.Value, 0)
Case 111 'ComboBox
Me.strValue000 = Nz(Screen.ActiveControl.Text, 0)
Case 122 'Umschaltfeld
Me.strValue000 = ""
Case 123 'Reiter
Me.strValue000 = ""
Case Else
Me.strValue000 = ""
End Select
Me.intID000 = Screen.ActiveForm.Controls("ID").Value
Case "Report"
Me.strObject000 = Screen.ActiveReport.Name
Me.strsubForm000 = ""
Me.strControl000 = ""
Me.intID000 = "0"
Me.strValue000 = "0"
Case Else
Me.strObject000 = "?"
Me.strsubForm000 = "?"
Me.strControl000 = "?"
Me.intID000 = "99"
Me.strValue000 = "?"
End Select

End Sub


Function getArt() As String

Dim strArt As String

On Error Resume Next

Err.Number = 0
strArt = Screen.ActiveForm.Name
If Err.Number = 0 Then
getArt = "Form"
Exit Function
End If
Err.Number = 0
strArt = Screen.ActiveReport.Name
If Err.Number = 0 Then
getArt = "Report"
Exit Function
End If

getArt = "Unbekannt"

End Function

Content-ID: 225505

Url: https://administrator.de/contentid/225505

Ausgedruckt am: 25.11.2024 um 17:11 Uhr

colinardo
colinardo 29.12.2013 aktualisiert um 23:40:32 Uhr
Goto Top
Hallo Jochen,
ich würde das anders lösen, und zwar mit einem AutoIT-Script welches Access und deine Datenbank startet und in welchem dann die kontinuierliche Prüfung auf Inaktivität stattfindet. AutoIT-Scripte lassen sich zu einer ausführbaren EXE kompilieren, so dass du diese dann zum Aufruf deiner FE-Datenbank nutzen kannst. Im Script selber kannst du auf die ganzen Access-Objekte und Eigenschaften in der Datenbank zugreifen und darauf reagieren. Du kannst hier also auch deine gewünschten Felder abfragen ob sich diese geändert haben. Für ein Beispiel habe ich hier aber mal die Mausposition als Aktivitätskriterium her genommen. Das Script prüft hier als Beispiel alle 5 Sekunden ob sich die Mausposition geändert hat; wenn nicht wird ein Zähler solange hochgezählt bis dieser einen Maximalwert erreicht, daraufhin wird dann Access geschlossen. Ändert sich die Mausposition wird dieser Zähler immer wieder auf 0 zurückgesetzt.
Wie gesagt das ist kein Muss du kannst hier also deine Methode zur Aktivitätsprüfung problemlos einbauen.
(In Zeile 4 wird der Pfad zur Datenbank eingetragen / weitere Kommentare befinden sich im Code)
back-to-topAutoIT-Code zum Monitoring auf Inaktivität
;#NoTrayIcon
Global $arrLastPos, $timeCounter,$timeMax,$dbPath
;Pfad zur Frontend Datenbank
$dbPath = "c:\Pfad\Orga-FE.mdb"  
$timeCounter = 0
; Maximale Zeit der Inaktivität in Sekunden im Beispiel 6,5 Minuten.
$timeMax = 390
;Access Datenbank starten / die Variable $objAccess entspricht dem "Application"-Objekt in Access worüber du auch die "Screen"-Eigenschaft ansprichst.  
$objAccess = ObjCreate("Access.Application")  
$objAccess.OpenCurrentDatabase($dbPath)
$objAccess.Visible = True
;Objekt der aktuellen Datenbank in Variable speichern
$db = $objAccess.CurrentDb
;Initiale Position der Maus holen
$arrLastPos = MouseGetPos()
While 1
	; Wenn Maximalzeit erreicht oder überschritten, beende Access und schließe dieses Programm
	if $timeCounter >= $timeMax then
		$objAccess.Quit()
		exit 0
	endif
	; Aktuelle Mauszeigerposition holen
	$arrPos = MouseGetPos()
	;Vergleiche Position mit der alten Position
	if $arrLastPos = $arrPos and $arrLastPos[1] = $arrPos[1] then
                : Zähle 5 Sekunden zum Zähler hinzu / Beim anpassen der Wartezeit muss hier auch angepasst werden
		$timeCounter = $timeCounter + 5
	else
                ; Mausposition hat sich geändert, setze Zähler also zurück
		$timeCounter = 0
	endif
	;Mausposition für den nächsten Vergleich sichern
	$arrLastPos = MouseGetPos()
	; Warte 5 Sekunden vor der erneuen Prüfung
	Sleep(5000)
WEnd
Denke das ist cleaner gelöst also zig Datenbanken zu öffnen, das sind alles nur zusätzliche Fehlerquellen.

nochmal zu deiner Frage:
Was muss vor "Screen" stehen, damit sich das auf eine andere Datenbank bezieht?
Das "Application"-Objekt dieser Datenbank
back-to-topBeispiel:
Dim app As New Application  ' Neues Access Application-Objekt erzeugen  
app.OpenCurrentDatabase "c:\Pfad\Orga-FE.mdb"  ' In diesem die Datenbank öffnen  
app.Visible = True   ' Das ganze für den Benutzer sichtbar machen  
app.DoCmd.OpenForm "xyz"   'als Beispiel eine Form mit Namen 'xyz' öffnen  
Debug.Print app.Screen.ActiveForm.Name 'den Namen der Form im Direktbereich ausgeben  

Grüße Uwe