Termin ins Outlook eintragen

Modul Termin nach Outlook in die Datenbank als neues Modul kopieren.

Im Modul gehen Sie auf Extras ==> Verweise. Markieren Sie den Eintrag Microsoft Outlook 11.0 Objekt Library.
Bestätigen Sie das mit OK.


Ein Formular erstellen mit folgenden Feldern:

[von] ==> Datumfeld

[Uhrvon] ==> Datumfeld

[Dauer] ==> Zahlfeld

[Betreff] ==> Textfeld

[Kommentar] ==> Textfeld

[Erinnerung] ==> Ja/Nein

[Erinnerung Minuten] ==> Zahlfeld


Erstellen Sie nun eine Schaltfläche mit folgenden VBA-Code:

Testwert = terminnachoutlook(Format([von], „dd.mm.yyyy“) & “ “ & Format([Uhrvon], „hh:mm“), Dauer, Betreff, Kommentar, Erinnerung, [Erinnerung Minuten])

If Testwert = False Then
MsgBox „Die Übertragung des Termins nach Ourlook ist fehlgeschlagen!“, vbCritical
End If


Module: terminnachoutlook

 

Im Modul gehen Sie auf Extras ==> Verweise. Markieren Sie den Eintrag Microsoft Outlook 11.0 Objekt Library.
Bestätigen Sie das mit OK.

Elemente ein- / ausblenden

Frage:

Können Sie mir einen Tipp geben, wie man ein Registersteuerelement abhängig von einem Feldinhalt ein oder ausblenden kann? Ich habe ein Adressformular sowohl für private wie auch für geschäftliche Kunden. Ich möchte das Register „Mitarbeiter“ aber nur einblenden, wenn die Anrede „Firma“ ist.

Antwort:

Das Registersteuerelement verfügt über eine Eigenschaft „Visible“, mit der es sichtbar oder unsichtbar geschaltet werden kann. In Ihrem Fall wären die da – zu notwendigen Anweisungen zunächst in der Ereignisprozedur „Beim Anzeigen“ des Formulars unterzubringen, damit der Status bei jedem Datensatzwechsel geprüft werden kann:

Sub Form_Current()
If Me.Anrede & „“ = „Firma“ Then
Me.Mitarbeiter.Visible = True
Else
Me.Mitarbeiter.Visible = False
End If

End Sub

„Anrede“ ersetzen Sie ggf. durch den Namen des Feldes oder Kombinationsfeldes, das die Anrede enthält. Die Anweisungen prüfen, ob die aktuelle Einstellung für Anrede „Firma“ ist. Ist das der Fall, wird das Registersteuerelement per „Visible = True“ sichtbar, ansonsten per „Visible = False“ unsichtbar geschaltet. Die Verknüpfung ‘Me.Anrede & „“‘ sorgt dafür, dass bei Feldern ohne Inhalt kein Laufzeitfehler „Ungültige Verwendung von null“ ausgelöst wird. Weiterhin muss sichergestellt sein, dass nach einer Änderung der Anrede das Registersteuerelement ebenfalls aus- oder eingeblendet wird. Dazu wird die Ereignisprozedur „NachAktualisierung“ des Feldes oder Kombinationsfeldes „Anrede“ genutzt. Dort geben Sie folgende Anweisung ein:

Form_Current

Dadurch wird obige Ereignisprozedur aufgerufen, die dann wie erläutert das Registersteuerelement ein- oder ausblendet.

SQL-Konsole zur effektiven Datenbankverwaltung

Datenbank

Wussten Sie schon, dass sich viele Aufgaben der täglichen Datenbankverwaltung mit einer einzigen SQL-Anweisung erledigen lassen?

Dazu sind noch nicht einmal umfangreiche SQL-Kenntnisse notwendig. Sie benötigen lediglich ein wenig Hintergrundwissen und ein Werkzeug, das Ihnen die Eingabe und direkte Ausführung von SQL-Anweisungen ermöglicht. Beides bieten wir Ihnen in diesem Beitrag an. Nutzen Sie außerdem unser kostenloses Tool, damit Sie Ihre Datenbanken in Zukunft wesentlich schneller verwalten können.

Im ersten Schritt müssen Sie dazu unsere Lösung, die aus einem einzigen Formular samt VBA-Code besteht, in Ihre Datenbank importieren.

Wir haben daher eine Beispieldatenbank vorbereitet. Um die Lösung in Ihren Anwendungen einzusetzen, übertragen Sie das Formular „SQL-Direkteingabe“ in Ihre Datenbank. Für diesen Zweck verwenden Sie in Access 2003, 2002/XP, 2000 und 97 das Menü DATEI-EXTERNE DATEN-IMPORTIEREN.

In Access 2007 wechseln Sie in der Multifunktionsleiste auf die Registerkarte „Externe Daten“ und klicken in der Gruppe „Importieren“ auf die Schaltfläche ACCESS. Lokalisieren Sie im nachfolgenden Dialog per DURCHSUCHEN die Beispieldatenbank, aktivieren Sie die Option IMPORTIEREN SIE TABELLEN, ABFRAGEN, FORMULARE…IN DIE AKTUELLE DATENBANK und klicken Sie auf OK. Markieren Sie danach das Formular, klicken Sie auf OK und bestätigen Sie die Abschlussmeldung mit SCHLIEßEN.

Anschließend können Sie das Formular ganz einfach per Doppelklick öffnen. Es besteht aus einem mehrzeiligen Textfeld und einer Schaltfläche. Nach der Eingabe einer SQL-Anweisung drücken Sie zweimal die Return-Taste und die SQL-Anweisung wird sofort ausgeführt.

Für mehr zeilige SQL-Anweisungen fügen Sie einen Zeilenumbruch mit der Tastenkombination Strg+Return-Taste ein. Durch das zweimalige Drücken der Return-Taste wird die Eingabe im Textfeld abgeschlossen und die Schaltfläche SQL betätigt.

Die Ereignisprozedur „Beim Klicken“ dieser Schaltfläche liest den Inhalt des Textfeldes aus und übergibt ihn zur Ausführung mit der Anweisung „DoCmd.RunSQL“ an Access.

Tritt dabei ein Fehler auf, wird dazu eine Meldungsbox angezeigt, nach deren Bestätigung Sie Ihre Eingabe prüfen und korrigieren können. Im Folgenden einige Beispiele dafür, wie Sie Ihre Datenbank per SQL in Zukunft noch schneller verwalten können.

Tabelleninhalte ganz einfach löschen
Vor einem Datenimport oder nach Testläufen in einer Kundendatenbank müssen häufig die Inhalte verschiedener Tabellen gelöscht werden. Dazu setzen Sie einfach die SQL-Anweisung „DELETE“ wie folgt ein:

DELETE * FROM Tabelle

Für „Tabelle“ geben Sie dabei den Namen der Tabelle an, deren Inhalt gelöscht werden soll. Die Anweisung veranlasst Access, alle Datensätze aus der angegebenen Tabelle zu löschen, die Tabelle selbst aber in der Datenbank zu belassen. Die Tabelle kann also anschließend zum Beispiel über einen Import wieder gefüllt werden. Möchten Sie nur bestimmte Datensätze aus einer Tabelle löschen, können Sie eine „WHERE“-Klausel einsetzen, die die Datensätze spezifiziert.

Die folgende SQL-Anweisung löscht zum Beispiel alle alten Kundenanfragen aus dem Jahr 2000 aus einer Tabelle „Anfragen“:

DELETE * FROM [Kunden-Anfragen]WHERE Year([Anfrage-Datum])=2007

Bitte beachten Sie dabei:
Die Funktion „Year()“ ist eine Access-Funktion, die für das als Parameter angegebene Datum nur die Jahreszahl als Ergebnis liefert. Die SQL-Anweisung selektiert dann nur die Datensätze, bei denen das Anfragedatum zwischen dem 1.1.2007 und dem 31.12.2007 liegt.

Bitte beachten Sie, dass solche Löschungen nicht rückgängig gemacht werden können! Außerdem sollten Sie Tabellen oder Feldnamen, die Sonderzeichen wie beispielsweise den Bin de strich enthalten, in eckige Klammern setzen!

Komplette Tabellen entfernen
Wenn Sie Tabellen komplett aus der Datenbank löschen möchten, nutzen Sie die SQL-Anweisung „DROP TABLE“ wie folgt:

DROP TABLE Tabelle

Für „Tabelle“ geben Sie den Namen der Tabelle an, die komplett gelöscht werden soll. Auch hier ist zu beachten, dass diese Aktion nicht rückgängig gemacht werden kann und Sie Tabellennamen mit Sonderzeichen in eckige Klammern setzen müssen!

Definitionen Ihrer Tabellen ändern
Gelegentlich müssen in Tabellen neue Felder mit jeweils gleichem Namen und gleichem Datentyp hinzugefügt werden.

Zum Beispiel:
Verschiedene Tabellen sollen um ein Feld „EMail“ erweitert werden. Anstatt jede Tabelle im Entwurfsmodus zu öffnen und das Feld hinzuzufügen, geben Sie im Formular „SQL-Direkteingabe“ eine SQL-Anweisung wie die folgende ein:

ALTER TABLE Personal ADD COLUMN EMail TEXT(200)

Diese Anweisung fügt der Tabelle „Personal“ ein Feld „EMail“ hinzu und setzt dessen Feldgröße auf 200 Zeichen.

Nachdem diese Anweisung ausgeführt ist, ändern Sie einfach nur den Namen der Tabelle auf die nächste anzupassende Tabelle und in kürzester Zeit haben Sie alle betroffenen Tabellen geändert, ohne jedes Mal in den Tabellenentwurf wechseln zu müssen. Natürlich können Sie auch Felder mit anderen Datentypen über eine solche SQL-Anweisung hinzufügen.

Geben Sie dazu beispielsweise statt „TEXT(xxx)“ „DATE“ für Datums-/Zeitfelder oder „CURRENCY“ für Währungsfelder an. Weitere mögliche Typen sind in der Online-Hilfe aufgelistet.

Ähnlich einfach können Sie übrigens auch Felder aus mehreren Tabellen löschen. Die folgende Anweisung löscht zum Beispiel das Feld „PreisInDM“ aus einer Tabelle „Artikel“:

ALTER TABLE Artikel DROP COLUMN PreisInDM

Feldinhalte auf den neuesten Stand bringen Um z. B. den Preis für einen Artikel um 20 % zu erhöhen, setzen Sie normalerweise eine Aktualisierungsabfrage ein. Auch hier kann eine SQL-Anweisung viel Zeit sparen:

UPDATE Artikel SET VKPreis = VKPreis * 1.2

Diese Anweisung multipliziert den aktuellen Inhalt des Feldes „VKPreis“ mit „1.2“ und schreibt das Ergebnis dann zurück in das Feld. Auf Wunsch können Sie wieder mit Kriterien arbeiten und zum Beispiel nur Artikel einer bestimmten Warengruppe aktualisieren:

UPDATE Artikel SET VKPreis = VKPreis * 1.2 WHERE Warengruppe = ‚Grafikkarten‘

Wenn Sie diese „WHERE“-Klausel einmal mit der aus Beispiel 1 vergleichen, sehen Sie, dass Vergleiche auf Textfelder immer mit, Vergleiche auf Werte aber ohne Hochkommas anzugeben sind.

Zusammenführen von Tabellen
Zum Abschluss noch eine SQL-Anweisung, die besonders nützlich für das Zusammenführen von vorhandenen und neuen Datensätzen ist. Zunächst eine ganz einfache Anweisung, die Adressen aus einer Tabelle „Neue Adressen“ in einen vorhandenen Adressenstamm übernimmt.

Nachdem die Tabelle in die Datenbank importiert ist, fügt die folgende Anweisung die neuen Datensätze aus der Tabelle „NeueAdressen“ in die vorhandene Tabelle „Adressen“ ein:

INSERT INTO Adressen SELECT * FROM NeueAdressen

Auch hier können Sie gegebenenfalls wieder mit Kriterien arbeiten, um zum Beispiel nur Adressen von Kunden aus Deutschland aufzunehmen:

INSERT INTO Adressen SELECT * FROM NeueAdressen WHERE Land´ = ‚Deutschland‘

Außerdem ist es möglich, auf diesem Wege direkt einen einzelnen neuen Datensatz per SQL-Anweisung anlegen:

INSERT INTO Adressen (Vorname, Nachname, Strasse, PLZ, Ort) VALUES (‚Johannes‘, ‚Schmidt‘, ‚Am Bahnhof 12‘, 80911, ‚München‘)

Hinter „INSERT INTO Tabelle“ geben Sie zunächst in Klammern die Namen der Felder ein, die mit den ebenfalls in Klammern stehenden Zeichenketten und Werten hinter dem Schlüsselwort „VALUES“ gefüllt werden sollen. Texte sind wieder in einfache Hochkommas einzuschließen, numerische Werte oder Zahlen geben Sie ohne Hochkommas an.

Sendkeys Anweisungen

Ein Feld weiter springen

SendKeys „{Numlock}{Enter}“, True


Fenster schließen

SendKeys „^{F4}“, True


Datensatz markieren

SendKeys „+ “, True


oder

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70

Jede Taste wird durch mindestens ein Zeichen repräsentiert. Ein einzelnes Zeichen auf der Tastatur kann mit dem Zeichen selbst angegeben werden. „A“ für das Argument string repräsentiert beispielsweise den Buchstaben A. Sie geben mehrere Zeichen an, indem Sie die Zeichen aneinanderhängen. „ABC“ für string repräsentiert zum Beispiel die Buchstaben A, B und C.

Das Pluszeichen (+), Caret-Zeichen (^), Prozentzeichen (%), die Tilde (~) und die Klammern ( ) haben bei der SendKeys-Anweisung eine spezielle Bedeutung. Sie müssen jedes dieser Zeichen in geschweifte Klammern einschließen ({}), um es verwenden zu können. Für das Pluszeichen geben Sie beispielsweise {+}an. Eckige Klammern ([ ]) haben bei der SendKeys-Anweisung zwar keine spezielle Bedeutung, müssen aber auch in geschweifte Klammern eingeschlossen werden, da sie in anderen Anwendungen eine spezielle Bedeutung haben, insbesondere im Zusammenhang mit dynamischem Datenaustausch (DDE). Die Zeichen für die geschweiften Klammern legen Sie unter Verwendung von {{} und {}} fest.

Für Zeichen, die beim Drücken einer Taste nicht angezeigt werden (z.B. die EINGABETASTE oder TAB-TASTE) und für bestimmte Aktionstasten können Sie die folgenden Codes verwenden:

Taste

Code

RÜCKTASTE

{BACKSPACE}, {BS} oder {BKSP}

PAUSE

{BREAK}

FESTSTELLTASTE

{CAPSLOCK}

ENTF

{DELETE} oder {DEL}

NACH-UNTEN

{DOWN}

ENDE

{END}

EINGABETASTE

{ENTER}oder ~

ESC

{ESC}

HILFE

{HELP}

POS 1

{HOME}

EINFG

{INSERT} oder {INS}

NACH-LINKS

{LEFT}

NUM-FESTSTELL

{NUMLOCK}

BILD-AB

{PGDN}

BILD-AUF

{PGUP}

DRUCK

{PRTSC}

NACH-RECHTS

{RIGHT}

ROLLEN-FESTSTELL

{SCROLLLOCK}

TAB

{TAB}

NACH-OBEN

{UP}

F1

{F1}

F2

{F2}

F3

{F3}

F4

{F4}

F5

{F5}

F6

{F6}

F7

{F7}

F8

{F8}

F9

{F9}

F10

{F10}

F11

{F11}

F12

{F12}

F13

{F13}

F14

{F14}

F15

{F15}

F16

{F16}

Sie können Tastenkombinationen mit der UMSCHALTTASTE, STRG-TASTE oder ALT-TASTE angeben, indem Sie vor dem normalen Tasten-Code einen oder mehrere der folgenden Codes angeben:

Taste

Code

UMSCHALT

+

STRG

^

ALT

%

Wenn UMSCHALT, STRG und ALT gleichzeitig mit anderen Tasten gedrückt werden müssen, schließen Sie die Codes für die Tasten in Klammern ein. Wenn zum Beispiel die UMSCHALTTASTE gleichzeitig mit den Tasten E und C gedrückt werden soll, geben Sie „+(EC)“ an. Wenn die UMSCHALTTASTE zusammen mit E gedrückt werden soll und im Anschluß daran C ohne UMSCHALTTASTE, geben Sie „+EC“ an.

Tastenwiederholungen können Sie in der Form {Taste Zahl} angeben. Das Leerzeichen zwischen Taste und Zahl ist dabei zwingend erforderlich. {LEFT 42} wird zum Beispiel als 42-maliges Drücken der NACH-LINKS-TASTE interpretiert, {h 10} als 10-maliges Drücken der Taste H.

Anmerkung SendKeys kann keine Tastenanschläge an Anwendungen senden, die nicht unter Microsoft Windows oder auf dem Macintosh ausgeführt werden können. SendKeys kann auch die DRUCK-TASTE {PRTSC} an keine Anwendung senden.

Schließen

Tabelle schließen

DoCmd.Close acTable, „Name Tabelle“


Formular schließen

DoCmd.Close acForm, „NameFormular“


Abfrage schließen

DoCmd.Close acQuery, „Name Abfrage“

Runden von Zahlen

Gibt eine Zahl zurück, die auf eine angegebene Anzahl an Dezimalstellen gerundet wurde.

Syntax

Round(Ausdruck [,AnzahlDezimalstellen])

Die Syntax der Round-Funktion besteht aus folgenden Argumenten:

Argument Beschreibung
Ausdruck Erforderlich. Numerischer Ausdruck, der gerundet wird.
AnzahlDezimalstellen Optional. Zahl, die angibt, wie viele Stellen rechts vom Dezimalzeichen beim Runden berücksichtigt werden. Wird dieser Wert ausgelassen, gibt die Round-Funktion ganze Zahlen zurück.

In Eigenschaften eines Feldes auf Steuerelementinhalt:

=Runden([Feldname];2)

Im Visual Basic:

=Round([Feldname];2)

Roter Rand bei aktiviertem Filter

Mithilfe des Auswahlfilters können Sie die Datensätze eines Formulars gemäß dem Inhalt des aktuellen Feldes filtern. Befinden Sie sich also beispielsweise im Formular „Kunden“ der Beispieldatenbank „Nordwind“ im Feld „Land“ mit der Einstellung „Frankreich“ und aktivieren den auswahlbasierten Filter, werden beispielsweise nur noch die Datensätze angezeigt, bei denen „Land“ auf „Frankreich“ eingestellt ist. Nachdem Sie einige Zeit in den Datensätzen geblättert und Änderungen vorgenommen haben, ist allerdings schnell vergessen, nach welchem Feld die Filterung ursprünglich erfolgte.

Um eine kleine Gedächtnisstütze zu realisieren, können Sie das Feld, auf dessen Basis die Filterung erfolgte, farblich hervorheben, in dem zum Beispiel die Rahmenfarbe auf „Rot“ eingestellt wird. Für diesen Zweck können Sie die Ereignisprozedur „Bei angewendetem Filter“ (VBA: „ApplyFilter“) nutzen, die Access bei Aktivierung und Deaktivierung eines Filters aufruft (siehe nachfolgendes Listing oben auf dieser Seite). Der Parameter „ApplyType“ gibt Auskunft darüber, ob ein Filter aktiviert („acApply- Filter“, Wert = 1) oder deaktiviert („ac – Show AllRecords“, Wert = 0) wurde. Ist der Filter eingeschaltet, ermitteln wir über „Screen.ActiveControl“ das aktuelle Steuerelement und setzen dessen Rahmenfarbe auf „Rot“. Anschließend wird in einer Schleife über alle Steuerelemente des Formulars die Rahmenfarbe der restlichen Steuerelemente auf „Standard“ zurückgesetzt. Öffnen Sie dann das Formular „Kunden“ und kopieren Sie die Ereignisprozedur „ApplyFilter“ des Formulars in die Zwischenablage.

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
Dim ctl As Control, strField As String

On Error Resume Next
If ApplyType = acApplyFilter Then ‚Filterfeld hervorheben
strField = Screen.ActiveControl.Name
Me(strField).BorderColor = vbRed
End If

For Each ctl In Me.Controls ‚Alle anderen zurücksetzen
Select Case TypeName(ctl)
Case „TextBox“, „Combobox“
If ctl.Name <> strField Then
ctl.BorderColor = 8421504
End If
End Select
Next ctl

End Sub

Dann öffnen Sie Ihre Datenbank und dort das Formular, in dem die Lösung eingesetzt werden soll, und fügen die Ereignisprozedur per Strg + V in den allgemeinen Teil des Formularmoduls ein.

Rechner per VBA herunterfahren

Datenbank

Auf einigen Systemen kommt ausschließlich Access zum Einsatz und die Anwender sollen möglichst gar nicht auf die Idee kommen, mit anderen Programmen zu arbeiten oder gar mit den Einstellungen des Betriebssystems zu experimentieren.

Der automatische Start von Access beim Einschalten des Rechners ist kein Problem, aber wie können Sie das System „sauber“ herunterfahren?

Oder wie gehen Sie vor, wenn Sie kurz vor Feierabend eine komplexe Auswertung bzw. einen umfangreichen Import vor gang starten? Der Rechner soll nach Beendigung der Aufgabe (und wirklich erst dann) automatisch heruntergefahren werden.

Wir haben die Lösung für Sie:
Der Maus klick auf eine Formularschaltfläche oder ein Funktionsaufruf genügen, um nicht nur Access, sondern auch Windows komplett zu verlassen. Falls das von Ihnen eingesetzte System Power-Management-Funktionen unterstützt, brauchen Sie dann nicht einmal mehr den Aus-Schalter zu betätigen.

Der Programmcode der Beispiellösung greift auf API-Funktionen zurück – also auf Funktionen, die direkt von Windows bereitgestellt werden. Deshalb haben Sie wie beim manuellen Beenden des Systems die Möglichkeit, den Rechner komplett herunterzufahren, ihn neu zu starten oder sich einfach nur abzumelden. Sie kennen die Befehle aus dem Startmenü von Windows.

Um die verschiedenen Optionen vorzustellen, enthält die mitgelieferte Beispieldatenbank ein Formular mit entsprechenden Optionsfeldern. So können Sie die gewünschte Shutdown-Methode auswählen und anschließend testen, wie sich Ihr System verhält. Das hilft bei der Entscheidung, welches Verfahren am besten für Ihre eigenen Access-Lösungen geeignet ist.

Installieren Sie die Datenbank und öffnen sie. Zum Experimentieren dient das Formular „frmExitWin“.

Wenn Sie das Formular öffnen, können Sie aus drei Methoden zum Beenden von Windows auswählen: ABMELDEN, NEU STARTEN und HERUNTERFAHREN.

Standard mäßig ist die letzte Option aktiviert. Nachdem Sie sich für eine der drei Varianten entschieden haben, klicken Sie auf die darunter stehende Symbolschaltfläche.

Um ein versehentliches Herunterfahren zu vermeiden, erscheint zuerst eine Sicherheitsabfrage. Nur wenn Sie diese Abfrage mit JA bestätigen, wird die aktuelle Windows-Sitzung tatsächlich beendet. Je nach vorheriger Auswahl erfolgt automatisch eine Neuanmeldung, ein Neustart oder der Rechner wird komplett ausgeschaltet.

Wenn Sie mehr über die Funktionsweise der Beispiellösung wissen wollen, öffnen Sie das Formular „frmExitWin“ im Entwurfsmodus. Lassen Sie sich dann mit ANSICHTCODE bzw. ENTWURF-TOOLS-CODE ANZEIGEN das Fenster mit den dazugehörigen VBA-Anweisungen anzeigen.

Das Codefenster des Formulars enthält lediglich die Ereignisprozedur, die beim Anklicken der Befehlsschaltfläche ausgeführt wird. Kern ist der Aufruf der Hauptprozedur „ComputerShutdown“; die restlichen Codezeilen dienen nur zur Verarbeitung eventueller Fehler.

Beachten Sie, dass der Hauptprozedur der aktuelle Wert der Optionsgruppe „fraExitOptions“ übergeben wird. Der Wert 1 entspricht der Auswahl ABMELDEN, der Wert 2 der Option NEU STARTEN und der Wert 3 gehört zu HERUNTERFAHREN.

Wenn Sie einen genaueren Blick auf die Hauptprozedur „ComputerShutdown“ werfen wollen, öffnen Sie das Modul „modShutdownFunctions“.

In Access 97 müssen Sie dazu im Datenbankfenster auf das Register MODULE wechseln. In den anderen Access-Versionen können Sie im Visual-Basic-Editor direkt zum entsprechenden Modulfenster gehen.

Vor der eigentlichen Prozedur werden einige API-Funktionen und die dafür erforderlichen Konstanten sowie Typklassen deklariert.

Zum Beenden von Windows benötigen Sie im Prinzip nur folgende API-Bestandteile:

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4

Private Declare Function ExitWindowsEx _
Lib „user32“ _
(ByVal uFlags As Long, _
ByVal dwReserved As Long) _
As Long

Diesem theoretisch einfachen Ansatz machen jedoch die Windows-Versionen, die auf Netzwerk- und Mehrbenutzerumgebungen spezialisiert sind, einen Strich durch die Rechnung.

Die Sicherheitseinstellungen (Zugriffsprivilegien) in Windows NT, 2000, XP und Vista verhindern, dass die API-Funktion „ExitWindowsEx“ aus Access heraus aufgeführt werden kann.

Das bedeutet, dass Sie weitere API-Funktionen benötigen, mit denen Sie die Windows-Version abfragen und neue Zugriffsrechte verteilen können.

Zum Einsatz kommen die Betriebssystemfunktionen in der Prozedur „Computer-Shutdown“. Sofern das Herunterfahren des Systems in der „MsgBox“-Funktion bestätigt worden ist, fragen Sie mit „GetVersionEx“ die Details der aktuellen Windows-Version ab. Im Parameter „dwPlatformId“ steht entweder der Wert 1 für Windows 95/98/ME oder der Wert 2 für Windows NT/2000/XP/Vista. Davon ausgehend entscheiden Sie, ob spezielle Zugriffsprivilegien geändert werden müssen oder nicht.

Das äußert sich im Code wie folgt:

WinInfo.dwOSVersionInfoSize = Len(WinInfo)
GetVersionEx WinInfo
‚dwPlatformID für Win95/98/ME ist 1, für WinNT/2000/XP ist es 2
If WinInfo.dwPlatformId = VER_PLATFORM_WIN32_NT Then
hProcess = GetCurrentProcess()
OpenProcessToken hProcess, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue „“, „SeShutdownPrivilege“, LocalLUID
LocalPriv.PrivilegeCount = 1
LocalPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
LocalPriv.Privileges(0).pLuid = LocalLUID
AdjustTokenPrivileges hToken, False, LocalPriv, Len(NewPriv), NewPriv, lBuffer
End If

Zum Setzen neuer Privilegien benötigen Sie zuerst ein Handle zum aktuellen Prozess – also zur laufenden Access-Anwendung.

Dann fragen Sie die Sicherheits-Tokens ab und ermitteln die Shutdown-Berechtigung.

Schließlich definieren Sie die Berechtigung um und weisen sie dem Sicherheits-Token des Prozesses zu.

Die darauf folgende Select-Case-Verzweigung widmet sich bereits den Einstellungen, die für den allgemeinen Shutdown-Vorgang relevant sind.

Spezielle Flags sind für das Abmelden, Neustarten oder Herunterfahren zuständig.

Der Wert richtet sich nach dem Parameter, den Sie der Prozedur übergeben hatten.

Und zum Schluss beenden Sie das System mit der API-Funktion „ExitWindows Ex“.

Select Case ShutdownMode
Case 1 ‚Logoff
lFlags = EWX_LOGOFF + EWX_FORCE
Case 2 ‚Neu starten
lFlags = EWX_REBOOT + EWX_FORCE
Case 3 ‚Herunterfahren
lFlags = EWX_SHUTDOWN + EWX_FORCE
Case Else
lFlags = EWX_SHUTDOWN + EWX_FORCE
End Select
ExitWindowsEx lFlags, 0

Unser Tipp:
Beachten Sie, dass jeweils die Konstante „EWX_FORCE“ addiert wird. Das ist nicht zwingend erforderlich, hat aber den Vorteil, dass Windows auch dann beendet wird, wenn eine Anwendung aus irgendwelchen Gründen nicht reagiert.

Normalerweise erscheint in diesem Fall ein Hinweisfenster auf dem Bildschirm, was das Herunterfahren des Systems unterbrechen würde. Die Hauptprozedur und, wenn Sie wollen, auch das Formular lassen sich problemlos in Ihre eigenen Datenbanken einbinden.

Am einfachsten ist es, sowohl das Formular als auch das Modul aus der Beispieldatenbank in Ihre Datenbank zu importieren.

Dazu verwenden Sie bis Access 2003 den Befehl DATEI-EXTERNE DATEN-IMPORTIEREN. In Access 2007 wechseln Sie in der Multifunktionsleiste auf die Registerkarte „Externe Daten“ und klicken in der Gruppe „Importieren“ auf die Schaltfläche ACCESS.

Sobald das Formular „frmExitWin“ und das Modul „modShutdownFunctions“ in die Zieldatenbank integriert sind, müssen Sie nur noch eine Formularschaltfläche oder einen Menübefehl einrichten, die/der das Formular öffnet. Die restliche Funktionsweise kennen Sie aus der hier vorgestellten Beispiellösung.

Ebenso gut ist es natürlich möglich, nur das Modul in Ihre Datenbank zu übernehmen. Vielleicht wollen Sie sogar auf die Auswahl verschiedener Shutdown-Methoden verzichten und allein das Herunterfahren aktivieren.

In diesem Fall brauchen Sie nur das Modul „modShutdownFunctions“ zu importieren. Danach schreiben Sie einen VBA-Programmcode, der die Prozedur „ComputerShutdown“ mit dem gewünschten Parameter aufruft. Oder Sie gehen einen Schritt weiter und bearbeiten die Hauptprozedur, indem Sie den Parameter und die SelectCase-Anweisung löschen.

Anschließend stellen Sie das Flag für die API-Funktion generell auf einen der Werte „EWX_LOGOFF“, „EWX_REBOOT“ oder „EWX_SHUTDOWN“ ein.

In jedem Fall wird es in Zukunft kein Problem mehr sein, das System „sauber“ zu beenden.


Module: modShutdownFunctions

 

Rechnen mit leeren Feldern

Frage: Ich nutze in einem Formular ein ungebundenes Steuerelement, um den Gesamtbetrag einer Rechnung aus der Zwischensumme und den Versandkosten zu berechnen:

=[Zwischensumme]+[Versand]

In der Regel funktioniert das ohne Probleme, aber wenn ich einmal keine Versandkosten eingebe, wird auch die Zwischensumme nicht beachtet und das Feld für den Gesamtbetrag bleibt leer.

Woran könnte das liegen?

Antwort: Die Ursache für dieses Problem ist die Tatsache, dass ein leeres Feld das Ergebnis „Null“ liefert. Das führt dazu, dass auch die Berechnung „Null“ zum Ergebnis hat und das Textfeld entsprechend leer bleibt. Mit der Funktion „Nz“ beheben Sie das Problem. Nz liefert die Zahl „0“ oder eine leere Zeichenkette in den Fällen, in denen der übergebene Ausdruck „Null“ zum Ergebnis hat.

Der Ausdruck für Ihr berechnetes Steuerelement müsste dann lauten:

=Nz([Zwischensumme]) + Nz([Versand])

Unabhängig davon, welches dieser beiden Felder leer bleibt, erhalten Sie in jedem Fall das korrekte Ergebnis.

Nachrichtenaustausch in Multiuser-Datenbanken

Datenbank

Die Nutzung einer Access-Datenbank mit mehreren Anwendern ist ohne großen Aufwand möglich. Etwas komplizierter sind da schon Pflege und Wartung. So ist beispielsweise das wichtige regelmäßige Komprimieren nur dann möglich, wenn kein Anwender angemeldet ist. Sie müssen damit also entweder bis nach Feierabend warten oder alle infrage kommenden Personen per Mail oder Telefon benachrichtigen. Unsere Lösung: Erweitern Sie Ihre Datenbanken um ein eigenes kleines Kommunikationssystem. Wartungsarbeiten, neue Funktionen, Sicherheitshinweise und andere wichtige Informationen können Sie damit zuverlässig allen Anwendern mitteilen, denn die Nachrichten erscheinen automatisch beim Öffnen der Datenbank oder auch während damit gearbeitet wird.

Unsere Lösung basiert auf zwei Tabellen, die im Back-End untergebracht sind und in die einzelnen Front-End-Datenbanken eingebunden werden müssen, sodass ein gemeinsamer Zugriff möglich ist. Die Tabelle „MBUMsgText“ speichert die einzelnen Nachrichten mit einer eindeutigen Nachrichten-ID, die beim Senden einer Nachricht automatisch generiert wird.

Die Tabelle „MBUMsgSeenBy“ hält anhand dieser Nachrichten-ID und einer pro Arbeitsplatz individuell vergebenen Anwender-ID fest, welcher Anwender die einzelnen Nachrichten bereits gelesen hat, damit nicht immer wieder dieselben Nachrichten angezeigt werden. In den einzelnen Front-Ends kommt ein Formular „MBUMsg – Form“ zum Einsatz, das über „AutoExec“ beim Öffnen minimiert abgelegt wird. Das Formular prüft die Tabellen kontinuierlich auf ungelesene Nachrichten und dient der Anzeige, Verwaltung und Erstellung neuer Nachrichten.

Für die Prüfung auf neue Nachrichten ist die Zeitgeber-Routine des Formulars zuständig. Sie nimmt bei jedem Aufruf (alle 5 Sekunden) im Hintergrund einen Abgleich der Tabellen vor. Dabei werden in einer Schleife alle Nachrichten in der Tabelle „MBU Msg Text“ daraufhin geprüft, ob dazu in der Tabelle „MBUMsgSeenBy“ bereits ein „Gelesen“-Eintrag mit der ID des aktuellen Anwenders vorhanden ist. Sollte das nicht der Fall sein, hat er die Nachricht noch nicht gelesen.

Das Formular wird dann im Vordergrund mit der neuen Nachricht angezeigt. Über eine Schaltfläche GELESEN bestätigt der Anwender die Nachricht. Dabei wird zunächst in der Tabelle „MBUMsg Seen By“ über eine Kombination aus Nachrichten- ID und Anwender-ID festgehalten, dass die Nachricht gelesen wurde, und das Formular anschließend wieder minimiert abgelegt. Beim nächsten Aufruf der Zeitgeber-Routine findet diese nun einen „Gelesen“-Eintrag für die letzte Nachricht in der Tabelle „MBUMsgSeenBy“, sodass sie nicht noch einmal als neue Nachricht angezeigt wird. Wie das im Detail realisiert ist, erfahren Sie weiter unten. Beginnen wir damit, die Lösung in Ihre Datenbanklösungen einzubinden.

Um die Lösung in Ihre Back-End-/Front- End-Lösung einzubinden, gehen Sie wie folgt vor:

1. Öffnen Sie das Back-End und übertragen Sie die Tabellen „MBUMsgText“ und „MBUMsgSeenBy“ über das Menü DATEI-EXTERNE DATEN-IMPORTIEREN aus unserer Beispieldatenbank und verlassen Sie die Datei wieder. Nach dem Download installieren Sie die Datenbank und öffnen sie. Alternativ können Sie auch die Beispieldatenbank in das Verzeichnis des Back-Ends kopieren, den Schreibschutz entfernen und die Tabellen „MBUMsgText“ und „MBUMsgSeenBy“ von dort aus in die Front- End-Dateien über das Menü DATEI EXTERNE DATEN-TABELLEN VERKNÜPFEN einbinden.

2. Öffnen Sie der Reihe nach alle Front- End-Datenbanken und führen Sie dort jeweils die folgenden Aktionen durch.

3. Übertragen Sie das Formular „MBUMsgForm“ über das Menü DATEI EXTERNE DATEN-IMPORTIEREN aus der Beispieldatenbank in das Front-End.

4. Binden Sie die Tabellen „MBUMsgText“ und „MBUMsgSeenBy“ aus dem Back-End in das Front-End über das Menü DATEI-EXTERNE DATENTABELLEN VERKNÜPFEN ein.

5. Öffnen Sie das Formular „MBUMsgForm“ im Entwurfsmodus und wählen Sie das Menü ANSICHT-CODE an, um die VBA-Entwicklungsumgebung zu öffnen.

6. Wählen Sie das Menü EXTRAS-VERWEISE an und setzen Sie eine Referenz auf „Microsoft DAO 3.6x Object Library“ bzw. „Microsoft DAO 3.5x Object Library“ (Access 97).

7. Im allgemeinen Teil des Formulars wird eine Konstante „cstrSeenByID“ deklariert. Dieser Konstanten weisen Sie eine pro Arbeitsplatz individuell vergebene Identifikation zu. Das kann zum Beispiel ein Anwendername, ein Rechnername oder eine Kombination aus beidem sein. Wichtig ist in jedem Fall, dass diese ID eindeutig ist und nicht doppelt vergeben wird! Der Inhalt dieser Konstanten wird in allen Bereichen über eine Funktion „GetSeenByID()“ ausgelesen. Wenn die Anwender sich individuell anmelden, können Sie in dieser Funktion die erste Zuweisung auskommentieren und die Zuweisung des Funktionsergebnisses auf „=CurrentUser()“ setzen. Als Anwender-ID wird dann der jeweilige Anwendername anstelle der Konstanten „cstrSeenByID“ verwendet:

8. Speichern Sie die Änderungen am Formular anschließend und verlassen Sie den Formularentwurf.

9. Legen Sie ein Makro „AutoExec“ an und definieren Sie eine Aktion „ÖffnenFormular“ mit den folgenden, vom Standard abweichenden Parametern: Formularname: MBUMsgForm
Fenstermodus: Symbol
Ist bereits ein Makro „AutoExec“ vorhanden, fügen Sie die oben genannte Aktion am Anfang hinzu.

10. Speichern Sie das Makro beziehungsweise die Änderungen und verlassen Sie den Makroentwurf.

11. Für das nächste Front-End beginnen Sie wieder mit Schritt 3.

In Zukunft wird nun bei jedem Start der einzelnen Front-End-Datenbanken automatisch das Formular „MBUMsgForm“ geladen, das im Hintergrund auf neue Nachrichten wartet oder zum Senden neuer Nachrichten genutzt werden kann.