Set Me.Recordset = datObj.raum ' Anbinden des Formulars an die Mastertabelle
Text0.ControlSource = "Nr"
Text1.ControlSource = "Raum"
aktualisiere
End Sub
Die Methodenaufrufe:
Private Sub Befehl0_Click() ' >
datObj.nextRaum
Set Liste1.Recordset = datObj.person
End Sub
Private Sub Befehl1_Click() ' <
datObj.previousRaum
Set Liste1.Recordset = datObj.person
End Sub
Der Kehraus für das Objekt:
Private Sub Form_Unload(Cancel As Integer)
Set datObj = Nothing
End Sub
Test
Nach dem Programmstart sollte alles wunschgemäß funktionieren. Nach dem Blättern zum nächsten Raum
wird die Anzeige im Listenfeld sofort aktualisiert.
Abbildung 7.7 Das Programm
in Aktion
Ein intelligentes ADO-Frontend entwickeln
ADO-Recordset-Objekt, ADO-Connection-Objekt; Open-, AddNew-, Delete-, MoveNext-, MovePrevious-
Methode; Error-Objekt; Optionsfeld-Steuerelement; Navigationsschaltflächen; berechnete Felder;
Beim Eintippen von Belegen mit Netto und MWST ist es ziemlich lästig, per Hand erst das Brutto auszu-
rechnen. Außerdem wünscht man sich eine verkürzte und weniger fehleranfällige Eingabe der MWSt.
403
Praxisbeispiele
Kapitel 7: ADO-Programmierung
Dieses etwas anspruchsvollere Beispiel soll aus einer Artikeldatenbank ArtikelDat.accdb wahlweise Brutto
oder Netto anzeigen, wobei auch die unterschiedliche Mehrwertsteuer berücksichtigt wird. Die Eingabe-
maske verhält sich »intelligent«, da sie bei Bedarf den Bruttopreis aus dem abgespeicherten Nettopreis er-
mittelt bzw. es dem Benutzer erlaubt, wahlweise Brutto- oder Nettopreis einzugeben.
Datenbasis
Getreu dem ADO-Prinzip der »Trennung von Programm und Daten« werden die Daten in einer separaten
Datenbank ArtikelDat.accdb gespeichert. Dort legen wir eine Tabelle Artikel an, die die in der Abbildung ge-
zeigte einfache Struktur hat.
Abbildung 7.8 Struktur der Tabelle »Artikel«
Um späteren Problemen mit leeren Feldern vorzubeugen, sollte man bei den Feldeigenschaften Folgendes
berücksichtigen:
keine Standardwerte für Felder
»Nein« für »Eingabe erforderlich« (Required = False)
Eingabemaske
Wir verzichten auf den eingebauten Datensatznavigator und damit auch auf die üblichen »starren« Bound
Controls, da diese die Feldinhalte aus der Datenbank nur 1:1 übernehmen können (Netto könnte zwar
durch Modifikation der SQL-Abfrage als Brutto angezeigt, aber nicht bearbeitet werden). Die folgende
Laufzeitabbildung zeigt die Eingabemaske, bestehend aus einem mit Befehlsschaltflächen »selbstgebastelten«
Datensatznavigator, mehreren Bezeichnungs- und Textfeldern und den in zwei Rahmen-Steuerelementen
eingebetteten Optionsfeldern.
Abbildung 7.9 Laufzeitansicht der Eingabemaske
404
HINWEIS
Beide Optionsfelder haben grundsätzlich unterschiedliche Funktion:
Rahmen1 ändert lediglich den Anzeigemodus (Brutto/Netto)
Rahmen2 ändert ein Feld in der Datenbank (MWSt)
Programmplanung
Um die Übersicht zu behalten und um die erforderlichen Rechenoperationen auf ein Minimum zu be-
schränken, sollte man sich vor dem Schreiben eines solchen Programms Gedanken über die auftretenden
Zustände machen und über die Ereignisse, die einen Zustandswechsel hervorrufen. Hier das Ergebnis dieser
Überlegungen:
In unserem Programm können wir die Zustände »Brutto« und »Netto« unterscheiden.
Rahmen1.Value hat die Rolle einer Zustandsvariablen, die bei jeder Ereignisbehandlung die »Weichen«
stellt.
Ein Zustandswechsel tritt nach Klick auf eines der beiden Optionsfelder im Rahmen1 ein.
In Abhängigkeit vom Zustand werden die Routinen für das Anzeigen und das Speichern der Eingabe-
maske anders implementiert.
Beschränkung auf drei Hauptereignisse: Moduswechsel (Brutto <=> Netto), MWST ändern (7% <=>
19%) und Navigieren (Datensatzwechsel).
Quelltext
Über den Menübefehl Extras/Verweise... aktivieren Sie die Microsoft ActiveX Data Objects 2.8 Library. Die
Funktionalität der Bound Controls wird nachgebildet durch die Aufeinanderfolge von drei Aktionen:
Speichern
Weiterbewegen zum nächsten DS
Anzeigen
Auf Eigenschaften wie RecordSource und ControlSource muss verzichtet werden, stattdessen erfolgt ein
Anbinden der Steuerelemente »per Hand« (Value-Eigenschaft).
Private conn As ADODB.Connection
Private rs As ADODB.Recordset
Const mwstA = 0.07, mwstB = 0.19
Die Startaktivitäten:
Private Sub Form_Load()
Dim pfad As String
pfad = CurrentProject.Path & "\ArtikelDat.accdb"
Set conn = New ADODB.Connection
conn.CursorLocation = adUseClient
conn.Provider = "Microsoft.ACE.OLEDB.12.0"
conn.Open pfad
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM Artikel ORDER BY Bezeichnung", conn, adOpenStatic, adLockOptimistic
405
Praxisbeispiele
Kapitel 7: ADO-Programmierung
Rahmen1.Value = 1 ' Brutto-Anzeige einstellen
Rahmen2.Value = 1 ' MWSt = 19% einstellen
anzeigen ' erster DS
End Sub
Die E/A-Prozeduren:
Private Sub speichern()
If rs.RecordCount > 0 Then
rs!Bezeichnung = Text1.Value
If Rahmen1.Value = 1 Then ' Bruttowert in Netto umrechnen
rs!Netto = Text2.Value / (1 + rs!mwst)
Else ' Netto direkt abspeichern
rs!Netto = Text2.Value
End If
End If
End Sub
Private Sub anzeigen()
If rs.RecordCount > 0 Then
Text0.Value = rs!Nr
Text1.Value = rs!Bezeichnung
If Rahmen1.Value = 1 Then
Text2.Value = rs!Netto * (1 + rs!mwst)
Else
Text2.Value = rs!Netto
End If
If rs!mwst = mwstB Then Rahmen2.Value = 1 Else Rahmen2.Value = 2
End If
End Sub
Eingaben in die Optionsfelder:
Private Sub Rahmen1_Click() ' Brutto-/Netto-Anzeige geändert
If Rahmen1.Value = 1 Then
Bezeichnungsfeld4.Caption = "Brutto"
Else
Bezeichnungsfeld4.Caption = "Netto"
End If
anzeigen
End Sub
Private Sub Rahmen2_Click() ' MWStgeändert
speichern
If Rahmen2.Value = 1 Then
rs!mwst = mwstB
Else
rs!mwst = mwstA
End If
anzeigen
End Sub
Die Navigatorschaltflächen:
Private Sub Befehl0_Click() ' |<
speichern
rs.MoveFirst
406

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.