Arbeiten mit Interface-Klassen

By , 28. Februar 2014

Dass man mit Access auch objektorientiert entwickeln kann – wenn auch nicht völlig – dürfte hinlänglich bekannt sein. Klassenmodul erstellen, Methoden und Eigenschaften in als Prozeduren und Properties definieren, alles längst bekannt. Weniger bekannt aber ist die Verwendung von Interfaces bzw. Interface-Klassen.

Man stelle sich vor, man hat eine Klasse Auto, eine Klasse Motorrad und eine Klasse Fahrrad. 3 verschiedene Klassen, und doch werden die Methoden und Eigenschaften dieser Klassen in vielen Punkten identisch sein. Die Objekte aller 3 Klassen haben sicherlich die gemeinsamen Methoden „Fahren“, „Bremsen“ und „Lenken“. Außerdem die gemeinsamen Eigenschaften „Geschwindigkeit“, „Richtung“ und „Farbe“, um ein paar Beispiele zu nennen.

Diese Zusammenhänge lassen sich durch ein Interface abbilden, und das geschieht einfacher als man denkt. Ein Interface ist zuerst einmal nichts anderes als ein Klassenmodul, das man speziell benennt. Eingebürgert hat sich, dass man vor den Interface-Namen ein „i“ setzt. Wir erstellen also ein Klassenmodul, und benennen es „iFahrzeug“. Um jetzt die Struktur für Fahrzeuge in diesem Interface abzubilden erstellen wir darin alle Properties und Prozeduren wie oben benannt, aber ohne weiteren Code. Unser Interface sieht jetzt wie folgt aus:

Option Explicit

Property Get Geschwindigkeit() As Long
End Property
Property Let Geschwindigkeit(ByVal lSpeed As Long)
End Property

Property Get Richtung() As String
End Property
Property Let Richtung(ByVal cRichtung As String)
End Property

Property Get Farbe() As Long
End Property
Property Let Farbe(ByVal lColor As Long)
End Property

Sub Fahren()
End Sub

Sub Bremsen()
End Sub

Sub Lenken()
End Sub

Read more »

Array definieren mal anderst

By , 27. Februar 2014

Arrays werden entweder per Array() Anweisung definiert, oder auch durch den Split() Befehl.
Auf eine andere bzw. erweiterte Möglichkeit bin ich kürzlich gestoßen beim Entwickeln eines Benutzersteuerelementes mit VB6.
Dort ging es u.a. darum, Steuerelemente beim Klick auf einen Button zu plazieren und sichtbar zu machen.

Die Größe und Position der Steuerelemente habe ich dabei wie folgt definiert:

Private Sub Form_Open(Cancel As Integer)
    Dim sizeArr(8) As Variant
    Dim i As Long
    sizeArr(0) = Array("cmdClose", 2350, 23, 306, 975)
    sizeArr(1) = Array("Linie1", 47, 2412, 2066, 2066)
    sizeArr(2) = Array("Linie2", 47, 2412, 697, 697)
    sizeArr(3) = Array("lblMonat", 23, 47, 454, 2381)
    sizeArr(4) = Array("zurueck", 142, 120, 227, 227)
    sizeArr(5) = Array("vor", 142, 2160, 227, 227)
    sizeArr(6) = Array("MonatJahr", 120, 480, 255, 1575)
    sizeArr(7) = Array("Heute", 2066, 47, 255, 2381)
    sizeArr(8) = Array("Rechteck1", 23, 47, 2280, 2381)

Das bedeutet also, jedem einzelnen Array-Element wurde ein weiteres Array zugewiesen.
Der Zugriff auf einen bestimmten Wert, z.B. auf „lblMonat“ lautet dann: sizeArr(3)(0)

Und um wieder zum Beispiel aus der Praxis zurückzukommen, hier der restliche Code, der die Steuerelemente dimensioniert, positioniert und sichtbar schaltet:

    For i = LBound(sizeArr) To UBound(sizeArr)
        With Controls(sizeArr(i)(0))
            .Top = sizeArr(i)(1)
            .Left = sizeArr(i)(2)
            .Height = sizeArr(i)(3)
            .Width = sizeArr(i)(4)
            .Visible = True
        End With
    Next i
End Sub

Bis dahin
© 2014 Andreas Vogt

Clouden Sie noch oder wie wichtig sind Ihnen Ihre Daten?

By , 15. Februar 2014

Die Zeit der Goldgräberstimmung in der Cloud Server Branche außerhalb der EU ist längst vorbei, zu tief sind doch die emotionalen Gräben die uns die NSA beschert hat. Für mich war es immer schon klar dass in die Cloud keine betriebswichtigen Daten gehören. Meine Denkweise war aber eher die dass in einem Rechtsstreit ServerHardware und entsprechende auch die Daten beschlagnamt werden könnten – dass aber die NSA die Cloud direkt anzapfte, Hersteller von Internetdiensten dazu verpflichten Hintertürchen einzubauen etc. etc. – diese Dimension haben sich wohl die wenigsten ausgemalt, ich auch nicht.

Die ganze Spionagetätigkeit läuft unter dem Aspekt der Terrorabwehr, und verschleiert vollkommen, dass es auch um handfeste Wirtschaftsspionage geht.

Hintertuerchen Gut, dann eben wieder lokale Lösungen mit eigenem und teuren Rechenzentrum. Das wäre auch bislang eine sichere Bank gewesen, bis zu dem entsprechenden Spiegel-Beitrag vor etwa 6 Wochen.
Die NSA hat ganze Lieferungen von PC Hardware abgefangen, aufgeschraubt und Spionage-Tools verbaut als Hintertürchen, um so an Daten und Kontrolle über den PC zu kommen. Das ganze klingt nach einem übertriebenen Science-Fiction Roman – doch die Wirklichkeit hat diese Lektüre bereits überholt.

Viele „flüchten“ jetzt zu Cloud-Anbietern innerhalb Europa vorallem auch innerhalb Deutschland. Was bleibt ist die Frage ob auch hier es so weit kommt bzw. ob es nicht längst auch so weit ist.
Das digitale Wettrüsten hat längst begonnen und ist im vollen Gange.

Also schauen Sie ruhig mal nach Ihrem PC unter dem Schreibtisch, nicht dass dort ein Hintertürchen aufsteht.

Meint der Autor.

Quelle: http://www.spiegel.de/netzwelt/netzpolitik/…
© 2014 Andreas Vogt

Abfrage oder Tabelle ‚Zeichengetrennt‘ in Textdatei speichern

By , 13. Februar 2014

Die landläufige Methode eine Abfrage oder eine Tabelle als Txt-Datei zu speichern ist die Docmd.OutputTo() Methode.
Informationen dazu findet ihr hier: http://msdn.microsoft.com/en-us/library/office/…

Um aber Zeichengetrennte Textdateien zu erstellen, d.h. jede Zeile ein Datensatz, jedes Feld in der Zeile durch einen Separator getrennt, muss man die Methode Docmd.TransferText() incl. Exportspezifikation erstellen. http://msdn.microsoft.com/en-us/library/office/… Das wäre sicherlich der einfachste Weg.

Falls aber die Exportspezifikation aber nicht mehr genügt, kann man mittels Output-Stream eine Textdatei zu erstellen, eine Abfrage oder Tabelle in ein Recordset packen und zeilenweise durchlaufen und in die Textdatei zu schreiben. Und mit den Worten von Jean Pütz sag ich: „ich hab da mal was vorbereitet“:

Sub Table2Textfile(ByVal Outputfile As String, ByVal TableName As String, _
                   Optional Separator As String = ";", _
                   Optional titlebar As Boolean = False)
    
    Dim rs As DAO.Recordset
    Dim strTableRow As String
    Dim filenum As Long
    Dim i As Long
    filenum = FreeFile

    Set rs = CurrentDb.OpenRecordset(TableName)
    Open Outputfile For Output As #filenum

    'Spaltenköpfe
    If titlebar Then
        For i = 0 To rs.Fields.Count - 1
            strTableRow = strTableRow & rs(i).Name & Separator
        Next i
        strTableRow = Left(strTableRow, Len(strTableRow) - Len(Separator))
        Write #filenum, strTableRow
        strTableRow = vbNullString
    End If

    Do While Not rs.EOF
        For i = 0 To rs.Fields.Count - 1
            strTableRow = strTableRow & rs(i) & Separator
        Next i
        strTableRow = Left(strTableRow, Len(strTableRow) - Len(Separator))
        Write #filenum, strTableRow
        strTableRow = vbNullString
        rs.MoveNext
    Loop
    Close #filenum
    rs.Close
    Set rs = Nothing
End Sub

Dies ist eine universelle Prozedur mit dem man Abfragen bzw. Tabellen schnell in eine separierte Liste bringen kann.
In einer Schleife über alle Recordset-Felder wird der String zusammengestellt, welcher in die Textdatei gespeichert wird.
Ebenso die Spaltenköpfe welche mit rs(Zeilennummer).Name auszulesen sind.

Die Prozedur welche obige Prozedur aufruft sieht dann z.B. so aus:

Sub Tester()
    Table2Textfile "c:\users\Public\test4711.txt", "qryTeilnehmer", ";", True
End Sub

Anstatt eines Separators als String kann man natürlich auch VBA-Konstanten verwenden, z.B. vbTab bietet sich hier an, Verwendung ohne Anfürungszeichen!

Ein Wermutstropfen bleibt aber übrig. In der erstellten Textdatei sind die einzelnen Textzeilen in Anführungszeichen. D.h. vor dem Weiterverarbeiten müsste man eventuell mittels FileSystemObject ran gehen und die einzelnen Zeilen bearbeiten – oder falls per VBA die Weiterverarbeitung stattfindet kann man die Bereinigung auch im VBA-Code machen.

Bis dahin
© 2014 Andreas Vogt

OfficeFolders theme by Themocracy