Module Module (ACCESS Basic) Access Basic ist eine Programmiersprache, die sowohl konventionell, aber auch für visuelle ereignisgesteuerte Programmierung verwendbar ist. Hinter einem Formular oder Bericht steht programmtechnisch ein Modul mit einer Menge von Ereignisfunktionen, die im Rahmen dieses Formulars oder Berichtes definiert werden. Sub Befehl6_Click () Text4 = .16 * preis End Sub Sub Befehl12_Click () Text8 = preis + Feld4 End Sub Prozedurale Programmiersprache 1) Datentypen, Variablen, Namen einfache Datentypen: Integer, Long, Single, Double, Currency, String (für variable Länge), String * Länge (für feste Länge), Variant, benutzerdefinierte Datentypen, Objektdatentypen (Dynaset, Database etc.). Für jede Variable wird eine eigene As-Klausel angegeben. Zusammengesetzte Datentypen: Arrays, Tabellen, Dynasets Variablen: explizit oder implizit Dim Variable [([Indizes])][As Datentyp][, Variable[([Indizes])] [As Datentyp]]... Variable Indizes As Datentyp Name, den die Variable bekommt Dimension(en) einer Datenfeldvariablen (Array). Es dürfen mehrere Dimensionen deklariert werden. Reserviertes Wort mit nachfolgender Angabe des Datentyps z.B. Dim i As Integer TFH Berlin/Steyer 7-1 Module Konstanten Const PI = 3.14 Arrays Dim TestArray1 (1 To 100) As Integer Dim TestArray2 (1 To 100, 1 To 100) As Integer mit Dim Datenfeld () As Integer zunächst und ReDim Datenfeld (1 To 5, 1 To 100) später und ReDim Datenfeld (1 To 5, 1 To 50) als weitere Änderung benutzerdefinierte Typen Type PersonenTyp Name As String Alter As Integer Telefon As String End Type 2) Operatoren, Ausdrücke Vergleichsoperatoren Print True = True Print True = False Print False = False Print 5 = 3 + 2 Print 5 < 3 Print (5 = 3 + 2) + 3 Print "Meier" = "Mei" & "er" Print "A" <"Z" Print "AAAAAB" > "AAAAAA" Rem Ergebnis -1 Rem Ergebnis 0 Rem Ergebnis -1 Rem Ergebnis -1 Rem Ergebnis 0 Rem Ergebnis 2 Rem Ergebnis -1 Rem Ergebnis -1 Rem Ergebnis -1 False = 0 True <> 0 Numerische Ausdrücke: Print 10 ^ 10 Print 3 + 4 * 2 Print (3 + 4) * 2 Print 5 / 2 Print 2.5 * 3 Print 2.5E-5 Print &HAFE / 2 Rem Ergebnis 100 Rem Ergebnis 11 Rem Ergebnis 14 Rem Ergebnis 2.5 Rem Ergebnis 7.3 Rem Ergebnis 0.000025 Rem Ergebnis 1407 Zeichenketten: Print "Hallo" Print "Dieter" & "Meier" Print "Dieter" & " " & "Meier" Rem Hallo Rem Ergebnis DieterMeier Rem Ergebnis Dieter Meier Logische Ausdrücke: Rem Ergebnis -1 (oder <> 0) Rem Ergebnis 0 Rem Ergebnis -1 Rem Ergebnis 0 Rem Ergebnis -1 Rem Ergebnis 0 Print True Print False Print True And True Print True And False Print True Or False Print True Xor True TFH Berlin/Steyer 7-2 Module 3) Befehle Befehle Entscheidungs strukturen If <Bedingung> Then <Anweisungsblock> End If If <Bedingung> Then <Anweisungsblock> Else <Anweisungsblock> End If Select Case <Testausdruck> [Case <Ausdrucksliste1> [<Anweisungsblock>]] [Case <Ausdrucksliste2> [<Anweisungsblock>]] [Case Else [<ElseAnweisungsblock>]] End Select Schleifenstrukturen For <Zähler> = <Startwert> To <Endwert> [Step <Schrittgrösse>] <Anweisungsblock> [Exit For] <Anweisungsblock> Next [<Zähler>] Do [{While|Until} <Bedingung> <Anweisungsblock> [Exit Do] <Anweisungsblock> Loop Do <Anweisungsblock> [Exit Do] [<Anweisungsblock>] Loop [{While|Until}] <Bedingung> While <Bedingung> <Anweisungsblock> Wend Sprünge GoTo <Ziel> ... Ziel: 4) Funktionen, Prozeduren Funktionen: Function DoppelterWert (Zahl As Integer) As Integer DoppelterWert = Zahl * 2 End Function Aufruf: A = DoppelterWert(2) + DoppelterWert(4) / 10 TFH Berlin/Steyer 7-3 Module Prozeduren: Sub Prozedur1 () Dim a As Integer a = 10 Debug.Print a Rem Ausgabe: 10 Prozedur2 (a) Debug.Print a :Rem Ausgabe: 2 End Sub Sub Prozedur2 (zahl As Integer) Debug.Print zahl :Rem Ausgabe: 10 zahl = 2 Debug.Print zahl :Rem Ausgabe: 2 End Sub Aufruf: Call Prozedur1 (1) oder: Prozedur1 (1) oder: x = 1 Prozedur1 (x) Viele Access-Datenbankobjekte können über Variable angesprochen werden. Objektvariablen: Systemobjekte Objekttyp Gilt für Application Screen Form(i) Property(i) Control Property(i) Report(i) Property(i) Control Property(i) Debug gesamte Anwendungsumgebung Oberflächenobjekte Formular Eigenschaft eines Objektes Steuerelement in Formular oder Bericht Eigenschaft eines Objektes Bericht Eigenschaft eines Objektes Steuerelement in Formular oder Bericht Eigenschaft eines Objektes Ausgabe im Direktfenster Objektvariablen: Datenzugriffsobjekte Objekttyp Gilt für DBEngine alle Datenquellen Workspace(i) Aktive Sitzung der Jet_Datenbank Database Datenbank TableDef(i) Gespeicherte Tabelle Field(i) Feld in Tabelle, Abfrage, Datensatzgruppe o.a. Index(i) Tabellenindex Field(i) Feld in Tabelle, Abfrage, Datensatzgruppe o.a. QueryDef Abfragedefinition Field(i) Feld in Tabelle, Abfrage, Datensatzgruppe o.a. Parameter(i)Abfrageparameter Recordset Datensatzgruppe Field(i) Feld in Tabelle, Abfrage, Datensatzgruppe o.a. Relation Tabellen- oder Abfragebeziehung TFH Berlin/Steyer 7-4 Module Field(i) Feld in Tabelle, Abfrage, Datensatzgruppe o.a. Container(i) Objekt mit Informationen zu anderen Objekten Document(i)Informationen über Objekte in der Jet-Datenbank User(i) Benutzerkonto in der aktuellen Arbeitsgruppe Group(i) Gruppenkonto in der aktuellen Arbeitsgruppe User(i) Benutzerkonto in der aktuellen Arbeitsgruppe Kleine Beispiele für die Arbeit mit Systemobjekten: Formular öffnen: DoCmd.OpenForm "Adressen" Formular schliessen: DoCmd.Close acForm, "Adressen" Geöffnetes Formular unsichtbar machen: Dim FF1 As Form Set FF1 = Forms!Adressen FF1.Visible = False Formularname im Programm zuweisen: Dim FF1 As Form Dim Name As String Name = "Adressen" Set FF1 = Forms!(Name) alle existierenden Formularnamen ausgeben: Dim i As Integer For i = 0 To Forms.Count - 1 Debug.Print Forms(i).Name Next i alle Objekte eines geöffneten Formulars ausgeben: Dim i As Integer For i = 0 To Forms![Adressen].Count - 1 MsgBox Forms![Adressen](i).Name Next i Beispiele für die Arbeit mit Datenzugriffsobjekten s.u. TFH Berlin/Steyer 7-5 Module Beispiele für das Arbeiten mit Datenzugriffsobjekten: Es existiert ein Formular mit vier Textfeldern Text0, Text5, Text9 und Text12 und eine Tabelle "person" mit den Spalten pnr, nachname, vorname, alter. Es gibt verschiedene Ereignis-prozeduren, die auf Tastendruck verschiedene Aktionen ausführen: pnr nachname vorname alter mit SQL Private Sub Befehl0_Click() 'Zeile einfügen Dim db As DAO.Database Set db = CurrentDb() Dim sql As String sql = "INSERT INTO person VALUES (" + Text4 + ",'" + Text6 + "','" + Text8 + "'," + Text10 + ")" MsgBox sql db.Execute (sql) End Sub Private Sub Befehl1_Click() 'alle lesen Dim db As DAO.Database, rs As DAO.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("SELECT * FROM person") While Not rs.EOF Text4 = rs(0) Text6 = rs(1) Text8 = rs(2) Text10 = rs(3) MsgBox "weiter ?" rs.MoveNext Wend End Sub TFH Berlin/Steyer 7-6 Module Private Sub Befehl2_Click() 'alle ändern Dim db As DAO.Database Set db = CurrentDb() db.Execute ("UPDATE person SET palter = palter + 1") End Sub Private Sub Befehl3_Click() 'alle löschen Dim db As DAO.Database Set db = CurrentDb() db.Execute ("DELETE FROM person") End Sub ohne SQL Private Sub Befehl15_Click() ‘Zeile einfügen Dim db As DAO.Database, ta As DAO.Recordset Set db = CurrentDb() Set ta = db.OpenRecordset("person", DB_OPEN_TABLE) ta.AddNew ta!pnr = Text0 ta!nachname = Text5 ta!vorname = Text9 ta!alter = Text12 ta.Update ta.Close End Sub Private Sub Befehl16_Click() ‘alle lesen Dim db As DAO.Database, ta As DAO.Recordset Set db = CurrentDb() Set ta = db.OpenRecordset("person", DB_OPEN_TABLE) ta.MoveFirst While Not ta.EOF Text0 = ta![pnr] Text5 = ta![nachname] Text9 = ta![vorname] Text12 = ta![alter] MsgBox "weiter ?" ta.MoveNext Wend ta.Close End Sub Private Sub Befehl17_Click() ‘alle ändern Dim db As DAO.Database, ta As DAO.Recordset Set db = CurrentDb() Set ta = db.OpenTable("person") ta.MoveFirst While Not ta.EOF ta.Edit TFH Berlin/Steyer 7-7 Module ta![alter] = ta![alter] + 10 ta.Update ta.MoveNext Wend ta.Close End Sub Private Sub Befehl18_Click() ‘alle löschen Dim db As DAO.Database, ta As DAO.Recordset Set db = CurrentDb() Set ta = db.OpenTable("person") ta.MoveFirst While Not ta.EOF ta.Edit ta.Delete ta.MoveNext Wend ta.Close End Sub Weitere Möglichkeiten select und recordset Abfrage und recordset find und recordset Private Sub Befehl0_Click() 'select und recordset Dim db As DAO.Database, ta As DAO.Recordset, sql As String Set db = CurrentDb() sql = "SELECT nachname FROM person;" Set ta = db.openrecordset(sql, dbopendynaset) ta.MoveFirst While Not ta.EOF MsgBox ta!nachname MsgBox "Weiter" ta.MoveNext Wend ta.Close End Sub Private Sub Befehl0_Click() 'Abfrage und recordset Dim db As DAO.Database, ta As DAO.Recordset, sql As String Set db = CurrentDb() sql = "SELECT * FROM namen;" Set ta = db.openrecordset(sql, dbopendynaset) ta.MoveFirst While Not ta.EOF MsgBox ta!Ausdr1 MsgBox "Weiter" ta.MoveNext Wend ta.Close End Sub TFH Berlin/Steyer 7-8 Module Private Sub Befehl0_Click() 'find und recordset Dim db As DAO.Database, ta As DAO.Recordset, bedingung As String Set db = CurrentDb() bedingung = "alter < 10" Set ta = db.openrecordset(“person”, dbopendynaset) ta.FindFirst bedingung While Not ta.NoMatch MsgBox ta!nachname MsgBox "Weiter" ta.MoveFindNext bedingung Wend ta.Close End Sub TFH Berlin/Steyer 7-9 Module Selbstanwendung: Tabellen/Abfragen/Formulare/Berichte bearbeiten Tabellen: Private Sub Befehl2_Click() 'Tabelle erzeugen Dim db As DAO.Database Dim df As DAO.TableDef Dim fe As DAO.Field Set db = CurrentDb() Set df = db.CreateTableDef("neu") Set fe = df.CreateField("f1", DB_TEXT, 60) df.Fields.Append fe db.TableDefs.Append df End Sub Private Sub Befehl3_Click() 'Tabelle füllen Dim db As DAO.Database Dim ta As DAO.Recordset Set db = CurrentDb() Set ta = db.OpenRecordset("neu", DB_OPEN_TABLE) ta.AddNew ta!f1 = "x1" ta.Update ta.Close End Sub Private Sub Befehl4_Click() 'Tabelle löschen Dim db As DAO.Database Set db = CurrentDb() db.TableDefs.Delete "neu" End Sub TFH Berlin/Steyer 7-10 Module Abfragen: Private Sub Befehl5_Click() 'Abfrage erzeugen Dim db As DAO.Database Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.CreateQueryDef("myquery") Dim strSQL As String Dim strWhere As String strWhere = "alter > 5" 'kann auch aus Eingabevariablen gelesen und zusammengebastelt werden strSQL = "SELECT * FROM person WHERE " & strWhere MsgBox strSQL qdf.SQL = strSQL End Sub Private Sub Befehl6_Click() 'Abfrage ausführen Dim db As DAO.Database Dim qdf As DAO.QueryDef Set db = CurrentDb() Set qdf = db.QueryDefs("myquery") qdf.OpenRecordset 'hier noch anzeigen End Sub Private Sub Befehl7_Click() 'Abfrage löschen Dim db As DAO.Database Set db = CurrentDb() db.QueryDefs.Delete "myquery" End Sub Formulare: Private Sub Befehl11_Click() MsgBox Forms.Count 'Formulare anzeigen MsgBox Forms(0).Caption For i = 0 To Forms.Count - 1 MsgBox Forms(i).Caption Next End Sub Private Sub Befehl1_Click() 'Formular erzeugen Dim fo As Form Set fo = CreateForm DoCmd.Restore fo.Caption = Text2 + "Form" End Sub TFH Berlin/Steyer 7-11 Module Private Sub Befehl4_Click() 'Formular öffnen DoCmd.OpenForm Text2 + "Form" End Sub Berichte: Private Sub Befehl14_Click() MsgBox Reports.Count 'Berichte anzeigen MsgBox Reports(0).Caption For i = 0 To Reports.Count - 1 MsgBox Reports(i).Caption Next End Sub Private Sub Befehl1_Click() 'Bericht erzeugen Dim rp As Report Set rp = CreateReport DoCmd.Restore rp.Caption = Text2 + "Report" End Sub Private Sub Befehl4_Click() 'Bericht öffnen DoCmd.OpenReport Text2 + "Report" End Sub TFH Berlin/Steyer 7-12 Module DoCmd-Methoden: AddMenu ApplyFilter Beep CancelEvent Close CopyObject DeleteObject DoMenuItem Echo FindNext FindRecord GoToControl GoToPage GotToRecord Hourglass Maximize Minimize MoveSize OpenForm OpenModule OpenQuery OpenReport OpenTable OutputTo PrintOut Quit Rename RepaintObject Requery Restore RunCommand RunMacro RunSQL Save SelectObject SendObject SetMenuItem SetWarnings ShowAllRecords ShowToolbar TransferDatabase TransferSpreadsheet TransferText TFH Berlin 7-13