Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2018.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Neue Datensätze oben anfügen

Es scheint in Stein gemeißelt: Neue Datensätze werden unter Access immer unten, am Ende der Datensatzliste, angehängt. Das gilt sowohl für die Datenblattansicht als auch für die Endlosansicht. Für uns kein Anlass, es nicht doch einmal auszuprobieren. Mit ein paar Tricks schaffen wir es schließlich, eine passable Datenblattansicht zu programmieren, die scheinbar das Anfügen eines neuen Datensatzes in der obersten Zeile der Datenblattansicht erlaubt.

Wenn Sie in der Datenblattansicht unter Access einen neuen Datensatz einfügen möchten, haben Sie nur eine Möglichkeit: Sie klicken in der Navigationsleiste auf die Schaltfläche für einen neuen Datensatz und fügen den neuen Datensatz dann unten an (siehe Bild 1). Das gilt aber auch nur, wenn diese Leiste sichtbar ist – anderenfalls gelangen Sie nur durch Scrollen oder entsprechende Tastenkombinationen zum Ende der Liste. Oder Sie nutzen den Ribbon-Eintrag Start|Datensätze|Neu, um zu einem neuen, leeren Datensatz zu gelangen.

Datensätze werden unter Access unten angefügt.

Bild 1: Datensätze werden unter Access unten angefügt.

Nun, wir wollen schauen, ob wir nicht doch einen Weg finden, den neuen, leeren Datensatz oben im Datenblatt anzuzeigen. Das wäre zum Beispiel praktisch, wenn Sie ohnehin immer die neuesten Einträge oben anzeigen und dort auch neue Datensätze anlegen wollen.

Neuer Datensatz dank zweitem Unterformular

Wie aber können wir dies realisieren? Ganz klar: Mit einem einzigen Unterformular in der Datenblatt-Ansicht bekommen wir dies nicht hin. Wir zauben im oberen Bereich unseres Hauptformulars ein zweites Unterformular mit der gleichen Datenherkunft hin, die auch das eigentliche Unterformular aufweist.

Der Unterschied: Das obere Unterformular soll nur der Eingabe eines neuen Datensatzes dienen und sonst keine Datensätze anzeigen. Das untere Datenblatt soll im Gegenzug keine Möglichkeit mehr bieten, einen neuen Datensatz anzulegen.

Soweit, so gut: Damit das obere Formular nur einen neuen, leeren Datensatz anzeigt, brauchen wir diesem lediglich einen Filter hinzuzufügen, der die Anzeige aller anderen Datensätze verhindert – also beispielsweise 1:2.

Damit der neue, leere Datensatz am Ende des zweiten Unterformulars, das ansonsten alle Datensätze anzeigen soll, nicht mehr erscheint, stellen wir einfach die Eigenschaft Anfügen zulassen auf den Wert Nein ein.

Und dann kommt da natürlich noch ein geschicktes Arrangement der beiden Unterformulare, damit diese wie ein einziges Unterformular aussehen. Doch eins nach dem anderen!

Hauptformular erstellen

Das Hauptformular unserer Anwendung, die wieder auf die Tabellen der Südsturm-Datenbank zugreift, soll frmArtikel heißen. Legen Sie dieses an und lassen Sie es in der Entwurfsansicht geöffnet. Stellen Sie direkt die Eigenschaften Datensatzmarkierer und Navigationsschaltflächen auf Nein und Automatisch zentrieren auf Ja ein.

Erstes Unterformular

Das erste Unterformular soll sfmArtikelNeu heißen. Weisen Sie seiner Eigenschaft Datenherkunft die Tabelle tblArtikel zu. Stellen Sie außerdem die Eigenschaft Standardansicht auf Datenblatt ein. Dann speichern und schließen Sie das Formular und ziehen es aus dem Navigationsbereich von Access in den Detailbereich des noch in der Entwurfsansicht geöffneten Hauptformulars (siehe Bild 2).

Einfügen des ersten Unterformulars in das Hauptformular

Bild 2: Einfügen des ersten Unterformulars in das Hauptformular

Dieses Formular wollen wir gleich ein wenig breiter gestalten, und zwar so, dass die Felder in der Datenblattansicht nicht die ganze Breite einnehmen und somit keine horizontale Bildlaufleiste angezeigt werden muss. Außerdem können wir die Höhe des Formulars auch gleich soweit reduzieren, dass diese lediglich die Spaltenköpfe und die erste Zeile anzeigt. Das sieht dann etwa wie in Bild 3 aus.

Das Unterformular sollte breit genug sein, damit keine horizontale Bildlaufleiste eingeblendet werden muss.

Bild 3: Das Unterformular sollte breit genug sein, damit keine horizontale Bildlaufleiste eingeblendet werden muss.

Die Navigationsleiste soll dieses Formular gar nicht anzeigen, daher stellen wir die Eigenschaft Navigationsschaltflächen auf den Wert Nein ein – ebenso wie die Eigenschaft Bildlaufleisten. Dann können wir in die Formularansicht des Hauptformulars wechseln und die Höhe des Unterformulars kontrollieren. Dieses sollte genau so hoch sein wie in Bild 4 abgebildet.

Die Höhe stellen wir so ein, dass soeben die Markierung der Linie unter dem neuen Datensatz sichtbar ist.

Bild 4: Die Höhe stellen wir so ein, dass soeben die Markierung der Linie unter dem neuen Datensatz sichtbar ist.

Damit das Unterformular erst gar keine Datensätze anzeigt, sondern nur den leeren, neuen Datensatz, hinterlegen wir für die Ereigniseigenschaft Beim Laden die folgende Ereignisprozedur:

Private Sub Form_Load()
     Me!sfmArtikelNeu.Form.Filter = "1=2"
     Me!sfmArtikelNeu.Form.FilterOn = True
End Sub

Dadurch werden nur die Datensätze angezeigt, für welche die Bedingung 1=2 gilt – also gar keiner.

Zweites Unterformular erstellen und einfügen

Danach begeben wir uns an das zweite Unterformular, das wir sfmArtikel nennen. Es soll ebenfalls die Tabelle tblArtikel als Datenherkunft verwenden und seine Daten in der Datenblattansicht anzeigen. Darüber hinaus stellen wir seine Eigenschaft Anfügen zulassen auf den Wert Nein ein. Wie weiter oben bereits beschrieben, soll die Zeile mit dem leeren, neuen Datensatz hier nicht nochmals auftauchen.

Anschließend fügen wir dieses Formular ebenfalls in das Hauptformular frmArtikel ein. Dieses bringen wir auf die gleiche Breite wie das Unterformular sfmArtikelNeu und eine beliebige Höhe. Im Entwurf sehen die beiden Unterformulare nun wie in Bild 5 aus.

Hauptformular mit den beiden Unterformularen

Bild 5: Hauptformular mit den beiden Unterformularen

Unterformulare überlagern

Nun kommt der interessante Teil. Wenn wir uns die Unterformulare in der Formularansicht des Hauptformulars ansehen, erhalten wir die Ansicht aus Bild 6. Wir haben also im oberen Bereich das Unterformular sfmArtikelNeu, das nur den leeren, neuen Datensatz anzeigt und keine Navigationsschaltflächen und im unteren Bereich das Unterformular sfmArtikel, das alle Datensätze und Navigationsschaltflächen enthält, aber keinen neuen, leeren Datensatz.

Hauptformular mit den beiden Unterformularen in der Formularansicht

Bild 6: Hauptformular mit den beiden Unterformularen in der Formularansicht

Was stört? Natürlich die Spaltenüberschriften des unteren Unterformulars. Wie ändern wir das? In dem wir einfach das Unterformular sfmArtikel unter das Unterformular sfmArtikelNeu schieben. Die Sache hat einen kleinen Haken, denn da wir das Unterformular sfmArtikelNeu zuerst angelegt haben, liegt es in der Z-Reihenfolge unter dem Formular sfmArtikel. Das können wir aber leicht ändern, indem wir das Formular sfmArtikelNeu einmal ausschneiden (Strg + X) und es direkt wieder einfügen (Strg + V).

Dadurch verschieben wir es in der Z-Reihenfolge über das Formular sfmArtikel. Nun schieben wir das Formular sfmArtikel soweit nach oben, dass sich das Lineal der Entwurfsansicht unter die Bildlaufleiste von sfmArtikelNeu verschiebt (siehe Bild 7). In diesem Bild ist das Unterformular sfmArtikelNeu markiert.

Das Formular sfmArtikelNeu überlappt nun das Formular frmArtikel

Bild 7: Das Formular sfmArtikelNeu überlappt nun das Formular frmArtikel

Erster Test

Wie sieht dies nun in der Formularansicht aus? So gut wie perfekt, wie Bild 8 zeigt. Ganz oben wird der leere, neue Datensatz angezeigt, darunter befinden sich die vorhandenen Datensätze. Sind wir damit fertig? Nein! Es warten noch eine Menge Aufgaben auf uns:

Das Formular, das den neuen Datensatz scheinbar ganz oben anzeigt

Bild 8: Das Formular, das den neuen Datensatz scheinbar ganz oben anzeigt

  • Wenn ein neuer Datensatz angelegt wird, muss das Unterformular sfmArtikel aktualisiert werden.
  • Wenn der Benutzer die über die Spaltenköpfe des Formulars sfmArtikelNeu verfügbaren Sortierungen und Filter nutzt, müssen diese auf die Daten des Unterformulars sfmArtikel übertragen werden.
  • Und es fallen bei der Bearbeitung dieser beiden Aufgaben bestimmt noch weitere Aufgaben auf ...

Anlegen eines neuen Datensatzes

Wenn wir nun einen neuen Datensatz im Unterformular sfmArtikelNeu anlegen, soll dieser nach dem Speichern im Unterformular sfmArtikel angezeigt werden. Dazu müssen wir dieses nach dem Anfügen eines neuen Datensatzes aktualisieren. Wir müssen also ein Ereignis im Unterformular sfmArtikelNeu abfangen und daraufhin eine Methode des Unterformulars sfmArtikel ausführen. Wie erledigen wir das am geschicktesten? Und welches Ereignis wollen wir überhaupt nutzen?

Doch schauen wir uns zunächst einmal an, was geschieht, wenn wir überhaupt einen neuen Datensatz anlegen. Bei der Eingabe des ersten Zeichens oder auch schon vorher kann es geschehen, dass plötzlich die horizontale Bildlaufleiste des Unterformulars auftaucht und die Zeile zur Eingabe verdeckt. In diesem Fall haben Sie offensichtlich die beiden Unterformulare nicht breit genug gestaltet, sodass die Bildlaufleiste notwendig wird. Also verbreitern Sie nun zunächst die beiden Unterformulare so, dass alle Felder komfortabel Platz finden.

Danach beginnen wir, einen neuen Datensatz anzulegen. Das gelingt auch zunächst wie gewohnt – der Datensatzmarkierer erhält das Bearbeiten-Symbol und ein neuer Wert für das Feld ArtikelID wird angelegt (siehe Bild 9). Wenn wir die übrigen Felder füllen und dann den Datensatz durch einen Klick auf den Datensatzmarkierer oder durch Verlassen der Zeile speichern, geschieht genau dies – der Datensatz wird gespeichert. Mehr passiert allerdings nicht.

Hinzufügen eines neuen Datensatzes

Bild 9: Hinzufügen eines neuen Datensatzes

Der neue Datensatz bleibt in der Zeile stehen, die normalerweise zum Anlegen weiterer neuer Datensätze genutzt werden soll. Und der neue Datensatz erscheint auch nicht automatisch im unteren Unterformular sfmArtikel.

Davon abgesehen können wir im Unterformular sfmArtikelNeu nun nach unten zum nächsten neuen Datensatz scrollen – immerhin.

Wie bekommen wir es nun hin, dass erstens der neue Datensatz aus dem Unterformular sfmArtikelNeu verschwindet und dieser zweitens im Unterformular sfmArtikel erscheint? Dazu verwenden wir eine Ereignisprozedur, die beim Speichern des neuen Datensatzes ausgelöst wird, nämlich Nach Aktualisierung.

Diese könnten wir nun direkt im Unterformular sfmArtikelNeu auslösen und dann das Unterformular selbst per Requery und das Unterformular sfmArtikel über den Bezug Me!Parent!sfmArtikel.Form aktualisieren. Das gefällt uns stilistisch aber nicht, sodass wir die Ereignisprozedur im Klassenmodul des Hauptformulars implementieren.

Dort legen wir zunächst zwei Objektvariablen für die beiden Unterformulare sfmArtikelNeu und sfmArtikel an:

Dim WithEvents sfmNeu As Form
Dim WithEvents sfm As Form

Diese statten wir mit dem Schlüsselwort WithEvents aus, damit wir Ereignisprozeduren für diese beiden Formulare hier in diesem Klassenmodul implementieren können.

Die Ereignisprozedur, die durch das Auslösen des Ereignisses Beim Laden ausgelöst wird, nutzen wir, um diese Variablen mit Verweisen auf die beiden Unterformulare zu füllen:

Private Sub Form_Load()
     Set sfm = Me!sfmArtikel.Form
     Set sfmNeu = Me!sfmArtikelNeu.Form
     With sfmNeu
         .AfterUpdate = "[Event Procedure]"
         .Filter = "1=2"
         .FilterOn = True
     End With
End Sub

Die ersten beiden Anweisungen füllen die Objektvariablen sfm und sfmNeu mit den Verweisen auf die Unterformulare.

Danach stellen wir Eigenschaften für das Unterformular sfmArtikelNeu ein. Die Filter-Eigenschaften hatten wir bereits vorher für Me!sfmArtikelNeu.Form eingestellt und setzen diese nun für sfmNeu. Außerdem legen wir mit der Eigenschaft AfterUpdate fest, dass wir in diesem Klassenmodul auf das Auslösen des Ereignisses Nach Aktualisierung des Unterformulars sfmArtikelNeu lauschen.

Anschließend können wir das Ereignis AfterUpdate für die Variable sfmNeu aus der Liste der Ereignisse im rechten Kombinationsfeld auswählen, nachdem wir im linken Kombinationsfeld den Wert sfmNeu ausgewählt haben (siehe Bild 10). Hier aktualisieren wir nun einfach beide Unterformulare:

Anlegen von Ereignisprozeduren für WithEvents-Variablen

Bild 10: Anlegen von Ereignisprozeduren für WithEvents-Variablen

Private Sub sfmNeu_AfterUpdate()
     sfmNeu.Requery
     sfm.Requery
End Sub

Wenn Sie das Formular nun schließen und erneut öffnen, damit die Variablen beim Laden des Formulars gefüllt werden können und einen neuen Datensatz eingegeben haben, werden die beiden Unterformulare aktualisiert. Das führt dazu, dass das Unterformular sfmArtikelNeu nun wieder den leeren, neuen Datensatz anzeigt und das Unterformular sfmArtikel den neuen Datensatz liefert.

Sortierung ändern

Wenn wir nun die Sortierung des zweiten Unterformulars ebenfalls in der Ereignisprozedur Beim Laden so einstellen, dass die neuesten Datensätze anz oben angezeigt werden, finden Sie den neu hinzugefügten Datensatz auch direkt unter der Zeile für den neuen, leeren Datensatz vor.

Wenn wir nun einen neuen Datensatz anfügen, sieht das während der Eingabe wie in Bild 11 aus.

Vor dem Speichern eines neuen Datensatzes ...

Bild 11: Vor dem Speichern eines neuen Datensatzes ...

Nachdem die Eingabe abgeschlossen ist, landet der neue Datensatz direkt unter dem neuen, leeren Datensatz im zweiten Unterformular (siehe Bild 12).

... und nach dem Speichern.

Bild 12: ... und nach dem Speichern.

Filter und Sortierung zur Laufzeit ändern

Nun gibt es allerdings über die Spaltenköpfe der Datenblattansicht die Möglichkeit, die Sortierung und die Filterung der enthaltenen Datensätze zu beeinflussen (siehe Bild 13). An dieser Stelle müssen wir berücksichtigen, dass die Spaltenköpfe, die oben angezeigt werden, ja nur zum oberen Unterformular zur Eingabe neuer Datensätze gehört und nicht zum Unterformular sfmArtikel.

Setzen eines benutzerdefinierten Filters

Bild 13: Setzen eines benutzerdefinierten Filters

Dessen Spaltenköpfe sind ja hinter dem Unterformular sfmArtikelNeu verborgen. Wenn wir dem Benutzer die Illusion erhalten wollen, dass er mit einem Formular arbeitet, in das er die Datensätze ganz oben eingeben kann, müssen wir ein wenig tricksen.

Das sieht so aus, dass wir wiederum Ereignisse abfangen müssen – und zwar diejenigen, die durch das Filtern und das Sortieren ausgelöst werden. Das Ereignis für das Setzen eines Filters ist schnell gefunden: Es heißt im Eigenschaftsfenster Bei angewendetem Filter, unter VBA OnApplyFilter.

Damit wir es im Klassenmodul des Hauptformulars implementieren können, stellen wir die Eigenschaft OnApplyFilter in der Ereignisprozedur Form_Load auf [Event Procedure] ein:

Private Sub Form_Load()
     Set sfmNeu = Me!sfmArtikelNeu.Form
     With sfmNeu
         ...
         .OnApplyFilter = "[Event Procedure]"
     End With
     ...
End Sub

Die Implementierung wird indes etwas komplizierter. Der Kern sieht schon einmal so aus:

Private Sub sfmNeu_ApplyFilter(Cancel As Integer,  ApplyType As Integer)
     ...
End Sub

Warum wird es kompliziert? Nun: Für das erste Unterformular sfmArtikelNeu legen wir ja bereits beim Laden einen Filter mit dem Kriterium 1=2 fest. Wenn wir also nun über das Menü, das wir mit der Pfeil nach unten-Taste öffnen können, eines der Filterkriterien auswählen, beispielsweise Beginnt mit... und etwa den Buchstaben C als Kriterium eingeben, sollte aber nur dieses Filterkriterium auf das zweite Unterformular angewendet werden, nicht aber das Kriterium 1=2. Dann würden nämlich keine Datensätze im Unterformular erscheinen.

Also schauen wir uns erst einmal an, wie der aus 1=2 und unserem hinzugefügten Kriterium bestehende Filterausdruck nun aussieht. Dazu geben wir im Direktbereich des VBA-Editors die folgende Anweisung ein:

  Screen.ActiveForm!sfmArtikelNeu.Form.Filter
(1=2) AND ([tblArtikel].[Artikelname] Like "C*")

Aus diesem Ausdruck müssen wir nun den hinteren Teil herausnehmen. Zuvor schauen wir uns allerdings noch an, was geschieht, wenn wir den Filter über den Eintrag Filter löschen aus Artikelname wieder entfernen. Danach sieht der Filter so aus:

  Screen.ActiveForm!sfmArtikelNeu.Form.Filter
((1=2))

Grundsätzlich ist das in Ordnung. Aber wo kommt das zweite Paar Klammern her? Fügen wir nochmals einen Filter hinzu, diesmal für alle Einträge, deren Artikelname mit dem Buchstaben D beginnt. Danach erhalten wir folgenden Filterausdruck:

  Screen.ActiveForm!sfmArtikelNeu.Form.Filter
(((1=2))) AND ([tblArtikel].[Artikelname] Like "D*")

Offensichtlich fügt Access also bei jeder Änderung des Filters ein neues Klammern zum Ausdruck 1=2 hinzu. Wir müssen die Methode, die den gewünschten Filterausdruck von unserem Kriterium 1=2 trennt, theoretisch etwas aufwendiger gestalten. Außer natürlich, man geht einfach davon aus, dass wir einfach nach dem ersten AND suchen und den Teil dahinter als Kriterium für das Unterformular verwenden. Probieren wir also aus, ob das funktioniert:

Private Sub sfmNeu_ApplyFilter(Cancel As Integer,  ApplyType As Integer)
     Dim strFilter As String
     Dim intPosAnd As String
     strFilter = sfmNeu.Filter
     intPosAnd = InStr(1, strFilter, " AND ")
     If intPosAnd > 0 Then
         strFilter = Mid(strFilter, intPosAnd + 4)
         sfm.Filter = strFilter
         sfm.FilterOn = True
     Else
         sfm.Filter = ""
     End If
     sfmNeu.Filter = "1=2"
     sfmNeu.FilterOn = True
End Sub

Dies funktioniert erstmal ganz gut. Die Prozedur erfasst nach dem Setzen des Filters den Filter des Formulars sfmArtikelNeu in der Variablen strFilter. Das sieht dann etwa so aus:

(1=2) AND ([tblArtikel].[Artikelname] Like "D*")

Nun ermittelt die Prozedur, ob sich ein AND im Filterausdruck befindet. Ist das der Fall, schneidet sie den Teil bis zum AND ab und behält nur den Rest. In unserem Fall:

([tblArtikel].[Artikelname] Like "D*")

Perfekt – dieser Ausdruck landet nun in der Eigenschaft Filter des Unterformulars und wir aktivieren diesen noch durch Setzen der Eigenschaft FilterOn auf den Wert True. Sollte kein AND enthalten sein, ist der Filter wohl geleert worden und wir stellen die Filter-Eigenschaft für das Unterformular sfmArtikel auf eine leere Zeichenfolge ein.

Dies blendet alle Datensätze wieder ein. Außerdem leeren wir das obere Formular sfmArtikelNeu wieder, indem wir dessen Filter wieder auf 1=2 einstellen und diesem mit FilterOn = True aktivieren.

Sind wir fertig mit dem Filter? Nein, wir wollen noch ausprobieren, was geschieht, wenn wir ein zweites Kriterium setzen. Also erst Artikelname beginnt mit C, dann Artikelname enthält D.

Leider erhalten wir dann den Fehler aus Bild 14. Was ist hier passiert? Schauen wir uns den Filterausdruck an, der für die Filter-Eigenschaft des Unterformulars sfmArtikelNeu hinterlegt wurde:

Fehler beim Setzen des Filters

Bild 14: Fehler beim Setzen des Filters

((1=2) AND ([tblArtikel].[Artikelname] Like "C*")) AND ([tblArtikel].[Artikelname] Like "*D*")

Hier fällt uns noch nichts auf. Schauen wir uns dann an, wie der aktuelle Inhalt der Variablen strFilter nach dem Abtrennen des Kriteriume 1=2 aussieht:

  strFilter
([tblArtikel].[Artikelname] Like "C*")) AND ([tblArtikel].[Artikelname] Like "*D*")

Dieser sieht auch zunächst unauffällig aus – es handelt sich halt um den hinteren Teil, den vorderen Teil haben wir ja abgeschnitten. Beim Klammern-Zählen fällt dann allerdings auf, dass wir offensichtlich vorn eine Klammer zu viel abgeschnitten haben.

Und da wird es deutlich: Access hat den gesamten Ausdruck vor dem Hinzufügen des neuen Kriteriums in ein neues Klammernpaar eingefasst. Deshalb haben wir vorn eine Klammer zu viel abgeschnitten.

Also machen wir es uns nun etwas einfacher und ersetzen einfach nur 1=2 durch 1=1:

Private Sub sfmNeu_ApplyFilter(Cancel As Integer,  ApplyType As Integer)
     Dim strFilter As String
     strFilter = sfmNeu.Filter
     strFilter = Replace(strFilter, "1=2", "1=1")
     sfm.Filter = strFilter
     sfm.FilterOn = True
     sfmNeu.Filter = "1=2"
     sfmNeu.FilterOn = True
End Sub

Damit wird der Filter nun zuverlässig gesetzt.

Sortierung anpassen

Nun kommt die scheinbar komplizierte Aufgabe, was die Umsetzung der per Kontextmenü ausgewählten Befehle angeht ­– die Sortierung. Diese wird angewendet, wenn wir einen der beiden Befehle Von A bis Z sortieren oder Von Z bis A sortieren auswählen (siehe Bild 15).

Aufrufen einer Sortierung

Bild 15: Aufrufen einer Sortierung

Dumm nur: Wir finden in den Ereignissen des Formulars keine einzige Eigenschaft, die namentlich etwas mit dem Sortieren zu tun hat.

Was nun? Wie es der Zufall will, hatte ich beim Auswählen einer der beiden Sortierungen noch einen Haltepunkt auf der Ereignisprozedur sfmNeu_ApplyFilter stehen, der prompt angesteuert wurde.

Diese Methode wird also auch ausgelöst, wenn man einen der Sortieren-Befehle des Kontextmenüs auswählt. Beim Blick auf die Definition dieser Ereignisprozedur fällt dann auch der Parameter ApplyType auf, den wir uns nun genauer ansehen. Dazu fügen wir eine entsprechende Debug.Print-Anweisung in die Prozedur ein:

Private Sub sfmNeu_ApplyFilter(Cancel As Integer,  ApplyType As Integer)
     Dim strFilter As String
     Debug.Print ApplyType
     ...
End Sub

Wenn wir nun einen Filter setzen, liefert der Parameter ApplyType den Wert 1. Das gilt auch für das Löschen des Filters. Diesen Wert erhalten wir allerdings auch, wenn wir eine Sortierung einstellen. Wann also tauchen andere Werte als 1 oder acApplyFilter auf? Das ist der Fall, wenn Sie eine .adp-Anwendung nutzen – dann erhalten wir an dieser Stelle den Wert 3 oder acApplyServerFilter.

Also müssen wir in der Ereignisprozedur sfmNeu_ApplyFilter immer auch prüfen, welche Sortierung gerade für das Unterformular sfmArtikelNeu eingestellt ist und dieses auf sfmArtikel übertragen. Dazu ergänzen wir die Prozedur wie folgt:

Private Sub sfmNeu_ApplyFilter(Cancel As Integer,  ApplyType As Integer)
     ...
     sfm.OrderBy = sfmNeu.OrderBy
     sfm.OrderByOn = sfmNeu.OrderByOn
End Sub

Auf diese Weise werden die Werte der beiden Eigenschaften OrderBy und OrderByOn immer von sfmNeu auf sfm übertragen.

Ändern der Spaltenbreiten

Wir müssen auch noch berücksichtigen, dass der Benutzer gegebenenfalls einmal über de Spaltenköpfe die Spaltenbreiten des Datenblatts anpasst.

Also schauen wir uns dies auch noch an – allerdings in einem weiteren Artikel namens Spalten zweier Datenblätter synchronisieren (www.access-im-unternehmen.de/****).

Zusammenfassung und Ausblick

Dieser Beitrag zeigt, wie Sie die unter Access übliche Konstellation, dass neue Datensätze im Datenblatt immer unten angelegt werden müssen, ändern können.

Dafür sind zwar ein paar Tricks nötig, aber das ist ja das Schöne an Access: Es bietet so viele Möglichkeiten, dass man die meisten Dinge an seine Bedürfnisse anpassen kann.

Sie müssen bei der hier vorgestellten Lösung zwar ein paar kleinere Einschränkungen hinnehmen wie etwa die Tatsache, dass Sie die Unterformularsteuerelemente so breit gestalten müssen, dass diese alle in den Spalten angezeigten Informationen aufnehmen können. Anderenfalls würde im oberen Formular die horizontale Bildlaufleiste eingeblendet werden, wodurch der neue, leere Datensatz nicht mehr sichtbar ist.

Im Beitrag Spalten zweier Datenblätter synchronisieren werden wir uns auch noch ansehen, wie wir dafür sorgen können, dass der Benutzer die Spaltenbreiten nicht so groß macht, dass die Gesamtbreite größer als die Breite des Unterformulars wird.

Download

Download

Die .zip-Datei enthält folgende Dateien:

NeuerDatensatz.accdb

Beispieldateien downloaden

© 2003-2018 André Minhorst Alle Rechte vorbehalten.