|
|
 |
|
 |
 |
Befehlsschaltflächen fassen meistens mehrere Arbeitsschritte zusammen und erleichtern damit die Bedienung eines Formulars. Damit eine Schaltfläche bestimmte Aufgaben übernehmen kann, müssen Sie sie mit einem Makro oder einer VBA-Prozedur verknüpfen.
Schaltflächen für die wichtigsten Aufgaben können Sie einfach und schnell mit dem Befehlsschaltflächen-Assistenten von Access anlegen.
Zum Start des Befehlsschaltflächen-Assistenten gehen Sie wie folgt vor:
Öffnen Sie ein Formular in der Entwurfsansicht. Markieren Sie in der Toolbox die Symbole Steuerelementassistenten und Befehlsschaltfläche.
Klicken Sie auf die Position des Formulars, an der Sie eine Befehlsschaltfläche anordnen wollen.
Der erste Dialog des Befehlsschaltflächen-Assistenten enthält eine Liste von Kategorien, nach denen die Schaltflächen organisiert sind. Nachdem Sie beispielsweise die Kategorie Datensatzoperationen markiert haben, erscheinen die Aktionen dieser Kategorie in der rechten Liste. Markieren Sie beispielsweise den Eintrag Datensatz duplizieren.
Über die Schaltfläche Weiter öffnen Sie weitere Dialogseiten des Assistenten, mit denen Sie unter anderem ein Symbol für die neue Schaltfläche auswählen können. Alternativ können Sie aber auch auf Fertigstellen klicken, um die Schaltfläche direkt anlegen zu lassen.
Der Assistent erstellt die Schaltfläche und Sie können sie gleich nach dem Wechsel in die Formularansicht testen. Probieren Sie ruhig einmal verschiedene Schaltflächen nacheinander aus. Sie werden sehen, dass Sie Ihre Formulare damit aufwerten können. | |
| Access-Paradies ist eine Site von Microsys-Kramer. Ein Office-Forum mit derzeit über 4000 Beiträgen zu Access. | |
| Sie müssen lediglich folgende Regeln beachten:
Vermeiden Sie den Einsatz von Variablen des Typs Variant. Variant-Variablen belegen viel Speicherplatz (mindestens 16 Byte) und haben bei mathematischen Berechnungen einen deutlichen Geschwindigkeitsnachteil.
Vermeiden Sie bei zeitkritischen Prozeduren den Aufruf anderer Prozeduren. Durch den Aufruf und die eventuelle Übergabe von Parametern entsteht ein erheblicher Verwaltungsaufwand, der natürlich Zeit kostet.
Wenn Sie mehrfach auf Eigenschaften und Methoden von Objekten (z.B. Formulare oder Steuerelemente) zugreifen, sollten Sie das betreffende Objekt in einer Objektvariablen zwischenspeichern.
Beim Einsatz der IIF-Funktion (Immediate If, deutsch Wenn-Funktion) werden immer sowohl der zweite als auch der dritte Ausdruck ausgewertet, obwohl dies nur bei einem der beiden Ausdrücke notwendig wäre. Besonders negativ wirkt sich dies aus, wenn in beiden Ausdrücken zeitaufwendige Funktionen ausgeführt werden. In diesem Fall sollten Sie lieber das normale If...Then...Else-Kontrukt einsetzen, bei dem in Abhängigkeit von der If-Bedingung immer nur ein einzelner Anweisungsblock ausgeführt wird.
Verweisen Sie auf Objekte, die von OLE-Servern stammen, stets zusammen mit dem Namen des Objektservers.
Access braucht so nicht alle Objektbibliotheken nach dem Bezeichner Database zu durchsuchen, sondern kann direkt auf den richtigen Objektdatentyp zugreifen. | |
In der Spalte Bedingung, die Sie jedem Makro über den Menüpunkt Ansicht/Bedingungen hinzufügen können, lässt sich die Ausführung einer oder mehrerer Aktionen vom Ergebnis einer Bedingung abhängig machen.
Mit Hilfe der Aktion StopMakro lässt sich auch ein If-Then-Else-Konstrukt realisieren. Hierbei werden bestimmte Aktionen nur dann ausgeführt, wenn der in der Spalte Bedingung angegebene Ausdruck das Ergebnis Wahr hat. Andernfalls wird ein zweiter Aktionsblock ausgeführt. Ein entsprechendes Makro könnte folgenden Aufbau haben:
|
Bedingung |
Aktion |
|
Bedingung |
Aktion 1 |
|
... |
Aktion 2 |
|
... |
StopMakro |
|
|
Elde-Aktion 1 |
|
|
Else-Aktion 1 |
In diesem Beispiel werden die Aktionen 1 und 2 nur dann ausgeführt, wenn die Bedingung Wahr zum Ergebnis hat. Als letztes wird in diesem Fall die Aktion StopMakro ausgeführt, was zur Beendigung des kompletten Makros führt. Sollte die Bedingung dagegen Falsch zum Ergebnis haben, werden die Aktionen 1 und 2 inklusive der StopMako-Aktion übersprungen. Access führt ausschließlich die Else-Aktionen 1 und 2 aus. Siehe Abbildung 1.
Die drei Punkte vor der ersten ÖffnenBericht- und der StopMakro-Aktion bewirken, dass die Ausführung dieser Aktionen von der vorhergehenden Bedingung abhängig ist. In dem obigen Beispiel werden damit die ersten drei Aktionen zu einem Aktionsblock zusammengefasst, dessen komplette Ausführung von der Bedingung abhängt. | |
Wählen Sie den Menübefehl Format>Schriftart. Es öffnet sich der gleichnamige Dialog. Im Listenfeld Schriftart stehen Ihnen alle unter Windows installierten Schriftarten zur Auswahl. Außerdem können Sie den Schriftschnitt und die Schriftgröße festlegen. In der Sektion Darstellung läßt sich eine zum Layout passende Schriftfarbe festlegen. Wie gewohnt gibt es auch im Schriften-Dialog eine Vorschau.
Wenn Sie mit der neuen Schrift zufrieden sind, können Sie die Änderungen mit OK aktivieren. Die Veränderungen beziehen sich nur auf das aktuelle Datenblatt und werden mit ihm gespeichert. | |
Stellen Sie zu diesem Zweck in der Druckereinrichtung eine niedrigere Druckqualität ein. Nachdem Sie die Druckereinrichtung mit Datei>Drucken geöffnet haben, klicken Sie auf die Schaltfläche Eigenschaften. Hier werden für jeden Drucker individuelle Optionen angezeigt. Bei einigen Druckern zählt dazu auch die Druckqualität. Von Makros oder VBA aus kann die Druckqualität ebenfalls bestimmt werden:
- In Makros: Die Aktion Drucken enthält das Argument Druckqualität, welches Sie auf Hoch, Mittel, Niedrig oder Entwurf einstellen können.
- In VBA: Das vierte Argument des Befehls DoCmd.PrintOut bestimmt die Druckqualität, welche durch die Konstanten acHight (Hochqualität), acMedium (mittel), acLow (niedrig) und acDraft (Entwurfsqualität) vertreten wird.
Das folgende Beispiel druckt den momentan aktiven Bericht in Entwurfsqualität aus:
DoCmd.PrintOut , , , acDraft | |
Stört es Sie auch, wenn Sie eine Datenbank öffnen wollen, im Öffnen-Dialog aber nie Ihr persönlicher Datenbankordner, sondern der Ordner Eigene Dateien erscheint? Sie müssen also immer erst in Ihren Ordner wechseln.
Definieren Sie Ihr eigenes Verzeichnis als Standardverzeichnis für den Öffnen-Dialog.
Wählen Sie den Menüpunkt Extras / Optionen aus. Dazu muss allerdings eine Datenbank geöffnet sein. Wechseln Sie dann in das Register Allgemein. Im Eingabefeld Standarddatenbankverzeichnis können Sie jetzt den Pfad angeben, der im Öffnen-Dialog standardmäßig erscheint.
Damit diese Einstellung aktiv wird, müssen Sie Access verlassen. Beim nächsten Start erscheint dann im Öffnen-Dialog der eingestellte Ordner. | |
Wählen Sie den Menüpunkt Datensätze>Filter>Spezialfilter/Sortierung. Es öffnet sich dann ein dem Abfrageentwurf ähnliches Fenster. Definieren Sie alle Kriterien und klicken Sie auf das Symbol Filter Sortierung anwenden, um das Filterergebnis zu sehen.
Mit einem Spezialfilter können Sie generell die gleichen Operationen durchführen, wie mit einem formularbasierten Filter. Der einzige Unterschied besteht darin, dass Sie bei einem Spezialfilter zusätzlich Sortierreihenfolgen festlegen können.
Der Unterschied zu einer Abfrage ist, dass immer alle Felder im Datenblatt angezeigt werden, auch wenn Sie im Entwurfsraster des Filters nur ein Feld eingefügt haben. | |
Kombinationsfelder enthalten standardmäßig nur diejenigen Datensätze, die die zugrunde liegende Abfrage als Ergebnis zurückliefert. Die richtige Option verschafft Ihnen bei jeder Abfrage Einblick in alle Daten.
Das folgende Beispiel geht von einer Tabelle namens tblStädte aus, die die beiden Datenfelder StadtID und Stadt beinhaltet. Mit einer Union-Abfrage wird der Eintrag Städte hinzugefügt:
(SELECT 0 AS StadtID, "" AS Stadt FROM tblStädte) UNION (SELECT StadtID, Stadt FROM tblStädte) ORDER BY Stadt;
Der erste Teil dieser Abfrage ergibt die Werte 0 und "". Dazu wird der zweite Teil hinzugefügt, nämlich alle Stadtnummern (StadtID) und -namen (Stadt). Die gesamte Abfrage liefert also folgendes Ergebnis zurück:
| StadtID |
Stadt |
| 0 |
|
| 1 |
Aachen |
| 2 |
Bielefeld |
Diese Abfrage wird dann mit einem beliebigen Listen- oder Kombinationsfeld verknüpft. Siehe Abb. 1 unten.
Wählt man im Kombinationsfeld den Eintrag aus, so hat das Feld den Wert 0. Andernfalls hat das Feld die entsprechende StadtID, wie in der folgenden AfterUpdate-Ereignisprozedur demonstriert:
Private Sub cmbStadtFilter_AfterUpdate()
'Datensätze neu filtern If Me!cmbStadtFilter = 0 Then ' "Alle" wurde ausgewählt Me.FilterOn = False Else ' ID-Wert des Kombifeldes als Filter einsetzen ' und Filter einschalten Me.Filter = "StadtID=" & Me!cmbStadtFilter Me.FilterOn = True End If
End Sub
| |
Ich bin gerade dabei, ein kleines Fahrradverwaltungsprogramm zu erstellen. Zum einen habe ich die Tabelle "Daten Fahrräder", in der einem neuen Fahrrad eine fortlaufende Nummer zugeordnet wird.
Diese Tabelle enthält auch die dazugehörigen Daten zu einem Fahrrad. Nun will ich ein Fahrrad, wenn es verkauft ist, nicht einfach löschen, sondern diesen Datensatz in eine Tabelle gleicher Struktur namens "Verkaufte Fahrräder" verschieben (mit dem Verkaufsdatum).
Das heißt, per Knopfdruck und vorheriger Abfrage des Verkaufsdatums soll dieser Datensatz automatisch verschoben werden. | Anstatt einer zusätzlichen Tabelle der verkauften Fahrräder anzulegen, würden wir Ihnen empfehlen, ein zusätzliches Ja/Nein-Feld namens "Verkauft" sowie ein Datumsfeld namens "Verkaufsdatum" in der Haupt-Tabelle anzulegen. Wenn Sie nun auf die Schaltfläche "Fahhrad verkauft" klicken, können Sie folgende VBA-Prozedur ausführen:
Private Sub btnFahrrad_Click()
Me!Verkauft = True Me!Verkaufsdatum = Now
End Sub
Der Vorteil dieser Methode ist, daß die Datensätze sehr übersichtlich sind. Sie können beispielsweise auf einem Blick sehen, welche Fahrräder schon verkauft worden sind. |
Beim direkten Ausdruck eines Berichts auf einem Drucker kann es schon einmal ärgerlich sein, wenn aufgrund eines falschen Filterkriteriums keine Datensätze gedruckt werden. Der Ausdruck war damit umsonst.
Setzen Sie die Bei Ohne Daten-Eigenschaft ein, um die Ausgabe leerer Berichte zu verhindern.
Die folgende Beispielprozedur zeigt eine Meldung an, falls der Bericht keine Daten enthält. Der Ausdruck wird nach entsprechender Bestätigung vom Benutzer durch Setzen der Variablen Cancel auf den Wert True abgebrochen.
Private Sub Report_NoData(Cancel As Integer)
If MsgBox("Dieser Bericht enthält keine Daten." & vbCrLf & "Möchten Sie den Vorgang abbrechen?", _ vbYesNo Or vbExclamation) = vbYes Then Cancel = True End If
End Sub | |
Bei der Anlage neuer VBA-Ereignisprozeduren ist es für den eingefleischten VBA-Programmierer oft lästig, nach einem Klick auf die Editor-Schaltfläche der betreffenden Eigenschaft, das nachfolgende Dialogfenster stets noch mit der Option Code Editor bestätigen zu müssen.
Einfacher geht es, wenn Sie vorher doppelt auf den Namen der Ereigniseigenschaft klicken.
Access trägt hierdurch automatisch den Text [Ereignisprozedur] ein. Anschließend führt ein Klick auf die Editor-Schaltfläche sofort und ohne Umweg über das Dialogfenster zum Öffnen des betreffenden Moduls. | |
| Codekabinett ist eine Site von Philipp Stiefel. | |
Die Funktion GetFileExtension liefert nur das Datei-Suffix (im Beispiel exe) zurück. Dies ist zum Beispiel sinnvoll, wenn eine bestimmte Datei-Operation nur auf eine definierte Dateimenge anzuwenden ist, oder nur bestimmte Dateien in eine Datenbank eingetragen werden sollen.
Sie benötigen hierzu auch die Funktion ReverseInStr aus dem Tipp Stringmanipulation - Parsen - Textmanipulation (Link siehe unten)
Public Function GetFileExtension(strPath As String) As String
Dim intPos As Integer
intPos = ReverseInStr(strPath, ".") GetFileExtension = Right(strPath, Len(strPath) - intPos)
End Function | |
Leider steht bei Formularen keine solche Ereigniseigenschaft zur Verfügung, so das die beschrieben Formatierungen bei Endlosformularen nicht möglich sind. Auch der Versuch, die Hintergrundfarbe des Detailbereichs während der Laufzeit zu verändern, schlägt fehl. Die Änderung wirkt sich nämlich stets auf alle angezeigten Datensätze aus.
Um trotzdem einzelne Datensätze farbig hervorzuheben, verwenden Sie farbige OLE-Objekte, die relational mit einer Datentabelle verknüpft werden. Die unten aufgeführte Abbildung zeigt, wie so etwas bei einer Rechnungsübersicht aussehen kann.
Voraussetzung für das Beispiel ist eine Tabelle mit dem Namen Status, in der die einzelnen OLE-Objekt zur Markierung der Datensätze angelegt werden. Die Tabelle enthält die beiden folgenden Datenfelder:
| Datenfeld |
Felddatentyp |
| StatusNr |
Zahl |
| SatusGrafik |
OLE-Objekt |
Das Feld StatusNr dient als Primärschlüssel der Tabelle.
In diesem Beispiel sollen die einzelnen Datensätze durch farbige Punkte markiert werden. Je nach Fälligkeit der Rechnung erscheint neben dem Datensatz ein grüner, gelber oder roter Punkt. Diese Punkte erstellen Sie am einfachsten mit Hilfe des Zeichenprogramms Paint, das zum Lieferumfang von Windows gehört. Das Einfügen der Objekt in das Feld StatusGrafik der Tabelle erledigen Sie über die Zwischenablage. Beachten Sie außerdem die folgende Zuordnung der Farbigkeit zu einer Statusnummer:
| Statusnummer |
Farbe |
Bedeutung |
| 1 |
Rot |
Zahlung ist überfällig |
| 2 |
Geld |
Zahlung muss innerhalb der nächsten neun Tage erfolgen |
| 3 |
Grün |
Zahlung erst in mehr als neun Tagen |
Die zweite für das Beispiel erforderliche Tabelle heißt Rechnungen. Sie speichert einige für die zu bezahlenden Rechnungen interessante Daten. Für das Beispiel kommt es nur auf das Feld Zahlungsdatum an, da die Dringlichkeit einer Zahlung durch das Verhältnis vom Tages- zum Zahlungsdatum ermittelt wird.
Die Bewertung der Zahlungsdringlichkeit übernimmt eine VBA-Funktion namens StatusBestimmen. Die Prozedur erwartet das Zahlungsdatum als Parameter und gibt einen der Stati 1 bis 3 nach obiger Tabelle zurück. Geben Sie die VBA-Funktion in ein beliebiges Standardmodul ein:
Public Function StatusBestimmen(Zahlungsdatum As Variant) As Integer
Dim DifferenzInTagen As Integer
If IsNull(Zahlungsdatum) Then Exit Function
DifferenzInTagen = DateDiff("d", Date, Zahlungsdatum)
If DifferenzInTagen < 0 Then StatusBestimmen = 1 'Rot If DifferenzInTagen >= 0 And DifferenzInTagen < 10 _ Then StatusBestimmen = 2 'Gelb If DifferenzInTagen >= 10 Then StatusBestimmen = 3 'Grün
End Function
Bevor Sie die Tabellen Rechnungen und Status in einer Abfrage miteinander verknüpfen können, benötigen Sie in der Tabelle Rechnungen ein entsprechendes Datenfeld, dessen Werte mit der Statusnummer aus der Tabelle Status übereinstimmen. Der Entwurf eines solchen Datenfeldes erfolgt am einfachsten in einer Abfrage. Fügen Sie einer neuen Abfrage die Tabelle Rechnungen hinzu, und ziehen Sie das Sternchen aus der Feldliste in den Entwurfsbereich. Fügen Sie dann die folgende Spalte hinzu:
Status: StatusBestimmen([Zahlungsdatum])
Dieser Ausdruck definiert das neue Feld Status, dessen Wert sich aus der Berechnung der VBA-Funktion StatusBestimmen und dem aktuellen Zahlungsdatum ergibt. Speichern Sie die Abfrage unter dem Namen Rechnungen mit Status.
In einer zweiten Abfrage führen Sie die Tabellen Rechnungen und Status nun zusammen. Entwerfen Sie eine Abfrage und fügen Sie die Tabelle Status und die Abfrage Rechnungen mit Status hinzu. Die Verknüpfung der beiden Feldlisten erfolgt über eine Linie, die Sie vom Feld StatusNr der Tabelle Status auf das Feld Status der Abfrage Rechnungen mit Status ziehen. Um die Abfrage zu vervollständigen, ziehen Sie das Sternchen aus der Abfrage Rechnungen mit Status und das Feld StatusGrafik aus der Tabelle Status in den Entwurfsbereich.
Nachdem Sie die Abfrage unter dem Namen Formular Rechnungsübersicht gespeichert haben, können Sie sie als Datenherkunft für ein neues Endlosformular verwenden. Der Entwurf des Formulars erfolgt am einfachsten mit einem der Formularassistenten von Access. Als Ergebnis erhalten Sie eine Ansicht von mehreren Datensätzen, die jeweils gemäß der Dringlichkeit der Zahlung farbig markiert sind.
Aufgrund der Konzeption als relationale Verknüpfung von Tabellen, läßt sich dieses Beispiel problemlos erweitern. Sie müssen lediglich weitere farbige Objekte in der Tabelle Status speichern und die VBA-Funktion StatusBestimmen entsprechend erweitern. | |
Die Datenbank - Sprachversion Deutsch Microsoft; Euro 429,00 | |
Auf dieser Site präsentiert Ihnen Reinhard Kraasch unter der Rubrik Downloads eine Vielzahl von Beispieldatenbanken, die in Access 97 erstellt wurden.
Unter "Links" finden Sie eine Auflistung von Deutsch- und Englischsprachigen Access Websites. Auch die Access-Forum-Bereiche sind sehr Interessant. Hier können Sie sich mit anderen Access-Programmierern austauchen und so direkt von den Erfahrungen anderer profitieren.
Zu den folgenden Themenbereichen finden Sie Tipps & Tricks sowie Praxisbeispiele:
- Allgemeine und Konversionsfunktionen
- Datumsfunktionen
- Numerische Operationen
- Windows: Fenster, GDI (API-Funktionen)
- Windows: Prozesssteuerung
- Formulare, Berichte
- Datenmodell, Tabellen
- Module, Utilities zur Code-Verwaltung
- Anwendungsbeispiele
- Dateien, Verzeichnisse
- Netzwerkfunktionen
- Sonstige Algorithmen
| |
In diesem Buch werden Ihnen anhand anschaulicher Beispiele praxisnahe Lösungsschritte vermittelt.
Von Benno Brudermanns; Rowohlt (1997); Euro 11,50; ISBN: 3499198703 | |
Um das Schließen solcher Formulare durch den Benutzer zu verhindern, brechen Sie einfach das Entladen-Ereignis ab.
Alles was Sie benötigen, ist folgende Ereignisprozedur, die Sie mit der BeimEntladen-Ereigniseigenschaft des betreffenden Formulars verknüpfen:
Private Sub Form_Unload(Cancel As Integer)
Cancel=True
End Sub
Beim Beenden der Datenbank tritt allerdings ein Problem auf: Access muß das Formular auch beim Beenden der Datenbank schließen. Da dies nicht funktioniert, kann die Datenbank nicht geschlossen werden. Zur Lösung dieses Problems legen Sie in einem Standardmodul einfach eine globale Boolean-Variable mit dem Namen SchließenErlaubt an. Vor dem Beenden der Datenbank setzen Sie diese einfach auf den Wert True damit die Datenbank ordnungsgemäß geschlossen werden kann.
Die Ereignisprozedur muß lediglich folgendermaßen ergänzt werden:
Private Sub Form_Unload(Cancel As Integer)
If SchließenErlaubt = False Then
Cancel = True
End If
End Sub
| |
Zu den folgenden Themenbereichen finden Sie Praxisbeispiele:
- Erstellen einer Datenbank
- Erstellen der Tabellen und Felder
- Festlegen der Beziehungen
- Abfragen
- Formulare
- Eigenschaften der Objekte
- Programmierung eines Makros
- Formular im Formular
- Filter
- Umschalten zwischen Formularen
- Das Ausdrucken von Daten-Berichte
- Ein Formular als Startbildschirm
- Abfragearten
- Ex- und Import von Daten
Diese Beispiele dienen Ihnen als Hilfestellung, um Fehler bei der Access-Programmierung zu vermeiden. | |
Der Ausdruck Screen.ActiveForm.hwnd stellt beispielsweise das Handle des aktiven Fensters dar. Das folgende Beispiel übergibt der Funktion GetWindowText das Handle des aktuellen Fensters, um den Fenstertitel zu ermitteln:
Declare Function GetWindowText Lib "user32" Alias _ "GetWindowTextA" (ByVal hwnd As Long, _ ByVal lpString As String, ByVal cch As Long) As Long
Dim ret As Long Dim strFensterText As String, length As Long
strFensterText = String$(50, 0) length = Len(strFensterText)
ret = GetWindowText(Screen.ActiveForm.hwnd, strFensterText, length)
Um das Handle des Hauptfensters von Access zu übergeben, verwenden Sie die Eigenschaft hWndAccessApp des Objekts Application:
ret = GetWindowText(Application.hWndAccessApp, _ strFensterText, length) | |
Vielen Grafik-Funktionen müssen beispielsweise die Koordinaten eines Rechtecks übergeben werden. Diesen Datentyp können Sie in einem Access-Modul wie folgt deklarieren:
Type RECT
Left As Long Top As Long Right As Long Bottom As Long
End Type
Einen Parameter dieses Typs können Sie beispielsweise der API-Funktion GetWindowRect als Referenz (ByRef) übergeben, die die Koordinaten des angegebenen Fensters ermittelt und im RECT-Parameter zurückgibt:
Declare Function GetWindowRect Lib "user32" _ (ByVal hwnd As Long, ByRef lpRect As RECT) As Long
Das Schlüsselwort ByRef können Sie übrigens auch weglassen, denn ByRef ist der Standardwert für alle Parameter. |
| Benutzerdefinierte Datentypen an API-Funktionen übergeben |
|
| |
Es verwendet wieder die Beispiel-Datenbank Nordwind.
Ziehen Sie die Tabellen Kunden, Bestellungen und Bestelldetails in den Abfrageentwurf.
Wählen Sie für das Feld Firma der Tabelle Kunden folgende Einstellungen aus:
Funktion: Gruppierung Kreuztabelle: Zeilenüberschrift
Geben Sie in das nächste Feld folgenden Ausdruck ein:
Expr1: Jahr([Bestelldatum]) & " " & " Bestellsumme pro Jahr"
Wählen Sie für dieses Feld folgende Einstellungen aus:
Funktion: Gruppierung Kreuztabelle: Spaltenüberschrift Geben
Sie in das letzte Feld folgenden Ausdruck ein:
Expr2: Summe(ZCurrency([Einzelpreis]*[Anzahl]*(1-[Rabatt])))
Wählen Sie für dieses Feld folgende Einstellungen aus:
Funktion: Ausdruck Kreuztabelle: Wert | |
Genauso, wie Sie Daten anderer Anwendungen aus der Registratur einlesen und wieder speichern können, so können Sie auch eigene Daten in der Registratur speichern.
Benötigt werden hierzu die beiden API-Funktionen RegCreateKey und RegSetValue.
Die Funktionen werden folgendermaßen deklariert werden:
Declare Function RegCreateKey Lib "advapi32.dll" Alias _ "RegCreateKeyA" (ByVal hKey As Long, _ ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegSetValue Lib "advapi32.dll" Alias _ "RegSetValueExA" (ByVal hKey As Long, _ ByVal lpValueName As String, ByVal Reserved As Long, _ ByVal dwType As Long, lpData As Any, _ ByVal cbData As Long) As Long
Der Funktion RegCreateKey übergeben Sie als Parameter einen neuen Schlüssel der Form
HKEY_CURRENT_USER\Software\[Hersteller]\[Produkt]\[Version]
Anschließend legen Sie diesem Schlüssel mit der Funktion RegSetValue einen Eintragnamen sowie dessen Wert an. Die neuen Daten geben Sie der Registratur frei, indem Sie die Funktion RegCloseKey aufrufen.
Folgendes Beispiel erzeugt einen neuen Schlüssel namens Software\MeineFirma\MeinProgramm\DieVersion, den Eintrag DatenEintrag und einen EintragWert:
Public Function DatenSpeichern()
Dim NeuerSchlüssel As Long
If RegCreateKey(HKEY_CURRENT_USER, _ "Software\MeineFirma\MeinProgramm\DieVersion", _ NeuerSchlüssel) = ERROR_SUCCESS Then
If RegSetValue(NeuerSchlüssel, "DatenEintrag", _ REG_SZ, ByVal "EintragWert", 15) _ = ERROR_SUCCESS Then
Debug.Print "Daten erfolgreich angelegt." Else Debug.Print "Vorgang mißlungen"
End If RegCloseKey NeuerSchlüssel End If End Function | |
| Eine ausführliche FAQ-Datei mit Hinweisen zu weiterführender Literatur, Links, konkreten Problemlösungen und Downloads ab Access 2.0. Außerdem bietet die Firma Beratung zu Auswahl und Einsatz verschiedener Software bis hin zur individuellen Anwendungsentwicklung. | |
| Die deutsche Benutzeroberfläche für die Access 2003 Developer Extensions bietet die Tools und Ressourcen, die Entwickler zum schnellen und problemlosen Erstellen, Testen und Bereitstellen von anspruchsvollen Access-Lösungen benötigen. Die Developer Extensions enthalten ein lizenzfreies Paket mit Access-Lösungen, mit dem die Access-Laufzeit aktiviert wird. Die Developer Extensions enthalten außerdem Tools mit Quellcode zum Erstellen professioneller Setup-Routinen, Lösungen für eine globale Suche nach benutzerdefinierten Zeichenfolgen sowie Lösungen zum Erstellen von Lösungen, aus denen der gesamte Quellcode entfernt wurde. | |
Öffnen Sie zusätzlich zur aktuellen Datenbank die Datenbank, in die Sie ein Objekt kopieren möchten. Platzieren Sie die beiden Accessfenster so, dass beide Datenbankfenster sichtbar sind. Jetzt können Sie beliebig Objekte zwischen den Datenbanken austauschen, indem Sie ein Objekt aus dem einen Datenbankfenster in das andere Datenbankfenster ziehen. Der Kopiervorgang ist in beide Richtungen möglich.
Sie können Objekte auch verschieben. Betätigen Sie dazu beim Ablegen eines Objekts gleichzeitig die SCHIFT-Taste. Aus Sicherheitsgründen wird in der Ursprungsdatenbank vor dem Löschen der Tabelle nachgefragt, ob diese wirklich entfernt werden soll. | |
| Mit dieser kleinen Access 2002/XP-Datenbank ist es möglich Überweisungsvorlagen (DIN-A-4) wie man sie im Schreibwarenladen erhält zu bedrucken. Einfach Auftraggeber- und Empfängerdaten eingeben, Betrag und Verwendungszweck dazu und drucken. WICHTIG: Diese Version bedruckt Vorlagen mit dem DM/Euro-Feld!! ("EUR"-Ausgabe) -> siehe hier Auftraggeber- und Empfängerdaten werden in der Datenbank gespeichert, so dass man wiederkehrende Daten einfach direkt auswählen kann. Durch das Speichern dieser Daten kann man diese Datenbank auch zum Speichern und - wenn notwendig - zum Drucken der Bankverbindungen nutzen. Auch die Überweisungsliste kann gedruckt werden. | |
Der Dateiname und des Verzeichnis, in dem sich die aktuelle Datenbank befindet, sind häufig benötigte Informationen.
Verwenden Sie die Prozedur DateinameZerlegen aus dem vorherigen Tipp, um beide Informationen zu ermitteln.
Den kompletten Dateinamen der Datenbank erhalten Sie über die Name-Eigenschaft der aktuellen Datenbank, wie das folgende Beispiel demonstriert:
Sub Dateiinfo()
Dim Name As String Dim Pfad As String Dim DB As Database Set DB = CurrentDb()
DateinameZerlegen DB.Name, Pfad, Name 'Ergebnis im Testfenster ausgeben Debug.Print Pfad Debug.Print Name
End Sub
Beim Start übergeben Sie der Prozedur den kompletten Namen der Datei inklusive dem Pfad. Außerdem übergeben Sie zwei leere Variablen, die anschließend das Ergebnis aufnehmen. | |
| Der TriniDat Tab-Assistent ermöglicht Ihnen die Einstellung der Tab- bzw. Aktivierungsreihenfolge der Steuerelemente Ihres Formulars. Er erzeugt zu diesem Zweck eine identische Kopie des Formulars, in der alle Steuerelemente durch Schaltfläche ersetzt sind. Durch Anklicken dieser Schaltflächen in der richtigen Reihenfolge ändern Sie die Tab-Reihenfolge nach Ihrem Wunsch. Besonders effektiv ist der Assistent, wenn Sie die Tab-Reihenfolge eines Formulars Spaltenweise setzen möchten.
Vollversion | |
| Wir beraten Sie kompetent in allen Fragen der Konzeption, Entwicklung und Einführung individueller Software zum günstigen Festpreis. Falls Sie einen Kontakt wünschen, klicken Sie Bitte links oben auf Impressum. | |
Berichte in der Seitenansicht lassen sich auf den Bildschirm nur schwer entziffern. Hier kommt es auf den richtigen Einsatz der Zoom-Funktion an.
Verwenden Sie den Menüpunkt Ansicht / Zoom, um eine individuelle Vergrößerung einzustellen.
Als Vergrößerungs- bzw. Verkleinerungsfaktoren stehen hierbei die Menüpunkte 200% bis 10% sowie An Fenster anpassen zur Verfügung. | |
In der Seitenansicht eines Berichts können Sie mit dem Menübefehl Ansicht / Seiten bestimmen, wieviele Seiten auf dem Bildschirm gleichzeitig angezeigt werden. Die Zuordnung und Reihenfolge der dargestellten Seiten übernimmt allerdings Access.
Wenn Sie hier etwas mehr Flexibilität wünschen, verwenden Sie einfach den Menüpunkt. Mehrere Seiten des Kontextmenüs.
Hier können Sie nämlich neben der Anzahl der darzustellenden Seiten auch die Anordnung festlegen. | |
Bei der Eingabe von Texten ist es in vielen Fällen erforderlich, die Anzahl der eingegebenen Buchstaben auf eine bestimmte Anzahl festzulegen.
Um die Textlänge zu prüfen, setzen Sie die Länge-Funktion innerhalb der Gültigkeitsregel-Eigenschaft ein.
Wenn Sie beispielsweise die Länge des Textfeldes Versandkürzel auf drei Zeichen festlegen wollen, geben Sie in die Gültigkeitsregel-Eigenschaft des Textfeldes den folgenden Ausdruck ein:
Genau die gleichen Schritte erledigt die folgende VBA-Prozedur:
Länge([Versandkürzel])=3
Unter Gültigkeitsmeldung geben Sie zusätzlich einen Text ein, der den Benutzer über eine ungültige Eingabe informiert:
Geben Sie bitte genau drei Zeichen ein!
Nach einer Eingabe wird die Gültigkeitsregel beim Verlassen des Textfeldes ausgewertet und ggf. die Fehlermeldung angezeigt. | |
| Mit Access ab Version 95 können Sie synchronisierte Formulare mit dem in Access integrierten Formularassistenten erstellen. Das Geheimnis besteht darin, daß Sie auf der ersten Dialogseite des Assistenten Felder aus mehreren Tabellen oder Abfragen auswählen müssen. Nur dann haben Sie auf der zweiten Dialogseite die Möglichkeit, zwischen einer Kombination aus Haupt- und Unterformular oder zwei verknüpften Formularen zu wählen. | |
| In diesem Artikel wird beschrieben, wie Sie Common Dialog API in Microsoft Office Access 2003 und in Microsoft Office Access 2007 anstelle der Common Dialog Box-Funktionen verwenden, die nur in der Microsoft Office 2000 Developer Edition und in der Microsoft Office XP Developer Edition enthalten sind. | |
| Auf dieser Site gibt es News, Messageboard, Downloads, Mailing Listen, Links etc. | |
Wenn Sie eine Tabelle, eine Abfrage oder ein Formular in der Datenblattansicht öffnen, haben Sie in allen Fällen die Möglichkeit, die Formatierung für jedes Objekt separat zu verändern und zu speichern. Rufen Sie den Menübefehl Format>Felder auf. Mittels des Dialogs Feldformatierungen können Sie für das aktuelle Datenblatt die Hintergrund- und Rasterlinienfarbe sowie einen von drei Spezialeffekten auswählen. Beim Spezialeffekt Flach können Sie zusätzlich entscheiden, ob die vertikalen oder horizontalen Rasterlinien angezeigt werden sollen.
In der Sektion Vorschau des Dialogs können Sie sich vorab ein Bild davon machen, wie das Datenblatt nach der Veränderung aussehen wird. Mit dem Speichern des Datenblattes wird auch die neue Formatierung gespeichert. | |
Jede Audio CD hat eine eindeutige Nummer, über die beispielsweise die CD in der CDDB-Datenbank (www.CDDB.com) registriert ist; Die meisten CD-Player (Software) benutzen diese Funktion, um dem Anwender möglichst bequem die Informationen wie CD-Titel, Interpret und Tracktitel zu liefern. Die Routine GetCDNumber liest diese Nummer aus und gibt sie als INTEGER - Wert zurück. Danach steht sie für eine weitere Bearbeitung (Abfrage an CDDB oder Integration in eine Datenbank) zur Verfügung.
Function GetCDNumber(Drive As String) As String
On Error GoTo CDNum_Err
Dim cdfile As String * 44 Dim i As Integer
If Dir$(Drive & "\Track01.CDA") = "" Then MsgBox "Keine Audio-CD!", 64 Exit Function End If
Open Drive & "\Track01.CDA" For Binary Shared As #1 Get 1, , cdfile
GetCDNumber = Format$(Asc(Mid$(cdfile, 25, 1)), "000") & Format$(Asc(Mid$(cdfile, 26, 1)), "000") Format$(Asc (Mid$(cdfile, 27, 1)), "000")
Close 1
CDNum_Err: If Err = 71 Then If MsgBox("Bitte CD einlegen und Laufwerk schliessen.", 1 + 64) = 1 Then Resume Else CDNum = "" Exit Function End If Else Exit Function End If
End Function | |
Wenn eine Abfrage innerhalb von VBA als SQL-Text vorliegt, und diese mehrmals hintereinander aufgerufen wird, muss Access bei jedem Aufruf eine Übersetzung der SQL-Anweisungen vornehmen. Dies kostet natürlich Zeit.
Um eine temporäre Abfrage mit Hilfe der CreateQueryDef-Abfrage anzulegen, geben Sie einfach keinen Namen an. Die Abfrage wird dadurch nicht gespeichert, was die Performance weiter erhöht.
Der folgende Programmausschnitt legt eine solche temporäre Abfrage an:
Dim Abfrage As QueryDef Dim DB As Database
Set DB = CurrentDb Set Abfrage = DB.CreateQueryDef("", "DELETE * FROM Adressen") Abfrage.Execute
Wichtig: Wenn Sie diesen Tipp mit Access 2000 oder höher einsetzen möchten, müssen Sie vorher die "Microsoft DAO 3.x Object Library" einbinden. Öffnen Sie zu diesem Zweck ein beliebiges VBA-Modul und wählen Sie den Menüpunkt Extras/Verweise aus. Anschließend kreuzen Sie den Eintrag "Microsoft DAO 3.x Object Library" an, wobei das "x" für eine Versionsnummer zwischen 0 und 6 steht. | |
Um diese Probleme zu verhindern ist es sehr wichtig, dass Sie den Standarddrucker aktivieren und den Bericht dann abspeichern. Diese Einstellung wird dann im Bericht mitgespeichert und beim Öffnen des Berichtesautomatisch aktiviert.
Um den Standarddrucker als Voreinstellung zu aktivieren, gehen sie wie folgt vor:
- Öffnen Sie den Bericht in der Entwurfsansicht
- Wählen Sie den Menübefehl Datei>Seite einrichten aus
- Klicken Sie die Registerkarte Seite an
- Wählen Sie die Option Standarddrucker aus und klicken Sie auf OK
- Speichern Sie den Bericht ab
| |
| Mit TriniDat Adressen 95 und TriniDat Adressen 97 verwalten Sie Firmen, Gruppen und Personen mit mehreren Anschriften und beliebig vielen Kommunikationsarten (Telefon, Telefax, e-Mail, usw.). Sie können die Beziehungen zwischen Firmen, Gruppen und Personen einfach und schnell in Ihrer Datenbank abbilden. Darüber hinaus verwaltet Adressen vergangenheits- und zukunftsbezogene Aktivitäten inkl. ToDo-Liste und Historie-Funktion. Ein besonderes Highlight sind die Funktionen zum Schreiben von Briefen. Damit erledigen Sie Ihre Korrespondenz im Handumdrehen. Natürlich ist auch eine Anbindung an Microsoft Word vorhanden. | |
Im Tipp "Abfrage mit Forderungen" haben Sie eine Abfrage entwickelt, mit der Sie die Forderungen aus einer Rechnungstabelle ermitteln. Für die Finanzplanung sind aber nicht nur Forderungen, sondern zusätzlich auch geplante Zahlungseingänge interessant.
Es handelt sich hierbei um zu erwartende Zahlungseingänge, für die Sie noch keine Rechnung geschrieben haben. Da es sich hierbei nicht um Rechnungen im eigentlichen Sinne, sondern eher um Projekte handelt, basiert das folgende Beispiel auf einer Projekttabelle.
Um alle geplanten Zahlungseingänge abzufragen, erweitern Sie die Abfrage für Forderungen um eine zusätzliche Kriterien-Zeile.
Zu den geplanten Zahlungseingängen gehören zunächst einmal alle Forderungen. Es bietet sich daher an, die neue Abfrage auf der Abfrage für Forderungen basieren zu lassen. Öffnen Sie diese Abfrage, und wählen Sie den Befehl Datei>Speichern unter aus der Menüzeile. Geben Sie beispielsweise Geplante Zahlungseingänge als neuen Namen ein. Ersetzen Sie dann die Rechnungs- durch die Projekttabelle.
Neben den Forderungen muss die Abfrage zusätzlich solche Projekte berücksichtigen, die bereits abgegeben aber noch nicht berechnet wurden. Es handelt sich folglich um eine Oder-Verknüpfung von zwei Kriterien, denen für Forderungen und denen für nicht berechnete Projekte.
Um diesen Zusammenhang umzusetzen, klicken Sie in der Zeile oder des Abfrageentwurfs, und geben Sie folgende Kriterien ein:
| Spalte |
Krtiterium |
| Abgabedatum |
Ist Nicht Null |
| Rechnungsdatum |
Ist Null |
Wenn Sie die Abfrage nun ausführen, zeigt das Datenblatt sowohl Forderungen als auch abgegebene aber nicht berechnete Projekte an.
Für die Anzeige des Abfrageergebnisses ist ein tabellarisches Formular gut geeignet, das Sie per Assistent erstellen. Ordnen Sie im Formularfuß dieses Formulars ein ungebundenes Steuerelement mit dem Ausdruck
=Summe([Nettobetrag])
an, um Ihre geplanten Zahlungseingänge aufzusummieren.
SELECT RechnungsNr FROM tblRechnungen WHERE (Rechnungsdatum Is Not Null AND Zahlungsdatum Is Null) OR (Abgabedatum Is Not Null AND Rechnungsdatum Is Null); | |
Wertelisten sind für feste Werte, die nur selten ergänzt oder geändert werden, vollkommen ausreichend. Ein Beispiel für eine Werteliste ist der Mehrwertsteuersatz. Sobald aber umfangreiche Listen im Kombinationsfeld zur Auswahl bereitgestellt werden sollen, die wohlmöglich noch nach Kriterien gefiltert und sortiert sein sollen, sind Wertelisten unbrauchbar.
Verwenden Sie eine Tabelle oder das Ergebnis einer Abfrage als Datensatzherkunft für ein Kombinationsfeld.
Wählen Sie als Herkunftstyp im Register "Nachschlagen" den Eintrag "Tabelle/ Abfrage" aus. Wenn Sie jetzt das Kombinationsfeld der Eigenschaft "Datensatzherkunft" aufklappen, werden dort alle in der Datenbank vorhandenen Tabellen und Abfragen aufgeführt, von denen Sie eine auswählen können. Sie können aber auch über die Assistentenschaltfläche den Abfrageentwurf starten und eine neu, genau auf das Problem abgestimmte Abfrage erzeugen. Wenn Sie diese Abfrage speichern, wird der Name der Abfrage in der Datensatzherkunft eingetragen.
Die übrigen Eigenschaften, wie "Spaltenanzahl", "Gebundene Spalten" usw. sind, wie im vorangegangenen Tipp (Mehrspaltige Wertelisten), bei einer Werteliste zu handhaben.
********************************************************************************** Auch in diesem Fall können Sie wieder ein Listenfeld als Steuer-Element auswählen. Die Einschränkungen sind die gleichen, wie bei den Wertelisten. ********************************************************************************** | |
Beim relationen Datenbankentwurf sollten alle Informationen so weit wie möglich aufgeteilt werden, damit jedes Feld nur Informationen zu einem einzigen Gegenstand enthält. Ein typischer Verstoß gegen diese Regel ist die Erfassung von Postleitzahl und Ort in einem einzigen Feld. Nach einem umfangreichen Datenimport können Sie also mit einem solchen Problem gegenüberstehen.
Trennen Sie nicht zusammengehörende Feldinhalte mit Hilfe einer Aktualisierungsabfrage auf.
Abbildung 1 unten zeigt solch ein Beispiel.
Dieses Beispiel ist noch relativ einfach zu lösen, weil Sie es hier mit einer festen Anzahl von Zeichen zu tun haben: fünf Zeichen für eine deutsche Postleitzahl. Gehen Sie wie folgt vor.
Legen Sie in der Tabelle die beiden Felder Plz und Ort zur Speicherung der getrennten Feldinhalte an.
Erstellen Sie eine Aktualisierungsabfrage und stellen Sie für die Felder Plz und Ort im Feld Aktualisieren folgende Eigenschaften ein:
Links([PlzUndOrt];5) Teil([PlzUndOrt];7)
Die Funktion Links bzw. Left gibt die ersten fünf und die Funktion Teil bzw. Mid gibt alle Zeichen ab dem siebten Zeichen zurück.
Führen Sie die Abfrage aus. Überprüfen Sie das Ergebnis und löschen Sie anschließend das nun nicht mehr benötigte Feld PlzUndOrt. | |
Bei der Fehlersuche in Programmen ist es oftmals wichtig zu wissen, von welcher Prozedur aus die aktuelle Prozedur (die eventuelle einen Laufzeitfehler ausgelöst hat) aufgerufen wurde.
Die Informationen zu den aktuellen Prozeduraufrufen entnehmen Sie dem Dialogfenster Extras / Aufrufe.
In diesem Dialogfenster werden alle Prozeduren aufgelistet, die letztendlich zum Start der Prozedur geführt haben. Beachten Sie, dass der Menüpunkt nur im Debug-Modus (also beispielsweise nach dem Auftreten eines Laufzeitfehlers) verfügbar ist. | |
Wir suchen nach der Eigenschaft, die Feldbeschreibungen (Deskription) von Access-Tabellenfeldern per Programm auslesen kann. Feldnamen, Typen oder Längen können problemlos ausgelesen werden.
TabName.Fields(i).Description
funktioniert nicht. | Die Description-Eigenschaft lässt sich nur über die Property-Auflistung eines Feldes ermitteln. Der folgende VBA-Code enthält ein einfaches Beispiel, das Sie aus dem Debug-Fenster von Access starten können:
Public Sub test1()
Dim PropertyCounter As Integer Dim FieldCounter As Integer Dim tdf As DAO.TableDef Dim fld As DAO.Field Dim dbs As Database
Set dbs = CurrentDb Set tdf = dbs.TableDefs("tblTabellenname")
For FieldCounter = 0 To tdf.Fields.Count - 1 Set fld = tdf.Fields(FieldCounter) For PropertyCounter = 0 To tdf.Fields(FieldCounter).Properties.Count - 1 If tdf.Fields(FieldCounter).Properties(PropertyCounter).Name="Description" Then
Debug.Print "Description: ", PropertyCounter, _ tdf.Fields(FieldCounter).Properties(PropertyCounter).Name, _ tdf.Fields(FieldCounter).Properties(PropertyCounter).Value
End If
Next PropertyCounter Next FieldCounter
End Sub
|
| Diese Site enthält Infos rund um das Thema Access mit einigen Links, Code Beispielen u.v.m. | |
Berichte mit vielen Spalten bieten oftmals nicht genügend Platz für die einzelnen Spaltenüberschriften.
Abhilfe schaffen hier vertikale Spaltenüberschriften.
Zur Anzeige der vertikalen Texte eignet sich ein OLE-Objekt der Tabellenkalkulation Excel besonders gut, da Excel die Ausgabe vertikaler Texte generell unterstützt.
Nach dem Start von Excel schreibe Sie die einzelnen Spaltenüberschriften nebeneinander in die erste Zeile des Arbeistblattes und markieren diese. Im Register "Ausrichtung" des Dialogfensters "Format" > "Zellen" können Sie nun insgesamt zwischen drei vertikalen Textausrichtungen wählen. Am besten geeignet ist die mittlere Option. Nach dem Sie Ihre Auswahl mit "ok" bestätigt haben, wird der vertikale Text im Arbeitsblatt angezeigt.
Nun passen Sie die Spaltenbreite optimal an Ihre Überschriften an. Anschliessend markieren Sie diese und kopieren sie in die Zwischenablage. Aus der Zwischenablage können Sie die Spaltenüberschriften nun in einen beliebigen Bericht (oder auch in ein Formular) einfügen. | |
Ich möchte an eine vorhandene Tabelle leere Datensätze anfügen.
Ein Beispiel: Der letzte Datensatz hat die ID 1202 daran sollen 800 Datensätze angehängt werden. Der letzte Datensatz sollte also die ID 2002 haben und die andern Felder, wie z.B "Name" sollen leer bleiben.
Wie lässt sich dieses Problem mit einer Schleifenfunktion in VB realisieren? | Sie können eine Anfügeabfrage 800 mal ausführen:
For I = 1 TO 800
CurrentDB.Execute("INSERT ...")
Next I |
| Eine Site mit vielen Tipps, News, Downloads und einem Forum u.a. zu VB. Der Gratis-Newsletter kommt 2mal im Monat heraus, mit News, Buchvorstellungen und Schnäppchen, inkl. einem extra VB-Tipp. Ältere Ausgaben lagern im Newsarchiv. | |
Mit Firmenlogos und persönlichen Briefköpfen geben Sie Ihren Berichten den letzten Schliff. Wenn Sie nachträglich einmal eine Änderung vornehmen müssen, kann das Anpassen aller Berichte allerdings eine mühselige Aufgabe werden.
Verwenden Sie in diesem Fall einen Unterbericht, um ein Firmenlogo in mehrere Berichte einzufügen.
Platzieren Sie zu diesem Zweck alle Elemente des Firmenlogos wie beispielsweise Grafiken oder Texte im Detailbereich eines neuen Berichts. Die Fuß- und Kopfbereiche deaktivieren Sie.
Speichern Sie den Bericht unter dem Namen Logo und fügen Sie ihn als Unterbericht in die gewünschten Berichte ein. Anschließend ändern Sie noch die Rahmenart-Eigenschaft in Transparent ab, damit der Unterbericht nicht als solcher zu erkennen ist.
Bei Änderungen müssen Sie von nun an ausschließlich den Logo-Bericht anpassen. | |
In einigen Fällen macht sich beim Öffnen eines formularbasierten Filters eine deutliche Zeitverzögerung bemerkbar. Der Grund dafür ist, dass Access zu jedem Feld einer Liste mit allen verfügbaren Eingaben füllt.
Sollte die Performance eines formularbasierten Filters zu schlecht sein, schränken Sie das Füllen der Listen- und Kombinationsfelder ein.
Im Register Bearbeiten/Suchen des Dialogfenster Extras>Optionen können Sie zu diesem Zweck folgende globale Einstellungen vornehmen
- Deaktivieren Sie das Kontrollkästchen Lokalen nicht-indizierten Feldern. Die betreffenden Listen werden dadurch nur dann gefüllt, wenn Sie an indizierte Datenfelder gebunden sind.
- Reduzieren Sie den Wert im Feld Keine Liste anzeigen, wenn mehr als diese Anzahl Zeilen gelesen wird. Dadurch bricht Access das Füllen der Listen bei Erreichen der angegebenen Datensatzanzahl ab.
In der Entwurfsansicht von Formularen können Sie zusätzlich für jedes Feld individuelle Einstellungen treffen. Wenn Sie das Füllen der Liste für ein spezielles Feld verhindern möchten, stellen Sie einfach die Filter anwenden-Eigenschaft auf Nie ein. | |
| Office 97 SR-2b ist ein kostenloses Update für Office 97, das eine Reihe aktueller Problembehebungen enthält. Damit soll Kunden die Bereitstellung von Office 97 weiter erleichtert werden. Service Release 2b mit umfangreichen Bugfix. | |
Die relationale Datenbank Access bietet eine nahezu unüberschaubare Fülle an Möglichkeiten. Das Einsteigerseminar ermöglicht Ihnen einen Einblick in die Funktionsvielfalt dieses Datenbankprogramms.
Anhand zahlreicher Praxisbeispiele werden Sie Schritt für Schritt in die Arbeit mit der neuen Access-Version 2002 eingeführt. Sie erfahren alles Wissenswerte, um eigene Datenbanken zu erstellen und Daten in strukturierter Form zu verwalten, aufzubewahren und auszuwerten. Darüber hinaus werden auch anspruchsvollere Themen wie die Erstellung von Makros und der Datenaustausch mit anderen Office-Programmen behandelt. Am Ende jedes Kapitels finden Sie zudem eine kurze Zusammenfassung und Übungsaufgaben, mit denen Sie das Erlernte sofort überprüfen können.
Von Winfried Seimert;vmi-Buch, Berlin (Juni 2001); Euro 9,95; ISBN: 3826671554 | |
In einer Abfrage sollen alle Datensätze zwischen zwei bestimmten Tagen angezeigt werden. Diese Abfrage funktioniert schon. Diese Abfrage soll in einer Kreuztabelle dargestellt werden. Beim Aufrufen der Kreuztabelle wird eine Meldung angezeigt, dass das "Microsoft Jet Modul" die "Datumsfelder" nicht als "gültigen Feldnamen oder -ausdruck" erkennt.
Woran kann das liegen und was kann ich dagegen machen? | Probieren Sie einmal, die Datumsangaben mit Hilfe der Format-Funktion in einen Text umzuwandeln. Danach sollte die Kreuztabelle funktionieren. |
| LiteRat ist eine kostenlose wissenschaftliche Literaturverwaltung, die für Studierende und Dozenten gleichermaßen geeignet ist.
Zur Verfügung gestellt von der Philosophischen Fakultät der Universität Düsseldorf. | |
Um dieses Problem zu beheben, müssen Sie entweder die fehlerhafte Zeile im Code-Fenster korrigieren und den Programmablauf fortsetzen, oder den Programmablauf beenden.
Letzteres erledigen Sie mit dem Menübefehl Ausführen>Beenden, oder mit dem entsprechenden Symbol auf der Symbolleiste. Das Formular sollte jetzt wieder aktiviert werden können. | |
| Ich möchte z.B. für die Unterstützung eines sportlichen Wettkampfes Access nutzen. In allen Bereichen bis auf die Erstellung von Ranglisten ergeben sich keine Probleme, die nicht schon gelöst wären. Nehmen wir ein einfaches Beispiel, einen Hochsprung-Wettbewerb. Ich habe 5 Teilnehmer mit Namen, Startnummern und gesprungener Höhe in der Datenbank und will nun via Report eine Rangliste erstellen. Zwei Punkte werfen immer wieder Fragen auf: Automatische Generierung des Ranges, Behandlung zweier ranggleicher Teilnehmer (z.B. beide im 2. Rang, wobei der nächste nicht im 3. sondern im 4. Rang ist). | Die ZLong-Funktion (CLng in VBA) kann Null-Werte nicht konvertieren und löst stattdessen einen Fehler aus. Setzen Sie daher besser die Nz-Funktion ein, um gegen das Auftreten von Null-Werten Vorsorge zu treffen:
=(ZLong(Nz(([Menge]*[Preis]);0)*20)/20)
Das Ergebnis dieser Funktion ist 0, wenn entweder das Feld Menge oder das Feld Preis den Wert Null enthält. |
Anhand zahlreicher Praxisbeispiele wird der Leser Schritt für Schritt in die Arbeit mit der neuen Access-Version 2003 eingeführt. Er erfährt alles Wissenswerte, um eigene Datenbanken zu erstellen und Daten in strukturierter Form zu verwalten, aufzubewahren und auszuwerten.
Darüber hinaus werden auch anspruchsvollere Themen wie die Erstellung von Makros und der Datenaustausch mit anderen Office-Programmen behandelt. Am Ende jedes Kapitels befinden sich zudem eine kurze Zusammenfassung und Übungsaufgaben, mit denen das Erlernte sofort überprüft werden kann.
Von Winfried Seimert; Vmi Buch (2004); Euro 9,95; ISBN: 3826672720 | |
Einige API-Funktionen verlangen einen NULL-Zeiger als Parameter, den VBA allerdings nicht zur Verfügung stellt. Diese Art Parameter darf leider nicht durch einen einfachen leeren String ("") ersetzt werden, denn ein leerer String ist lediglich ein gültiger Wert vom Typ String.
Um einen NULL-Zeiger zu übergeben, deklarieren Sie zunächst die Funktion mit einem ByVal-Parameter vom Typ Long bzw. Any. Als Funktionargument geben Sie dann ByVal 0& bzw. die VBA-Konstante vbNullString an.
Der API-Funktion MessageBox übergeben Sie beispielsweise einen NULL-Wert als erstes Parameter, wenn das Meldungfenster keinem aktiven Fenster zugeordnet werden soll:
Declare Function MessageBox Lib "user32" _ Alias "MessageBoxA" (ByVal hwnd As Any, _ ByVal lpText As String, ByVal lpCaption As String, _ ByVal wType As Long) As Long
Dim ret As Long ret = MessageBox(vbNullString, "Guten Morgen!", "Testmeldung!", 0)
| |
Ich bin Vogelzüchter und möchte mir gern ein Auswertungsprogramm erstellen.
Bin auch schon sehr weit, aber jetzt hänge ich fest. Es gibt bei einer Ausstellung viele Züchter:
Diese Züchter können viele Vögel Bewerten lasse. Jeder Vogel bekommt eine Punktzahl. Ich brauche aber nur die besten vier Vögel eines Züchters. Ich habe schon Sortiert nach Punktzahl und Gruppen, kann aber weder bei der Abfrage noch im Bericht nur die vier besten Datensätze eines Züchters anzeigen.
Wie kann ich dieses Problem beheben? | Zur Lösung Dieses Problems können Sie das TOP-Schlüsselwort der SELECT-Anweisung einsetzen.
Ein Beispiel:
SELECT TOP 4 * FROM tblVögel ORDER BY PunkteAnzahl DESC
Mit dieser Abfrage erhalten Sie die Vögel mit den vier höchsten Punktezahlen. Wenn Sie kein DESC angeben, erhalten die die vier schlechtesten Vögel. |
Sie aktivieren den Objektkatalog von jedem beliebigen Modulfenster aus über den Menüpunkt Ansicht / Objektkatalog (F2-Taste). Im oberen Kombinationsfeld wählen Sie anschließend den Eintrag Access aus. Sofort darauf werden in der rechten Liste alle Objekt aufgelistet, die Access zur Verfügung stellt.
Klicken Sie hier beispielsweise auf das DoCmd-Objekt, um die einzelnen Methoden in der rechten Liste zu begutachten. Hier können Sie nun eine beliebige Methode markieren, zu der Access im unteren Teil des Objektkatalogs die komplette Syntax inklusive den Argumentnamen anzeigt.
| |
Abfragen können nicht nur zum Ausfindigmachen von Informationen genutzt werden, sondern auch dazu, um Lücken im Datenbestand zu ermitteln. In einer Adreßverwaltung haben Sie sicherlich nicht zu jeder Person das Geburtsdatum gespeichert? Sie würden aber gerne heraus bekommen, von wem Sie das Datum nicht wissen, ohne die ganze Tabelle durchzugehen. Erstellen Sie eine Abfrage, die nach leeren Datenfeldern sucht.
Genau für diesen Zweck gibt es den Ist Null-Ausdruck. Fügen Sie das Feld, das Sie überprüfen wollen im Entwurfsraster ein und geben Sie als KriteriumMit dem Zwischen-Operator können Sie einen Wertebereich festlegen.
Mit Hilfe der Vergleichsoperatoren wie größer, kleiner, gleich, ungleich usw. können Sie gezielt Wertebereiche einschränken, wenn Sie diese in Kriterien verwenden. Um einen Bereich mit einer oberen und einer unteren Grenze einzuschränken, wählen Sie normalerweise ein Größerzeichen und ein Kleinerzeichen, kombiniert mit einem Und. Verwenden Sie den Zwischen-Operator, um einen Wertebereich festzusetzen.
Anstelle der Zeile
>=#01.12.00# Und <=#01.03.01#
können Sie das folgende Kriterium verwenden:
Zwischen #01.12.00# Und #01.03.01#
Die Bedeutung der beiden Zeilen ist die gleiche. Die Verwendung des Zwischen-Operators entspricht allerdings dem normalen Sprachgebrauch und lässt sich deshalb besser anwenden und verstehen. | |
Das Access Konverter Add-in ist speziell für die Organisationen von Access Anwendungen entworfen wurden und ist Ihnen beim konvertieren von Access nach Java behilflich, wobei Berichte in Crystal Reports umgesetzt werden. | |
Informationen zu Access 2003
Access 2003 ist die neueste Version des relationalen Datenbankmanagementprogramms zur Speicherung und Abfrage umfangreicher Datenmengen. Mit Access 2003 können Sie u. a. Daten auch mit Microsoft Windows® SharePoint™ Services bearbeiten, die Vorteile der erweiterten XML-Unterstützung nutzen und Smarttags zu Formularen und Berichten hinzufügen.
Erfahren Sie, wie leicht das Update auszuführen ist, und lesen Sie Informationen zu neuen Sicherheitsfeatures. | |
Grundsätzlich gilt für Abfragen:
Bei der Erstellung werden die Einstellungen der zugrunde liegenden Tabellen übernommen.
Es ist allerdings möglich, diese Einstellungen im Abfrageentwurf zu verändern, in dem im Dialogfenster Eigenschaften der betreffenden Spalte ein anderes Format für das Ausgabefeld ausgewählt wird.
Es bleibt Ihnen also nichts anderes übrig, als Ihre Abfragen auf solche Felder hin zu überprüfen und eventuell anzupassen.
| |
Manchmal ist es von Interesse die Feldnamen einer Tabelle auszulesen. Mit nachfolgender Funktion ist dies möglich; sie gibt als Ergebnis die Stelle des Feldes sowie den Feldnamen zurück.
Public Function OPTabFeldnamen(ByVal OPTable) As String
Dim x Dim meldung As String
For x = 0 To CurrentDb.TableDefs(OPTable).Fields.Count - 1
MsgBox CurrentDb.TableDefs(OPTable).Fields(x).Name
meldung = meldung & "Field Number: " & x & " Name: " & _ CurrentDb.TableDefs(OPTable).Fields(x).Name & Chr(10) & Chr(13)
Next
MsgBox meldung
End Function
SYNTAX: OPTabFeldnamen("Tabellenname") | |
Access stellt zwar eine Möglichkeit zur Verfügung, eine Formular auf den Drucker auszugeben; wenn das Aussehen aber nicht 100%ig dem gewünschten Ausdruck entspricht, ist trotzdem ein Bericht erforderlich.
Speichern Sie das Formular in diesem Fall einfach als Bericht.
Markieren Sie zu diesem Zweck das gewünschte Formular im Datenbankfenster und wählen Sie aus dem Kontextmenü den Befehl. Als Bericht speichern aus (Access 97). Unter Access 2000 bzw. XP wählen Sie aus dem Kontextmenü den Befehl Speichern unter und im nachfolgenden Dialogfenster als Bericht aus.
Nach der Eingabe des Berichtsnamens können Sie den neuen Bericht nach Ihren Wünschen anpassen.
| |
In einem Access-Bericht werden meine Feldinhalte in jeweils zwei Zeilen ausgegeben. In der zweiten Zeile steht nur ein Feld (OLE-Objekt), das aber bei manchen Datensätzen leer ist.
Wie kann ich die Ausgabe der leeren Objekte im Bericht verhindern, wobei die entsprechenden Datensätze dann nur eine Zeile benötigen sollen? | Die leeren OLE-Felder können Sie einfach aus Ihrem Abfrage-Resultat weglassen, indem Sie Kriterien auf das Feld setzen.
In der Abfrage-Definition setzen Sie die Kriterien auf Ist Nicht Null im OLE-Feld. |
Die Access 2003 Developer Extensions bietet die Tools und Ressourcen, die Entwickler zum schnellen und problemlosen Erstellen, Testen und Bereitstellen von anspruchsvollen Access-Lösungen benötigen. Die Developer Extensions enthalten ein lizenzfreies Paket mit Access-Lösungen, mit dem die Access-Laufzeit aktiviert wird. Die Developer Extensions enthalten außerdem Tools mit Quellcode zum Erstellen professioneller Setup-Routinen, Lösungen für eine globale Suche nach benutzerdefinierten Zeichenfolgen sowie Lösungen zum Erstellen von Lösungen, aus denen der gesamte Quellcode entfernt wurde. | |
Drei Bücher im Paket:
1) Das Nachschlagewerk 2) Das Programmierbuch 3) Referenz für Anwender und Programmierer.
Für Datenbank-Entwickler und solche die es werden wollen. Auf der beigefügten CD finden Sie alle Beispiele und wertvolle Tools.
Von Manfred Hoffbauer und Christoph Spielmann; Sybex (1999); Euro 65,95; ISBN: 3815502918 | |
Wichtige Daten verdienen natürlich besondere Aufmerksamkeit.
Um bestimmte Daten hervorzuheben, invertieren Sie einfach die Vorder- und Hintergrundfarbe des Feldes.
Ein Textfeld mit schwarzer Schrift auf weißem Hintergrund würde nach der Invertierung also mit weißer Schrift auf schwarzem Hintergrund erscheinen.
Die folgende Beim Formatieren-Ereignisprozedur des Detailbereichs eines Berichts wertet das Feld Anzahl aus und invertiert es, wenn der Wert 0 oder negativ ist:
Const vbSchwarz = 0 Const vbWeiss = 16777215
Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)
' Wenn weniger als 1 Artikel bestellt wurde, ' dann die Anzahl mit weiß auf schwarz drucken If Me!Anzahl <= 0 Then Me!Anzahl.BackColor = vbSchwarz Me!Anzahl.ForeColor = vbWeiss Else Me!Anzahl.BackColor = vbWeiss Me!Anzahl.ForeColor = vbSchwarz End If
End Sub
Damit die Hintergrundfarbe sichtbar wird, stellen Sie sicher, dass die Eigenschaft Hintergrundart des Textfeldes auf Normal gesetzt ist.
Steht Ihnen ein Farbdrucker zur Verfügung, können Sie anstelle des schwarzen Hintergrunds natürlich auch jede andere Farbe einsetzen (z.B. rot). Achten Sie nur darauf, dass Sie für positive Werte die üblichen Farbwerte wiederherstellen, damit Access nicht alle restlichen Datensätze ebenfalls hervorgehoben darstellt.
| |
Ich möchte ein OLE-Feld in einem Formular so gestalten, dass niemand den sensiblen Inhalt in die Zwischenablage kopieren kann.
Geht das irgendwie? | Um das Kopieren des OLE-Feldes zu verhindern, setzen Sie folgende Eigenschaften des Steuerelements:
Aktiviert: Nein Gesperrt: Ja
Diese Eigenschaften sperren das OLE-Feld, so dass auf den Inhalt nicht zugegriffen werden kann. |
Tabellenfelder sind normalerweise Eingabefelder, in die Sie Werte eingeben müssen. Wenn diese Werte aber aus einer Werteliste stammen, ist die Eingabe über ein Kombinationsfeld, in dem die möglichen Werte vorgegeben und nur noch ausgewählt werden müssen, wesentlich einfacher. Solche Kombinationsfelder werden üblicherweise in Formularen erstellt, deren Inhalt dann in einem Datenfeld der Tabelle gespeichert wird. Wenn Sie aber das Datenblatt der Tabelle öffnen, haben Sie das Kombinationsfeld nicht zur Verfügung. Dem kann Abhilfe geschaffen werden.
Definieren Sie für ein Datenfeld beim Tabellenentwurf eine Werteliste. Auf diese Weise können Sie auch im Datenblatt die Tabelle der Werte komfortabel auswählen.
Ein weiterer Pluspunkt für eine solche Definition ist, dass Sie in Formularen kein zusätzliches Kombinationsfeld erzeugen müssen. Wenn Sie das Datenfeld einem Formular hinzufügen, wird automatisch ein Kombinationsfeld angezeigt.
Um eine Werteliste für ein Datenfeld anzulegen, markieren Sie das Datenfeld und klicken auf das Register "Nachschlagen". Bei der Eigenschaft "Steuerelement Anzeigen" wählen Sie den Eintrag "Kombinationsfeld" aus, im darunter liegenden Feld "Herkunftstyp" den Eintrag "Werteliste".
Sie können jetzt die Werte, die im Kombinationsfeld zur Auswahl stehen sollen, eingeben. Die Werte müssen durch Semikolon getrennt werden. Die Werteliste hat also die Form
Wert1; Wert2; Wert3;...; Wert n
In den Feldern "Spaltenbreite" und "Listenbreite" können Sie die für Ihre Werte passenden Zahlen angeben. Die Maßeinheit ist in diesem Fall "cm". | |
Wenn Sie schon einmal eine Adresse in die Zwischenablage befördert und von hier aus in ein Textdokument eingefügt haben, dürften Sie sich wahrscheinlich auch schon einmal über die schlechte Funktionalität des Menüpunkts Bearbeiten/Kopieren geärgert haben. Es ist nämlich nur möglich, entweder einen einzelnen Feldinhalt oder gleich einen kompletten Datensatz (mit allen für die Adresse überflüssigen Feldern) in die Zwischenablage zu kopieren.
Für den Assistenten benötigen Sie zunächst einmal ein neues leeres Formular mit dem Namen Zwischenablage-Assistent. Platzieren Sie auf der linken Seite ein Listenfeld namens lstFeldliste und rechts daneben ein etwa gleich großes Textfeld mit dem Namen txtText. Unterhalb beider Steuerelemente ordnen Sie dann noch zwei Schaltflächen mit den Namen btnOK und btnAbbrechen an.
Um dem Formular ein für Dialogfenster typisches Aussehen zu verleihen, stellen Sie folgende Formulareigenschaften entsprechend ein:
| Eigenschaft |
Einstellungen |
| Standard-Ansicht |
Einzelnes Formular |
| Bildlaufleisten |
Nein |
| Datensatzmarkierer |
Nein |
| Navigationsschaltflächen |
Nein |
| Rahmenart |
Dialog |
| Beschriftung |
Zwischenablage-Assistent |
Die linke Liste des Formulars soll die Namen aller Felder eines bestimmten Formulars auflisten. Stellen Sie zu diesem Zweck die HerkunftsTyp-Eigenschaften des Steuerelements lstFeldliste auf Feldliste ein. Auf welches Formular der Assistent beim Füllen der Liste zurückgreift, wird mittels einer VBA-Ereignisprozedur festgelegt, die Sie für die BeimÖffnen-Ereigniseigenschaft anlegen. Die Prozedur enthält lediglich die folgende Anweisung:
Me!lstFeldliste.RowSource = Forms(OpenArgs).RecordSource
Bei Start des Assistenten wird der Name des betreffenden Formulars als Öffnungsargument OpenArgs übergeben. Die obige Anweisung liest nun die Datenquelle des Formulars aus und weist sie der RowSource-Eigenschaft des Listenfeldes zu. Da die HerkunftsTyp-Eigenschaft auf Feldliste eingestellt ist, werden hier keine Datensätze, sondern lediglich die Feldnamen der Datenquelle aufgelistet.
Um den Benutzer des Assistenten die Möglichkeit zu geben, bestimmte Feldinhalte auzuwählen, soll er mit einem Doppelklick auf einen Feldnamen den aktuellen Feldinhalt in das rechte Textfeld befördern. Dies erledigt eine zweite Ereignisprozedur, die mit der BeimDoppelklicken-Eigenschaft der Feldliste verknüpft ist:
Private Sub lstFeldliste_DblClick(Cancel As Integer)
Dim Feldname As String Dim Feldinhalt As Variant
Feldname = Me!lstFeldliste Feldinhalt = Forms(OpenArgs)(Feldname)
If IsNull(Feldinhalt) Then Beep MsgBox "Das ausgewählte Feld hat keinen Inhalt!" Else If Not IsNull(Me!txtText) Then Me!txtText = Me!txtText & vbCrLf & Feldinhalt Else Me!txtText = Feldinhalt End If End If
End Sub
Die Prozedur ermittelt den Namen des angeklickten Datenfeldes und fügt ihn zusammen mit einem Zeilenumbruch (Konstante vbCrLf) dem Textfeld hinzu.
Nachdem der Benutzer mehrere Feldinhalte auf diese Weise übernommen hat, muss der Inhalt des Textfeldes in die Zwischenablage kopiert werden. Dafür ist die BeimKlicken-Ereignisprozedur der OK-Schaltfläche zuständig:
Private Sub btnOk_Click()
Me!txtText.SetFocus
'Text markieren SendKeys "^{HOME}" SendKeys "+^{END}"
'Bearbeiten>Kopieren auswählen DoCmd.DoMenuItem acFormBar, acEditMenu _ ,acCopy, , acMenuVer70
DoCmd.Close
End Sub
Die Ereignisprozedur der Abbrechen-Schaltfläche enthält nur eine einzelne Anweisung:
Private Sub btnAbbrechen_Click()
DoCmd.Close
End Sub
Der Start des Zwischenablage-Assistenten erfolgt über die DoCmd.OpenForm-Methode:
DoCmd.OpenForm FormName:="Zwischenablage-Assistent" _ ,WindowMode:=acDialog _ ,OpenArgs:=Screen.ActiveForm.Name
Der Ausdruck übergibt dem Zwischenablage-Assistenten direkt den Namen des momentan aktiven Formulars. Sollte kein Formular aktiv sein, tritt hierbei allerdings ein Laufzeitfehler auf. Die folgende Prozedur zeigt, wie Sie Ihn abfangen können. Zusätzlich wird auch gleich der Datensatz des aktuellen Formulars gespeichert, damit der Assistent stets auf die aktuellen Daten zugreift:
Sub ZwischenablageKopieren()
On Error Resume Next
DoCmd.DoMenuItem acFormBar, acRecordsMenu _ ,acSaveRecord, , acMenuVer70
DoCmd.OpenForm FormName:="Zwischenablage-Assistent" _ ,WindowMode:=acDialog _ ,OpenArgs:=Screen.ActiveForm.Name
End Sub
Wenn Sie die Prozedur ZwischenAblageKopieren in ein Standardmodul platzieren, können Sie sie von jedem beliebigen Formular aus aufrufen. Legen Sie innerhalb des Formulars einfach eine Schaltfläche mit einer BeimKlicken-Ereignisprozedur an und rufen Sie von hier aus die Prozedur ZwischenAblageKopieren auf.
Bei einer Adresse ist es beispielsweise erforderlich, dass die Postleitzahl und der Ort in einer einzelnen Zeile erscheinen. Um dies zu bewerkstelligen, legen Sie dem Adressenformular einfach eine Abfrage zugrunde und definieren hier ein neues, berechnetes Feld, über das Sie die Postleitzahl mit dem Ort verknüpfen. Nach dem Start des Assistenten wird das berechnete Feld wie alle anderen Datenfelder in der Feldliste aufgeführt und steht zur Auswahl bereit. Das Anlegen eines Steuerelements für das berechnete Feld ist hierbei nicht erforderlich, da der Assistent direkt auf die Datenquelle zugreift. | |
Manchmal ist es erforderlich, die Anzahl der Tage bis zu einem bestimmten Datum zu ermitteln.
Subtrahieren Sie einfach zwei Datumswerte voneinander.
Vielleicht haben Sie in Ihrem Formular ein Steuerelement, das das Zieldatum speichert. Es könnte sich hierbei beispielsweise um den Abgabetermin für ein Projekt handeln. Ein weiteres Steuerelement berechnet nun die Anzahl der Tage bis zu diesem Datum.
Geben Sie dazu folgenden Ausdruck als Steuerelementinhalt ein:
=[Plan Abgabe]-Datum()
Da Access den Unterschied zwischen zwei Datumswerten standardmäßig in Tagen berechnet, können Sie sie einfach voneinander subtrahieren. Wenn das Abgabedatum bereits verstrichen ist, liefert die Berechnung einen negativen Wert. | |
Jedes Formular hat eigene Netzwerkeigenschaften, die Vorrang vor den Standardeinstellungen haben. So können Sie in jedem Formular festlegen, ob die Daten dort pessimistisch oder optimistisch gesperrt werden.
Wählen Sie für jedes Formular eine Sperrmethode aus, damit dass eine Formular mit pessimistischer Sperrung für Datensicherheit sorgt, während das andere mit optimistischer Sperrung schnell arbeitet.
Um eine Sperrmethode für Formulare festzulegen, öffnen Sie das Formular in der Entwurfs-Ansicht und wählen im Eigenschaftsfenster die Registerkarte "Daten" aus. Wählen Sie das Formular mit dem Befehl Bearbeiten > Formular auswählen aus.
Die Datensatzeigenschaft "Datensätze sperren" erlaubt dieselben Optionen, wie die Standardsperrung: "keine Sperrung, "Alle Datensätze" und "Bearbeiteter Datensatz". Diese Einstellung gilt nur für das Hauptformular. Die Sperrmethode eines Unterformulars wird in der Entwurfs-Ansicht des Unterformulars eingestellt.
Programm gesteuert erreichen Sie die Sperrmethode eines Formulars mit Hilfe der Eigenschaft "RecordLocks"
Forms![Name].Properties.RecordLocks=2
Dieser Befehl aktiviert die pessimistische Datensatzsperrung für das Formular. Die Werte 0 bis 2 entsprechen den Optionen "Keine Sperrung", "Alle Datensätze" und "Bearbeiteter Datensatz" | |
Bei mehrseitigen Rechnungen ist es in vielen Fällen erforderlich, dass auf jeder Seite eine Zwischensumme der einzelnen Positionen ausgegeben wird.
Verwenden Sie das Drucken-Ereignis, um solche Seitensummen zu berechnen.
Grundlage für diese Lösung ist ein ungebundenes Textfeld namens ZwischSumme, das Sie im Seitenfuß der Rechnung plazieren. Hier wird später die Zwischensumme ausgegeben. Alles weitere wird von zwei Ereignisprozeduren erledigt.
Die erste Prozedur ist an die BeimDrucken-Ereigniseigenschaft des Seitenkopfes gebunden:
Private Sub Seitenkopf0_Print(Cancel As Integer, PrintCount As _Integer)
Me!ZwischSumme = 0
End Sub
Diese Prozedur sorgt dafür, dass das Feld ZwischSumme zum Beginn jeder neuen Seite auf 0 initialisiert wird. Die zweite Prozedur ist an das BeimDrucken-Ereignis des Datailbereichs geknüpft:
Private Sub Detail1_Print(Cancel As Integer, _PrintCount As Integer)
If PrintCount = 1 Then Me!ZwischSumme = Me!ZwischSumme + Me!Gesamtpreis End If
End Sub
Bei jedem einzelnen Datensatz wird die Zwischensumme um den Betrag der aktuellen Rechnungsposition (in diesem Beispiel Gesamtpreis) erhöht. Vorher wird jedoch noch die PrintCount-Eigenschaft auf den Wert 1 untersucht. Dies ist erforderlich, da Access das Print-Ereignis bei Rechnungspoitionen, die sich über mehrere Seiten erstrecken, mehrmals aufruft. Die PrintCount-Eigenschaft gibt hierbei an, wie oft das Ereignis für den aktuellen Bereich bereits aufgerufen wurde.
Damit bestimmte Positionen nicht mehrmals hinzuaddiert werden, darf die Berechnung nur beim Auftreten des ersten Ereignisses erfolgen.
| |
| Diese Site ist für Einsteiger, Fortgeschrittene und Profi-Programmierer. Mit Suchmaschine. | |
Wie Sie Dateien kopieren, wissen Sie. Wie aber können Sie beispielsweise eine Tabelle aus einer Datenbank in eine andere kopieren?
Öffnen Sie zusätzlich zur aktuellen Datenbank die Datenbank, in die Sie ein Objekt kopieren möchten. Platzieren Sie die beiden Accessfenster so, dass beide Datenbankfenster sichtbar sind. Jetzt können Sie beliebig Objekte zwischen den Datenbanken austauschen, indem Sie ein Objekt aus dem einen Datenbankfenster in das andere Datenbankfenster ziehen.
Der Kopiervorgang ist in beide Richtungen möglich.
Sie können Objekte auch verschieben. Betätigen Sie dazu beim Ablegen eines Objekts gleichzeitig die [SHIFT]-Taste. Aus Sicherheitsgründen wird in der Ursprungsdatenbank vor dem Löschen der Tabelle nachgefragt, ob diese wirklich entfernt werden soll. | |
| Der TriniDat Währungs-Assistent rechnet Währungsfelder in beliebige andere Währungen um. Dazu erzeugt er von dem gewünschten Formular eine identische Kopie, und trägt dort die neuen Beträge ein. Durch diese Technik kann der Assistent mit nahezu jedem Formular eingesetzt werden, ohne dass Sie Änderungen innerhalb des Formulars vornehmen müssen. Während der Assistent geöffnet ist, können Sie mit Ihrem Formular problemlos weiterarbeiten. Er verfolgt alle Änderungen an den Währungsfeldern Ihres Formulars und rechnet diese automatisch um. Auch auf einen Datensatzwechsel reagiert der Assistent ohne Verzögerung.
Vollversion | |
| Hier finden Sie zahlreiche Informationen und Tipps zum Umgang mit der Oracle-Datenbank. Schauen Sie doch einfach mal vorbei. Es lohnt sich! | |
Für den Felddatentyp gilt Ähnliches wie für die Feldgröße. Nachdem Sie einen Feldnamen eingegeben haben und in die Spalte Felddatentyp wechseln, wird dort der Datentyp Text eingetragen. Wenn Sie aber beispielsweise fast ausschließlich mit Zahlen zu tun haben, ist das ständige Ändern des voreingestellten Wertes lästig. Bestimmen Sie, welcher Felddatentyp beim Wechsel in die gleichnamige Spalte eingetragen wird.
Im Dialogfenster Optionen, das Sie über das Menü Extras erreichen, haben Sie im Register Tabellen/Abfragen die Möglichkeit, den Standardfelddatentyp auszuwählen, der für Sie die meiste Eingabeersparnis bringt.
Das entsprechende Kombinationsfeld zur Auswahl des Felddatentyps ist in der Rubrik | |
Im vorigen Tipp haben Sie eine Gültigkeitsregel und ein Anzeigeformat zur Eingabe von Bankleitzahlen definiert.
Der Schwachpunkt dieser Variante besteht darin, dass der Anwender während der Eingabe nicht sehen kann, dass er gerade eine Bankleitzahl eingibt.
Um die Bankleitzahl schon während der Eingabe zu formatieren, definieren Sie ein Eingabeformat.
Zur Definition des Eingabeformats geben Sie folgenden Ausdruck in die gleichnamige Eigenschaft des Tabellenentwurfs ein:
000" - "000" - "00;;#
Die Nullen in diesem Ausdruck markieren die Stellen, an die der Anwender nur Ziffern eingeben kann. Dazwischen befinden sich einige Textliterahle, die die Eingabe als Bankleitzahl formatieren.
Das Eingabeformat erzwingt die Eingabe von 8 Ziffern und zwar ohne Vorzeichen oder andere Sonderzeichen. Die Eingabe von weniger als 8 Ziffern ist nicht möglich.
Wenn Sie nur das Eingabeformat verwenden, kann der Anwender auch Bankleitzahlen wie 000 000 00 eingeben. Wenn Sie dies unterbinden wollen, definieren Sie zusätzlich eine Gültigkeitsregel.
Außerdem sollten Sie die Eigenschaft Format auf folgenden Ausdruck ändern, um die Bankleitzahl im passenden Format anzeigen zu lassen:
@@@ @@@ @@ | |
Datenbankentwurf Teilen Sie beim Datenbankentwurf die Informationen so weit wie möglich auf einzelne Tabellenfelder auf. Häufig gemachte Fehler dabei sind beispielsweise die Zusammenfassung von Vor- und Nachname, sowie Postleitzahl und Ort in einem einzigen Tabellenfeld.
Beachten Sie beim Datenbankentwurf auch die Performance-Tipps zu Tabellen.
Der Assistent zur Leistungsanalyse Bei einer bestehenden Datenbank sollten Sie als erstes einmal den Assistenten zur Leistungsanalyse ausprobieren.
Dieser Assistent kann entweder die gesamte Datenbank oder einzelne Datenbankobjekte analysieren und Optimierungsvorschläge machen. Falls Sie es wünschen, kann der Leistungsanalyse-Assistent außerdem einige Änderungen automatisch vornehmen.
Der Assistent zur Leistungsanalyse wird über den Menübefehl Extras / Analyse / Leistung aufgerufen.
Datenbanken aufteilen Teilen Sie Ihre Datenbank in ein so genanntes Frontend und ein Backend auf. Das Prinzip einer solchen Aufteilung ist simpel:
- Das Frontend enthält alle Datenbankobjekte außer den Tabellen. - Das Backend enthält nur die Tabellen.
Die Tabellen aus dem Backend werden dann mit dem Frontend verknüpft und verhalten sich dann im Prinzip genau so wie lokale Tabellen.
Bei Datenbankaufteilung können Sie sich durch einen Assistenten unterstützen lassen. Der Assistent wird mit den Menübefehl Extras / Datenbank-Dienstprogramme / Assistent zur Datenbankaufteilung (Access 2000/XP) bzw. Extras / Add-Ins / Assistent zur Datenbankaufteilung (Access 97) aufgerufen.
Alleiniger Zugriff auf Datenbanken Falls Sie an einem Einzelplatzrechner arbeiten oder in einer Netzwerkumgebung nur alleine auf eine Access-Datenbank zugreifen, sollten Sie die Datenbank Exklusiv öffnen. Klicken Sie dazu im Dialogfenster Öffnen auf das nach unten gerichtete Dreieck neben der Schaltfläche Öffnen und markieren Sie den Eintrag Exklusiv öffnen.
Dieser Öffnungsmodus kann auch dauerhaft für alle Datenbanken in Access eingestellt werden. Öffnen Sie mit Extras / Optionen das Dialogfenster Optionen und aktivieren Sie dann das Register Weitere. Markieren Sie dann die Option Exklusiv und klicken Sie auf Übernehmen.
Datenbank regelmäßig komprimieren Eine weitere effektive Möglichkeit zur Leistungsverbesserung ist das regelmäßige Komprimieren einer Datenbank, so wie es hier schon in einem früheren Tipp beschrieben wurde. | |
Um diese Probleme zu verhindern ist es sehr wichtig, dass Sie den Standarddrucker aktivieren und den Bericht dann abspeichern. Diese Einstellung wird dann im Bericht mitgespeichert und beim Öffnen des Berichtesautomatisch aktiviert.
Um den Standarddrucker als Voreinstellung zu aktivieren, gehen sie wie folgt vor:
- Öffnen Sie den Bericht in der Entwurfsansicht
- Wählen Sie den Menübefehl Datei>Seite einrichten aus
- Klicken Sie die Registerkarte Seite an
- Wählen Sie die Option Standarddrucker aus und klicken Sie auf OK
- Speichern Sie den Bericht ab
| |
Access unterstützt Sie während des Formularentwurfs mit einer Symbolleiste, die speziell für die Formatierung von Steuerelementen geschaffen ist. Bei einem Klick mit der rechten Maustaste auf die Symbolleiste zeigt Access den Text Format (Formular-/Berichtsentwurf) als Namen an. Die Format-Symbolleiste enthält Schaltflächen, mit denen Sie Schriften, Schriftattribute und eine Reihe weiterer Eigenschaften einstellen können.
Die Einstellung der Eigenschaften Hintergrundfarbe, Textfarbe, Rahmenfarbe, Rahmenbreite und Spezialeffekt erfolgt über einen neuen Typ von Symbolen. Wenn Sie auf den nach unten zeigenden Pfeil eines dieser Symbole klicken, öffnet Access eine Palette, in der Sie den gewünschten Wert anklicken können.
Wenn Sie viel mit diesen Eigenschaften arbeiten, dann empfinden Sie es nach einer Weile wahrscheinlich als hinderlich, daß Sie jedesmal zuerst auf den Pfeil klicken müssen. Sie können Ihre Arbeit optimieren, indem Sie die Paletten aus der Symbolleiste lösen. Öffnen Sie dazu eine Palette, und klicken Sie mit der linken Maustaste auf einen grauen Bereich. Ziehen Sie die Palette dann bei festgehaltener, linker Maustaste an die gewünschte Bildschirmposition. | |
Ein klassisches Beispiel für eine Aktualisierung von Daten ist die Änderung des Mehrwertsteuersatzes. Die Erhöhung um ein Prozent wirkt sich auch auf Ihre Datenbestände negativ aus. Sie müssen nämlich bei allen Datensätzen beispielsweise in einer Artikelverwaltung den Mehrwertsteuersatz ändern. Eine unzumutbare Aufgabe.
Erstellen Sie eine Aktualisierungsabfrage, die diese lästige Arbeit für Sie übernimmt.
Erstellen Sie eine neue Auswahlabfrage und fügen Sie die zu aktualisierende Tabelle hinzu. Ziehen Sie das Aktualisierungsfeld in das Entwurfsraster, zum Beispiel das Feld MwSt.
Soll die Mehrwertsteuer von 15 % auf 16 % angehoben werden, müssen Sie über ein Kriterium erst alle Sätze mit 15 % selektieren. Der Steuersatz 7 % soll ja erhalten bleiben. Geben Sie also als Kriterium
0,15
ein.
Wandeln Sie die Auswahlabfrage in eine Aktualisierungsabfrage um, indem Sie den Menüpunkt Abfrage/Aktualisieren wählen. Im Entwurfsraster wird nun die Zeile Sortierung durch die Zeile Aktualisieren ersetzt. Tragen Sie in dieser Zeile in der Spalte MwSt den Wert
0,16
ein.
Dies ist der Wert, der bei den Datensätzen, die das Kriterium erfüllen, anstelle des alten Wertes eingesetzt wird.
Wechseln Sie in die Datenblattansicht, um noch einmal zu prüfen, ob die richtigen Datensätze selektiert wurden. Durch den Wechseln in die Datenblattansicht wird die Aktualisierung noch nicht durchgeführt. Die Datenblattansicht ist in diesem Fall nur eine Kontrollansicht.
Um die Aktualisierung zu vollziehen müssen Sie zurück in die Entwurfsansicht wechseln und auf das Symbol Ausführen in der Symbolleiste klicken. Damit die versehentliche Aktualisierung vermieden wird, fragt Access noch einmal ab, ob Sie die Daten wirklich aktualisieren möchten. | |
| Office 2000 SP-2 ist ein auf Benutzer in einem Unternehmen zugeschnittenes Update. Darin sind die neuesten Produktupdates für Office 2000-Programme enthalten. Service Release 2 mit umfangreichen Bugfix. | |
Oft wird anstelle einer Sub-Prozedur eine Function-Prozedur eingesetzt, damit die Prozedur auch außerhalb von VBA aufgerufen werden kann. Das Ergebnis solcher Funktionen ist in der Regel unwichtig.
Bei der Nutzung solcher Prozeduren von VBA aus rufen Sie die Function-Prozedur einfach wie eine Sub-Prozedur auf und ignorieren damit den Rückgabewert.
Ein gutes Beispiel hierfür ist die in Access eingebaute MsgBox-Funktion, die ein Meldungsfenster auf den Bildschirm bringt. Der Rückgabewert der Funktion gibt an, mit welcher Schaltfläche (z.B. OK oder Abbrechen) das Meldungsfenster vom Benutzer bestätigt wurde.
Wenn die Meldung ausschließlich mit einer einzelnen OK-Schaltfläche angezeigt wird, ist der Rückgabewert der MsgBox-Funktion uninteressant. Schließlich gibt es abgesehen von dieser Schaltfläche keine andere Möglichkeit, das Dialogfenster zu bestätigen
Ältere Access-Versionen haben zu diesem Zweck eine spezielle Anweisung zur Verfügung gestellt, die ebenfalls den Namen MsgBox trug. Da sich ab Access 7.0 allerdings alle Funktionen genauso wie Anweisungen aufrufen lassen, ist die MsgBox-Anweisung nun überflüssig. Die beiden folgenden Programmfragmente sind vom Ergebnis her vollkommen identisch. Im zweiten Beispiel wird das Ergebnis der Funktion allerdings ignoriert. Beachten Sie bei der zweiten Variante, dass Sie die Argumente nicht einklammern dürfen.
Dim Ergebnis As Variant
Ergebnis = MsgBox("Dies ist ein Test") MsgBox "Dies ist ein Test"
Natürlich können Sie auch Ihre selbsterstellten Funktionen wie Sub-Prozeduren aufrufen. Die Vorgehensweise ist hierbei mit dem obigen Beispiel identisch. | |
Access bietet diverse Möglichkeiten, die Eingaben von Daten zu erleichtern. Vor allem in verknüpften Tabellen werden bei der Auswahl eines existierenden Datensatzes die dazugehörigen Daten automatisch angezeigt.
Ein Beispiel für das automatische Füllen von Feldern ist eine Abfrage, in der die beiden Tabellen Artikel und Lieferanten miteinander verknüpft werden. Zwischen den beiden Tabellen besteht eine 1-zu-N-Beziehung, die über das Feld Lieferanten-Nr beider Tabellen realisiert wird: siehe Abbildung 1.
Wenn Sie nun das verknüpfte Feld Lieferanten-Nr der Tabelle Artikel ändern, ermittelt Access die Feldinhalte Kontaktperson und Telefon aus der Tabelle Lieferanten und zeigt sie an.
Auf der Basis dieser Abfrage können Sie nun ein Formular anlegen. Plazieren Sie auf dem Formular ein Kombinationsfeld, das an das Datenfeld Lieferanten-Nr gebunden ist. Die Datensatzherkunft des Kombinationsfeldes sollte aus einer Abfrage mit den Feldern Firma und Lieferanten-Nr bestehen, wobei Sie das Feld Lieferanten-Nr an das Kombinationsfeld binden. Die Breite der Spalte Lieferanten-Nr setzen Sie im Kombinationsfeld auf 0, damit diese nicht angezeigt wird.
Nach der Auswahl eines Lieferanten im Formular ergänzt Access nun automatisch die übrigen Daten wie in Abbildung 2. | |
Bereits beim "Öffnen" einer MDB-Datei können Sie festlegen, wie sich Access im Mehrbenutzerbetrieb verhalten soll. Access öffnet Datenbanken standardmäßig exklusiv, so dass nur ein Anwender die MDB-Datei bearbeiten kann. Wenn mehrer Anwender gleichzeitig eine MDB-Datei bearbeiten wollen, müssen alle die Datenbank im Modus "Nicht exklusiv" öffnen.
Sie können alternativ auch die Standardeinstellungen von Access ändern, um die Datenbank grundsätzlich "Nicht exklusiv" zu öffnen.
Wie Access eine MDB-Datei öffnet, können Sie mit Hilfe von Optionen beeinflussen. Rufen Sie dazu den Befehl Extras>Optionen in der Menüzeile auf, und wählen Sie die Registerkarte "Weitere". Daraufhin können Sie in der Optionsgruppe "Standard-Öffnungsmodus festlegen, ob Access Ihre Datenbanken standardmäßig exklusiv oder für die gemeinsame Nutzung öffnet.
In VBA erreichen Sie den Öffnungsmodus für Datenbanken mit den Methoden GetOption und SetOption:
Application.GetOption ("Öffnungsmodus für Datenbanken") Application.SetOption "Öffnungsmodus für Datenbanken", 0
Sofern Sie keine Änderungen an der Datenbank vornehmen, können Sie die MDB-Datei schreibgeschützt öffnen. Die lesenden Datenbankzugriffe sind etwas schneller.
Rufen Sie den Befehl Datei>Datenbank öffnen auf, klicken Sie auf die MDB-Datei im Dialog "Öffnen" mit der rechten Maustaste an, und wählen Sie im "Kurzmenü" den Befehl "Schreibgeschützt Öffnen" aus. In diesem Fall können Änderungen in der MDB-Datei nicht gespeichert werden. Eine entsprechende Meldung macht auf diesen Umstand aufmerksam | |
Diese spezielle Software für die Versicherungsbranche importiert Dateien im GDV-Format (Gesamtverband der Deutschen Versicherungswirtschaft e.V., GDV-Format Stand 7/2001) in eine Access-Datenbank. Die eingelesenen Daten (Kunden, Verträge, Tarifinformationen, Schadendaten usw.) werden sachgerecht aufbereitet und stehen dann in verschiedenen Tabellen zur Verfügung.
| |
Klicken Sie auf den Start-Button und wählen Sie den Menüpunkt Einstellungen>Task-Leiste aus. Aktivieren Sie anschließend das Register Programme im Menü „Start“ und klicken Sie auf Erweitert. Daraufhin wird der Explorer geöffnet, in dem nur die Struktur des Startmenüs dargestellt wird. Öffnen Sie den Ordner Programme>Autostart. In diesem Ordner können Sie nun eine Verknüpfung mit Access erstellen. Sie können bei der Verknüpfung zusätzlich eine Datenbank oder Befehlszeilenoptionen angeben. Alternativ zu einer Verknüpfung mit Access können Sie auch direkt die passende Datenbankdatei oder eine Verknüpfung zu der Datenbankdatei in den Autostart-Ordner ziehen. | |
Beide Funktionen werden in einem Access-Modul wie folgt deklariert:
Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Declare Function GetTempFileName Lib "kernel32" Alias _ "GetTempFileNameA" (ByVal lpszPath As String, _ ByVal lpPrefixString As String, ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long
Der erste Parameter der Funktion GetTempFileName enthält den Pfadnamen des Temp-Verzeichnisses, den die Funktion GetTempPath zurückgibt. Der zweite Parameter lpPrefixString ist eine kleine Zeichenkette mit zwei bzw. drei Zeichen, die den Beginn des Dateinames bestimmt. Wenn Sie eine 0 als dritten Parameter übergeben, wird dem Dateinamen ein Wert im Hexadezimalformat vervollständigt. Der vierte Parameter nimmt das Ergebnis der Funktion auf.
Die folgende Beispielprozedur ermittelt zunächt das Temp-Verzeichnis und erzeugt dort einen Temp-Dateinamen:
Private Sub TempDateiErzeugen ()
Dim ret As Long, length As Long Dim strTempVerz As String, strTempDatei As String
' Verzeichnis ermitteln strTempVerz = String$(255, 0) length = Len(strTempVerz) ret = GetTempPath(length, strTempVerz)
If ret <> 0 Then strTempVerz = Left$(strTempVerz, ret) Else Debug.Print "Verzeichnis konnte nicht ermittelt werden!" Exit Sub End If
' Dateinamen erzeugen strTempDatei = String$(255, 0) ret = GetTempFileName(strTempVerz, "TJ", 0, strTempDatei)
If ret <> 0 Then strTempDatei = Left$(strTempDatei, InStr(1, strTempDatei, ".TMP") + 3) ' Nullen abschneiden Else Debug.Print "Datei wurde nicht erzeugt!" End If
End Sub
Diese Beispielprozedur sowie die API-Funktion GetTempFileName erzeugt nicht die Datei selber, sondern nur einen Dateinamen, den Sie verwenden können.
Um die Datei zu erzeugen bzw. öffnen, benutzen Sie die Open-Anweisung:
Open strTempDatei For Output As #1
' Daten in die Temp-Datei schreiben
Close #1
Dateien, die Sie vorübergehen anlegen, sollten Sie nach ihrem Einsatz auch wieder löschen. Dies bewerkstelligen Sie beispielsweise mit Hilfe der Kill-Anweisung. | |
Bevor Access eine VBA-Prozedur ausführen kann, muss diese zunächst kompiliert und damit in einem Zwischencode übersetzt werden. Abgesehen von einer Zeitverzögerung merken Sie hiervon bei der Entwicklung einer Datenbank nichts. Bei großen Modulen kann sich der Vorgang jedoch über mehrere Sekunden hinziehen. Unglücklicherweise nimmt Access diese Kompilierung immer zum ungünstigsten Zeitpunkt vor - nämlich beim Öffnen der Datenbank. Wer möchte hierbei schon gerne eine längere Wartezeit in Kauf nehmen?
Sie sollten daher alle VBA-Module im kompilierten Zustand speichern, um die Performance Ihrer Datenbank zu erhöhen.
Dies bewerkstelligen Sie folgendermaßen: Öffnen Sie ein beliebiges Modul Ihrer Datenbank. Die kann entweder ein Standardmodul oder aber ein Objektmodul (also ein Formular- oder Berichtsmodul) sein.
Wählen Sie den Menüpunkt Ausführen / Alle Module kompilieren und direkt danach den Menüpunkt Datei / Alle Module speichern aus.
In der Datenbank wird dadurch zusätzlich zum normalen Programmcode ein Kompilat gespeichert, das Access beim nächsten Öffnen der Datenbank direkt und ohne erneute Kompilierung ausführen kann.
Damit Access die Datenbank im kompilierten Zustand speichern kann, darf sie nicht gleichzeitig von anderen Benutzern (z.B. im Netzwerk) geöffnet sein. Wenn Sie hierbei auf Nummer Sicher gehen wollen, öffnen Sie die Datenbank im exklusiven Modus. Kreuzen Sie dazu im Öffnen-Dialogfenster das Kontrollkästchen Exclusiv an.
Der kompilierte Status der Datenbank geht verloren, sobald Sie irgendeine Änderung an der Struktur der Datenbank vornehmen, die auch den VBA-Code betrifft. Dazu gehören Änderungen an Formularen, Berichten, Steuerelementen und Modulen. Es genügt z.B. schon das Verschieben eines Steuerelements innerhalb eines Formulars. Sobald Sie das geänderte Formular speichern, geht der kompilierte Status verloren. Auch das Löschen eines der oben aufgeführten Objekte hat die gleichen Folgen.
Da Access den Dateinamen der Datenbank zusammen mit dem VBA-Code in der Datenbank speichert, bewirkt auch eine Änderung des Dateinamens eine Dekompilierung der kompletten Datenbank. Besonders betroffen sind Sie hiervon, wenn Sie beim Komprimieren der Datenbank aus Sicherheitsgründen einen anderen Dateinamen angeben.
Um auch hierbei den kompilierten Zustand beizubehalten, gibt es folgende Alternativen:
Komprimieren Sie die Datenbank über die aktuelle Datenbank. Um eventuellen Datenverlust vorzubeugen, sollten Sie vorher auf jeden Fall eine Sicherheitskopie der Datenbank anlegen.
Komprimieren Sie die Datenbank unter dem gleichen Namen in ein neues Verzeichnis. Nur der Name der Datenbank, nicht jedoch das Verzeichnis ist bei der Aufrechterhaltung des kompilierten Zustands relevant.
Komprimieren Sie die Datenbank unter einem neuen Namen und geben Sie ihr nach dem Vorgang wieder den ursprünglichen Namen. Das Umbenennen können Sie beispielsweise vom Windows-Explorer aus vornehmen. | |
Die parameterlose Funktion wird in einem VBA-Modul deklariert:
Declare Function GetVersion Lib "kernel32" () As Long
Die Funktion gibt einen Wert zurück, mit dem Sie unter Zuhilfenahme verschiedener Hex-Werten die Versionnummer von Windows ausrechnen:
Public Function WinVersionAnzeigen()
Dim ret As Long Dim iVersionGross As Integer, iVersionKlein As Integer
ret = GetVersion()
iVersionGross = ret And &HFF& iVersionKlein = (ret And &HFF00&) / &H100&
Debug.Print "Versionnummer: " & iVersionGross & "." & iVersionKlein
If ret And &H80000000 Then Debug.Print "Windows 95" Else Debug.Print "Windows NT" End If
End Function | |
Die Überwachung einer bestimmten Variablen aktivieren Sie, indem Sie die gewünschte Variable im Modulfenster markieren und anschließend den Menüpunkt Debugging/Überwachung hinzufügen auswählen. Access öffnet daraufhin das gleichnamige Dialogfenster.
In der Sektion Art der Überwachung markieren Sie anschließend die Option Unterbrechen wenn der Wert True ist. Diese Einstellung bewirkt, dass Access in den Unterbrechungsmodus wechselt, sobald der im Textfeld Ausdruck angegebene Ausdruck den Wert True hat. Um nun beispielsweise den Unterbrechungsmodus zu aktivieren, wenn die Variable i den Wert 5 aufweist, geben Sie unter Ausdruck einfach den folgenden Text ein:
i = 5 | |
| Auf der Seite finden Sie Downloads, News und Antworten auf FAQ, sowie Links zu anderen MVPs. | |
Ich habe ein Formular mit einem Textfeld und einem Listenfeld. Die Datensatzherkunft des Listenfeldes ist eine Abfrage mit den Feldern Name und TelefonNr. Als Bedingung vom Name-Feld habe ich
Wie[Formulare]![TelnrSuchen]![txtName] & "*"
eingegeben. Wenn ich nun im Name-Feld den ersten Buchstaben des Namens eingebe, werden im Listenfeld nur die Namen angezeigt, dessen erster Buchstabe mit der Eingabe übereinstimmt. Als Ereigniseigenschaft des Textfeldes BeiTasteAuf habe ich
Forms![TelnrSuchen]![lstNamesliste].Requery
eingegeben damit nach Eingabe jedes weiteren Buchstaben das Listenfeld aktualisiert wird. Diese Aktualisierung funktioniert aber nur, wenn ich kurz in die Entwurfsansicht und wieder in die Formularansicht wechsle.
Wie kann das Listenfeld nach Eingabe jedes Buchstaben aktualisiert werden? Die Einfügemarke sollte dabei das Textfeld nicht verlassen. | Access-97-Datenbank mit Demo-Datenbank
Das Problem mit der Lösung mit BeiTasteAuf ist, dass der Wert des Textfeldes nicht nach jedem Tastendruck aktualisiert wird, obwohl Sie die eingebenden Buchstaben im Feld sehen. Das Feld wird erst dann aktualisiert, wenn Sie das Feld verlassen.
Auch das BeiÄnderung-Ereignis nutzt uns nichts, weil die Listenfeld-Abfrage keinen aktuellen Textfeldwert erhält. Sie müssten also die NachAktualisierung-Ereignisprozedur implementieren, die das Listenfeld nach dem vollständigen Eingabewert filtert und aktualisiert.
Um das Listenfeld wirklich nach jedem Tastendruck zu aktualisieren, verwenden Sie eine statische Variable innerhalb der BeiTasteAuf-Prozedur. Dieser Variable wird jedem eingegebenen Buchstaben hinzugefügt. Die Variable behält auch ihren aktuellen Wert bei jedem Aufruf der Prozedur:
Static strLikeText As String
Je nach Buchstaben können Sie die neuen Zeichen in der BeiTasteAuf-Prozedur hinzufügen bzw. löschen:
Select Case KeyCode
Case vbKeyBack ' Ein Zeichen löschen
If Len(strLikeText) > 0 Then strLikeText = Left$(strLikeText, Len(strLikeText) - 1) End If
Case vbKeyEscape ' Auswahl löschen strLikeText = ""
Case 65 To 90 ' Das Zeichen (A-Z) hinzufügen
strLikeText = strLikeText & Chr$(KeyCode)
End Select
Diese Variable können Sie dann als Where-Klausel für die Listenfeld-Abfrage verwenden:
Me!lstFirmen.RowSource = "SELECT Firma, Telefon FROM Kunden WHERE Firma Like '" & strLikeText _ & "*';" |
| Von Andreas Blasberg; Econ (1997); EUR 5,48; ISBN: 3612281496 | |
Die Berichte einer Datenbank weisen in Praxis oft ein ähnliches Layout auf.
Beschleunigen Sie den Entwurf ähnlicher Berichten durch den Einsatz von Autoformaten.
Mit dem Menübefehl Format / Autoformat weisen Sie einem Bericht ein bestimmtes Format zu. Dazu zählen die Schriftart, die Farbgebung und die Formatierung von Linien.
Die Schaltfläche Anpassen des AutoFormat-Dialogs ermöglicht Ihnen die Definition neuer Automformate, die auf dem aktuellen Bericht basieren. | |
| FAQ zu verschiedenen Themen in englischer Sprache. Freeware und Demo-Versionen im eigenen Downloadbereich, sowie umfangreiche Linksammlung für weitere Downloads. | |
Ich möchte eine Seriennummer ermitteln, die sich aus Jahreszahl und fortlaufender Nummer zusammensetzt.
Wie kriege ich Access dazu, zum einen bei jedem Datensatz weiterzuzählen und vorher zu ermitteln, ob noch immer das gleiche Jahr läuft, oder ob es sich um ein neues Jahr handelt und dann wieder bei 1 zu beginnen? | Eine fortlaufende Nummer mit Jahreszahl, die sich beim neuen Jahr wieder zurücksetzt, kann man mit einer VBA-Funktion relativ leicht realisieren.
Legen Sie zunächst ein Textfeld mit einer Länge von mindestens 8 Zeichen in Ihrer Rechnungs-Tabelle (beispielsweise tblRechnungen) an. Für die Rechnungsnummern könnte dieses Feld folgendes Format haben: 00023-99 Diese Nummer stellt also die dreiundzwanzigste Rechnung im Jahr 1999 dar. Um die letzte Rechnungsnummer im aktuellen Jahr zu ermitteln, setzen wir die Max-Funktion in einem Recordset ein:
Dim db As Database Dim rstLetzteRechNr As Recordset Dim strJahr As String
strJahr = Right$(Year(Date), 2) ' Aktuelles Jahr, z.b. "99" Set db = CurrentDb
Set rstLetzteRechNr = db.OpenRecordset("SELECT Max(Left([RechnungNr],5)) AS LetzteRechNr FROM tblRechnungen HAVING Right([RechnungNr],2)='" & strJahr & "';", dbOpenSnapshot)
Im Recordset-Feld LetzteRechNr befindet sich die allerletzte Rechnungsnummer des laufenden Jahres, z.B. "23". Wenn noch keine Rechnungsnummer in diesem Jahr vorhanden ist, enthält LetzteRechNr den Wert Null. Um die nächste Rechnungsnummer zu ermitteln, addieren Sie 1 zur letzten Rechnung und formatieren Sie das Ergebnis zusammen mit dem Jahr:
If IsNull(rstLastRechNr!LastRechNr) Then
'erste Rechnung hat die Nummer 1 NeueRechnungNr = Format$(1, "00000-") & strJahr
Else
'nächste Rechnung wird um 1 erhöht NeueRechnungNr = Format$(rstLetzteRechNr!LetzteRechNr + 1, "00000-") & strJahr
End If
Die Variable NeueRechnungNr enthält dann die formatierte Nummer Ihrer nächsten Rechnung. Diese Paar Zeilen VBA-Code können Sie wunderbar in eine Funktion beispielsweise mit dem Namen GetNeueRechnungNr einwickeln. Sobald Sie eine neue Rechnung anlegen, lassen Sie die Rechnungsnummer automatisch generieren, z.B. im Ereignis Vor Eingabe Ihres Rechnungformulars:
Private Sub Form_BeforeInsert(Cancel As Integer)
Me!RechnungNr = GetNeueRechnungNr()
End Sub |
Wenn Sie bei dem Entwurf von Unterformularen einige Regeln beachten, können Sie diese universell einsetzen.
Die wichtigste Regel ist hierbei, dass Sie beim Verweis vom Unterformular aus auf das Hauptformular nie den Namen des Hauptformulars angeben dürfen. Dies ist erforderlich, da der Name natürlich davon abhängig ist, wo Sie das Unterformular einfügen. Als Ersatz stellt Access die Parent-Eigenschaft zur Verfügung, die zu einem bestimmten Unterformular einen Verweis auf das Hauptformular zurückliefert.
Ein gutes Beispiel für ein universelles Unterformular sind selbsterstellte Navigationsschaltflächen. Legen Sie einfach ein neues leeres Formular an, bei dem Sie die Navigationsschaltflächen, den Datensatzmarkierer sowie die beide Bildlaufleisten ausblenden. Platzieren Sie auf dem Formular zwei Schaltflächen mit den Namen btnNächster und btnVorheriger. Der BeimKlicken-Ereigniseigenschaft der ersten Schaltfläche weisen Sie folgende Prozedur zu:
Private Sub btnNächster_Click()
On Error Resume Next Dim R As DAO.Recordset
'Auf Hauptformular verweisen Set R = Me.Parent.RecordsetClone
'Gleichen Datensatz auswählen R.Bookmark = Me.Parent.Bookmark
R.MoveNext Me.Parent.Bookmark = R.Bookmark
End Sub
Die Ereignisprozedur der zweiten Schaltfläche hat einen identischen Aufbau. Ersetzen Sie lediglich die MoveNext-Eigenschaft durch die MovePrevious-Eigenschaft. Speichern Sie das fertige Formular unter den Namen Navigationsschaltflächen.
Sie können das neue Formular nun in jedes beliebige Hauptformular per Drag&Drop aus dem Datenbankfenster einfügen. Wenn Sie im Hauptformular die Rahmenart-Eigenschaft des Unterformular-Steuerelements auf Transparent einstellen, ist das Unterformular noch nicht einmal als solches zu erkennen. Nach dem Umschalten in die Formularansicht können Sie die Navigationsschaltflächen direkt einsetzen. | |
Viele Formulare belegen bekanntlich viel Platz auf dem Bildschirm. Wenn sie nicht benötigt werden, können sie aber auch Platz sparend verkleinert werden.
Besonders geeignet ist diese Vorgehensweise bei Formularen, die als Toolbox verwendet werden sollen. Positionieren Sie am oberen Rand des Formulars nebeneinander zwei neue Schaltflächen mit den Namen btnEinfahren und btnAusfahren.
Die erste Schaltfläche verknüpfen Sie mit folgender Ereignisprozedur:
Private Sub btnEinfahren_Click()
DoCmd.MoveSize Height:=850
End Sub
Die zweite Ereignisprozedur hat den gleichen Aufbau, nur dass Sie hier eine Höhe von ca. 2000 angeben. Die genauen Angaben ermitteln Sie am einfachsten durch etwas experimentieren.
Sobald Sie nun auf Einfahren klicken, wird die Formularhöhe soweit reduziert, dass nur noch die beiden Schaltflächen sichtbar sind. Mit Ausfahren bringen Sie das Formular wieder auf die ursprüngliche Höhe. | |
Geben Sie dem Primärschlüsselfeld und auch allen anderen Feldern möglichst Namen ohne Sonderzeichen. Sie können dann beim Zugriff auf die Felder die eckigen Klammern weglassen.
Theoretisch können Sie dem Primärschlüsselfeld jeden beliebigen Namen geben, der den Konventionen von Access entspricht. Häufig werden für dieses Feld Namen wie Adresse-Nr oder Person-Nr verwendet. Diese Namensgebung hat den Nachteil, dass Sie in VBA beim Zugriff auf dieses Feld den Namen immer in eckige Klammern setzen müssen. Das gleiche gilt auch für alle anderen Felder der Tabelle. Sie sollten daher auf Sonderzeichen verzichten und lieber zusammenhängende Namen vergeben, beispielsweise AdresseNr oder PersonNr. Sie können dann bei der Programmierung und auch bei SQL-Texten die eckigen Klammern weglassen. | |
Zu den folgenden Themenbereichen finden Sie Tipps & Tricks, Hinweise und Vorschläge:
- Konzept, Entwurf
- Tabellen, Abfragen
- Formulare, Berichte
- VBA, Makros
- Anwendung
Diese Tipps stehen auch als Datenbank zum kostenlosen Download zur Verfügung. Sie dient Ihnen als Hilfestellung, um Fehler bei der Access-Programmierung zu vermeiden.
Ein besonderer Leckerbissen auf dieser Seite ist die Beispieldatenbank "Stoppuhr.mdb", mit der Sie eine Stoppuhr-Klasse mit 1/1000 Sekunden Genauigkeit in Ihre Access Anwendungen Integrieren können. | |
| Ich benötige eine Rundenfunktion für Access 2000. Kann man diese nur in einem Bericht umsetzen oder auch in einem Formular, vorallem,wie binde ich das Rundenmodul im Formular ein mit einer [Ereignisprozedur]. | Sehr geehrte Frau Pawlik-Herrmann, Sie können eine beliebige Funktion als "Public Function" in einem Standardmodul abspeichern. Von dort aus ist sie dann von Formularen, Berichten und Abfragen erreichbar. Nutzen Sie dazu die Syntax "=MeineFunktion()". Viele Grüße Tom Jordan |
| Ich habe mehrere Adressen meiner Freunde in Access angelegt. Über ein Kombinationsfeld kann ich die Adressen aussuchen und anklicken. Mein Problem: ich kann das Kombinationsfeld im Formular nicht sortieren. Wenn ich also einen Eintrag mit dem Nachnamen Amann habe, der jedoch erst Tage oder Datensätze nach Schmidt angelegt wurde, kann ich ihn auch immer nur als letzten Eintrag, also unten im Kombinationsfeld finden und nicht weiter oben, wo er vom Alphabet hinkommen müßte. Wo und wie kann ich dies bewerkstelligen? | Ein Kombi-Feld hat die Eigenschaft Herkunftstyp. Diese soll auf Tabelle/Anfrage gesetzt sein. Bei der Eigenschaft Datensatzherkunft können Sie eine beliebige Abfrage hinterlegen, auch nach Nachnamen sortiert. Im Eigenschaftsfenster klicken Sie dazu auf den Knopf mit den drei Pünktchen (...) Das Abfrageentwurfsfenster öffnet sich. |
Texte innerhalb von Meldungen oder Textfeldern sollen häufig mehrzeilig dargestellt werden.
Verwenden Sie die Konstante vbCrLF, um Zeilenumbrüche in Zeichenketten einzufügen.
Der folgende Ausdruck erzeugt beispielsweise einen dreizeiligen Text:
txtZeilen = "Zeile 1" & vbCrLf & "Zeile 2" & vbCrLf & "Zeile 3" | |
Die Suche nach einem bestimmten Programmfenster können Sie mit den API-Funktionen GetWindow und GetWindowText durchführen.
Die unten abgedruckte Funktion FensterSuchen erwartet ein String-Parameter, der den Titel des gesuchten Fensters darstellt. Wenn die Anwendung mit dem gesuchten Titel gerade nicht läuft, gibt die Funktion den Wert 0 zurück.
Public Const GW_HWNDFIRST = 0 Public Const GW_OWNER = 4 Public Const GW_HWNDNEXT = 2
Declare Function GetWindow Lib "user32" _ (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias _ "GetWindowTextA" (ByVal hWnd As Long, _ ByVal lpString As String, ByVal cch As Long) As Long
Declare Function IsWindowVisible Lib "user32" _ (ByVal hWnd As Long) As Long Public
Function FensterSuchen(FensterTitel As String) As Long
Dim hWnd, strTitel As String, ret As Long, Länge As Long
hWnd = GetWindow(Application.hWndAccessApp, GW_HWNDFIRST) If hWnd Then Do While hWnd ' alle Fenster durchlaufen strTitel = String$(255, 0) Länge = Len(strTitel) ret = GetWindowText(hWnd, strTitel, Länge) ' Fenstertitel ermitteln strTitel = Left$(strTitel, InStr(strTitel, Chr$(0)) - 1) 'nur wenn Fenster sichtbar und kein Child-Fenster ist If IsWindowVisible(hWnd) And GetWindow(hWnd, GW_OWNER) = 0 Then If strTitel Like FensterTitel Then FensterSuchen = hWnd ' Fenster gefunden Exit Function End If End If
hWnd = GetWindow(hWnd, GW_HWNDNEXT) ' nächstes Fenster in der Kette ermitteln Loop End If
FensterSuchen = 0
End Function
In der Do-Schleife wird für jedes Fenster geprüft, ob es erstens sichtbar ist, und zweitens ob es ein Hauptfenster ist. Stellt die Funktion einen möglichen Kandidaten fest, überprüft sie den Titel mit der Funktion GetWindowTitel. Dieser wird dann mit dem Parameter FensterTitel verglichen.
Damit die Funktion auch Platzhalterzeichen akzeptiert, erfolgt der Vergleich mittels Like-Operator:
If strTitel Like FensterTitel Then 'Titel mit Funktionparameter vergleichen FensterSuchen = True 'Fenster gefunden Exit Function End If
Um beispielsweise festzustellen, ob eine Anwendung mit dem Text "Microsoft" im Fenstertitel gestartet ist, rufen Sie die Funktion wie folgt auf:
If FensterSuchen("Microsoft*") Then
Debug.Print "Microsoft ist da!"
End If | |
Bei der Texteingabe in Formulare ist es in einigen Fällen erforderlich, dass alle Wörter mit einem großen Buchstaben beginnen.
Verwenden Sie die StrConv-Funktion, um alle Wortanfänge in Großbuchstaben umzuwandeln.
Die StrConv-Funktion wird normalerweise dazu eingesetzt, um das Unicode-Zeichenformat in das ASCII-Zeichenformat zu konvertieren.
Mit Hilfe der Option vbProperCase lassen sich aber auch Wortanfänge in Großbuchstaben umwandeln.
Der Ausdruck
StrConv("Dies ist ein Test", vbProperCase)
hat dementsprechend die folgende Zeichenkette zum Ergebnis:
Dies Ist Ein Test | |
Achten Sie dabei besonders auf die Format[$]()-Funktion.
Ein Beispiel dafür ist die folgende Anweisung:
txtBruttoPreis = Format(txtNettoPreis + txtMwst, "#,###0.00 DM")"
Verwenden Sie zur Umstellung am besten die Funktion Ersetzen, die Sie in einem Modul-Fenster mit dem Menübefehl Bearbeiten/Ersetzen aufrufen können.
Markieren sie im Dialogfenster Ersetzen zunächst das Kontrollkästchen Suche in aktuellem Projekt, damit Sie diese Bearbeitung für die komplette Datenbank in einem Rutsch erledigen können. | |
| Access enthält standardmäßig keine Funktion zum Runden von Zahlen. Diese besonders in der Buchhaltung auffällige Lücke schließt die TriniDat Runden-Funktion. Die Runden-Funktion verhindert Differenzen zwischen dem exakten Wert und dem von Access berechneten Wert. Ohne die Funktion kann eine Abweichung von einigen Pfennigen vom genauen Betrag entstehen. Datenbank mit Beispieldaten und Anleitung im Word-Format. | |
| Ich suche ein Tool oder ein Programm, mit dem ich fertige Access-Datenbanken packen und weitergeben kann. Doch sollte auf dem PC des Empfängers Access nicht installiert sein, funktionieren ja die Datenbanken nicht. Gibt es eine Möglichkeit die in VBA erstellten Datenbanken auch ohne Entwicklungsumgebung auf einem Computer zu benutzen? Ich freue mich auf eine Antwort, mfg. Ulli | Dazu müssen Sie das Office Developer Kit besorgen. Da ist ein Setup-Assistent enthalten, mit dem Sie Installationen für Ihre Access-Datenbanken erstellen können. Für Ihre Anwender ohne Access können Sie auch die Access Laufzeit-Version ins Setup einbinden. Mehr zur Office-Entwicklung finden Sie hier: http://www.microsoft.com/germany/msdn/library/office/default.mspx |
| Ich möchte über eine Ereignisprozedur einen Bericht öffnen. Es soll nur der Bericht geöffnet werden, dessen Rechnungsnummer mit derjenigen im Formular übereinstimmt.
Bisher habe ich dies über ein Makro gestartet und folgende Bedingung eingegeben:
[rechnen].[nummer]=[Formulare]![rechnen]![nummer]
In VBA möchte ich dies über den Befehl:
DoCmd.OpenReport..., WhereCondition:=...
erreichen.
Wie kann ich diese Bedingung aber mit VBA zusammenstellen? | Mit VBA geht es natürlich auch, meistens aber noch flexibler. Sie bauen einfach einen String-Wert mit der Rechnungsnummer zusammen. Das Resultat können Sie in einer Variablen speichern:
Dim strWhere As String strWhere = [rechnen].[nummer]=Me![nummer]
Die Variable strWhere setzen Sie dann in den WhereCondition-Parameter der OpenReport-Methode:
DoCmd.OpenReport "MeinBericht", WhereCondition:=strWhere
Weitere Bedingungen können Sie auch anfügen, indem Sie die WhereCondition etwa wie folgt ändern:
WhereCondition:=strWhere & " AND Storniert=False" |
| Wenn sich auf Formularen zu viele Steuerelemente tummeln, kann schnell die Übersicht verloren gehen.
Teilen Sie Ihr Formular in diesem Fall in mehrere Formularseiten auf.
Um dies zu bewerkstelligen, ordnen Sie am rechten Rand des Detailbereichs untereinander mehrere Steuerelemente des Typs Seitenumbruch an. Wenn Sie Ihr Formular beispielsweise in drei Seiten aufteilen möchten, fügen Sie dem Formular zwei Seitenumbrüche hinzu. Achten Sie darauf, dass die Seitenumbruch-Steuerelemente exakt den gleichen Abstand voneinander haben.
Außerdem müssen Sie die Höhe des Detailbereichs genau an ein Vielfaches der Seitenhöhe anpassen. Wenn Sie das Formular z.B. in drei Seiten mit einer Höhe von 5 cm aufteilen, muß der Detailbereich eine Höhe von 15 cm aufweisen.
In der Formularansicht wechseln Sie nun mit Hilfe der Tasten U oder O zu den einzelnen Seiten. Komfortabler wird es mit Hilfe der folgenden VBA-Anweisung:
DoCmd.GoToPage
Unter Seite geben Sie die Nummer der Seite an, zu der Access wechseln soll. Sie können die Anweisung beispielsweise von einer Schaltfläche aus aufrufen, um mit einem einfachen Mausklick zu einer bestimmten Seite zu wechseln. | |
Auf dieser Seite finden Sie viele Tipps, Tricks und Source Codes, die Sie für Ihre eigenen Access Datenbank Projekte verwenden können. Hierbei spielt es keine Rolle, ob Sie diese für den privat oder kommerziellen Bereich verwenden möchten. Es ist alles absolut kostenlos. | |
Soll ein Steuerelement weder in der Formular- noch in der Datenblattansicht sichtbar sein (beispielsweise um für den Anwender nicht sichtbare Berechnungen durchzuführen), plazieren Sie es einfach im Formularkopf oder -fuß und stellen die Sichtbar-Eigenschaft des kompletten Bereichs auf Nein ein. | |
Zur Zeit sind 3 verschiedene Versionen des SP8-Downloads für folgenede Betriebssysteme verfügbar:
- Microsoft Windows 2000
- Microsoft Windows XP
- Microsoft Windows Server 2003
| |
Bei einem Autowert-Feld mit der Feldgröße Long Integer werden die Werte automatisch bei jedem neuen Datensatz um den Wert 1 erhöht. Man erhält dadurch eine fortlaufende Datensatznummerierung. Diese Nummerierung bringt aber Nachteile mit sich, wenn mehrere Personen auf eine Tabelle zugreifen und neue Datensätze eingeben. Es kann sein, dass zwei verschiedene Datensätze dieselbe Primärschlüsselnummer erhalten. Ein Konflikt ist so unvermeidbar.
Wenn Sie ein neues Autowert-Feld angelegt haben, können Sie im Register Allgemein die Eigenschaften des Feldes einstellen. Wählen Sie im Feld Neue Werte den Eintrag Zufall aus. Beim Anlegen eines neuen Datensatzes wird dann ein zufälliger Wert vergeben. Die Wahrscheinlichkeit, dass die Datensatznummern von zwei Datensätzen gleich sind, ist sehr gering. Hauptsächlich wird die Einstellung Zufall bei der Replikation von Datenbanken benutzt. Der Zweck ist der gleiche wie oben beschrieben. | |
| Wählen Sie dafür den Menüpunkt Datei>Als Abfrage speichern aus. In einem Dialog können Sie dem Filter einen Namen geben. Der Filter erscheint im Datenbankfenster im Register Abfrage als ganz normale Abfrage. Sie können Abfragen auch wie jede andere Abfrage aus dem Datenbankfenster öffnen. | |
Habe bei einem Bericht ein Bild eingebettet. Möchte diesen Bericht nun per E-Mail versenden. Finde aber keine Möglichkeit. Bei der Konvertierung in ein Word-Doc als rtf.Datei wird nur der Text angezeigt, die Formatierung und vor allem auch die Bilder gehen verloren.
Gibt es hier eine Lösung? | Um einen Bericht mit allen Daten weiterleiten zu können, müssen Sie den Bericht in einem geeignetem Format ausdrucken.
Sie erreichen dies mit dem kostenlosen Snapshot-Viewer für Access 97 und 2000 http://office.microsoft.com/germany/downloads/2000/snapshot_viewer.aspx oder beispielsweise auch mit dem kostenpflichtigen Acrobat Distiller/PDF-Writer. |
Sprachversion Deutsch
Seit der Einführung im Jahre 1992 gehört Microsoft Access zu den vielfältigsten Anwendungen der Microsoft Office-Suite. Diese Vielfältigkeit spiegelt sich vor allem bei den leitungsfähigen Funktionen und Features wieder, die selbst die Ansprüche erfahrener Datenbankanwender und Entwickler befriedigen. Auf der anderen Seite ist Access aber ebenso einfach zu bedienen wie die anderen Office-Applikationen und stellt somit die ideale Plattform für Einsteiger in die Datenverwaltung dar. Microsoft Access 2002 baut diese Vielfältigkeit noch weiter aus, indem es Datenbankentwicklern und erfahrenen Anwendern eine Vielzahl neuer Funktionen bereitstellt, mit denen nicht nur Datenverwaltung und Analyse wichtiger Komponenten, sondern auch die Erstellung leistungsfähiger Datenbanken noch einfacher und komfortabler von der Hand gehen. Gleichzeitig wird aber auch der Einsteiger dazu ermuntert, sich mit den Grundfunktionen der modernen Datenverwaltung vertraut zu machen. (Update)
Voraussetzungen Windows 95/98/2000/ME/NT Pentium 133 MHz ab 32 MB RAM. | |
Der Access 2.0-Konverter wird von Microsoft Office Access 2003 zum Konvertieren von Dateien im Microsoft Access 2.0-Dateiformat benutzt. | |
Beim Import von Daten liegen diese oftmals in einer Form oder Darstellung vor, die unerwünscht ist. Dabei sind natürlich die unterschiedlichsten Variationen denkbar.
Benutzen Sie die Funktionen, um die Darstellung importierter Daten in eine gewünschte Form zu bringen.
Das folgende Beispiel (siehe Abbildung 1) zeigt eine Tabelle mit importierten Daten an. Vor- und Nachname liegen nicht in der üblichen Schreibweise - erster Buchstabe groß und alle anderen Buchstaben klein - vor.
Erstellen Sie in einem solchen Fall eine benutzerdefinierte Funktion, die mit Hilfe eingebauter Access-Funktionen dieses Problem löst.
Public Function StandardString(ByVal InputString As String) As String '
Diese Funktion gibt eine Zeichenkette mit dem ersten Buchstaben groß ' und den restlichen Buchstaben klein aus
Dim FirstLetter As String, RemainString As String
FirstLetter = Left(InputString, 1) RemainString = Right(InputString, Len(InputString) - 1) StandardString = Format(FirstLetter, ">") & Format(RemainString, "<")
End Function
Die beiden Variablen FirstLetter und RemainString teilen den übergebenen String InputString in den ersten Buchstaben und den Rest der Zeichenkette auf. FirstLetter wird mit Hilfe der Left-Funktion der erste Buchstaben der Zeichenkette zugewiesen, RemainString der Rest der Zeichenkette. Dabei kommen die Funktionen Right und Len zum Einsatz.
Anschließend werden die Buchstaben der beiden Teilstrings entsprechend umgewandelt und als Rückgabewert der aufrufenden Funktion übergeben. Eine solche Funktion können Sie anschließend in einer Abfrage verwenden, um in berechneten Feldern die umgewandelten Zeichenketten darzustellen. | |
Ich habe eine Datenbank mit 2 Tabellen. In der Tabelle 1 sind ca. 20.000 Datensätze mit 8 Feldern. In der Tabelle 2 sind ca. 1.700.000 Datensätze mit 5 Feldern. Diese Tabellen sind aus einer Anwender-Software in Access importiert worden und haben keine Schlüsselfelder. Jeweils 2 Felder sind identisch und können als 1:n Beziehung verwendet werden. Die Aufgabe besteht darin, die Tabelle 2 mit zwei Feldern aus der Tabelle 1 zu aktualisieren. Die Lösung mit zwei verschachtelten "for i = 1 to Anz" funktioniert, allerdings lässt hier die Verarbeitungsgeschwindigkeit zu wünschen übrig. Diese Methode benötigt doch ca. 340 Mio. Prüfschritte!
Können Sie hier eine Lösung anbieten, die eine akzeptable Abarbeitung bringt? | Die SQL-Anweisung UPDATE kann auch Daten aus unterschiedlichen Tabellen aktualisieren.
Das folgende Beispiel aktualisiert das Feld "Empfänger" der Tabelle "Bestellungen" mit dem Firmennamen der Tabelle "Kunden"
UPDATE Kunden INNER JOIN Bestellungen ON Kunden.[Kunden-Code] = Bestellungen.[Kunden-Code] SET Bestellungen.Empfänger = [Firma];
Das Beispiel basiert auf der Nordwind-Beispieldatenbank, die zum Lieferumfang von Access gehört. |
| Auf dieser Site finden Sie News, Support sowie Shareware und kostenlose Demoversion von "Find and Replace", für Access 2.0/95/97/2000. | |
| Von Ralf Albrecht und Natascha Nicol; Addison-Wesley; Euro 44,95; ISBN: 3827312663 | |
Das umfassende, lösungsorientierte Nachschlagewerk für die Realisierung maßgeschneiderter Datenbankprojekte
- Exzellentes Access-Know-how ohne theoretischen Ballast
- Direkt umsetzbare Lösungen konkreter Anwenderprobleme
- Ausgewählte Datenbank-Beispiele aus der beruflichen Praxis
Das kompetente Nachschlagewerk gehört neben jeden Office-PC. Denn hier finden Sie auf die Schnelle die richtigen Antworten auf Ihre Fragen rund um den Aufbau und die Entwicklung maßgeschneiderter Datenbankprojekte. Von der ersten Seite an vermittelt das große Buch exzellentes Access-Know-how ohne überflüssigen theoretischen Ballast. Dabei wird die Lösung konkreter Anwenderprobleme kompromisslos in den Vordergrund gestellt. Tipps & Tricks aus erster Hand sind auch für erfahrene Anwender eine Quelle der Inspiration. Ausgewählte Beispiele aus der beruflichen Praxis tragen zur Vertiefung Ihres Datenbankwissens bei und unterstützen Sie dabei, Ihr frisch erworbenes Know-how in eigene Projekte umzusetzen. Hier lernen Sie zum Beispiel, einfache Anwendungen von Grund auf optimal zu entwickeln, eine Personaleinsatzplanung mit umfangreichen Datenbeständen zu realisieren oder den Datenaustausch mit anderen Officeanwendungen zu automatisieren. Außerdem erfahren Sie, wie man Datenbanken ins Access 2007-Format konvertiert, analysiert und individuell anpasst. | |
| Von Praktikern für die Praxis geschrieben - hier steht der Nutzen im Vordergrund. Dieses Buch bietet Ihnen eine fundierte Einführung in die Datenbankprogrammierung mit Microsoft Access 97 und Visual Basic, ausführliches Know-how über die objekt- und ereignisorientierte Gestaltung der Benutzerschnittstelle sowie jede Menge universell einsetzbare Routinen und die richtigen Lösungen für Ihr Problem. Dabei werden auch die Neuerungen in Access 97 wie z. B. Verbesserung der Kommunikationsfähigkeit oder Integration der Internet/Intranet-Technologien ausführlich beschrieben. Auf den umfangreichen Rezept-Teil wird sicherlich kein Datenbankentwickler verzichten wollen. Die Begleit-CD enthält neben umfangreichem Beispiel-Material auch zusätzliche Access-Assistenten sowie weitere Microsoft-Programme.
Von Walter Doberenz und Thomas Kowalski; Microsoft Press (1997); Euro 49,90; ISBN: 3-86063-396-1 | |
Bei Formularen und Berichten kann es schon einmal vorkommen, dass in einem bestimmten Steuerelement der Text #Name? erscheint.
Überprüfen Sie in diesem Fall den Inhalt der Steuerelementinhalt-Eigenschaft des betreffenden Steuerelements.
Kontrollieren Sie, ob der angegebene Feldname wirklich in der Datenquelle des Formulars existiert und Ihnen kein Schreibfehler unterlaufen ist.
Wenn die Eigenschaft einen Ausdruck wie beispielsweise eine Rechenanweisung enthalten sollte, darf dieser keine syntaktischen Fehler haben. | |
Besonders einfach wird der Vorgang, wenn Sie der Symbolleiste den gleichen Namen wie der kontextsensitiven Menüleiste geben. Eine entsprechende VBA-Prozedur kann dann den Namen aus der Menüleiste-Eigenschaft auslesen und die gleichnamige Symbolleiste öffnen:
Public Sub KontextSymbolleiste (FormObj As Form, _ Einblenden As Integer)
Dim Symbolleistenname As Variant
Symbolleistenname = FormObj.MenuBar
If Einblenden = True Then DoCmd.ShowToolbar Symbolleistenname, acToolbarYes Else DoCmd.ShowToolbar Symbolleistenname, acToolbarNo End If
End Sub
Platzieren Sie die Prozedur am besten in einem Standardmodul, damit Sie von allen Formularen aus aufgerufen werden kann.
Um eine Symbolleiste mit einem Formular zu verknüpfen, müssen Sie nun lediglich noch zwei Ereignisprozeduren für die Eigenschaften BeiAktivierung und BeiDeaktivierung anlegen:
Private Sub Form_Activate()
KontextSymbolleiste Me, True
End Sub
Private Sub Form_Deactivate()
KontextSymbolleiste Me, False
End Sub
Sobald das Formular nun aktiviert wird, öffnet Access die passende Symbolleiste. Sollte es dagegen deaktiviert werden, verschwindet die Symbolleiste wieder | |
Ich habe eine Datenbank in der gibt es eine Spalte "Anrede". Wenn in dieser Spalte "Herr" oder "Frau" steht soll in der Briefanrede "Sehr geehrter Herr" bzw. "Sehr geehrte Frau" übernommen werden. Wenn in dieser Spalte nichts steht soll "Sehr geehrte Damen und Herren" als Anrede verwendet werden. | Sie sollten als Datenherkunft für den Serienbrief-Export eine Abfrage verwenden, der Sie das berechnete Feld "Briefanrede" hinzufügen. Der Inhalt des Feldes kann mit einem berechneten Ausdruck (z.B. Briefanrede: Anrede + " " + [Name]) oder durch eine programmierte VBA-Funktion berechnet werden. Falls dies zu schwierig ist, können Sie auch ein weiteres Feld in Ihre Access-Datenbank einfügen, und die Briefanrede dort manuell eingeben. |
| Zu diesem Zweck positionieren Sie die Einfügemarke auf das betreffende Schlüsselwort und betätigen die F1 Taste. Access öffnet dadurch automatisch die passende Hilfeseite. | |
Für eine Tabelle muss ein Primärschlüsselfeld erstellt werden, das aus einem String und einem Inkrement (möglichst Autowertfeld) kombiniert wird, also in der Art "NameA_1", "NameA_2", usw. Dabei ist 'NameA' identisch je Tabelle.
Eine zweite Tabelle in einer strukturell identischen, aber auf einem anderen Rechner installierten Datenbank muss analog indiziert werden, also "NameB_1, "NameB_2", usw. Beide Tabellen sollen dann per Anfügeabfrage an eine dritte Tabelle (in einer zentralen Datenbank) angefügt werden. Zweck des Ganzen ist, in der Haupttabelle die Herkunft des Datensatzes sofort zu erkennen.
Ein anderer Primärschlüssel ist aufgrund der Tabellenstruktur nicht möglich und ein einfaches Autowert-Feld pro Tabelle führt logischerweise zu doppelt indizierten Datensätzen in beiden Tabellen, weswegen die Anfügeabfrage dann nicht möglich wäre.
Wie ließe sich so etwas bewerkstelligen? | Anstatt den Stringwert und die Autowert-Zahl in einem Feld zu kombinieren, können Sie den Primärschlüssel über zwei verschiedene Felder aufteilen. In der Beispieldatenbank sehen Sie eine Tabelle namens tblRechnerA, die ein Textfeld "RechnerName" und einen Autowert-Feld "ID" enthält. Beide Felder sind im Primärschlüssel-Index enthalten: siehe Abbildung 1 unten.
Der Standardwert des Textfeldes ist auf ="NameA" eingestellt, damit der Rechnername automatisch vergeben wird. Eine zweite Tabelle tblRechnerB hat die gleiche Struktur mit dem Textfeld-Standardwert ="NameB". Wenn Sie also Daten im Feld "TextDaten" eingeben, bleibt der Primärschlüssel über beide Tabellen eindeutig.
Die Abfrage zum Anfügen von Daten aus beiden Tabellen in eine Haupttabelle könnte etwa so aussehen:
Function DatenAnfügen(TabelleName As String)
DoCmd.RunSQL _ "INSERT INTO tblHauptTabelle (RechnerName,ID,TextDaten)" _ & "SELECT RechnerName,ID,TextDaten FROM " & TabelleName
End Function
Der Parameter TabelleName ist der Name der Tabelle, also z.B. "tblRechnerA".
|
Manchmal soll ein Filter oder eine Abfrage ähnliche Schreibweisen des gleichen Namens berücksichtigen.
Um verschiedene Schreibweisen zu berücksichtigen, definieren Sie eine Menge von Buchstaben. Um diese Anforderung zu erfüllen, können Sie Platzhalter im Filterkriterium verwenden.
So trifft beispielsweise das Kriterium
Wie M??er
unter anderem auf folgende Ausdrücke zu:
Mayer Maier Meier
Zusätzlich trifft aber auch folgender Ausdruck zu:
Maler
Um Ihre Angabe weiter zu präzisieren, können Sie Buchstabenmengen angeben. Betrachten Sie dazu folgenden Ausdruck:
Wie "M[ae][iy]er"
Dieser Ausdruck berücksichtigt alle Namen, bei denen der zweite Buchstabe ein a oder ein e und der dritte Buchstabe ein i oder ein y enthält. Der erste Buchstabe ist immer ein M und der Namen endet immer mit er.
Der Name Maler gelangt daher nicht ins Abfrage- oder Filterergebnis.
| |
Mit einem auswahlbasierten Filter können Sie schnell Daten filtern, es läßt sich aber immer nur ein Kriterium angeben. Sie wollen im Datenblatt jedoch mehrere Kriterien definieren, in denen Sie auch Operatoren verwenden können.
Aktivieren Sie den formularbasierten Filter, um im Datenblatt spezielle Kriterien für einen Filter zu definieren.
Klicken Sie auf das Symbol Formularbasierter Filter. Das Datenblatt besteht anschließend nur noch aus einer Zeile. Die Felder des Blattes sind Kombinationsfelder, in denen jeweils alle Inhalte einer Spalte aufgelistet werden.
Um ein Kriterium zu definieren, können Sie entweder fertige Werte aus den Kombinationsfeldern auswählen, oder, wie aus Abfragen gewohnt, beliebige Kriterien eintragen. Die Kriterien können Vergleichs- und Logischen Operatoren, sowie Platzhalterzeichen und allen andern möglichen Ausdrücke enthalten.
Alle Kriterien in einer Zeile werden mit dem logischen Und verknüpft. Eine Oder-Verknüpfung erstellen Sie, indem Sie am unteren Fensterrand auf die Registerkarte Oder klicken. Es wird dann eine neue, leere Zeile angezeigt, deren Kriterien mit den zuvor definierten mit Oder verbunden werden.
Über das Symbol Filter/Sortierung anwenden starten Sie den Filtervorgang, mit dem Symbol Filter entfernen werden wieder alle Datensätze angezeigt. | |
Sie benötigen schnell die zehn Monate mit den höchsten Umsätzen der letzten fünf Jahre. In den Tabellen liegen die Daten aber nicht nach Umsätzen sortiert vor.
Eine Möglichkeit besteht darin, die Tabellen nach dem Umsatz zu sortieren. Wenn Sie aber die besten zehn Prozent aller Monate der letzten fünf Jahre benötigen, müssten Sie mit der Tabelle schon den Taschenrechner bemühen.
Lassen Sie sich Spitzenwerte durch eine Abfrage anzeigen.
Erstellen Sie stattdessen eine Auswahlabfrage, die alle benötigten Datenfelder enthält.
Öffnen Sie das Eigenschaftenfenster der Abfrage und geben Sie bei der Eigenschaft Spitzenwerte die Anzahl der zurückzugebenden Datensätze an, die die höchsten Werte beinhalten.
Wenn Sie eine prozentuelle Angabe machen, müssen Sie einen Wert zwischen 0 und 100, gefolgt von einem Prozentzeichen eingeben. Um das Feld festzulegen, nach dem die Spitzenwerte ermittelt werden sollen, müssen Sie für dieses Feld eine Sortierreihenfolge wählen.
Mit aufsteigender Sortierung erhalten Sie die niedrigsten Werte und mit absteigender Sortierung die höchsten Werte. Durch die entsprechende Sortierreihenfolge können Sie also auch die zehn niedrigsten Umsätze ermitteln.
| |
| Die Funktionsvielfalt des beliebten Datenbankprogramms Access scheint auf den ersten Blick nahezu unüberschaubar und viele Anwender nutzen nur einen geringen Teil der zahlreichen Möglichkeiten dieser Software. Das Taschenbuch hilft Ihnen, trotz der unzähligen Funktionen den Überblick zu behalten und die neue Access-Version 2003 Ihren Wünschen und Anforderungen entsprechend einzusetzen. Anfänger lernen alle wichtigen Programmfunktionen und Anwendungsmöglichkeiten kennen und Profis erhalten nützliche Tipps zur optimalen Nutzung des Programms. Sie erfahren alles Wissenswerte, um eigene Datenbanken zu erstellen und Daten in strukturierter Form zu verwalten, aufzubewahren und auszuwerten. Auch anspruchsvollere Themen wie die Erstellung von Makros und Modulen, die Programmierung mit Visual Basic sowie der Datenaustausch mit anderen Office-Programmen werden ausführlich dargestellt. Auf der beiliegenden CD-ROM: nützliche Musterdatenbanken und die Beispiele aus dem Buch.
| |
Ein Microsoft Access add-in für einen kontrollierbaren Import von Daten aus Excel in Access.
Statt die Daten aus der Tabelle oder aus einer anderen Quelle einzelnd einzugeben, konnen sie einfach in die Tabelle konvertiert werden. Die Benutzer brauchen nur die Daten zu importieren. Auf solche Weise spart das viel Zeit und Geld für die Dateneingabe von der Bedienungskraft. Die Erstellungshilfe wird gewohnlich benutzt, wenn man z.B. mit einem neuen Microsoft Access System arbeitet, wo die Daten aus Microsoft Excel in Microsoft Access übertragen werden müssen oder für einen regelmässigen Import der Files aus den Aussenquellen oder aus einem anderen System. Beim Linking Microsoft Access mit Ihrer ODBC Datenbank (Oracle, SQL Server, usw.), konnen Sie die Erstellungshilfe auch dazu benutzen, um dorthin die Daten aus Microsoft Excel zu übertragen. | |
Genau wie Formulare können auch Berichte mit einem Bild hinterlegt werden.
Ein Hintergrundbild definieren Sie mit Hilfe der Eigenschaft Bild, die alle Berichte zur Verfügung stellen. Dieser Eigenschaft können Sie eine Grafikdatei des Formats BMP oder WMF zuweisen.
Die Eigenschaft Bildausrichtung sollten Sie auf Mitte einstellen, damit die Grafik in der Mitte jeder Seite ausgedruckt wird. Außerdem sollten Sie die Eigenschaft Bild nebeneinander auf Nein einstellen, damit die Grafik nicht mehrfach erscheint. | |
Diese Aufgabe wird von der folgenden Prozedur erledigt:
Sub SonderzeichenUmwandeln(KeyAscii As Integer)
Select Case KeyAscii Case Asc("ä"): SendKeys "ae": KeyAscii = 0 Case Asc("ö"): SendKeys "oe": KeyAscii = 0 Case Asc("ü"): SendKeys "ue": KeyAscii = 0 Case Asc("Ä"): SendKeys "Ae": KeyAscii = 0 Case Asc("Ö"): SendKeys "Oe": KeyAscii = 0 Case Asc("Ü"): SendKeys "Ue": KeyAscii = 0 Case Asc("ß"): SendKeys "ss": KeyAscii = 0 End Select
End Sub
Zur eigentlichen Umwandlung muß diese Prozedur an das Taste-Ereignis der betreffenden Textfelder eines Formulars geknüpft werden. Legen Sie dazu für die BeiTaste-Ereigniseigenschaft eine neue Ereignisprozedur an, und füllen Sie diese mit der folgenden Anweisung:
SonderzeichenUmwandeln KeyAscii
Die deutschen Sonderzeichen werden nun bereits während der Eingabe ersetzt. | |
Bei Tabellen sollten Sie eines immer im Hinterkopf behalten:
Währungsbeträge können nicht nur in Feldern mit dem Felddatentyp Währung, sondern auch in Feldern mit anderen Felddatentypen gespeichert sein.
Dafür kommen in erster Linie Felder mit den Felddatentypen Single oder Double in Frage. Es soll allerdings auch Datenbanken geben, in denen Währungsbeträge in Text-, Integer- oder Long Interger-Feldern gespeichert sind.
Es bleibt Ihnen also nichts anderes übrig, als Ihre Tabellen daraufhin zu überprüfen und gegebenenfalls entsprechend anzupassen. | |
Um dies zu verhindern, setzen Sie den Eingabefokus mit dem Befehl SelectObject zurück:
Forms![frmUhrzeit].Visible = True 'Formular anzeigen und aktivieren Domd.SelectObject acForm, "frmEingabe 'Formular wieder aktivieren
Mit dieser Methode entsteht allerdings ein störendes Geflacker, so dass der Fokus hin- und hergeschickt wird.
Diesem Umstand kann jedoch durch die Verwendung der bekannten Funktion SetWindowPos und einiger Konstanten abgeholfen werden.
Durch Angabe geeigneter Flags im letzten Parameter können Sie SetWindowPos dazu bringen, ein Fenster einzublenden, ohne es zu aktivieren. Dieses Verhalten wäre beispielsweise für Formulare interessant, die einen Status (z.B. die Uhrzeit) anzeigen. Folgendes Beispiel setzt die SetWindowPos-Funktion ein, um ein verborgendes Formular frmUhrzeit einzublenden, ohne dass das aktuelle Formular den Eingabefokus verliert:
Private Sub btnShowTime_Click()
FensterAktivieren Forms![frmUhrzeit]
End Sub
Die Prozedur FensterAktivieren sieht wie folgt aus:
Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const SWP_NOZORDER = &H4 Public Const SWP_SHOWWINDOW = &H40 Public Const SWP_NOACTIVATE = &H10
Declare Function SetWindowPos Lib "user32" _ Alias "SetWindowPos" (ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, ByVal x As Long,_ ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Function FensterAktivieren(F As Form)
SetWindowPos F.hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE _ Or SWP_NOMOVE _ Or SWP_NOZORDER _ Or SWP_SHOWWINDOW Or SWP_NOACTIVATE
End Function
Die Flags SWP_NOSIZE und SWP_NOMOVE sorgen dafür, dass die Größe und Position des Fensters nicht verändert werden. | |
Ich habe mittlerweile eine unüberschaubare Anzahl von Abfragen in meiner Access 97 Datenbank. Nicht alle werden in Programmen, Berichten und Formularen verwendet.
Gibt es eine Möglichkeit, maschinell die in irgendeinem Objekt verwendeten Abfragen herauszufinden? | Die herkömmliche Lösung wäre, eine Abfrage zu löschen und die gesamten Formulare und Berichte erneut gründlich zu testen.
Ein viel komfortablerer Weg ist dagegen ein Assistent, der in sämtlichen Datenbankobjekten nach einem beliebigen Text sucht und diesen ggf. ersetzt. Unser Suchen-und-Ersetzen-Assistent ist ein solches Tool, das in unseren fullAccess powerTools enthalten ist. |
Werden Sie im Selbststudium mit Microsoft Access zum Datenbankprofi! Mit diesem praxisorientierten Lehrbuch und den vorbereiteten Übungsdateien arbeiten Sie sich in Ihrer persönlichen Lerngeschwindigkeit durch die leicht nachvollziehbaren Lektionen und praktischen Übungen und lernen dabei alle wesentlichen Werkzeuge und Techniken kennen. Gleichzeitig hilft Ihnen dieses Buch, sich auf die Microsoft Office Specialist-Prüfung vorzubereiten und stellt später ein ausgezeichnetes Nachschlagewerk für den beruflichen Alltag dar. Auf der Begleit-CD befinden sich alle vorbereiteten Übungsdateien, so dass Sie bei Ihrem Start keine Zeit verlieren. Dieses Lehrbuch wurde von unabhängiger Stelle als Vorbereitung auf die Microsoft Office Specialist-Prüfung anerkannt und erhielt das Prädikat „Microsoft Office Specialist Approved Courseware“. Das offizielle Trainingsbuch von Microsoft ist das ideale Lehrbuch für jeden, der Access endlich beherrschen will. Microsoft Press (September 2004); Euro 29,90; ISBN: 3860630849 | |
Sie haben mit Access die Möglichkeit, auf externe Datenbanken zuzugreifen. Sie können dazu Tabellen verknüpfen oder importieren.
Wenn Sie aber mal eben eine Information aus einer anderen Datenbank benötigen, beispielsweise eine Telefonnummer zu einem Namen aus einer Adressdatenbank, wäre es zuviel des Guten, diese Tabelle zu importieren.
Greifen Sie auf externe Datenbanken mittels einer Abfrage zu.
Erstellen Sie eine neue Abfrage, fügen Sie keine Tabelle oder Abfrage hinzu und öffnen Sie das Eigenschaftsfenster. In der Eigenschaft Quelldatenbank ist die aktuelle Datenbank (Aktuell) eingetragen. Geben Sie in diesem Eingabefeld den Namen und den Pfad der Datenbank an, auf die Sie zugreifen wollen. Zum Beispiel:
D:\Daten\Access90\Nordwind.mdb
Klicken Sie jetzt auf das Symbol Tabellen anzeigen. In den Registern Tabellen und Abfragen werden jetzt nicht mehr die Objekte der aktuellen, sondern der angegebenen Datenbank angezeigt. Fügen Sie die benötigte Tabelle hinzu. Sie können jetzt wie gewohnt Felder selektieren und Kriterien definieren.
Wenn Sie in der Abfrage noch Parameter verwenden, können Sie die Abfrage speichern und beim Aufruf mittels des Parameters gezielt Daten abrufen.
Definieren Sie beispielsweise einen Parameter für den Namen einer Person und lassen Sie sich zusätzlich die Telefonnummer anzeigen. Beim Aufruf der Abfrage geben Sie nur noch den Namen an, und Sie erhalten die Telefonnummer, ohne dass Sie Ihre Datenbank verlassen müssen. | |
Ich möchte in einer angelegten Datenbank wie bei Excel einen Wert berechnen lassen. Ich habe zwei Werte, die ich dividieren möchte. Das Ergebnis soll dann in einer neuen Spalte ausgegeben werden.
| Sie können die Berechnung in einer einfachen Auswahlabfrage vornehmen. Hierzu fgen Sie in der Abfrage eine weitere Spalte ein und statt des Feldnamens tragen Sie die Formel Summe: [Menge1] / [Menge2] ein.
In der Datenblattansicht erhalten Sie dann in der Dritten Spalte das Ergebnis. Die Daten dieser Spalte können Sie nun in Formularen oder anderen Abfragen weiterverwenden. |
Manchmal interessieren Sie nur bestimmte Datensätze einer Tabelle oder Abfrage. In diesem Fall definieren Sie einen Filter, um die Sicht Ihrer Daten einzuschränken.
Um alle Datensätze vom Ersten eines beliebigen Monats anzusehen, definieren Sie einen Filter mit der Format-Funktion.
Wählen Sie den Befehl Datensätze / Filter / Spezialfilter/-sortierung aus der Menüzeile, und geben Sie in die erste Spalte des Entwurfsbereichs folgenden Ausdruck ein:
TagBestelldatum: Format([Bestelldatum];"t") Abfragefeld
Ersetzen Sie dabei das Feld Bestelldatum durch den Namen des Feldes, nach dem Sie filtern wollen. Durch die Angabe des Parameters "t" ermittelt die Format-Funktion den Tag aus dem jeweiligen Datumswert.
Wenn Sie nun zusätzlich den Wert 1 als Kriterium eingeben und den Filter anwenden, zeigt Access nur die Datensätze an, deren Bestelldatum auf den Ersten eines beliebigen Monats in einem beliebigen Jahr fällt.
| |
Als einziges Parameter übergeben dieser Funktion das Handle des betreffenden Fensters. Das Ergebnis Wahr weist auf ein minimiertes Fenster hin.
Auf eine ähnliche Weise arbeitet die Funktion IsZoomed, die feststellt, ob ein Fenster maximiert ist. Genau wie mit der Funktion ShowWindow können Sie den Ausdruck Application.hWndAccessApp dazu verwenden, den Zustand des Hauptfensters zu ermitteln. Für aktive Objektfenster (von Formularen und Berichten) übergeben Sie die Eigenschaft hWnd des Objekts.
Die Funktionen IsIconic und IsZoomed deklarieren Sie in einem Modul wie folgt:
Declare Function IsIconic Lib "user32" Alias "IsIconic" _ (ByVal hwnd As Long) As Long Declare Function IsZoomed Lib "user32" Alias "IsZoomed" _ (ByVal hwnd As Long) As Long
Folgende Funktion nutzt beispielsweise die oben deklarierten API-Funktionen, um den Zustand des Fensters hWnd% festzustellen:
Public Const NORMAL = 0 Public Const MAXIMIZED = 1 Public Const MINIMIZED = 2
Public Function FensterZustand(ByVal hwnd%)
If IsZoomed(hwnd) Then FensterZustand = MAXIMIZED ElseIf IsIconic(hwnd) Then FensterZustand = MINIMIZED Else
FensterZustand = NORMAL End If
End Function | |
Wir haben zwei Büros in Leipzig und Dresden, die über Telefon in Kontakt stehen. Um stets aktuell zu bleiben, nutzen wir die Replikation bzw. wollen Sie gern nutzen. Nach jeder erfolgten Replikation sind die neuen Replikate jedoch unbrauchbar, da Makros, Funktionen u.ä. nicht mehr unterstützt werden und zu Programmfehlern führen. Mit einigem Basteln haben wir herausbekommen, dass dies wohl mit Änderungen im Original zusammenhängt, d.h. bei Abweichungen in Formularen u.ä. ist die Replikation fehlerhaft. Der Clou wäre jedoch, auch Änderungen durchführen und replizieren zu können.
Gibt es eine Möglichkeit, diese Änderungen bei der Replikation mit zu übertragen oder beschränkt sich die Nutzung auf die reine Datenänderung? | Tatsächlich beschränkt sich die Replikation auf Datenänderungen in Ihrer Datenbank. Für Entwurfsänderungen an Formularen, Berichten usw. ist die so genannte "Design-Master"-Datenbank verantwortlich. Wenn beide Büros Änderungen am Entwurf der Datenbank durchführen wollen, müssen diese nacheinander an der Design-Master-Datenbank durchgeführt werden. Es ist also erforderlich, diese Datenbank - beispielsweise via E-Mail - zwischen den beiden Büros auszutauschen.
Die Microsoft Office 97 Developer Tools bieten zur Vereinfachung Quellcode-Verwaltungsprodukte an (wie z.B. Visual SourceSafe), die Sie auch mit Access 97 nutzen können. Mit einem Quellcode-Verwaltungssystem werden Datenbankobjekte von verschiedenen Entwicklern ein- und ausgecheckt. Die aktualisierten Objekte werden dann nach einer Versionsnummer geprüft und zusammengefügt. Weitere Information zur Quellcode-Verwaltung mit Access 97 finden Sie unter http://www.microsoft.com/officedev. |
Das Buch bietet den gesamten Funktionsumfang von Access 2003 und mehr - für Leser, die in Access gründlich einsteigen und gleich weitermachen wollen. Für Access-Fortgeschrittene, die auf der Suche nach tiefer gehenden Informationen, nach Tipps und Praxiswissen sind, und für jeden Anwender, der nachschlagen und Know-how auffrischen will. Der Autor ist einer der erfahrensten bei Markt + Technik und zeichnet sich dadurch aus, dass er das, was er professionell darstellt besonders eingängig formuliert.
Von Said Baloui; Markt + Technik (2003); Euro 44,95; ISBN: 3827265622
Auch als eBook erhältlich; Markt + Technik (2003), € 29,95; ISBN PDF-3827265622
| |
Die Funktion SetWindowPos ändert die Position des angegebenen Fensters:
Declare Function SetWindowPos Lib "user32" _ (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ ByVal x As Long, ByVal y As Long, ByVal cx As Long, _ ByVal cy As Long, ByVal wFlags As Long) As Long
Das Parameter hwnd stellt das Handle des zu positionierenden Fensters dar.
Das folgende Beispiel ordnet das Access Hauptfenster und die Hilfe-Fenster zu den Datenzugriffsobjekten (Fenstertitel DAO-Referenz) nebeneinander an.
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long
Declare Function GetSystemMetrics Lib "user32" _ (ByVal nIndex As Long) As Long
Public Const SWP_NOZORDER = &H4 Public Const SM_CXSCREEN = 0 Public Const SM_CYSCREEN = 1 Public Const SW_NORMAL = 1
Public Function FensterPositionieren()
Dim SchirmBreite As Long, SchirmHöhe As Long Dim lHilfeFenster As Long
' Breite des gesamten Bildschirms SchirmBreite = GetSystemMetrics(SM_CXSCREEN)
' Höhe des gesamten Bildschirms SchirmHöhe = GetSystemMetrics(SM_CYSCREEN)
' falls maximiert bzw. minimiert ShowWindow Application.hWndAccessApp, SW_NORMAL
SetWindowPos Application.hWndAccessApp, 0, 0, 0, _ SchirmBreite / 2, SchirmHöhe, SWP_NOZORDER
' Handle des Hilfe-Fensters ermitteln lHilfeFenster = FensterSuchen("DAO-Referenz")
If lHilfeFenster Then
SetWindowPos lHilfeFenster, 0, SchirmBreite / 2, _ 0, SchirmBreite / 2, SchirmHöhe, SWP_NOZORDER
End If
End Function
Voraussetzung für das Funktionieren der Prozedur ist, dass Sie sich die Proezedur des vorhergehenden Beispiels bereits in Ihrem Modul befindet.
Damit die Funktion unabhängig von der Bildschirmauflösung arbeitet, ermitteln sie zuerst die Auflösung mit der Funktion GetSystemMetric. Anschließend wird das Access-Fenster links oben auf dem Bildschirm positioniert. Die Größe des Fensters wird auf die gesamte Bildschirmhöhe und die Hälfte der gesamten Bildschirmbreite (SchirmBreite / 2) gesetzt. Unmittelbar neben dem Access-Fenster fängt das Hilfe-Fenster in der Mitte des Bildschirms an und reicht bis zum rechten Rand des Bildschirms. | |
Dieses Buch richtet sich an Programmierer und Entwickler, die im professionellen und privaten Bereich eigene Access-Anwendungen erstellen möchten. Access-Anwendungskenntnisse werden vorausgesetzt.
Eigene Datenbanken entwickeln
Wer mit Access eigene Datenbank-Anwendungen entwickeln möchte, benötigt genaue Kenntnisse über Access Basic/VBA und die Makro-Programmierung. Dieses Buch liefert sie Ihnen: Anhand von zahlreichen Beispielen führt es Sie in die Programmierung mit Access ein.
Profi-Techniken
Neben den Grundlagen der Datenbankprogrammierung bietet Ihnen dieses Buch kompetente Anleitungen zur Handhabung von Datenbankobjekten sowie zum professionellen Design einer Datenbank. Echte Profi-Techniken werden in den letzten Kapiteln dieses Buches vermittelt. Hier geht es detailliert um die Programmierung von OLE und DDE sowie API-Funktionsaufrufen.
Aus dem Inhalt
- Tabellen, Abfragen, Formulare und Berichte mit Access-Basic/VBA programmieren
- OCX-Zusatzsteuerelemente zum Abfangen von Fenstermeldungen
- Vollständige Referenz
- Tipps zur Anwendungsentwicklung
- Artikeldatenbank mit zahlreichen Speziallösungen zu Access 7.0
Leider müssen wir Ihnen mitteilen, dass das Access 7.0 Buch für Windows 95 nicht mehr im Handel erhältlich ist.
Bei Amazon.de gibt es die Möglichkeit alte nicht mehr im Handel erhältliche Bücher gebraucht zu kaufen. Schauen Sie doch einfach mal bei Amazone.de vorbei. Vielleicht haben Sie ja Glück. | |
Wenn der Ausdruck eines Berichts via VBA aktiviert wurde, und der Benutzer den Druckauftrag abbricht, löst Access für die betreffende OpenReport-Methode einen Laufzeitfehler aus.
Diesen Fehler, der von Access beim Druckabbruch ausgelöst wird, sollte Ihre VBA-Prozedur abfangen.
Public Function BerichtDrucken(Bericht As String)
On Error GoTo Err
DoCmd.OpenReport Bericht, acNormal BerichtDrucken = True
Ende: Exit Function Err: If Err.Number = 2501 Then 'Druck wurde abgebrochen MsgBox "Druckauftrag wurde abgebrochen." End If
BerichtDrucken = False Resume Ende
End Function | |
Der Databases-Container enthält zu diesem Zweck ein Document-Objekt namens SummaryInfo, dessen Eigenschaften den Zugriff auf die einzelnen Dateiinformationen erlaubt. Jede Dateiinformation wird hier durch eine eigene Eigenschaft repräsentiert.
Bei Zugriff auf die Eigenschaft muß allerdings stets der englische Name der Dateiinformation angegeben werden. Außerdem muß der Zugriff mittels Properties-Auflistung erfolgen, da es sich bei den Datei-Informationen um benutzerdefinierte Eigenschaften handelt. Die folgenden Programmzeilen geben beispielsweise den Autor der aktuellen Datenbank im Testfenster aus:
Sub AutorAusgeben()
Dim DB As Database
Set DB = CurrentDb()
Debug.Print DB.Containers!Databases. _ Documents!SummaryInfo.Properties![Author]
End Sub
Bei der richtigen Zuordnung der deutschen und der englischen Eigenschaftsbezeichnungen hilft Ihnen die nachfolgende Tabelle:
Tabelle
Eine Besonderheit besteht darin, daß nur die Datenbankeigenschaften innerhalb des SummaryInfo-Objekts durch Eigenschaften vertreten sind, für die Sie einen Text eingetragen haben. Wenn Sie beispielsweise noch keine Firma eingetragen haben, ist die entsprechende Eigenschaft Company nicht vorhanden. Dies müssen Sie beim Zugriff auf die Eigenschaft berücksichtigen, das es hier zu einem Laufzeitfehler kommen kann. Die folgende Beispielfunktion liest den Firmennamen der aktuellen Datenbank aus und gibt ihn als Ergebnis zurück. Sollte die Eigenschaft nicht vorhanden sein, liefert die Funktion eine leere Zeichenkette:
Function FirmennameErmitteln() As String
On Error GoTo Err
Dim DB As Database
Set DB = CurrentDb()
FirmennameErmitteln = DB.Containers!Databases. _ Documents!SummaryInfo.Properties![Company]
Exit Function
Err:
'Die Eigenschaft ist nicht vorhanden FirmennameErmitteln = "" Exit Function
End Function
Natürlich können Sie eine Dateiinformation nicht nur auslesen, sondern auch verändern. Sie haben hierbei uneingeschränkten Lese- und Schreibzugriff auf die betreffenden Eigenschaften. Sie müssen allerdings sicherstellen, daß die Eigenschaft vor dem Hinzufügen auch wirklich existiert. Sollte dies nicht der Fall sein, können Sie diese vorher mittels CreateProperty-Methode hinzufügen. | |
Das 72-seitige Magazin ist werbefrei und enthält ca. acht bis zehn Beiträge pro Ausgabe, die sich mit Themen rund um Access beschäftigen. Es ist für jeden etwas dabei: Fundierte Grundlagen zur Datenmodellierung, Formular- und Berichtsgestaltung sowie zur Programmierung mit VBA sind dort ebenso vertreten wie fortgeschrittene Themen.
Die Zusammenarbeit von Access mit den anderen Office-Anwendungen wie Word, Excel oder Outlook wird immer wieder aufgegriffen und auch alternative Techniken finden ihren Platz - etwa der Microsoft SQL Server, die MSDE oder MySQL auf der Datenseite und VB.NET/ADO.NET oder klassisches ASP auf der Benutzerseite. Und in Zeiten des Internet dürfen auch Techniken wie E-Mail (mit und ohne Outlook) oder der Zugriff auf Web-Services via Access nicht fehlen.
Das Know-how kommt in verschiedenen Darreichungsformen: Grundlagen- und Know-how-Beiträge beschäftigen sich intensiv mit einer Technik, Musterlösungen stellen die Umsetzung von Anwendungen zum Verwalten von Kontakten, Kunden, Artikeln, Vereinen, Literatur und vielem mehr vor und beschreiben sowohl die Erstellung als auch die Anwendung der Lösungen und in den Tipps und Tricks finden Sie mundgerecht zubereitetes Know-how für den Soforteinsatz.
Zusätzlich zum Magazin erhält man für die Dauer des Abonnements Zugriff auf das sehr umfangreiche Online-Archiv, das alle Beiträge seit Erscheinen des ersten Magazins Ende 2000 enthält - dort warten immerhin mehr als 2000 Seiten Know-how auf den Leser.
Seit neuestem ist das Magazin auch preislich wesentlich attraktiver: Bisher gab es nur ein jederzeit kündbares Abo zum Preis von EUR 29,80 je Heft, nun offeriert der Verlag ein Jahresabo für EUR 124,- (zzgl. 7% MwSt.) - und darin ist auch noch das Buch 'Access, SQL & .NET' im Wert von EUR 49,80 enthalten. Die Bestellung ist unter http://www.access-magazin.de möglich; dort gibt es weitere Infos wie etwa eine komplette Übersicht über alle bisher erschienenen Beiträge inklusive der ersten Seite eines jeden Beitrags als .pdf-Leseprobe. Zu den Autoren gehören übrigens auch der Access-FAQ-Schöpfer Karl Donaubauer und die beiden TriniDat-Macher Manfred Hoffbauer und Christoph Spielmann.
Access im Unternehmen - das Magazin Lösungen, Tipps und Tricks und Know-how zu Microsoft Access Systemanforderung: Access 97 oder höher Preis: EUR 124,- für das Jahresabo + Buch 'Access, SQL & .NET' + Online-Archiv (zzgl. MwSt. und Versand) | |
Mit der API-Funktion ChooseColor können Sie diesen Dialog ihrer Access-Anwendung zur Verfügung stellen. Diese Funktion wird wie folgt definiert:
Declare Function ChooseColor Lib "comdlg32.dll" _ Alias "ChooseColorA" (Color As TChooseColor) As Long
Als einziges Parameter übergeben Sie der ChooseColor-Funktion einen benutzerdefinierten Typ, der wichtige Information für den Farben-Dialog enthält. Dieser Typ ist folgendermaßen definiert:
Type TChooseColor lStructSize As Long hwndOwner As Long hInstance As Long rgbResult As Long lpCustColors As Long Flags As Long lCustData As Long lpfnHook As Long lpTemplateName As Long End Type
Dim BDFarben(0 To 15) As Long
Zusätzlich müssen Sie ein Array deklarieren, das die fünfzehn benutzerdefinierten Farben enthält. Einen Zeiger auf dieses Array weisen Sie dem Parameter TChooseColor.lpCustColors zu. Da VBA jedoch nicht so geschickt mit Zeigern umgehen kann, müssen Sie den Zeiger per Hand erzeugen, und zwar mit der Funktion VarPtr, die sich in der Visual Basic Laufzeitbibliothek VB40032.DLL befindet:
Declare Function VarPtr Lib "vb40032" (lpVoid As Any) As Long
Die obengenannte Laufzeitbibliothek gehört nicht zum Lieferumfang von Access, sondern Sie finden sie bei Visual Basic ab Version 4.0. Da es sich um eine frei verfügbare Laufzeitversion handelt, können Sie die Datei auch aus Mailboxen und Onlinediensten (z.B. Com Mit dem Parameter Flags können Sie Optionen für den Dialog einstellen. In unserem Beispiel verwenden wir die Konstante CC_RGBINIT. Dies bedeutet, daß der Dialog die zuletzt ausgewählte Farbe als Voreinstellung für die nächste Farbenauswahl nehmen soll. Weitere Flags können Sie mit den folgenden Konstanten setzen:
Konstante |
Bedeutung |
Public Const CC_RGBINIT = &H1 |
letzte Farbe voreingestellt |
Public Const CC_FULLOPEN = &H2 |
Dialog wird mit beiden Hälften geöffnet |
Public Const CC_PREVENTFULLOPEN = &H4 |
Rechte Hälfte zum Farben selbst definieren darf nicht geöffnet werden |
Public Const CC_SHOWHELP = &H8 |
Hilfe-Schaltfläche verfügbar |
Public Const CC_SOLIDCOLOR = &H80 |
Nur solide Farben verfügbar |
Public Const CC_ANYCOLOR = &H100 |
Alle Farben verfügbar |
| |
Zu Beginn des Trainings lernen Sie die Benutzeroberfläche von Access 2003 kennen und erfahren sukzessive, welche Funktionen die Datenbank zu bieten hat. Schon bald werden Sie selbst aktiv und legen mit Hilfe von detaillierten Schritt-für-Schritt-Anleitungen eigene Datensätze an. Anschließend trainieren Sie ebenfalls unter Anleitung den effektiven Umgang mit Tabellen, Formularen, Abfragen und Berichten. Und um die nötige Routine im Umgang mit Access zu gewinnen, können Sie das Erlernte mit Hilfe der Übungen auf der beiliegenden CD selbst ausprobieren.
Ganz gleich, ob Sie das Trainingsprogramm von A bis Z absolvieren möchten oder sich gezielt einzelnen Themen widmen wollen – mit diesen Workouts werden Sie Ihre Fitness in Access 2003 zügig und effizient steigern.
Aus dem Inhalt
- Grundlagen von Access
- Eine Datenbank anlegen und bearbeiten
- Daten suchen, filtern und formatieren
- Eine relationale Datenbank erstellen
- Mit Tabellen, Formularen, Abfragen, Makros und Berichten arbeiten
- Daten importieren und exportieren
Deutsche Übersetzung von DELTA International CITS GmbH; Euro 29,00; ISBN: 3-89721-418-0 | |
Das Buch richtet sich sowohl an Anfänger, die eine fundierte Einführung in die Datenbankprogrammierung und die Programmiersprache VBA suchen, als auch an versierte Access-2000-Entwickler, die ein kompetentes Nachschlagewerk brauchen. Dem Access-Einsteiger werden Makros und deren Unterschiede zu VBA-Codes erklärt. Er lernt die Strukturen einer relationalen Datenbank und wichtige Begriffe der Datenbanktheorie kennen. Im Anschluß erläutern die Autoren die Grundlagen der VBA-Programmierung und gehen dann auf den praktischen Einsatz von VBA ein. Mit diesen Kenntnissen ist der Leser in der Lage, eigene Datenbankanwendungen zu programmieren.
Von Irene Bauder, Jürgen Bär und Carl Hanser (1999); Euro 49,90; ISBN: 3446211012 | |
Ich möchte ein Formular über eine Befehlsschaltfläche schließen. Dies führt jedoch zu einer Fehlermeldung, weil z.B. in einem Primärschlüsselfeld kein Wert eingetragen ist.
Wenn ich jedoch das Fenster via Systemmenüfeld schließe, erscheint zwar ebenfalls die Fehlermeldung, das Formular wird aber geschlossen.
Woran liegt das? Oder anders gefragt: Welcher Befehl wird ausgeführt, wenn ich den Systemmenübefehl ausführe? | Wenn Sie ein Formular mittels Systemmenü schließen, prüft Access zunächst die Gültigkeit der Daten. Wird diese verletzt, meldet Access einen Fehler. Sie können das Formular aber trotzdem schließen, indem Sie auf Ja klicken.
Die Datenänderungen werden in diesem Falle rückgängig gemacht. Wenn Sie das Formular mit einer eigenen Schaltfläche schließen möchten, müssen Sie vorher die Daten selbst prüfen. Dazu erweitern Sie die Ereignisprozedur der Schaltfläche:
Private Sub btnSchließen_Click()
If IsNull(Me!Nachname) Then ' Nachname-Feld braucht einen Wert MsgBox "Kein Nachname eingegeben!" Me!Nachname.SetFocus Else ' Daten sind OK DoCmd.Close acForm, Me.Name End If
End Sub |
Besonders beim Drucken von Aufklebern ist es oft erforderlich, daß bestimmte Datensätze mehrmals hintereinander gedruckt werden sollen.
Wenn Sie Adreßetiketten drucken möchten, fügen Sie der betreffenden Adressentabelle zunächst ein neues Datenfeld namens AnzahlKopien hinzu. Hier speichern Sie die Anzahl der Etiketten, die für den jeweiligen Datensatz ausgedruckt werden sollen. Wenn Sie beispielsweise den Wert 1 angeben, druckt Access das Original und zusätzlich eine Kopie – also insgesamt zwei Etiketten.
Auf Basis dieser Tabelle legen Sie dann einen Etikettenbericht an. Achten Sie darauf, dass Sie das Feld AnzahlKopien ebenfalls in Ihren Bericht übernehmen. Damit es hier später nicht sichtbar ist, stellen Sie die Sichtbar-Eigenschaft auf Nein ein.
Die BeimDrucken-Ereigniseigenschaft des Detailbereichs verknüpfen Sie anschließend mit der folgenden Ereignisprozedur:
Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)
Static Anzahl As Integer
If Anzahl < Me!AnzahlKopien Then
Me.NextRecord = False Anzahl = Anzahl + 1
Else
Anzahl = 0
End If
End Sub Die Prozedur enthält eine statische Variable, die die Anzahl der bereits gedruckten Kopien aufnimmt. Sollte die erforderliche Anzahl noch nicht erreicht worden sein, verhindert die Prozedur mittels NextRecord-Methode den Wechsel zum nächsten Datensatz. Der aktuelle Datensatz wird also erneut ausgedruckt. Sobald die erforderliche Anzahl erreicht ist, wird die Variable Anzahl wieder auf den Wert 0 gesetzt und der Wechsel zum nächsten Datensatz zugelassen. | |
Manchmal ist es erforderlich, solche Texte als Zahlen zu kodieren. Ein Grund hierfür könnte darin bestehen, dass sich die Anzahl der Farbwerte kontinuierlich erweitert und Sie sie deshalb lieber in einer eigenen Tabelle speichern. Um die Farbwerte umzusetzen, gehen Sie wie folgt vor:
- Fügen Sie Ihrer Tabelle das numerische Feld Farbwert hinzu.
- Speichern Sie den neuen Tabellenentwurf.
- Erstellen Sie eine neue Abfrage auf der Basis der geänderten Tabelle.
- Wählen Sie den Befehl Abfrage>Aktualisieren aus der Menüzeile, um die Auswahl- in eine Aktualisierungsabfrage umzuwandeln.
- Ziehen Sie die Spalte Farbwert in den Entwurfsbereich der Abfrage.
- Geben Sie den folgenden Ausdruck in die Zeile Aktualisieren der Spalte Farbwert ein:
Wenn([Farbe]="Grün";1;Wenn([Farbe]="Blau";2;3))
Dieser Ausdruck gibt den Wert 1 zurück, wenn der Wert des Feldes Farbe gleich Grün ist. Andernfalls führt Access die zweite, geschachtelte Wenn-Funktion aus. Diese ermittelt den Wert 2, wenn der Wert des Feldes Farbe gleich Blau ist. In allen anderen Fällen liefert die Funktion den Wert 3.
Mit dem Befehl Abfrage>Ausführen starten Sie die Abfrage. Access meldet zunächst, wieviele Datensätze aktualisiert werden. Klicken Sie auf die Schaltfläche OK, um den Vorgang zu starten. Wenn Sie anschließend in das Datenblatt Ihrer Tabelle schauen, werden Sie feststellen, daß das Feld Farbwert nun die gewünschten Werte enthält. Sie können das Feld Farbe daher aus Ihrer Tabelle löschen. | |
Lt. Microsoft Access-Hilfe kann man in einem ungebundenen Kombinationslistenfeld einen Eintrag markieren mit
cboFeld.selected(1)=true
(soll das 2. Element der Liste markieren) Der Kompiler gibt jedoch eine Fehlermeldung aus. "Methode oder Datenobjekt nicht gefunden" Was mache ich falsch? | Die Selected-Methode gilt nur für Listboxen. Für ein Kombinationsfeld kann man den Wert direkt setzen:
cboFeld.AddItem "Eintrag 1" cboFeld.AddItem "Eintrag 2" cboFeld.AddItem "Eintrag 3" cboFeld.AddItem "Eintrag 4" cboFeld = "Eintrag 2" ' Startwert. |
Umschaltflächen verfügen über keine Möglichkeit, zwei oder mehrere Zustände durch unterschiedliche Symbole zu repräsentieren.
Diese Funktionalität können Sie aber nachahmen, indem Sie zwei Schaltflächen deckungsgleich übereinander anordnen und bei Bedarf einzeln einblenden.
Erstellen Sie zuerst zwei gleich große übereinander liegende Schaltflächen, und weisen Sie diesen die Namen btnNr1 und btnNr2 zu. Da nur die erste Schaltfläche standardmäßig sichtbar sein sollte, ändern sie die Sichtbar-Eigenschaft der zweiten Schaltfläche in Nein ab.
Legen Sie dann für das Beim Klicken-Ereignis beider Schaltflächen zwei identische Ereignisprozeduren an. Das folgende Listing zeigt die beiden Ereignisprozeduren:
Private Sub btnNr1_Click()
Me![btnNr2].Visible = Not Me![btnNr2].Visible Me![btnNr2].SetFocus Me![btnNr1].Visible = Not Me![btnNr1].Visible
End Sub
Private Sub btnNr2_Click()
Me![btnNr1].Visible = Not Me![btnNr1].Visible Me![btnNr1].SetFocus Me![btnNr2].Visible = Not Me![btnNr2].Visible
End Sub
Bei einem Klick auf die erste Schaltfläche wird diese nun ausgeblendet und die zweite Schaltfläche eingeblendet. | |
Ich habe in einem Formular den Beginn einer Veranstaltung als Datumsfeld. In einem zweiten Feld steht das Geburtsdatum von Teilnehmern, die an dieser Veranstaltung teilnehmen wollen. Nun möchte ich prüfen (auf den Tag genau) ob ein Teilnehmer ein bestimmtes Mindestalter hat. Da das Mindestalter bei verschiedenen Veranstaltungen unterschiedlich ist, sollte in einem dritten Feld nur das Alter als Zahl eingesetzt werden müssen.
Wird das Mindestalter nicht erreicht, erscheint eine Warnmeldung. | Access-97-Datenbank mit Mindestalter-Abfrage
Wie so viele Aufgaben kann auch diese hauptsächlich mit einer Abfrage erledigt werden. Die Beispieldatenbank zu dieser Leseranfrage enthält zunächst eine Tabelle namens tblVeranstaltungen mit den Feldern, die Herr Koch erwähnt hat. Die Abfrage qryTeilnehmer gibt die Daten aus dieser Tabelle zusammen mit einigen berechneten Feldern zurück.
Um festzustellen, ob das Mindestalter zum Veranstaltungsbeginn vom Teilnehmer erreicht werden wird, brauchen wir zuerst das Alter an dem Datum, an dem die Veranstaltung beginnt. Dieses Datum kann entweder in der Zukunft oder in der Vergangenheit liegen. Dazu nehmen wir folgendes berechnetes Abfragefeld:
AlterDann: Wenn(DatSeriell(Jahr([Beginn]); Monat([TeilnehmerGeburtstag]); Tag([TeilnehmerGeburtstag]))<=[Beginn]; Jahr([Beginn])-Jahr([TeilnehmerGeburtstag]); Jahr([Beginn])-Jahr([TeilnehmerGeburtstag])-1)
Dieses Feld sieht beim ersten Blick ziemlich komplex aus, ist aber nichts Anderes als eine modifizierte Version der Funktion zur Berechnung des aktuellen Alters. Ein weiteres Abfragefeld vergleicht das Mindestalter mit dem Alter des Teilnehmers am Veranstaltungsbeginn: Mindestalter erreicht:
[AlterDann]>=[Mindestalter]
Dieses Feld gibt den Wert True bzw. False zurück. Das Ergebnis können Sie jedoch mit einem passenden Text formatieren. Geben Sie folgenden Text in der Format-Eigenschaft des Feldes ein:
"Mindestalter nicht erreicht"[Rot]; "Mindestalter OK" |
Redmond (1997); Euro 8,00; ISBN: 3932575261
Leider müssen wir Ihnen mitteilen, dass das Access 97 Trainings-Buch nicht mehr im Handel erhältlich ist.
Bei Amazon.de gibt es die Möglichkeit alte nicht mehr im Handel erhältliche Bücher gebraucht zu kaufen. Schauen Sie doch einfach mal bei Amazone.de vorbei. Vielleicht haben Sie ja Glück. | |
Diese Möglichkeit zur Feldauswahl nutzt das Entwurfsraster selbst.
Wählen Sie den Feldnamen über ein Kombinationsfeld aus.
Klicken Sie in der ersten freien Spalte in die Zeile Feld und öffnen Sie das erscheinende Kombinationsfeld. Darin werden alle Felder aus allen Tabellen, die Sie dem Entwurfsbereich hinzugefügt haben aufgeführt und zwar in der Form:
| |
Auf dieser Site präsentiert Ihnen Gerhard Kopatz viele Themenbereiche, wie zum Beispiel der Visual Basic Tutorials Bereich in dem Ihnen mehrere Tipps und Anregungen für die Programmier Praxis vorgestellt werden
In der Tipps & Tricks Rubrik werden Ihnen eine Vielzahl an Beispielen zur Verfügung gestellt. Eine ähnliche Beschaffenheit wie die Source Code Rubrik hat die Abteilung mit dem Namen „Programme“. Dort finden Sie etliche in Visual Basic geschriebene Programme komplett als Open Source.
Wie Sie an interessante Informationen rund um das Thema Visual Basic auch außerhalb des Internets kommen können erfahren Sie in der Rubrik Quellen.
Auch der Forum-Bereich ist sehr Interessant, denn dort können Sie sich mit anderen Besuchern austauschen und so direkt von den Erfahrungen anderer Programmierer profitieren.
Bei den Links bekommen Sie eine Auflistung der besten Deutsch- und Englischsprachigen Visual Basic Websites. Zu jeder Site finden Sie auch einen kleinen Screenshot, der Ihnen sofort einen Eindruck über das Angebot vermittelt.
Desweiteren gibt es einen Chatraum von Visual Basic World, in dem Sie sich direkt mit den Besuchern dieser Site austauschen können. | |
| Ich habe eine Datenbank mit einer Tabelle für offene Posten. Ich möchte nun über das Tabellenfeld RE-Betrag die Mahngebühren berechnen lassen. Die Berechnung soll wie folgt aussehen:
| RE-Betrag |
Mahngebühr |
| bis 1000 DM |
5,00 DM |
| zwischen 1001 und 20.000 DM |
0,5% des RE-Betrags |
| mehr als 20.000 DM |
100 DM | Wie kann ich solch eine Berechnung in eine Access-Abfrage einbinden? | Access-97-Datenbank mit Demo-Datenbank
Bei einer solchen Staffel-Berechnung ist in den meisten Fällen eine kleine VBA-Prozedur notwendig.
In der Beispieldatenbank finden Sie eine Funktion namens GetMahngebühr (im Modul modMahngebühren), die anhand eines Rechnungsbetrags die entsprechende Mahngebühr berechnet. Die Prozedur sieht wie folgt aus:
Public Function GetMahngebühr(REBetrag As _ Variant) As Variant
' berechnet Mahngebühren If IsNull(REBetrag) Then GetMahngebühr = Null ElseIf REBetrag <= 1000 Then GetMahngebühr = 5 ElseIf REBetrag <= 20000 Then GetMahngebühr = 0.005 * REBetrag Else GetMahngebühr = 100 End If
End Function
Diese Funktion können Sie beispielsweise in einer Abfrage einsetzen, um die Mahngebühren zu allen vorhandenen Rechnungen zu ermitteln:
SELECT RechnungNr, [RE-Betrag], GetMahngebühr([RE-Betrag]) AS Mahngebühr FROM Rechnungen; |
Des weiteren werden unter der Rubrik MS Access tips viele Praxisbeispiele vorgestellt.
Unter "Links" finden Sie eine Auflistung von Access Websites. Sehr interessant sind hier die Access-User-Groups. | |
Hier erfahren Sie alles über die Neuerungen in Access 2007 und Sie finden Links zu den Häufig gestelltesten Fragen zu Microsoft Office Access 2007 und zu einer Access 2007 Demo (Englisch).
Die Kaufoptionen werden in der zweiten Hälfte 2006 bekannt gegeben. | |
| Solche Fehler können sich beispielsweise bei Abstürzen von ACCESS oder WINDOWS einschleichen.
Teilen Sie eine Datenbank in eine BackEnd- und eine FrontEnd-Datenbank auf, um bei jedem Start eine automatische Reparatur der Daten durchführen zu können.
Bei der Aufteilung der Datenbank müssen Sie dafür sorgen, dass alle Tabellen von den übrigen Objeken vollständig getrennt und in der BackEnd-Datenbank untergebracht werden. Anschließend binden Sie die Tabellen aus der BackEnd- in die FrontEnd-Datenbank ein.
Die eigentliche Reparatur der BackEndDatenbank erledigen Sie mit Hilfe der RepairDatabase-Methode. Am besten rufen Sie diese Methode direkt nach dem Öffnen der FrontEnd-Datenbank als erste Anweisung auf. Dies ist erfoderlich, da die BackEnd-Datenbank zu diesem Zeitpunkt noch nicht geöffnet ist. Sollte allerdings bereits irgendein Tabellenzugriff ausgeführt worden sein, schlägt die Reparatur fehl. | |
| Mit dem TriniDat Explorer-Assistenten erhalten Sie ein nützliches Werkzeug, mit dem Sie ein Formular in Ihre Datenbank einfügen können, dass die Funktionalität des Windows-Explorers zur Darstellung Ihrer Daten verwendet. Das Explorer Formular erhält standardmäßig links eine Baumstruktur und rechts eine Listenstruktur. Sie können jedoch auch für jede Seite entweder ein normales Listenfeld, eine Baumstruktur oder eine Listenstruktur wählen. Mit dem Setup-Programm installieren Sie sowohl den Explorer-Assistenten, als auch eine Datenbank, die die Funktionsweise des Explorer-Formulars an zwei Beispielen demonstriert. Anhand dieser Beispiele und der ausführlichen Anleitung können Sie sich auch die Vorgehensweise zum Füllen der Listen mit Daten im Quellcode ansehen. Vollversion mit Dokumentation im Word-Format | |
Kombinations- und Listenfelder können bei Bedarf mit mehreren Spalten ausgestattet werden. Die Breite jeder Spalte lässt sich hierbei individuell einstellen.
Um eine bestimmte Spalte zu verstecken, weisen Sie dieser die Breite 0 zu.
Informationen in versteckten Spalten eignen sich ausgezeichnet zur Abfrage von Daten, ohne dass Sie die betreffenden Feldinhalte erneut nachschlagen müssen.
In einem Kombinationsfeld mit Kundennamen können Sie beispielsweise die Telefonnummer in der unsichtbaren zweite Spalte anordnen. Die Telefonnummer des momentan ausgewählten Kunden rufen Sie mit Hilfe des folgenden Ausdrucks ab:
=[cmbKunden].[Spalte](2)
In diesem Beispiel trägt das Kombinationsfeld den Namen cmbKunden. | |
Kombinationsfelder sind in erster Linie dazu gedacht, vorhandene Datensätze aus der Liste auszuwählen. Von Haus aus bietet Access keine Möglichkeit, der vorhandenen Liste neue Einträge hinzuzufügen.
Es gibt allerdings Situationen, wo genau diese Möglichkeit sinnvoll und auch komfortabel wäre. Angenommen, Sie erfassen in einer Datenbank Bücher und wählen den dazugehörigen Autor aus einem Kombinationsfeld aus, das auf einer Tabelle. Dann kann passieren, dass Sie ein Buch erfassen wollen, dessen Autor noch nicht in der Datenbank vorhanden ist.
Ändern Sie einfach die Datensatzherkunft des Kombinationsfelds, indem Sie in der zugrunde liegenden Tabelle einen neuen Datensatz anlegen
Dazu ist lediglich eine kleine Ereignisprozedur notwendig, die beim Ereignis Bei Nicht in Liste des Kombinationsfelds aufgerufen wird. In dieser Ereignisprozedur sollte noch eine Benutzerabfrage vorhanden sein, ob denn auch tatsächlich ein neuer Autor angelegt werden soll.
Private Sub CboAutor_NotInList(NewData As String, Response As Integer)
If MsgBox("Dieser Autor ist neu. Möchten Sie ihn anlegen?", vbYesNo) = vbYes Then
Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("tblAutoren", DB_OPEN_DYNASET) rs.AddNew rs!txtAutor = NewData rs.Update Response = acDataErrAdded rs.Close Set rs = Nothing Set db = Nothing Else
'Hier kann beispielsweise ein Tippfehler abgefangen werden Response = acDataErrContinue CboAutor.Undo
End If
End Sub
Dieser Code verwendet das DAO-Objektmodell. Für das ADO-Objektmodell verwenden Sie in der Prozedur zwischen If und Else den folgenden Code:
If...
Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tblAutoren", cn, adOpenDynamic, adLockOptimistic rs.AddNew rs!txtAutor = NewData rs.Update Response = acDataErrAdded rs.Close Set rs = Nothing Set cn = Nothing
Else ... | |
Dieser Barcode Generator ist ein VBA Modul und erstellt Barcodes für Microsoft Access ohne dass Sie zusätzlich Fonts, DLLs or plug-ins installieren müssen. Supports multiple Linear und 2D symbologies including GS1-128, Code 39, Code 128, Interleaved 2 of 5, Postnet, OneCode, PDF417 and Data Matrix ECC200.
Einsetzbar mit Access 2000 bis Access 2007. | |
Ein Makro mit dem Namen AUTOEXEC wird automatisch beim Öffnen einer Access-Datenbank ausgeführt, weil Access automatisch danach sucht.
Verwenden Sie ein solches Autoexec-Makro, um direkt nach dem Öffnen der Datenbank bestimmte Aktionen auszuführen.
Mit einem solchen Autoexec-Makro können Sie beispielsweise:
- einen Startbildschirm anzeigen
- die Tabelleneinbindung zu BackEnd-Tabellen überprüfen lassen
- ein bestimmtes Formular öffnen
Durch Drücken der SHIFT-Taste beim Start von Access wird übrigens - sofern diese Option nicht deaktiviert ist - die Ausführung eines AUTOEXEC-Makros unterbunden | |
Verwaltet Lieferanten, Artikel und Artikelgruppen. Verwaltet Kunden mit einer Vielzahl von Kriterien Verwaltet Bestellungen, Rechnungen, Lieferscheinen, Mahnungen und Gutschriften Offene Posten. Verwaltung von Forderungen Halbautomatisches Mahnwesen Benutzeroberfläche im Office-Standarddesign mit Menüzeile und Symbolleiste Inklusive Quellcode. | |
| Gibt es bei Access 2.0 die Möglichkeit das Kopieren einer Datei von einem bestimmten definierten Laufwerk auf ein Ziellaufwerk mit einem Makro zu automatisieren? | Mit dieser VBA-Funktion können Sie eine Datei kopieren. Die Funktion nimmt zwei String-Parameter an: die Quelldatei und die Zieldatei:
Sub CopyFile (ByVal Source As String, ByVal Destination As String)
Dim i As Integer, NumBlocks As Integer Dim FileLength As Long, LeftOver As Long Dim FileData As String
Const BlockSize = 32768
Open Source For Binary Access Read As #1 Open Destination For Output As #2 Close #2 Open Destination For Binary As #2
FileLength = LOF(1) NumBlocks = FileLength \ BlockSize LeftOver = FileLength Mod BlockSize FileData = String$(LeftOver, 32)
Get #1, , FileData Put #2, , FileData
FileData = String$(BlockSize, 32)
For i = 1 To NumBlocks Get #1, , FileData Put #2, , FileData Next i
Close #1, #2
End Sub |
Bei langen Berichten kann es schon einmal lästig sein, mit Hilfe der Navigationsschaltflächen zu einer bestimmten Seite zu wechseln.
Wechseln Sie schnell zur gewünschten Seite, indem Sie die Seitennummer direkt eingeben.
Inmitten der Navigationsschaltflächen befinden sich zu diesem Zweck ein Feld, in dem die aktuelle Seitennummer angezeigt wird. Klicken Sie dieses Feld an und geben Sie die gewünschte Seitennummer ein.
| |
| Während der Testphase eines Programms ist oftmals ärgerlich, wenn alle Laufzeitfehler durch On Error-Anweisungen abgefangen werden. Schließlich möchten Sie über alle auftretenden Fehler ausführlich informiert werden. Sie finden diese Option im Register Fehlerüberprüfung des Dialogfensters Extras>Optionen. | |
Die Funktion ReverseInStr sucht das LETZTE Vorkommen von strSearchString in strSourceString und liefert die gefundene Position als Integer-Wert zurück. Falls kein Vorkommen gefunden wird, ist der Funktionswert 0.
Diese Funktion bildet Grundlage für die Parsingfunktionen zu den Beispielen
Parsingfunktion - Dateiendung lesen Parsingfunktion - Pfadangabe Parsingfunktion - Dateiname Public Function ReverseInStr(strSourceString As String, strSearchString As String) As Integer
Dim intPos As Integer Dim intPosSaved As Integer Dim strDummy As String Dim bolStart As Boolean
strDummy = " " & strSourceString intStartPos = 1
If strDummy = "" Or strSearchString = "" Then MsgBox ("Der zu durchsuchende Text UND der Suchstring muß angegeben werden") ReverseInStr = 0 Exit Function End If
intPosSaved = 1 ntPos = InStr(intPosSaved, strDummy, strSearchString)
If intPos = 0 Then bolStart = True End If
Do While intPosSaved <> 0
If intPosSaved >= 1 Then If bolStart = True Then ReverseInStr = 0 Exit Function Else If intPos = 0 Then ReverseInStr = intPosSaved - 1 Exit Function End If intPosSaved = intPos End If intPos = InStr(intPosSaved + 1, strDummy, strSearchString) bolStart = False End If
Loop
End Function | |
Access stellt Ihnen von Haus aus bereits einen gewaltigen Funktionsumfang zur Verfügung. Trotzdem stößt man vor allem beim Entwickeln von Datenbankanwendung manchmal an Grenzen.
API steht für Application Programming Interface. Das Windows-API ist eine Schnittstelle, die Ihnen den Zugriff auf interne Betriebssystem-Prozeduren von Windows erlaubt.
Typisches Beispiel dafür ist der Zugriff auf das das Datei öffnen-Dialogfeld, das immer gleich aussieht, egal ob Sie eine Datei in Access, in Excel oder in Word öffnen.
Um eine solche API-Funktion verwenden zu können, müssen Sie VBA diese erst einmal bekannt gegeben werden. Dazu wird die Funktion mit dem Schlüsselwort Declare deklariert. Durch die Deklaration teilen Sie VBA mit, wie die Funktion heißt, welche Argumente ihr zu übergeben sind, welchen Typ von Funktionswert sie zurückgibt und in welcher der DLL- Dateien von Windows sie sich befindet.
Der Deklarationsteil
Declare Function GetOpenFileName Lib "Comdlg32.dll"
gibt VBA bekannt, dass sich die Funktion GetOpenFileName in der DLL Comdlg32.dll im Windows System-Verzeichnis befindet.
Der folgende Teil
Alias "GetOpenFileNameA"
besagt, dass diese Funktion in der DLL eigentlichen unter einem anderen Namen als GetOpenFileName enthalten ist, nämlich unter ihrer eigentlich Bezeichnung GetOpenFileNameA.
Der letzte Teil der Deklaration
pOPENFILENAME As OPENFILENAME
deklariert die beim Aufruf zu übergebenden Argumente und den zurückgegebenen Funktionswert. Die Prozedur erwartet die Übergabe einer Variablen vom Typ OPENFILENAME und übergibt einen Funktionswert vom Typ Long.
Weitere Einsatzbereiche von API-Funtionen sind unter anderem:
- Abfrage von Systeminformationen - Auslesen von Daten aus der Registry - Schreiben von Daten in die Registry - Änderung von Bildschirmfarben - Auswahl von Schriften | |
Sie öffnen das Zoom-Fenster von einem beliebigen Eingabefeld aus mit der Tastenkombination Shift F2.
Bei Formularfeldern kann das Zoom-Fenster auch über das Kontextmenü aktiviert werden. Klicken Sie das Feld einfach mit der rechten Maustaste an und wählen Sie den Befehl Zoom. | |
| Dieses Programmiertraining bietet Ihnen eine strukturierte Einführung in VisualBasic für Applikationen für Microsoft Access 97. Der Aufbau der einzelnen Übungen gliedert sich in drei Schritte: Unter dem Punkt Ziel wird die konkrete Aufgabe formuliert, dann zeigen wir Ihnen den Lösungsweg, auf dem Sie Schritt für Schritt zum gewünschten Erlebnis gelangen und zum Schluß sehen Sie das Ergebnis anhand eines Screenshots verdeutlicht. Tips zur Programmierung. Datenbankdesign. Trennung von Daten und Code. Variablen und Konstanten. Verzweigungen. Schleifen. Module und Funktionen. Programmierung mit Modulen. Arbeiten mit anderen Office-Applikationen. Internet und Access.
von Lothar Zeitler; Redmond (1997); Euro 19,40; ISBN: 393257527X | |
Mit dem TriniDat Kommentar-Assistenten können Sie Kopfzeilen für die verschiedenen Bereiche Ihrer VBA-Module einfügen lassen. Der Kommentar-Assistent hilft Ihnen, Ereignisprozeduren, private und öffentliche Eigenschaften, Methoden, WIN-API-Deklarationen usw. voneinander zu trennen, um die Übersichtlichkeit Ihrer Module beizubehalten. Vollversion | |
Der PercentPosition-Eigenschaft muß eine Zahl im Bereich von 1 bis 100 übergeben werden, die die prozentuale Position des Datensatzzeigers bestimmt. Der Wert 50 positioniert also genau auf den mittleren Datensatz. Damit bei mehr als 100 Datensätzen genaue Positionierungen möglich sind, können auch Dezimalbrüche wie z.B. 44,55 zugewiesen werden. Die folgende Prozedur kann direkt im Zusammenhang mit einer Schaltfläche eines Formulars eingesetzt werden. Sie positioniert im aktuellen Formular auf den mittleren Datensatz. Optional kann auch eine andere prozentuale Position angegeben werden (z.B. 25 oder 75).
Public Sub FormProzentPos(Optional Prozent As Variant)
Dim F As Form Dim R As Recordset
On Error GoTo Err
If IsMissing(Prozent) Then Prozent = 50
Set F = Screen.ActiveForm Set R = F.RecordsetClone R.PercentPosition = Prozent
‘Formular mit Recordset synchronisieren F.Bookmark = R.Bookmark
Exit Sub
Err:
MsgBox "Positionierung erfolglos!" Exit Sub
End Sub | |
Bei meiner Adressverwaltung habe ich einen Etikettendruck eingebaut. Im Formular habe ich ein Listenfeld, das auf Mehrfachauswahl Erweitert eingestellt ist. Das Listenfeld enthält alle Adressen aus einer Tabelle.
Kann man mit einer Schaltfläche, die man zum Beispiel "Alle auswählen" nennt, alle Einträge der Liste markieren? | Access-97-Datenbank mit Demo-Datenbank
Ein Listenfeld hat für jeden Listeneintrag eine Eigenschaft namens Selected, die man lesen bzw. setzen kann. Wenn Sie die Mehrfachauswahl des Listenfeldes auf Einfach gesetzt haben, kann immer nur eine Selected-Eigenschaft den Wert True haben. Alle anderen Selected-Eigenschaften bleiben False.
Bei einem Listenfeld mit Mehrfach- bzw. Einzelauswahl können Sie mit einer For-Schleife alle Listeneinträge durchlaufen und die Selected-Eigenschaft auf True setzen:
Dim i As Integer
For i = 0 To Me!lstAuswahl.ListCount - 1 Me!lstAuswahl.Selected(i) = True Next i
Die ListCount-Eigenschaft ergibt die Anzahl der Einträge im Listenfeld. |
Das Abfrageergebnis einer Union-Abfrage kann natürlich auch sortiert werden.
Beachten Sie dabei die Anordnung der ORDER BY-Klausel.
Die ORDER BY-Klausel kann nur in der zweiten Select-Anweisung verwendet werden. Das folgende Beispiel ruft Datensätze aus den Tabellen Kunden und Lieferanten ab und teilt diese im Feld Beziehung in Kunden und Lieferanten ein. Das Abfrageergebnis wird anschließend nach den Feldern Ort (absteigend) und Firma sortiert.
SELECT Ort, Firma, Kontaktperson, Position, "Kunden" AS [Beziehung] FROM Kunden
UNION SELECT Ort, Firma, Kontaktperson, Position, "Lieferanten" FROM Lieferanten ORDER BY Ort DESC, Firma; | |
Durch das Komprimieren wird die Größe der Datenbank reduziert und die Arbeitsgeschwindigkeit beschleunigt, das Reparieren hilft bei der Wiederherstellung von beschädigten Datenbanken.
Beide Funktionen können über den Menüpunkt Extras / Datenbankdienstprogramme aufgerufen werden. Dazu muss jedoch erst Access gestartet und die richtige Datei aus einem Dialog gesucht werden.
Verwenden Sie die Befehlszeilenoptionen "/Repair" und "/Compact", um eine Datenbank mittels einer Verknüpfung zu Reparieren oder zu Komprimieren.
Erstellen Sie drei neue Verknüpfungen zu Access. Ergänzen Sie bei den Eigenschaften der Verknüpfungen jeweils im Register Verknüpfung im Eingabefeld Ziel die Einträge wie folgt.
Ergänzung für Verknüpfung 1:
/Repair
Ergänzung für Verknüpfung 2:
/Compact
Ergänzung für Verknüpfung 3:
/Repair /Compact | |
| This download contains the Access 2003 source code control add-in for communicating between both Microsoft Office Access 2003 Service Pack (SP) 1 and a source code control application (like Visual Source Safe 6.0). While you work with Access 2003, the add-in steps in at various points and lets you do things like add, check out, or check in Microsoft Access objects into the source code control project. Source code control integration with Microsoft Access is very similar to source code control integration with Visual Basic. | |
| fgbsdgvsed vgfx dg | |
Access stellt zwar ausgefeilte Suchen- und Ersetzen-Funktionen zur Verfügung; wenn es aber darum geht, diese Funktionen auf einzelne Zeichenketten anzuwenden, versagt Access.
Verwenden Sie in diesem Fall einfach die folgende SuchenUndErsetzen-Funktion:
Function SuchenUndErsetzen(ByVal Text As Variant, _ Suchen As Variant, Ersetzen As Variant)
Dim x As Integer Dim p As Integer On Error GoTo Err:
p = Len(Suchen)
Do x = InStr(Text, Suchen) If x = 0 Then Exit Do Text = Left(Text, x - 1) + Ersetzen + Mid(Text, x + p) Loop
SuchenUndErsetzen = Text
Exit Function
Err: MsgBox Err.Description Exit Function
End Function
Die Funktion erwartet insgesamt drei Parameter. Unter Text muß eine Zeichenkette übergeben werden, in der die Funktion suchen und ersetzen soll. Die beiden übrigen Parameter erklären sich von selbst. Das Ergebnis der Funktion ist die veränderte Zeichenkette.
Das folgende Beispiel entfernt alle Leerzeichen aus einem Text:
SuchenUndErsetzen("Dies ist ein Text mit Leerzeichen", " ", "") | |
Hinweis Die Musterlösung zu diesem Beitrag heißt Belegverwaltung00.mdb und funktioniert mit Access 2000 und höher. Sie finden die Datenbank und die benötigte Schriftart Barcode.ttf unten.
- Funktionsweise der Lösung
Die hier vorgestellte Lösung verfolgt das Prinzip „Chaos mit Ordnung“. Jedes Dokument erhält eine eindeutige Nummer und wird danach auf einen Stapel gelegt. Die einzelnen Dokumente sind innerhalb des Stapels also in der Reihe des Eingangs abgelegt. Um nun schnell ein bestimmtes Dokument auffinden zu können, werden die einzelnen Dokumente mit einer Datenbank verwaltet, deren Aufbau Sie in diesem Artikel kennen lernen werden.
- Die Datenstruktur
Die Datenstruktur der vorgestellten Lösung besteht aus den vier Tabellen tblBelege, tblKategorien, tblAdressen und tblSeiten. Die Tabelle tblBelege speichert die einzelnen Dokumente. Sie enthält die Felder aus der folgenden Tabelle:
Falls Sie Besitzer eines Scanners sind, können Sie das komplette Dokument als Anlage in dem Feld Anlage als OLE-Objekt hinterlegen. Um auch den Empfänger und den Absender eines Belegs hinterlegen zu können und nicht jedes Mal die Adresse erfassen zu müssen, stellt die Tabelle tblAdressen die Informationen über Name, Straße, PLZ, Ort und Telefon zur Verfügung. Um auch den Empfänger und den Absender eines Belegs hinterlegen zu können und nicht jedes Mal die Adresse erfassen zu müssen, stellt die Tabelle tblAdressen die Informationen über Name, Straße, PLZ, Ort und Telefon zur Verfügung.
Ordnung in die einzelnen Dokumente bringt die Tabelle tblKategorien, die lediglich die zwei Felder KategorieNr und Kategorie enthält. Durch die Verknüpfung zur Tabelle tblBelege kann jedes Dokument auf einen virtuellen Stapel wie beispielsweise „Handy-Abrechnung“, „Bewirtung“ oder „Kreditkartenabrechnung“ gelegt werden. Die Verknüpfung der Tabellen entnehmen Sie Abb. 1. Abb. 1: Das ER-Diagramm Um die spätere Erstellung von Formularen zu vereinfachen, sind die beiden Felder AdresseNr und KategorieNr der Tabelle tblBelege als Nachschlagefelder definiert. Hierzu gehen Sie wie folgt vor: step by step
1. Öffnen Sie die Tabelle tblBelege in der Entwurfsansicht und positionieren Sie die Einfügemarke auf das Feld AdresseNr. 2. Wechseln Sie unterhalb der Tabelle zum Register Nachschlagen. 3. Wählen Sie unter Steuerelement anzeigen die Einstellung Kombinationsfeld aus. 4. Geben Sie unter Datensatzherkunft die folgende Abfrage an: SELECT Name, AdresseNr FROM tblAdressen ORDER BY Name; 5. Ändern Sie die Eigenschaften Gebundene Spalte und Spaltenanzahl auf den Wert 2. 6. Geben Sie als Spaltenbreite den Wert 5cm;0cm ein.
Auf die gleiche Weise definieren Sie für das Feld KategorieNr ein Nachschlagefeld. Verwenden Sie in diesem Fall jedoch die folgende Abfrage:
SELECT Kategorie, KategorieNr FROM tblKategorien ORDER BY Kategorie;
Speichern Sie anschließend die fertige Tabelle.
- Dokumente nummerieren
Ein wesentlicher Bestandteil der hier vorgestellten Lösung ist, dass alle Dokumente mit einer eindeutigen Nummer versehen werden. Um die Nummer nicht von Hand auf das Dokument schreiben zu müssen, soll diese Aufgabe von Ihrem Drucker erledigt werden. Hierzu werden die Belege einfach in den Papiereinzug gelegt und der Drucker versieht diese mit der Nummer.
Damit die Nummer immer sichtbar ist, wird sie in jeder Ecke und zudem noch invertiert ausgegeben. Zusätzlich zu der Nummer soll ein Barcode mit ausgegeben werden. Falls Sie also einen Barcode-Scanner haben sollten, können Sie einzelne Dokumente sehr schnell durch einfaches Scannen des Barcodes zuordnen.
Den Ausdruck der Nummer und des Barcodes erledigt ein Berichts namens rptIndex. Der Bericht enthält im Seitenkopf und im Seitenfuß jeweils links und rechts zwei Text- Steuerelemente zur Ausgabe der Nummer und des Barcodes (s. Abb. 2).
Falls Sie einen mehrseitigen Beleg haben, sollte die Nummer auf jeder Seite ausgegeben werden und idealerweise noch mit einer fortlaufenden Seitennummer versehen werden. Um diese zu realisieren, ist der Bericht an die Tabelle tblSeicomputer. haufe.de Access im Unternehmen Musterlösung Belege mit Barcodes verwalten 43 ten geknüpft. Diese Tabelle enthält nur eine einzelne Spalte namens SeiteNr. Damit für jeden Datensatz in der Tabelle tblSeiten eine Berichtsseite gedruckt wird, ist die Eigenschaft Neue Seite des Detailbereichs auf Vor Bereich eingestellt. Um nun eine bestimmte Anzahl Seiten zu drucken, muss die Tabelle tblSeiten zunächst mit der erforderlichen Anzahl Datensätze gefüllt werden. Dies erledigt die VBAProzedur SeitenErstellen (s. Quellcode 1).
Abb. 2: Der Bericht rptIndex in der Entwurfsansicht. Sub SeitenErstellen(Anzahl As Integer) Dim i As Integer Dim MyRecordset As New ADODB.Recordset Dim AnzahlExistierendeSeiten As Long AnzahlExistierendeSeiten = DCount("SeiteNr", _ "tblSeiten") If AnzahlExistierendeSeiten < Anzahl Then With MyRecordset .ActiveConnection = _ CurrentProject.Connection .LockType = adLockOptimistic .CursorLocation = adUseClient .Source = "tblSeiten" .Open For i = 1 To _ Anzahl - AnzahlExistierendeSeiten .AddNew !SeiteNr = AnzahlExistierendeSeiten + i .Update Next i End With End If End Sub Quellcode 1 Access im Unternehmen computer.haufe.de Musterlösung Belege mit Barcodes verwalten 44
Die Prozedur erwartet als Parameter die Anzahl der gewünschten Seiten. Sie prüft zunächst, ob die Tabelle bereits mindestens die angegebene Anzahl an Datensätzen enthält. Sollte dies nicht der Fall sein, fügt sie die fehlenden Seiten hinzu. Der Bericht wird später mit einem Filterkriterium wie beispielsweise
SeiteNr <= 10
geöffnet. Hierdurch stellt es kein Problem dar, wenn die Tabelle mehr Datensätze enthält, als für den Ausdruck erforderlich sind. Sie finden die fertige Prozedur im Modul modTools der Beispieldatenbank zu diesem Artikel. Wie bereits erwähnt, erfolgt der Ausdruck der Nummer und des Barcodes in allen vier Ecken jeder Seite. Um dies zu erreichen, platzieren Sie jeweils im Seitenkopf und im Seitenfuß insgesamt acht Textfelder. Vier davon sind für die Nummer, die anderen vier für die Barcodes reserviert.
Damit die korrekte Nummer ausgegeben werden kann, muss der Bericht an die Tabelle tblBelege gebunden sein. Zusätzlich ist aber auch eine Bindung an die Tabelle tblSeiten erforderlich, um den Ausdruck mehrerer Seiten zu ermöglichen.
Um dieses Problem zu lösen, fügen Sie der Datenquelle des Berichts einfach beide Tabellen hinzu, ohne diese zu verknüpfen (s. Abb. 3). Abb. 3: Die Datenquelle des Berichts besteht aus zwei nicht verknüpften Tabellen.
Durch die fehlende Verknüpfung bildet Access einen „Cross-Join“. Dies bedeutet, dass zu jedem Datensatz aus der Tabelle tblSeiten alle Datensätze aus der Tabelle tblBelege ausgegeben werden. Wenn jede Tabelle beispielsweise zehn Datensätze enthält, würde das Abfrageergebnis aus insgesamt 100 Datensätzen bestehen.
Als Ergebnis der Abfrage reichen die beiden Felder SeiteNr und BelegNr aus. Beim Öffnen des Berichts muss nun lediglich noch die BelegNr entsprechend gefiltert werden.
- Ausgabe der Nummer
Da zusätzlich zur Beleg-Nummer auch die Seitennummer ausgegeben werden soll, bietet sich die Definition eines Formats an. In dieser Lösung ist die Entscheidung auf das Format
00000-0000
gefallen, wobei der erste Teil vor dem Bindestrich die Belegnummer und der zweite Teil die Seitennummer darstellt. Die Formatierung übernimmt die VBA-Prozedur GetPageID, die Sie ebenfalls im Modul modTools der Beispieldatenbank finden:
Public Function GetPageID(BelegNr As _ Variant, SeiteNr As Variant) _ As String
GetPageID = Format(BelegNr, _ "00000") + "-" + Format(SeiteNr, _ "0000")
End Function
Die Prozedur erwartet als Parameter die Belegnummer und die aktuelle Seitennummer. Daraus bildet sie dann das vorgestellte Format.
Zum Einsatz kommt die Prozedur in den vier Text-Steuerelementen, die zur Anzeige der Nummer reserviert sind. Hierzu tragen Sie den folgenden Ausdruck in die Steuerelementinhalt- Eigenschaft des Textfeldes ein:
=GetPageID([BelegNr];[SeiteNr])
Zusätzlich sollten Sie das Textfeld noch mit einer weißen Schriftfarbe und einem schwarzen Hintergrund formatieren. Durch diese invertierte Darstellung kann der Text später besser entziffert werden (s. Abb. 4). Abb. 4: Invertierte Formatierung des Textfeldes
Das Eintragen des Ausdrucks und die Formatierung wiederholen Sie für alle vier Textfelder.
- Ausgabe des Barcodes
Die Ausgabe des Barcodes erfolgt direkt unterhalb der Belegnummer in einem weiteren Textfeld. Zur Darstellung des Barcodes kommt ein spezieller Font namens Barcode Universal zum Einsatz. Sie finden diesen Font auf der CD. Zur Installation des Fonts gehen Sie wie folgt vor:
step by step 1. Öffnen Sie die Systemsteuerung von Windows. 2. Öffnen Sie von hier aus den Ordner Schriftarten. 3. Ziehen Sie die Datei Barcode.tft von der CD in den Ordner Schriftarten.
Der Font enthält lediglich drei Zeichen: Einen langen Strich, einen kurzen Strich sowie einen weißen Strich als Leerzeichen. Die drei Zeichen werden durch die Ziffern 0, 1 und 2 repräsentiert.
Durch entsprechende Kombination dieser drei Zeichen lassen sich fast alle eindimensionalen Barcodes wie etwa Code39 oder EAN darstellen.
Da die Seitennummer in unserem Fall einen Bindestrich – also ein Sonderzeichen – enthält, fällt die Wahl auf den Code39.
Um den Barcode innerhalb des Textfeldes darzustellen, wählen Sie über die Schriftart- Eigenschaft des Textfeldes den Font Barcode Universal aus. Als Steuerelementinhalt- Eigenschaft geben Sie den folgenden Ausdruck ein (s. Abb. 5):
=Barcode_Code39(GetPageID([BelegNr];[Seit eNr]))
Die Ihnen bereits bekannte Funktion GetPageID erzeugt die fertig formatierte Seitennummer und gibt diese anschließend an die Funktion Barcode_ Code39. Diese erzeugt daraus eine Folge von Nullen und Einsen, die bei Formatierung mit dem Font Barcode Universal einen Barcode ergeben. Sie finden die Prozedur im Modul Code39 der Beispieldatenbank. Abb. 6: Ein fertiger Barcode
Damit der Barcode nicht zu klein dargestellt wird, erhöhen Sie die Schriftgröße abschließend mit Hilfe der Schriftgrad-Eigenschaft auf einen Wert von 35 (s. Abb. 6). Alle Einstellungen nehmen Sie wieder viermal vor.
- Erfassen eines neuen Belegs Um nun einen Beleg mit der Seitenindizierung zu versehen, müssen folgende Schritte durchgeführt werden: Abb. 5: Das Barcode-Textfeld
Anlegen eines neuen Datensatzes in der Tabelle tblBelege Anlegen der erforderlichen Datensatzanzahl in der Tabelle tblSeiten Öffnen des Berichts rptIndex zum Ausdruck der Beleg- und Seitennummern
Diese Aufgaben werden von dem Formular frmNeuerBeleg übernommen (s. Abb. 7). Das Formular basiert auf der Tabelle tblBelge. Damit nur die Erfassung neuer Datensätze möglich ist, ist die Eigenschaft Daten eingeben auf Ja eingestellt.
Die OK-Schaltfläche löst die Ereignisprozedur aus:
Private Sub btnOK_Click()
On Error Resume Next
Dim Anzahl As Integer
Anzahl = CInt(Me!Seitenanzahl)
DoCmd.RunCommand acCmdSaveRecord
SeitenErstellen (Anzahl)
DoCmd.OpenReport "rptIndex", acViewPreview, , "SeiteNr<=" & CStr(Anzahl) _ & " AND DokumentNr=" + CStr(Me!DokumentNr)
End Sub
Zunächst wird die Anzahl der eingegebenen Seiten ermittelt und in der Variablen Anzahl zwischengespeichert. Anschließend wird der Datensatz gespeichert und die Tabelle tblSeiten mit der erforderlichen Anzahl an Datensätzen aufgefüllt.
Die letzte Anweisung öffnet schließlich den Bericht in der Seitenvorschau. Mit einem Filter wird hierbei sowohl die Belegnummer als auch die Seitenanzahl eingeschränkt.
Nachdem der Bericht in der Seitenvorschau (s. Abb. 8) angezeigt wird, kann der Benutzer den Beleg in den Drucker einlegen und den Ausdruck starten.
- Das Suchformular Um ein Dokument schnell wieder auffinden zu können, ist ein entsprechendes Suchformular erforderlich. Dieses trägt den Namen frmBelegsuche (s. Abb. 9).
Abb. 7: Das Formular frmNeuerBeleg Abb. 8: Der Bericht in der Seitenvorschau
Das Formular besteht aus einem Haupt- und einem Unterformular. Im Hauptformular können über vier Felder Suchkriterien eingegeben werden. Nach einem Klick auch Suchen wird das Ergebnis im Unterformular angezeigt.
Die vier Felder zur Eingabe der Suchkriterien tragen die Namen txtSuchBelegNr, cmbSuchAdresseNr, cmbSuchKategorieNr und txtSuchKurzbezeichnung. Die beiden Kombinationsfelder zur Auswahl der Kategorie und der Adresse sind zur Anzeige der Daten aus der jeweiligen Tabelle konfiguriert.
Die Einstellungen entsprechen denen, die Sie bereits bei der Konfiguration der Nachschlagefelder zu Beginn dieses Artikels kennen gelernt haben.
Die Schaltfläche Suchen ist mit der folgenden Ereignisprozedur aus:
Private Sub btnSuchen_Click()
Dim BelegNr As Long
BelegNr = GetBelegNr(Me.txtSuchBelegNr)
Dim SQL As String
SQL = "SELECT * FROM tblBelege WHERE 1=1"
If BelegNr <> 0 Then SQL = SQL & " AND BelegNr=" & BelegNr
If Not IsNull(Me.cmbSuchAdresseNr) Then _
SQL = SQL & " AND AdresseNr=" & Me.cmbSuchAdresseNr
If Not IsNull(Me.cmbSuchKategorieNr) Then _
SQL = SQL & " AND KategorieNr=" & Me.cmbSuchKategorieNr
If Not IsNull(Me.txtSuchKurzbezeichnung) Then _
SQL = SQL & " AND Kurzbezeichnung LIKE '*" & Me.txtSuchKurzbezeichnung & "*'"
SQL = SQL & " ORDER BY Belegdatum"
Me.Sub.Form.RecordSource = SQL Me.Sub.Form.Requery
End Sub Quellcode 3
Im ersten Schritt wird die eingegebene Belegnummer ermittelt und in der Variablen BelegNr zwischengespeichert. Die Funktion GetBelegNr lernen Sie gleich noch kennen.
Abb. 9: Das Formular zur Suche nach Belegen
Anschließend wird eine SQL-Abfrage zusammengestellt. Hierbei wird pro Kriterium geprüft, ob ein Wert vorhanden ist. Sollte dies der Fall sein, wird der entsprechende Filter-Ausdruck mittels AND-Schlüsselwort hinzugefügt. Abschließend erfolgt noch eine Sortierung nach dem Belegdatum.
Die fertige SQL-Anweisung wird schließlich dem Unterformular als Datensatzherkunft übergeben.
Falls Ihnen ein Barcode-Lesegerät zur Verfügung steht und Sie den Barcode eines Belegs scannen, wird dieser inklusive Seitennummer eingelesen.
Die Funktion GetBelegNr trennt die beiden Teile voneinander, sodass eine Suche nach der Belegnummer erfolgen kann.
Public Function GetBelegNr(Eingabe As Variant) As Long
On Error GoTo Fehler
If IsNull(Eingabe) Then
GetBelegNr = 0
Else
Dim pos As Integer
pos = InStr(1, Eingabe, "-")
If pos = 0 Then
GetBelegNr = CInt(Eingabe)
Else
GetBelegNr = CInt(Left(Eingabe, pos - 1))
End If
End If
Exit Function
Fehler:
GetBelegNr = 0
Exit Function
End Function
Zuerst wird geprüft, ob überhaupt eine Eingabe vom Benutzer gemacht wurde; wenn nicht, gibt die Funktion den Wert 0 zurück und beendet die Abarbeitung.
Anschließend ermittelt die InStr-Funktion die Position des Bindestrichs. Falls die Positionsermittlung erfolgreich ist, wird der erste Teil abgeschnitten und als Funktionsergebnis zurückgegeben. Wenn kein Bindestrich vorhanden ist, wird die komplette Eingabe in eine Zahl umgewandelt und zurückgegeben. Zu guter Letzt sorgt noch eine Fehlerbehandlungsroutine dafür, dass bei unsinnigen Eingaben wie zum Beispiel Texten der Wert 0 zurückgegeben wird.
5.1 Detailansicht von Dokumenten In der Ergebnisliste werden nicht alle Informationen zu den einzelnen Dokumenten dargestellt. Um alle Details zu einem bestimmten Dokument anzuzeigen, steht das Formular frmBelege zur Verfügung. Hierbei handelt es sich um ein einfaches Formular, das mit dem Formular-Assistenten erstellt wurde (s. Abb. 10).
Das Öffnen des Formulars erfolgt von dem Formular frmBelegsuche-Sub aus, das als Unterformular in dem Suchformular platziert ist. Die Beim Doppelklicken-Ereigniseigenschaft ist hierbei mit der folgenden VBA-Prozedur verknüpft:
Private Sub BelegNr_DblClick(Cancel _
As Integer)
DoCmd.OpenForm "frmBelege", _
acNormal, , "BelegNr=" _
& CStr(Me!BelegNr)
End Sub
Die Prozedur öffnet das Formular frmBelege und filtert hierbei den gewünschten Datensatz heraus.
- Zusammenfassung und Ausblick Die hier vorgestellte Lösung kann noch weiter optimiert werden, indem beispielsweise ein Scanner eingesetzt wird, der automatisch PDFDateien erzeugt und diese auch gleich per OCR in Text umwandelt. Idealerweise wird hierbei auch die Indexnummer in Text umgewandelt, sodass Sie diese beispielsweise im Rahmen der Volltextsuche verwenden können.
Wenn Ihnen der Aufdruck der Nummern mit Hilfe des Druckers zu umständlich ist, können Sie alternativ auch einen Paginierstempel einsetzen. Dieser hat ein Zählwerk, womit bei jedem Stempelvorgang weitergezählt wird.
Abb. 10: Das Formular frmBelege
| |
Mit ihnen können diese Elemente nach der Veröffentlichung sowie Datenzugriffsseiten angezeigt werden. Falls Sie bereits Microsoft Office FrontPage 2003, Microsoft Office Access 2003 und Microsoft Office Excel 2003 installiert haben, können Sie mit Office Web Components interaktive Daten als Teil einer Webseite veröffentlichen. In Verbindung mit Microsoft Internet Explorer, Version 5.01 oder höher, können Sie mithilfe von Office Web Components ein auf einer Webseite veröffentlichtes Steuerelement (Kalkulationstabelle, Diagramm oder Datenbank) sowie Datenzugriffsseiten anzeigen. | |
Die Grundlage, um unbeabsichtigte Änderungen zu verhindern, stellt ein Makro mit dem Namen ÄnderungBestätigen dar. Das Makro hat den folgenden Aufbau:
| Bedingung |
Aktion |
| Meldung("Änderung übernehmen?";1) = 2 |
AbbrechenEreignis |
| ... |
Tastaturbefehle |
Für das Aktionsargument Tastenfolge der Tastaturbefehle-Aktion geben Sie folgenden Ausdruck an:
{ESC}
Beachten Sie bei der Eingabe des Makros, dass Sie vor der Aktion Tastaturbefehle die drei Punkte der Spalte Bedingungen nicht vergessen. Diese bewirken nämlich, dass die Ausführung der Tastaturbefehle-Aktion ebenfalls von der Bedingung der vorhergehenden Aktionszeile abhängig ist. Sollte die Spalte Bedingungen bei Ihnen nicht sichtbar sein, können Sie diese über den gleichnamigen Befehl des Menüs Ansicht einblenden.
Nachdem Sie das fertige Makro gespeichert haben, öffnen Sie das Eigenschaftenfenster des Steuerelements, dessen Änderungen überwacht werden sollen. Tragen Sie nun unter der Vor Aktualisierung-Eigenschaft den Namen des Makros, also - ÄnderungBestätigen - ein.
Zum Test wechseln Sie in die Formularansicht und nehmen an dem Steuerelement eine Änderung vor. Nachdem Sie zu einem anderen Steuerelement gewechselt haben, erscheint folgendes Meldungsfenster: siehe Abbildung 1.
Wenn Sie auf Abbrechen klicken, bricht das Makro zunächst das Speichern des Feldinhaltes mittels AbbrechenEreignis-Aktion ab. Anschließend wird der ursprüngliche Inhalt des Steuerelements durch simuliertes Betätigen der [Esc]-Taste wiederhergestellt | |
Oftmals genügt es nicht, Daten nur nach einem Feld zu sortieren. Wenn Sie eine Adressliste besitzen, wollen Sie die Adressen vielleicht zuerst nach dem Nachnamen, und wenn mehrere Personen den gleichen Nachnamen besitzen, diese noch zusätzlich nach dem Vornamen sortieren. Eine solche Sortierung wird mehrstufige Sortierung genannt. Wenn Sie im Datenblatt zuerst die Spalte Name sortieren und dann die Spalte Vorname, ist die Spalte Name anschließend wieder unsortiert. Diese Methode führt also nicht zum gewünschten Ergebnis.
Um mehrere Spalten gleichzeitig markieren zu können, müssen diese Spalten nebeneinander im Datenblatt liegen. Verschieben Sie die Spalten im Datenblatt also so, dass ganz links die Spalte ist, nach der zuerst sortiert werden soll, rechts davon die Spalte für die erste Untersortierung usw. Markieren Sie dann diese Spalten, indem Sie auf die Spaltenüberschrift der ersten Spalte klicken und den Mauszeiger über die restlich Spalten ziehen. Wählen Sie dann über die Symbolleiste eine auf- oder absteigende Sortierung aus.
Im Gegensatz zu Abfragen, kann eine mehrstufige Sortierung im Datenblatt nur für alle Felder gleich entweder auf- oder absteigend definiert werden. | |
| Zweck |
Taste(n) |
| Auswahl in die Zwischenablage kopieren |
Strg+C |
| Auswahl in die Zwischenablage ausschneiden |
Strg+X |
| Inhalts der Zwischenablage an der Einfügemarke einfügen |
Strg+V |
| Auswahl oder Zeichen links von der Einfügemarke löschen |
Rücktaste |
| Auswahl oder Zeichen rechts von der Einfügemarke löschen |
Entf |
| Alle Zeichen rechts von der Einfügemarke löschen |
Strg+Entf |
Tastenkombinationen für den Befehl Rückgängig
| Zweck |
Taste(e) |
| Rückgängig Eingabe |
Strg+Z oder Alt+Rücktaste |
| Rückgängig Änderungen im aktuellen Feld |
Esc |
Dateneingabe in der Datenblatt- oder Formularansicht
| Zweck |
Taste(n) |
| Aktuelles Datum einfügen |
Strg+Semikolon (;) |
| Aktuelle Uhrzeit einfügen |
Strg+Doppelpunkt (:) |
| Standardwert für ein Feld einfügen |
Strg+Alt+Leertaste |
| Wert aus demselben Feld im vorherigen Datensatz einfügen |
Strg+Apostroph (') |
| Neuen Datensatz hinzufügen |
Strg+Pluszeichen (+) |
| Aktuellen Datensatz löschen |
Strg+Minuszeichen (-) |
| Änderungen am aktuellen Datensatz speichern |
Umschalt+Eingabetaste |
| In einem Kontrollkästchen oder Optionsfeld zwischen den Werten wechseln |
Leertaste |
| Neue Zeile einfügen |
Strg+Eingabetaste |
Aktualisierung von Feldern mit Daten
| Zweck |
Taste(n) |
| Alle Felder im Fenster neu berechnen |
F9 |
| Abfrage der zugrunde liegenden Tabellen erneut ausführen |
Umschalt+F9 |
| Inhalts eines Listen- oder Kombinationsfelds aktulisieren |
F9 | | |
Ein häufig gespeicherter Wert in Access-Datenbanken sind Geburtsdaten.
Verwenden Sie eine benutzerdefinierte Funktion, um das Alter aus einem Geburtsdatum zu berechnen.
Function fctAlter(Geburtsdatum As Variant) As Variant On Error GoTo Err_fctAlter
If IsDate(Geburtsdatum) Then If DateSerial(Year(Date), Month(Geburtsdatum), Day(Geburtsdatum)) > Date Then 'Der Geburtstag war in diesem Jahr noch nicht fctAlter = Year(Date) - Year(Geburtsdatum) - 1 Else 'Der Geburtstag war in diesem Jahr schon fctAlter = Year(Date) - Year(Geburtsdatum) End If End If
Exit_fctAlter Exit Function
Err_fctAlter MsgBox Err.Number & " " & Err.Description, vbCritical Resume Exit_fctAlter
End Function
Diese Funktion wendet die eingebauten Access-Funktionen DateSerial, Year, Month und Date auf ein übergebenes Geburtsdatum an und berechnet daraus das Alter. Wichtig dabei ist die Unterscheidung, ob der Geburtstag im aktuellen Jahr schon stattgefunden hat oder nicht. Mit Hilfe dieser Funktion können Sie anschließend in einer Abfrage mit dem Ausdruck Alter: fctAlter(datGeburt) in einem berechneten Feld das Alter anzeigen lassen.
| |
Bei der Definition einer Prozedur werden die einzelnen Argumente zusammen mit ihren Datentypen hinter dem Prozedurnamen aufgelistet.
Oft hängt die Anzahl der erforderlichen Argumente jedoch von der aktuellen Situation ab.
Verwenden Sie in diesem Fall einfach ein Parameter-Array, um beliebig viele Parameter zu übergeben.
Jede Prozedur kann genau ein Parameter-Array enthalten, das mit dem Schlüsselwort ParamArray gekennzeichnet wird.
Die folgende Prozedur verwendet ein solches Parameter-Array, um zu überprüfen, ob bestimmte Zeichenketten innerhalb eines Textes enthalten sind:
Function TextInString(Text As String, ParamArray Teilstrings() As Variant) As Boolean
Dim Teilstring As Variant
TextInString = False For Each Teilstring In Teilstrings
If InStr(Text, Teilstring) <> 0 Then TextInString = True Exit Function End If
Next Teilstring
End Function
Der Prozedur wird als erstes Argument ein Text übergeben. Diesem folgen beliebig viele weitere Teilstrings. Die Prozedur gibt True zurück, wenn einer dieser Teilstrings in dem Text enthalten ist.
Das Ergebnis des folgenden Ausdrucks ist dementsprechend True:
TextInString("Über diesen Text läßt sich streiten", "ä", "ö", "ü") | |
Eine Anforderung an Abfragen kann die Berechnung einer laufenden Summe sein. Verwenden Sie die Funktion DomSumme zur Berechnung einer laufenden Summe. Das folgende Beispiel verwendet die Beispiel-Datenbank Nordwind. Ziehen Sie die Tabelle Bestellungen in den Abfrageentwurf. Wählen Sie das Feld Personal-ID aus und vergeben Sie den Aliasnamen Mitarbeiter.
Mitarbeiter: Personal-Nr
Klicken Sie auf das Symbol Funktionen in der Symbolleiste und wählen Sie im Feld Funktionen den Eintrag Gruppierung aus. Dadurch wird jeder Mitarbeiter nur einmal angezeigt.
Geben Sie in das nächste Feld folgenden Ausdruck ein:
Laufende Summe: Format(DomSumme("Frachtkosten";"Bestellungen";"[Personal- Nr]<=" & [Mitarbeiter] & "");"0.000,00 Euro")
Wählen Sie für dieses Feld folgende Einstellung aus:
Funktion: Ausdruck | |
| Das fullAccess Euro-Control bietet Ihnen eine Technik, mit der Sie Ihre Access-Anwendung im Handumdrehen Euro-Fähig machen. Hierbei kommen nur die Hausmittel von Access und keine problematischen ActiveX-Steuerelemente zum Einsatz. Pro Formular können Sie die gewünschte Währung während der Dateneingabe auswählen und beliebig oft umschalten. Die erforderlichen Funktionen können Sie mit geringen Aufwand in Ihre eigenen Formulare integrieren. |
|
Ob man ihn nun feiern will oder nicht, der Geburtstag ist und bleibt ein besonderer Tag im Leben eines Menschen. Da Sie Ihre Adressen in der Regel täglich einsehen, wäre es doch schön, wenn Sie die Datenbank bei jedem Start auf die aktuellen Geburtstage aufmerksam machen könnte.
Mit einer Abfrage veranlassen Sie Ihre Datenbank, Sie rechtzeitig über die anstehenden Geburtstage zu informieren.
Das genügt aber noch nicht ganz. Da Sie sich eventuell mit einer Postkarte melden wollen und die Datenbank ggf. an einigen Tagen doch nicht einsehen, sollte sie möglichst schon eine Woche vorher die kommenden Geburtstage ankündigen. Damit bei längerer Abwesenheit auch eine verspätete Gratulation erfolgen kann, sind zusätzlich die Geburtstage der zurückliegenden 7 Tage anzuzeigen.
Diese Aufgabe ist aufgrund der Besonderheiten beim Jahreswechsel nicht so einfach zu lösen, wie es zunächst klingt. Da die Abfrage ausgehend vom Tagesdatum die Geburtstage der vergangenen und der kommenden 7 Tage ermitteln soll, benötigen Sie zwei Ausdrücke, die ausgehend vom Tagesdatum jeweils die untere und die obere Grenze des Betrachtungszeitraums berechnen. Fügen Sie Ihrer Abfrage zunächst eine Spalte mit folgendem Ausdruck hinzu:
UntereGrenze: DatSeriell(Jahr(Datum()-7); Monat([Geburtstag]);Tag([Geburtstag]))
Wenn Sie Ihre Abfrage am 30.12.95 ausführen und das Feld Geburtstag den Wert 2.1.69 hat, zieht Access zunächst 7 Tage vom Tagesdatum, also dem 30.12.95 ab, bevor es die Jahreszahl ermittelt.
Das Ergebnis der DatSeriell-Funktion ist daher der 2.1.95, was deutlich mehr als 7 Tage vom Tasgesdatum entfernt ist. Die Spalte UntereGrenze löst die Jahreswechselproblematik also nur für den Fall, dass die Abfrage kurz nach dem Jahreswechsel, also beispielsweise am 3.1.95, ausgeführt wird und ein Geburtstag auf ein Datum am Ende eines Jahres, also beispielsweise den 30.12.95, fällt. Hier zieht Access 7 Tage vom 3.1.95 ab und berechnet so den 27.12.94, also die Jahreszahl 1994. Die DatSeriell-Funktion ermittelt dann das Geburtstagsdatum 30.12.94, das ganz klar weniger als 7 Tage vom Tagesdatum, also dem 3.1.95 entfernt ist.
Deshalb benötigen Sie noch eine weitere Spalte für die obere Grenze des Betrachtungszeitraums. Geben Sie dazu den folgenden Ausdruck ein:
ObereGrenze: DatSeriell(Jahr(Datum()+7); Monat([Geburtstag]);Tag([Geburtstag]))
In diesem Fall werden vor der Berechnung des Jahres 7 Tage zum Tagesdatum addiert. Bei den Gegebenheiten aus dem weiter oben genannten Beispiel addiert Access zunächst sieben Tage zum Tagesdatum, also dem 30.12.1995 und ermittelt so das Datum 06.01.96. Da der Geburtstag am 2.1.69 ist, berechnet die DatSeriell-Funktion das Datum 2.1.96. Auch dieses Datum liegt weniger als 7 Tage vom Tagesdatum entfernt und die entsprechende Person erscheint im Abfrageergebnis.
Damit das auch richtig funktioniert, müssen Sie natürlich für die Spalten UntereGrenze und ObereGrenze folgendes Kriterium eingeben:
Zwischen (Datum()-7) Und (Datum()+7)
Da Access Kriterien in derselben Zeile Und-Verknüpft, Sie aber bereits wissen, dass sich die Kriterien der beiden Spalten UntereGrenze und ObereGrenze ausschließen, müssen Sie das Kriterium der Spalte ObereGrenze in die zweite Zeile, die im Abfrageentwurf mit oder beschriftet ist, eintragen. Zusätzlich müssen Sie in dieser Zeile das Kriterium Ist Nicht Null für die Spalte Geburtstag eingeben. Siehe Abbildung 1.
Sie verfügen dann über zwei Kriterienzeilen, die Access mit einem logischen Oder verknüpft. Die erste Zeile enthält die Kriterien für die Spalten Geburtstag und UntereGrenze und die zweite Zeile die Wiederholung des Kriteriums für die Spalte Geburtstag und ein zweites Kriterium für die Spalte ObereGrenze.
Damit haben Sie das Jahreswechselproblem gelöst, und Sie können die Abfrage erst einmal ausgiebig testen. Verwenden Sie einfach die Systemsteuerung von Windows, um die Abfrage mit verschiedenen Tagesdaten auszuführen. Geben Sie vorher insbesondere ein paar Test-Geburtstage in der Nähe des Jahreswechsels ein. Wenn der Test abgeschlossen und Sie mit dem Ergebnis zufrieden sind, können Sie die Anzeige-Kriterien für die Spalten UntereGrenze und ObereGrenze löschen. Sie stören dann das Erscheinungsbild des Abfrageergebnisses nicht mehr und die Abfrage funktioniert trotzdem einwandfrei.
Bei der Ausführung der Abfrage fällt auf, dass Access die Geburtstage unsortiert anzeigt. Wünschenswert wäre jedoch eine Sortierung nach Monaten und Tagen, die die Jahreszahl unberücksichtigt läßt. So würden die Geburtstage in der Reihenfolge erscheinen, wie Sie im laufenden Jahr auch stattfinden. Auch dieses Problem können Sie über eine berechnete Spalte und der DatSeriell-Funktion lösen. Der Ausdruck lautet wie folgt:
Sortierung: DatSeriell(0;Monat([Geburtstag]); Tag([Geburtstag])))
In diesem Fall werden alle Geburtstage auf dieselbe Jahreszahl 0 transformiert. Sie können aber auch jede beliebige andere Konstante als Jahreszahl einsetzen. Wichtig ist aber, daß Sie für diese Spalte die aufsteigende Sortierung auswählen. Da die Berechnungsergebnisse nur zur Sortierung benötigt werden, sollten Sie das Anzeige-Kriterium für die Spalte löschen.
| |
Das Windows-API stellt eine Funktion zur Verfügung, die alle vorhandenen Laufwerke als Zahl des Typs Long zurückgibt. Die 26 rechts ausgerichteten Bits der zurückgegebenen Zahl stellen die 26 gültigen Laufwerke dar. Wenn ein Bit auf 1 gesetzt ist, ist das betreffende Laufwerk vorhanden.
Durch Einsatz der folgenden Schleife prüfen Sie jedes Bit der Zahl:
Dim i As Integer
For i = 0 To 25
If Zahl And 1 Then ' Laufwerknummer ist anwesend End If
'Zahl ein Bit nach rechts verschieben, um nächste Laufwerk zu prüfen Zahl = Zahl \ 2
Next i
Um die Zahl aus der Win-API zu ermitteln, benötigen Sie die Funktion GetLogicalDrives, die wie folgt deklariert wird.
Declare Function GetLogicalDrives Lib "kernel32" () As Long
Eine Funktion, die alle verfügbaren Laufwerke als Buchstaben im Testfenster anzeigt, würde dann folgendermaßen aussehen:
Public Function LaufwerkeAnzeigen()
Dim lLaufwerke As Long, i As Integer
lLaufwerke = GetLogicalDrives() ' logische Laufwerke ermitteln
For i = 0 To 25
If lLaufwerke And 1 Then ' Laufwerknummer ist anwesend Debug.Print Chr$(65 + i) & ": " ' Laufwerkbuchstaben anzeigen End If
' Wert ein Bit nach rechts verschieben, 'um nächste Laufwerknummer zu prüfen
lLaufwerke = lLaufwerke \ 2
Next i
End Function | |
Ihre lang recherchierten und schön formatierten Berichtsdaten müssen nicht ausschließlich auf Papier landen, sondern sie können auch in andere Office-Anwendung exportiert werden.
In der Seitenansicht können Sie einen Bericht beispielsweise an WinWord übergeben, um ihn dort weiterzuformatieren oder zwecks Weitergabe als Datei zu speichern.
Den Export eines bewerkstelligen Sie über den Menübefehl Extras / OfficeVerknüpfungen. Wählen Sie hier die gewünschte Anwendung aus.
Die Menübefehle befinden sich übrigens auch in der Symbolleiste. Nach WinWord exportierte Berichte werden in das RTF (Rich Text Format) konvertiert und automatisch geladen, während die Übergabe an Excel im XLS-Format erfolgt | |
Sie können die Spezialtasten von Access sperren, indem Sie den Menüpunkt Extras>Start wählen. Im unteren Teil des Dialogs wird die Option Access-Spezieltasten verwenden sichtbar. Deaktivieren Sie das Kontrollkästchen, um die Spezialtasten zu blockieren.
Um den Zugriff auf das Datenbankfenster zu sperren, reicht es nicht aus, die F11 Taste zu deaktivieren. Das Datenbankfenster kann dann immer noch über das Menü Fenster aufgerufen werden. Definieren Sie deshalb zusätzlich noch eine neue Menüzeile, in der das Menü Fenster nicht mehr enthalten ist. | |
Bei der Dateneingabe in Kombinationsfelder ist es besonders für Mauslose Anwender zeitaufwendig, die entsprechende Liste des Kombinationsfeldes vor der Eingabe herunterzuklappen. Eine Alternative wären Listenfelder, die jedoch sehr viel Platz benötigen.
Verwenden Sie die DropDown-Methode, um die Liste eines Kombinationsfeld direkt bei der Aktivierung herunterzuklappen.
Legen Sie zu diesem Zweck innerhalb eines Standardmoduls die folgende Prozedur an:
Function DropDown()
On Error Resume Next Screen.ActiveControl.DropDown
End Function
In die Beim Hingehen-Ereigniseigenschaft der betreffenden Kombinationsfelder tragen Sie anschließend den folgenden Ausdruck ein:
=DropDown()
Sobald nun der Fokus zu einem der Kombinationsfelder wechselt, wird die Liste automatisch heruntergeklappt. | |
Mit VIMail können Sie Serien-E-Mails mit der MS Access Datenbank und txt-Template-Dateien erstellen.
| |
Jeder Benutzer wird in der Users-Auflistung durch ein User-Objekt repräsentiert. Um festzustellen, ob ein Benutzer Mitglied in einer bestimmten Gruppe ist, muß nur die Groups-Auflistung des betreffenden Users-Objekt durchlaufen werden. Genau dies erledigt die folgende Prozedur. Sie ermittelt, ob der angegebene Benutzer Mitglied in einer bestimmten Gruppe ist und gibt dementsprechend True oder False zurück:
Function IstBenutzerGruppenmitglied(Benutzername As String, _ Gruppenname As String) As Boolean
Dim WS As Workspace Dim Benutzer As User Dim Gruppe As Group
On Error GoTo Err
Set WS = DBEngine(0) Set Benutzer = WS.Users(Benutzername)
IstBenutzerGruppenmitglied = False
For Each Gruppe In Benutzer.Groups
If Gruppenname = Gruppe.Name Then IstBenutzerGruppenmitglied = True Exit For End If
Next Gruppe
Exit Function
Err:
MsgBox Err.Description Exit Function
End Function
Bei einem jungfräulichen Sicherheitssystem gibt der folgende Ausdruck True zurück:
IstBenutzerGruppenmitglied("Admin", "Admins")
Beachten Sie, daß die Namen der Standardbenutzer und -benutzergruppen innerhalb von VBA in englisch angegeben werden müssen. Aus Administrator wird also Admin, aus Administratoren wird Admins und aus Benutzer wird Users. | |
| Ich habe einen Bericht, der auf einem gefilterten Formular beruht. Dieses Formular enthält des weiteren eine Parameterabfrage nach dem Jahr. Die Daten in diesem Formular sind nach Auftragsnummern sortiert. Wenn ich jetzt den Bericht aufrufe so werden mir auch nur die gefilterten Daten angezeigt aber leider nicht mehr sortiert. Wie kann ich es erreichen, dass die Sortierung aus dem Formular auch auf dem Bericht beibehalten wird? Das Formular und der Bericht haben die gleiche Datengrundlage (sortierte Abfrage). | Unabhängig von der Datenherkunft des Berichts können Sie nach einem beliebigen Feld sortieren. Das Feld tragen Sie in die Berichtseigenschaft "Sortiert nach" ein. Die Eigenschaft "Sortierung aktiv" muss natürlich auf "Ja" gesetzt sein. Das Feld muss nicht unbedingt auf dem Bericht stehen, aber schon in der Datenherkunft. |
Das Anschließen einer Arbeitsgruppendatei vor dem Start von Access geschieht in der Regel über den MS Access Arbeitsgruppen-Administrator. Die Arbeitsgruppendatei lässt sich aber auch direkt beim Start angeben. Der Standard Arbeitsgruppendateiname ist System.mdw.
Verwenden Sie die Befehlszeilenoption "/wrkgrp", um die zu verwendende Arbeitsgruppendatei beim Laden von Access festzulegen.
Wählen Sie im Start-Menü von Windows den Befehl Ausführen. Geben Sie im Kombinationsfeld Öffnen die folgende Zeile ein:
msaccess /wrkgrp .mdw
Access wird dann mit der angegebenen Arbeitsgruppendatei gestartet.
| |
Dieses Buch verbindet die komplette, praxisnahe Abhandlung der gesamten Funktionalität von Microsoft Access 2003 mit einem besonders günstigen Preis. Es ist geschrieben für Einsteiger, die interessiert sind, sich das Datenbankprogramm in all seinen Facetten Schritt für Schritt zu erarbeiten. Nach der Beschreibung der Oberfläche und dem Umgang mit Tabellen und Formularen geht es zum Erstellen von Tabellen und Datenbanken sowie zu den Abfragen und Diagrammen. Schließlich werden Berichte und Steuerelemente gründlich erläutert, bevor das Buch mit dem Datenaustausch sowie dem Internet/Intranet schließt.
Von Said Baloui; Markt + Technik (2003); Euro 29,95; ISBN: 382726605-X | |
Access stellt eine Funktion namens Rnd zur Verfügung, mit der sich Zufallszahlen zwischen 0 und 1 ermitteln lassen. In der Praxis werden jedoch häufig ganzzahlige Zufallszahlen zwischen einer bestimmten oberen und unteren Grenze benötigt (z.B. zwischen 1 und 10). Die folgende Anweisung erledigt dies:
Public Function ZufallszahlAusgeben(Untergrenze, Obergrenze)
Randomize Timer Ausgeben = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
End Function
Die Funktion erwartet beim Start eine Ober- und eine Untergrenze. Das Ergebnis ist eine ganzzahlige Zufallszahl zwischen den beiden angegebenen Werten. | |
Access verfügt über einen Assistenten für Eingabeformate, der unter anderem auch ein Format für Telefonnummern vorschlägt. Dieses Format ist aber leider nur für amerikanische Telefonnummern geeignet. Im deutschsprachigen Raum benötigen Sie ein anderes Eingabeformat.
Da Telefonnummern im deutschsprachigen Raum nicht normiert sind, benötigen Sie hierfür ein spezielles Eingabeformat.
Die hiesigen Telefonnummern weisen aus der Sicht des Datenbankentwicklers das Problem auf, dass weder die Länge der Vorwahl noch die Länge der Telefonnummer normiert ist.
Ein Eingabeformat mit 16 Stellen sollte jedoch für die meisten Zwecke ausreichend sein. Geben Sie folgenden Ausdruck in die Eigenschaft Eingabeformat Ihrer Telefonnummer ein:
!\(999999")"000\ 999\ 9999;;w
Während der Dateneingabe zeigt Access 16-mal den Buchstaben w an. Der Anwender kann jedes w durch eine Ziffer ersetzen.
Bei einer fünfstelligen Vorwahl muss der Anwender erst einmal die Leertaste betätigen, bevor er seine Ziffern eingibt. Ist die Vorwahl nur vierstellig muss er die Leertaste zweimal betätigen, usw.
Die Eingabe der Telefonnummer fällt leichter, wenn nach dem Eintritt in ein Feld die -Taste betätigt wird. Access zeigt das Eingabeformat dann innerhalb des Feldes an (siehe Abbildung). Zu dem Eingabeformat für die Telefonnummer passt folgendes Anzeigeformat:
!(@@@@@@)@@ @@ @@ @@ @@ | |
Datenherkunft Verwenden Sie als Datenherkunft für Formulare nach Möglichkeit keine SQL-Anweisung, sondern eine gespeicherte Abfrage. Gespeicherte Abfragen werden schneller ausgeführt.
Sortierungen Die Datensätze der einem Formular zugrunde liegenden Abfrage sollten nur dann sortiert werden, wenn dies unbedingt erforderlich ist. Dies tifft vor allem auf solche Abfragen zu, in denen mehrere Tabellen zusammengefasst sind.
Steuerelemente Grundsätzlich gilt: Reduzieren Sie die Anzahl der Steuerelemente auf einem Formular so weit wie möglich, denn das Laden von Steuerelementen ist relativ zeitraubend. Vermeiden Sie auf jeden Fall sich überlappende Steuerelemente.
Bildsteuerelemente Verwenden Sie nach Möglichkeit Bildsteuerlemente anstelle von OLE-Objekten, weil diese schneller geladen werden und weniger Speicherplatz benötigen.
Grafiken Bei der Verwendung von Grafiken gelten folgende Optimierungsregeln: - So wenige Grafiken wie möglich verwenden - Verwenden Sie nach Möglichkeit schwarzweiße anstelle farbiger Grafiken - Redizieren Sie die Farbtiefe farbiger Grafiken | |
Sie finden vielen Tipps & Tricks, Downloads und Beispieldateien zu Access. Autorin war fast ausschließlich Annerose Stübiger, die auch die Beispieldateien zu folgenden Access Themen erstellt hat:
-
Bericht
- Datenherkunft
- Datensatznavigation
- Datensatzoperation
- Datum
- DB-Design
- DomFunktion
- Felder
- Filter
- Format
- Formulargestaltung
- Formularsteuerung
- Layout
- MS Graph
- Timer
- Schutz
- Suchen
| |
Um auf versteckte Objekte zugreifen zu können, müssen Sie den Menübefehl Extras>Optionen ausführen und in das Register Ansicht wechseln. In der Sektion Einblenden aktivieren Sie dann die Option Ausgeblendete Objekte. Die Veränderung zeigt sofort Wirkung, wenn Sie auf OK oder Übernehmen klicken. Es werden nun alle erstellten Objekte angezeigt.
Ausgeblendete Objekte erkennen Sie im Datenbankfenster daran, dass das jeweils zugehörige Symbol verblaßt dargestellt wird. | |
MARS ermöglicht das schnelle Erstellen von Access-Reports, die automatisch ausgeführt, per E-Mail verschickt, gedruckt, gefaxt oder auf einen FTP-Server in vielen möglichen Formaten geladen werden können. Es ermöglicht das automatische Erstellen von Berichten im Tages-, Wochen- oder Monats-Rhythmus oder das Definieren von eigenen Rhythmen. Die Berichte können u.a. in Word-, Excel-, HTML-, RTF- oder im PDF-Format gespeichert werden. Gleiche Reports können mehrmals mit verschiedenen Parametern, Formaten, Rhythmen oder Zielen erstellt werden. Auch das Definieren von Aktions-Plänen ist möglich. | |
| | |
Weiterhin lassen sich diese Werte nach einer Reihe von Kategorien, die untereinander auf der linken Seite des Datenblatts angezeigt werden, und nach einer anderen Reihe von Kategorien, die am oberen Rand des Datenblatts angezeigt werden, gruppieren.
Kreuztabellenabfrage erlauben eine zweidimensionale Tabellendarstellung.
Das folgende Beispiel verwendet die Beispiel-Datenbank Nordwind und zeigt die Anzahl der Bestellungen einer pro Jahr an:
Ziehen Sie die Tabellen Kunden und Bestellungen in den Abfrageentwurf.
Wählen Sie für das Feld Firma der Tabelle Kunden folgende Einstellungen aus:
Funktion: Gruppierung Kreuztabelle: Zeilenüberschrift
Geben Sie in das nächste Feld folgenden Ausdruck ein:
Ausdr1: Jahr([Bestelldatum]) & " " & "Anzahl Bestellungen pro Jahr"
Wählen Sie für dieses Feld folgende Einstellungen aus:
Funktion: Gruppierung Kreuztabelle: Spaltenüberschrift
Wählen Sie für das letzte Feld aus der Tabelle Bestellungen folgende Einstellungen aus:
Feld: Anzahl: Bestell-Nr Funktion: Anzahl Kreuztabelle: Wert | |
Die folgende Funktion erwartet beim Start ein beliebiges Geburtsdatum. Das Ergebnis ist das Alter der Person am heutigen Tage.
Function AlterBerechnen(Geburtstag As Date) As Integer
AlterBerechnen = IIf(Day(Geburtstag) > Day(Date) And _ Month(Geburtstag) >= Month(Date), _ Year(Date) - Year(Geburtstag) - 1, _ Year(Date) - Year(Geburtstag))
End Function | |
In der Access Beispieldatenbank Nordwind finden Sie ein Formular namens Kunden-Telefonnummern, das mit einer Registerleiste im Formularfuß ausgestattet ist. Die Aufgabe dieser Leiste besteht darin, die Formulardaten nach bestimmten Anfangsbuchstaben zu filtern.
Mit wenigen Schritten können Sie eine solche Registerleiste auch in Ihre Formulare einfügen.
Zur Anlage der Leiste gehen Sie folgendermaßen vor:
1. Legen Sie eine Optionsgruppe im Fuß des Formulars an. Verzichten Sie hierbei auf den Einsatz des Optionsgruppen-Assistenten, da dieser nur mit maximal 20 Optionen hantieren kann.
2. Erstellen Sie innerhalb der Optionsgruppe 26 Umschaltsflächen. Mit dem Befehl Bearbeiten / Duplizieren vereinfachen Sie diesen Vorgang.
3. Beschriften Sie die Schaltflächen mit "A" bis "Z".
4. Numerieren Sie die Schaltflächen mittels Optionswert-Eigenschaft von 65 (für A) bis 90 (für Z) durch. Diese Zahlenwerte entsprechen des ASCII-Codes der betreffenden Buchstaben.
5. Legen Sie eine letzte Umschaltsfläche mit der Beschriftung 'Alle' und dem Optionswert 91 an.
6. Für das Ereignis Nach Aktualisierung der Optionsgruppe legen Sie die folgende Prozedur an:
Private Sub Kundenfilter_AfterUpdate()
Dim ctlFilterOption As Control Set ctlFilterOption = Me.Kundenfilter
Select Case ctlFilterOption
Case 65 To 90 ' Filter verwenden Me.Filter = "[Kontaktperson] Like '" & Chr(ctlFilterOption) & "*'" Me.FilterOn = True
Case Else ' Filter aufheben Me.FilterOn = False
End Select
End Sub | |
Access kennt verschiedene Methoden zum Schutz von Datenbanken. Diese Methoden unterscheiden sich sowohl im Bedienungsaufwand, als auch in Ihrer Wirksamkeit. In diesem ersten Teil werden die Themen Datenbankkennwort, MDE-Erstellung und Datenbankverschlüsselung behandelt.
Datenbankkennwort Eine Datenbank, die mit einem Kennwort geschützt ist, kann nur noch nach Eingabe dieses Kennworts geöffnet werden. Es besteht also die Gefahr, dass Sie sich selbst von Ihrer Datenbank aussperren. Der Dialog zur Kennworteingabe wird über Extras / Sicherheit / Datenbankkennwort zuweisen (Access 2000, XP) bzw. Extras / Zugriffsrechte / Datenbankkennwort zuweisen (Access 97) geöffnet.
MDE-Datei erstellen Beim Speichern einer Datenbank als MDE-Datei sind der komplette VBA-Code und die Entwurfsansichten von Formularen und Berichten nicht mehr zugänglich. Dies gilt allerdings auch für Sie selbst als Eigentümer einer Datenbank. Da außerdem dieser Vorgang nicht mehr rückgängig gemacht werden kann, sollten Sie in jedem Fall einer Kopie der MDB-Datei sicher aufbewahren. Der Dialog zur MDE-Erstellung (ab Access 97) wird über Extras / Datenbank-Dienstprogramme / MDE-Datei erstellen aufgerufen.
Datenbank verschlüsseln Beim Verschlüsseln einer Datenbank wird die Datenbankdatei so behandelt, dass sie nicht mehr mit Hilfe eines Texteditors oder sonstigen Dienstprogramms gelesen werden kann. Der Dialog zur Verschlüsselung wird über Extras / Sicherheit / Datenbank ver-/entschlüsseln (Access 2000, XP) bzw. Extras / Zugriffsrechte / Datenbank ver-/entschlüsseln (Access 97) aufgerufen. | |
| Wenn Sie hier etwas mehr Flexibilität wünschen, verwenden Sie einfach den gleichnamigen Menüpunkt des Kontextmenüs. Hier können Sie nämlich neben der Anzahl der darzustellenden Seiten auch die Anordnung festlegen. | |
Obwohl sich Formularfenster nahezu beliebig in der Größe ändern lassen, hat dies in der Regel wenige Auswirkungen auf den Inhalt der Formulare. Die Größe der Steuerelemente oder deren Position wird nämlich nicht automatisch angepasst.
Dank der BeiGrössenänderung-Eigenschaft können Sie eine Ereignisprozedur entwickeln, die alle Steuerelemente an die aktuelle Formulargröße anpasst. Der vorhandene Platz kann so optimal ausgenutzt werden.
Das Grössenänderung-Ereignis (engl. Resize) wird von Access beim Öffnen des Formulars und bei jeder Größenänderung ausgelöst. Mit einer entsprechenden Ereignisprozedur können Sie also die Position (Left- und Top-Eigenschaften) und die Größe (Width- und Height-Eigenschaften) der einzelnen Steuerelemente anpassen.
Zusätzlich benötigen Sie noch Informationen über die aktuelle Größe des Formulars. Diese ermitteln die beiden Eigenschaften InsideHeight und InsideWidth, die jedes Formular zur Verfügung stellt.
Die folgende Ereignisprozedur bezieht sich auf ein Formular, das lediglich ein einzelnes Listenfeld mit dem Namen lstLieferanten einhält. Die Größe dieses Listenfeldes wird an die aktuelle Formulargröße angepasst, wobei an allen Seiten ein Rand von 100 Tipps reserviert wird:
Private Sub Form_Resize()
Const Rand = 100
With Me!lstLieferanten If .Top <> Rand Then .Top = Rand If .Left <> Rand Then .Left = Rand .Height = Max(Me.InsideHeight - Rand * 2, 0) .Width = Max(Me.InsideWidth - Rand * 2, 0) End With
End Sub
Innerhalb der Ereignisprozedur kommt eine Funktion namens Max zum Einsatz, die immer den maximalen zweier Werte zurückgibt. Die Funktion verhindert in der obigen Prozedur, dass die Breite oder Höhe des Steuerelements bei sehr kleinen Formularausmaßen negative Werte annimmt.
Private Function Max(a, b) As Long
Max = IIf(a > b, a, b)
End Function | |
Wählen Sie im Start-Menü den Menüpunkt Ausführen und machen Sie im Kombinationsfeld Öffnen die folgende Eingabe:
msaccess <Datenbankname>.mdb /X <Makroname>
Klicken Sie auf OK, um Access zu starten. Es wird die angegebene Datenbankdatei geladen und anschließend das in der Option festgelegte Makro, dass in der Datenbank enthalten sein muss, ausgeführt. Sie benötigen also kein Autoexec-Makro.
Wenn Sie noch zusätzlich ein Autoexec-Makro in Ihrer Datenbank definiert haben, wird zuerst das Autoexec-Makro ausgeführt und dann das Makro in der Befehlszeile. Auf diese Weise können Sie für jeden Benutzer eine individuelle Startsequenz definieren, wobei zusätzlich im Autoexec-Makro globale, für alle Benutzer geltende Befehle ausgeführt werden können. | |
Dieses Tool ermöglicht Ihnen das Erstellen von COM add-ins, Smart Tags und RTD Server für Microsoft Office Anwendungen. | |
Abfragen dienen dazu, Datensätze zu filtern, um so gezielt Daten aufzuspüren. Besonders bei Textfeldern bieten sich Platzhalterzeichen für die Selektion von Datensätzen an.
Benutzen Sie den Wie-Operator, um Platzhalterfunktionen verwenden zu können.
Wenn Sie Platzhalter in Kriterien benutzen wollen, müssen Sie diese über den Wie-Operator festlegen. Sobald Sie in einem Kriterium ein Platzhalterzeichen verwenden und die Eingabe anschließen, wandelt Access die Eingabe automatisch unter Verwendung des Wie-Operators um. Als Platzhalterzeichen dienen die folgenden Zeichen:
| Platzhalterzeichen |
Platzhalter für |
| Sternchen: * |
kein, ein oder mehrere beliebige Zeichen oder Ziffern |
| Fragezeichen: ? |
ein beliebiges Zeichen |
| Doppelkreuz: # |
eine beliebige Ziffer zwischen 0 und 9 |
| |
Mit der Definition von Gültigkeitsregeln können Sie die Eingabe von Daten gut kontrollieren. Wird eine fehlerhafte Eingabe gemacht, erscheint eine Fehlermeldung. Dabei handelt es sich allerdings um eine Standardmeldung, die nur den aktuellen Feldnamen und die Gültigkeitsregel mit einschließt. Diese Meldung ist für eine Endanwendung nicht akzeptabel.
Sie definieren eigene Fehlermeldungen, die bei Verletzung einer Gültigkeitsregel angezeigt werden.
Für jedes Feld, für das Sie eine Gültigkeitsregel definieren, können Sie auch eine eigene Gültigkeitsmeldung eintragen. Dazu brauchen Sie nur bei der Eigenschaft Gültigkeitsmeldung des Feldes den Text einzugeben, der als Meldung erscheinen soll.
Für das Beispiel aus dem vorangegangenen Tipp könnte die Meldung wie folgt lauten:
Geben Sie bitte eine Zahl zwischen 10 und 30 in diesem Feld ein!
Andere Werte sind nicht zulässig. Genau dieser Text erscheint beim nächsten Mal, wenn eine Eingabe gemacht wird, die nicht den Regeln entspricht, in einem Meldungsfenster. | |
Ich habe folgende Tabellen: Lieferanten, Postleitzahlen-Gebiete, Spediteur.
Ich möchte, dass mir bei der Eingabe einer Lieferantenadresse (mit Postleitzahl), der für dieses Gebiet zuständige Spediteur im Formular angezeigt wird.
Kann dies über eine Abfrage in Access realisiert werden? | Ja, das können Sie mit einer Unterabfrage als zusätzliche Spalte Ihrer Abfrage erreichen. Wenn also Ihre Basisabfrage etwa so aussieht
SELECT LieferantNr, Lieferant, PLZ, FROM tblLieferanten
dann können Sie ein weiteres SELECT als Spalte hinzufügen. Die endgültige Abfrage sieht dann so aus:
SELECT LieferantNr, Lieferant, PLZ, (SELECT TOP 1 Spedition FROM tblSpeditionen WHERE Val(tblLieferanten.PLZ) BETWEEN Val(PLZvon) AND Val(PLZbis)) AS Spedition FROM tblLieferanten;
Für jeden Datensatz aus tblLieferanten wird anhand der Postleitzahl ein passender Datensatz aus tblSpeditionen herausgesucht. Wenn Sie sicher sind, dass die Gebiete sich nicht überschneiden, können Sie das TOP 1 wieder entfernen. Das TOP 1 ist nur sicherheitshalber in der Ablage enthalten, denn es darf maximal ein Datensatz aus der Unterabfrage zurückkommen. |
Dieses Handbuch erklärt Ihnen den Umgang mit Access von Anfang an. In einem Schnelleinstieg lernen Sie die Software zunächst im Überblick kennen. Anschließend vertiefen Sie sich in Datenbank-Grundlagen, Tabellen, Abfragen, Formulare und Berichte. Fortgeschrittene können sich danach mit den verschiedenen Programmiertechniken auseinandersetzen. Auch eigenständige Anwendungen, Access-Projekte und Access im Internet werden ausführlich dargestellt. Auf der Begleit-CD finden Sie neben den Beispiel-Datenbanken das komplette Handbuch als eBook.
Jetzt neu:
-
komplett zweifarbig, mit Praxisindex und eBook auf CD
-
980 Seiten voller Information, durchgehend zweifarbig
-
zusätzlicher Praxisindex aller Schritt-für-Schritt-Anleitungen
-
Profitipps, die Ihnen viel Zeit ersparen
-
das ganze Buch als eBook auf CD: für den bequemen Zugriff unterwegs
Das sind die Themen:
-
Schnelleinstieg: Datenbank-Assistenten, Tabellen-Assistent, Tabellen, Formulare, Berichte, Abfragen, Access-Hilfe
-
Tabellen: Datenbank-Grundlagen, Tabellenentwurf, Beziehungen zwischen Tabellen, Verknüpfen, Importieren, Tabellenanalyse
-
Abfragen: Einfache und komplexe Abfragen, Abfragen mit berechneten Feldern, Abfragen mit mehreren Tabellen, Abfragen mit Parametern, Aggregat-Funktionen, Aktionsabfragen, SQL
-
Formulare: Formularentwurf, Steuerelemente, Unterformulare, ungebundene Formulare, Diagramm-Formulare, Pivot-Ansichten
-
Berichte: Einfache und fortgeschrittene Berichte gestalten, Formulare für Berichte
-
Dienstprogramme und Datenweitergabe: Datenbank-Dienstprogramme, Office-Verknüpfungen
-
Programmierung: Makros, Visual Basic (VBA), Einführung in die Objekttechnik, Funktionen und Methoden, Datenzugriff mit ADO und DAO Komplette
-
Anwendungen: Eigenständige Anwendungen erstellen, Zugriffsrechte und Datensicherheit, Mehrbenutzer-Umgebungen
-
Access-Projekte: Access mit Microsoft SQL Server, Upsizing-Assistent, Unterschiede zwischen Access- und SQL Server-Datenbanken, MSDE
-
Access im Internet: Hyperlinks, HTML- und XML-Ausgabe, Datenzugriffs-Seiten, Microsoft Windows SharePoint Services Auf der Buch-CD finden Sie: - Das komplette Handbuch als eBook zur mobilen Nutzung - Alle im Buch beschriebenen Beispiel-Datenbanken - Microsoft SQL Server 2000 (120-Tage-Testversion) - Microsoft Jet 4.0 Service Pack 8 Über die Autoren: Natascha Nicol und Ralf Albrecht entwickeln seit langen Jahren Anwendungen mit Microsoft Access und .NET-Framework. Sie sind mit über 60 veröffentlichten Büchern zu EDV-Themen erfahrene und kompetente Autoren. Beide gehören zu den erfolgreichsten Buchautoren zum Thema Access. | |
In diesem Titel erhalten Sie Einblick in Microsofts neue Access Version 2003. Egal, ob Sie noch nie mit Access gearbeitet haben oder ob Sie bereits ältere Versionen der Software kennen, hier erlernen Sie auf einfache Art und Weise den Umgang mit der neuen Datenbanksoftware.
"Access 2003 zum Nachschlagen" verrät Ihnen die wichtigsten Kniffe im Umgang mit Access. Im ersten Teil des Buches erhalten Sie Grundlagenwissen, angefangen mit einer Erläuterung der neuen Funktionen und der Installation von Access 2003. Erfahren Sie dann, wie eine relationale Datenbank aufgebaut ist und wie man mit Access eine Datenbank optimal anlegen kann. Sie werden nach Lektüre des Buches schon bald dazu in der Lage sein, Ihre erste Datenbank zu erstellen, Tabellen anzulegen und zu bearbeiten, Abfragen zu entwerfen, Formulare zu verwenden und Berichte zu erstellen.
Sie lernen auch die Möglichkeit des Datenaustauschs mit anderen Office-Programmen kennen, so dass Sie Access 2003 wirklich effektiv nutzen können. Die Referenz als zweiter Teil des Buches bietet alphabetisch geordnete Einträge, die es Ihnen ermöglichen, das Gesuchte schnell zu finden.
Von Stefan Truckenmüller; Sybex (2003); Euro 10,95; ISBN: 3815504244
| |
Mit der Ermittlung der internen Menüstruktur von Windows-Anwendungen ist ein wenig Aufwand verbunden. Menüs werden vom System in verketteten Listen verwaltet, die rekursiv durchgeforstet werden müssen. Jeder Eintrag in der Liste enthält ein Handle auf ein Menü bzw. Untermenü, das wiederrum weitere Untermenüs haben kann. Die erste Aufgabe ist es also dann, das Handle des obersten Hauptmenüs dieser Hierarchie abzufragen. Diese erledigen Sie mit der API-Funktion GetMenu:
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Dim hmenu As Long hmenu = GetMenu(Application.hWndAccessApp)
Intern werden die einzelnen Menüpunkte von Bezeichnern verwaltet, mit denen der Menütext verknüpft ist. Möchten Sie den Text eines Menüeintrags ermitteln, so müssen Sie zuerst dessen Bezeichner ausfindig machen. Zu diesen Zweck übergeben Sie der API-Funktion GetMenuItemID ein Menü-Handle sowie einen Index, der die Menüposition des gefragten Eintrags darstellt:
menuid = GetMenuItemID(hmenu, i) ' Menü-Bezeichner ermitteln
Mit dem gültigen Menü-Bezeichner können Sie nun durch Einsatz der Funktion GetMenuItemString den Menütext abfragen:
menuname = Left(menuname, GetMenuString(hmenu, i, _ menuname, Len(menuname), MF_BYPOSITION))
Ob ein Menü ein Untermenü unter sich hat, stellen Sie mit der Funktion GetSubMenu fest. Wenn kein Untermenü vorhanden ist, gibt diese Funktion den Wert 0 zurück:
hsubmenu = GetSubMenu(hmenu, i) ' feststellen, ob Untermenü existiert
Mit den oben beschriebenen Funktionen können Sie eine umfassende Funktion schreiben, die alle Menüs durchschlieft und deren Texte im Testfenster anzeigt:
Public Const MF_BYPOSITION = &H400& Declare Function GetMenu Lib "user32" _ (ByVal hwnd As Long) As Long Declare Function GetMenuItemCount Lib "user32" _ (ByVal hmenu As Long) As Long Declare Function GetMenuItemID Lib "user32" _ (ByVal hmenu As Long, ByVal nPos As Long) As Long Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _ (ByVal hmenu As Long, _ ByVal wIDItem As Long, ByVal lpString As String, _ ByVal nMaxCount As Long, _ ByVal wFlag As Long) As Long Declare Function GetSubMenu Lib "user32" (ByVal hmenu As Long, _ ByVal nPos As Long) As Long Public Function MenüAuflisten(ByVal hmenu As Long, _ ByVal indent As Integer) Dim menuzahl As Long, i As Integer Dim menuid As Long, menuname As String Dim hsubmenu As Long ' Anzahl der Menüpunkte ermitteln menuzahl = GetMenuItemCount(hmenu) For i = 0 To menuzahl - 1 menuid = GetMenuItemID(hmenu, i) ' Menü-Bezeichner ermitteln menuname = String$(255, 0) ' Menütext ermitteln menuname = Left(menuname, GetMenuString(hmenu, i, _ menuname, Len(menuname), MF_BYPOSITION)) If menuid = 0 Then Debug.Print Space$(indent * 3) & "<--------Trennlinie-------->" Else Debug.Print Space$(indent * 3) & menuname, menuid End If 'feststellen, ob Untermenü existiert hsubmenu = GetSubMenu(hmenu, i) ' wenn ja, Funktion rekursiv aufrufen If hsubmenu Then MenüAuflisten hsubmenu, indent + 1 Next i End Function Diese Funktion ruft sich selbst rekursiv auf, um die Texte der eventuell vorhandenen Untermenüs mitanzuzeigen, wobei die Untermenüs je nach Tiefe mit Leerzeichen eingerückt werden. Hinter dem Menütext wird der jeweilige Menübefehl-Bezeichner ausgegeben. Wenn dieser Bezeichner den Wert 0 hat, ist eine Trennlinie vorhanden. Befehle mit dem Wert -1 stellen Menütexte auf dem Hauptmenü dar. Eine kleine Testprozedur, die das Handle des Hauptmenüs an die oben abgedruckte Funktion übergibt, sieht folgendermaßen aus: Public Function Test() Dim hmenu As Long hmenu = GetMenu(Application.hWndAccessApp) If hmenu Then MenüAuflisten hmenu, 0 End Function | |
Der Funktion wird ein Parameter übergeben, der die gewünschte Information darstellt. Das Ergebnis ist ein Long-Wert in der Einheit Pixel:
Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Zur Ermittlung der Bildschirmauflösung rufen Sie GetSystemMetrics zweimal auf, und zwar mit den folgenden Konstanten als Parametern:
Public Const SM_CXSCREEN = 0 ' Breite ermitteln Public Const SM_CYSCREEN = 1 ' Höhe ermitteln
Um festzustellen, ob die Bildschirmauflösung nur 640 x 480 Pixel beträgt, verwenden Sie GetSystemMetrics auf folgende Weise:
Public Function AuflösungZuWenig() As Boolean
Dim SchirmBreite As Long, SchirmHöhe As Long Dim lHilfeFenster As Long
' Breite des gesamten Bildschirms SchirmBreite = GetSystemMetrics(SM_CXSCREEN) SchirmHöhe =
' Höhe des gesamten Bildschirms GetSystemMetrics(SM_CYSCREEN)
AuflösungZuWenig = (SchirmBreite <= 640 And SchirmHöhe <= 480)
End Function | |
Sie liefert den Dateinamen als String zurück. Im Beispiel von C:\Windows\System\mscdex.exe
Sie benötigen hierzu auch die Funktion ReverseInStr aus dem Tipp
Stringmanipulation - Parsen - Textmanipulation (Link siehe unten)
Public Function GetFileName(strPath As String) As String
Dim intPos As Integer
intPos = ReverseInStr(0, strPath, "\") GetFileName = Right(strPath, Len(strPath) - intPos)
End Function | |
Wie kann ich einen eigenen Passwort-Dialog erstellen?
Ich habe bereits eine Teillösung mit KeyPress gefunden. Ich habe die eingegebenen Zeichen durch "*" ersetzt und die originalen Zeichen in ein anderes Textfeld hineingeschrieben. Dies funktioniert allerdings nicht bei der Leertaste und der Rückschritt-Taste.
Ein kleiner Tipp würde mich freuen. | Access-97-Datenbank mit Demo-Passwort-Dialog
Die Eingabeformat-Eigenschaft kann eingegebene Zeichen automatisch durch Sternchen darstellen, was für eine Passwort-Eingabe ideal ist.
Starten Sie den Eingabeformat-Assistenten im Eigenschaftsfenster im Feld Eingabeformat eines beliebigen Textfeldes. Wählen Sie Kennwort aus der Liste der verfügbaren Formate aus und klicken Sie Fertigstellen.
Im Textfeld werden nun alle Zeichen durch Sternchen ersetzt. |
Eine UNION-Abfrage kombiniert Felder aus zwei oder mehr Tabellen bzw. Abfragen in einem Feld in den Abfrageergebnissen.
Für die Kombination der Resultsets von zwei Abfragen mit UNION gelten die folgenden beiden Grundregeln:
- Die Anzahl und die Reihenfolge der Spalten müssen für alle Abfragen identisch sein. - Die Datentypen der beiden Abfragen müssen kompatibel sein.
Das folgende Beispiel benutzt wieder Tabellen aus der Beispieldatenbank Nordwind. Das Abfrageergebnis ist eine Telefonliste von Kunden und Lieferanten.
SELECT [Firma] AS [Kunde / Lieferant], [Telefon], [Telefax] FROM Kunden
UNION SELECT [Firma] AS [Kunde / Lieferant], Telefon, Telefax FROM Lieferanten;
Sie erkennen, dass die Union-Abfrage aus aus zwei Select-Anweisungungen besteht, die durch das Schlüsselwort UNION miteinander verbunden sind. | |
Setzen Sie dazu die Option Markierungsverhalten auf Teilweise eingerahmt. Diese Option finden Sie im Register Formulare/Berichte des Dialogfensters Extras/Optionen. Diese Einstellung bewirkt, daß Access ein Steuerelement auch dann markiert, wenn der aufgezogene Rahmen nur ein Teil des Steuerelements einschließt. | |
Ich habe in einer meiner Tabellen eine Spalte, in der Telefonnummern gespeichert sind. Nun möchte ich gerne die letzten 4 Ziffern als Durchwahl kennzeichnen. Die letzten 4 Ziffern sollen also in der bisherigen (Telefonnummern) Spalte gelöscht werden und in einer neuen (Durchwahl) Spalte gespeichert werden. Leider habe ich es bisher nicht geschafft, Teile eines Feldinhaltes zu löschen.
Haben Sie für dieses Problem eine Lösung? | Das Abschneiden der letzten vier Ziffern können Sie beispielsweise mit Hilfe einer Aktualisierungsabfrage, der Links-Funktion sowie der Länge-Funktion erledigen.
Ein Beispiel: Telefonnummer: 0211/111110000 Durchwahl: 0000 Ausdruck: Links([Telefonnummer]; Länge([Telefonnummer]) -4 ) Ergebnis: 0211/11111
Durch den Ausdruck wird zunächst die Länge der kompletten Telefonnummer ermittelt, diese um 4 reduziert und die übrig gebliebene Anzahl von links abgeschnitten. Mit einer Aktualsierungsabfrage können Sie nun das Feld "Telefonnummer" durch das Ergebnis des Ausdrucks aktualisieren. Ich hoffe, diese Lösung hilft Ihnen weiter. |
| Auf dieser Site finden Sie Shareware, Demoware, Trialware, Tipps, und Utilities. Ein Newsletter informiert Sie zweimal im Monat zu den unterschiedlichster Themen nach Ihrer Auswahl. | |
| Hallo liebes Access Team,
ich möchte eine Tabelle automatisch aktualisieren. Nun mein Vorgehen. Es wird eine Tabelle aus SAP R/3 gezogen. Diese wird dann in Acess importiert. Da aber die SAP R/3 Tabelle von einer anderen Abteilung gepflegt wird, ändert sie sich ständig. Nur kann ich nicht immer ein update dieser SAP R/3 Tabelle ziehen und sie in Access einpflegen. Für mich ist es wichtig, dass die Änderungen in der SAP R/3 Tabelle automatisch (über Nacht) in die Access Tabelle übertragen wird. Idealerweise aber nur die Neuerungen, nicht die ganze Tabelle. Wenn Ihr da einen Weg fü mich habt, wäre es super.
Vielen Dank | Sehr geehrter Herr Daubner,
zunächst wäre festzustellen, was für Sie ein neuer Datensatz ist. Gibt es in den SAP-Daten ein "ID"-Feld, also einen eindeutigen Schlüssel?. Dieses Feld könnten Sie als Primärschlüssel in Ihrer Access-Tabelle definieren, so daß die Import-Routine die schon vorhandenen Datensätze nicht nochmals anlegt. Statt dessen würde Access einen Fehler protokollieren (in der "Fehler"-Tabelle) und mit dem nächsten Datensatz weiter machen.
Mit freundlichen Grüßen,
Tom Jordan
_____________________________________
TriniDat Software-Entwicklung GmbH
Individual-Software zum günstigen Festpreis.
jordan@trinidat.de
www.trinidat.de
Telefon: 02 11/1 71 93 56
Telefax: 02 11/1 71 93 58 |
|
Datenbanken |
|
|
|
|
|
|
|
Maximale Größe einer mdb.Datei |
|
|
|
Access 97 - 1 Gigabyte zuzüglich verknüpfter Tabellen |
|
|
|
Access 2000/ XP - 2 Gigabyte zuzüglich verknüpfter Tabellen |
|
|
|
|
|
|
|
Maximale Anzahl der Objekte in einer Datenbank |
|
|
|
Access 97/ 2000/ XP - 32.768 |
|
|
|
|
|
|
|
Maximale Anzahl Module (einschließlich Formular und Berichte, wenn die HasModule-Eig. auf True gesetzt ist). |
|
|
|
Access 97/ 2000 - 1.024 |
|
|
|
Access XP - 1000 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in Kennwörtern |
|
|
|
Access 97/2000/XP - 14 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in Benutzer und Gruppennamen |
|
|
|
Access 97/ 2000/ XP - 20 |
|
|
|
|
|
|
|
Maximale Anzahl gleichzeitiger Benutzer |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
Projekte |
|
|
|
Projekte kennt Access erst ab der Version 2002/ XP |
|
|
|
|
|
|
|
Maximale Anzahl von Projekten in einem Access Projekt |
|
|
|
32.768 |
|
|
|
|
|
|
|
Maximale Anzahl Module (einschließlich Formular und Berichte, wenn die HasModule-Eig. auf True gesetzt ist). |
|
|
|
1000 |
|
|
|
|
|
|
|
|
|
| Tabellen |
|
|
|
|
Maximale Anzahl Zeichen im Tabellennamen |
|
|
|
Access 97/ 2000/ XP - 64 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen im Feldnamen |
|
|
|
Access 97/ 2000/ XP - 64 |
|
|
|
|
|
|
|
Maximale Anzahl Datenfelder |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl geöffneter Tabellen |
|
|
|
Access 97/ 2000 - 1024 |
|
|
|
Access XP - 2.048. Die effektive Anzahl kann wegen externer Tabellen, die Access öffnet geringfügig kleiner sein. |
|
|
|
|
|
|
|
Maximale Tabellengröße |
|
|
|
Access 97/ 2000/ XP - 1 Gigabyte |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in Textfeldern - 255 |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in Memofeldern bei Eingabe über die Benutzeroberfläche |
|
|
|
Access 97/ 2000/ XP - 65535 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in Memofeldern bei Eingabe über ein VBA Programm |
|
|
|
Access 97/ 2000/ XP - 1 Gigabyte |
|
|
|
|
|
|
|
Maximale Größe eines OLE-Feldes |
|
|
|
Access 97/ 2000/ XP - 1 Gigabyte |
|
|
|
|
|
|
|
Maximale Anzahl Indizes |
|
|
|
Access 97/ 2000/ XP - 32 |
|
|
|
|
|
|
|
Maximale Anzahl Felder in zusammengesetzten Indizes |
|
|
|
Access 97/ 2000/ XP - 10 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einer Gültigkeitsmeldung |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einer Gültigkeitsregel |
|
|
|
Access 97/ 2000/ XP - 2.048 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einer Tabellenbeschreibung |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einer Feldbeschreibung |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einem Datensatz |
|
|
|
Access 97/ 2000/ XP - 2000 |
|
|
|
|
|
|
|
Maximale Anzahl Zeichen in einer Feldeigenschaft |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
Abfragen |
|
|
|
|
|
|
|
Maximale Anzahl der Tabellen in einer Abfrage |
|
|
|
Access 97/ 2000/ XP - 32 |
|
|
|
|
|
|
|
Maximale Anzahl der Felder in einer Datensatzgruppe |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Größe einer Datensatzgruppe |
|
|
|
Access 97/ 2000/ XP - 1 Gigabyte |
|
|
|
|
|
|
|
Maximale Anzahl der Ebenen bei verschiedenen Abfragen |
|
|
|
Access 97/ 2000/ XP - 50 |
|
|
|
|
|
|
|
Maximale Anzahl der Zeichen in einer Zelle des Abfrageentwurfsbereichs |
|
|
|
Access 97/ 2000/ XP - 1.024 |
|
|
|
|
|
|
|
Maximale Anzahl der Zeichen für einen Parameter |
|
|
|
Access 97/ 2000/ XP - 255 |
|
|
|
|
|
|
|
Maximale Anzahl der Zeichen in einer SQL-Anweisung |
|
|
|
Access 97/ 2000/ ca. 64.000 |
|
|
|
|
|
|
|
|
|
|
Formulare + Berichte |
|
|
|
|
Maximale Anzahl der Zeichen in einem Bezeichnungsfeld |
|
|
|
Access 97/ 2000/ XP - 2.048 |
|
|
|
|
|
|
|
Maximale Anzahl der Zeichen in einem Textfeld |
|
|
|
Access 97/ 2000/ XP - 65535 |
|
|
|
|
|
|
|
Maximale Breite des Formulars oder Berichts |
|
|
|
Access 97/ 2000/ XP - 55,87 |
|
|
|
|
|
|
|
Maximale Höhe eines Berichts |
|
|
|
Access 97/ 2000/ XP - 55,87 |
|
|
|
|
|
|
|
Maximale Höhe aller Bereiche zuzüglich der Bereichsköpfe (in der Entwurfsansicht) |
|
|
|
Access 97/ 2000/ XP - 508 cm |
|
|
|
|
|
|
|
Maximale Anzahl der Ebenen bei verschiedenen Formularen oder Berichten |
|
|
|
Access 97/ 2000/ XP - 3 |
| | |
| |