Statistikfunktionen in Abfragen verwenden

By , 18. Januar 2014

Zur statistischen Auswertung von Datenreihen können in Abfragen Funktionen eingesetzt werden wie z.B. AVG() für den aritmetischen Mittelwert oder StDev() für die Standardabweichung.
Eine nicht ganz triviale Aufgabe wäre es z.B., wenn man das gespeicherte Bestelldatum von Bestellungen in einer Tabelle hat, und jetzt den durchschnittlichen Bestellabstand in Tagen ermitteln möchte.

Manuell ist das leicht zu lösen indem man die Abstände zur nächsten Bestellung in Tagen aufsummiert und durch die Anzahl Bestellungen -1 dividiert. Beispiel:

  1. Bestellung: 12.10.2013
  2. Bestellung: 18.10.2013
  3. Bestellung: 23.10.2013
  4. Bestellung: 02.11.2013
  5. Bestellung: 14.11.2013

Die Bestellabstände sind: 6 Tage, 5 Tage, 10 Tage und 12 Tage.
In Summe 33 Tage geteilt durch 5-1 ergibt einen durchschnittlichen Bestellabstand von 8,25 Tagen.

Möchte man das nun in einer Abfrage berechnen lassen, brauchen wir also immer das Datum vom aktuellen Daten und das Datum vom folgenden Datensatz. Daher müssen wir die Bestell-Tabelle 2x in die Abfrage einbinden einmal mit Alias T1 und einmal mit Alias T2, und der Bedingung dass das Bestelldatum von T2 kleiner dem Bestelldatum von T1 sein muss. Fangen wir also erst mal damit an die Bestellabstände aufzulisten:
Read more »

Steuerung von Fußschalter oder Joystick

By , 16. Januar 2014

Um Ereignisse zu erfassen die von einem Fußschalter oder einem Joystick ausgelöst werden, kann man sich der Methoden von DirectX bedienen. Im vorliegenden Beispiel wird die Version DirectX8 verwendet, d.H. Sie benötigen einen gültigen Verweis auf die „DirectX 8 für Visual Basic Type Library“. Dazu benötigen Sie die registrierte Datei dx8vb.dll auf Ihrem Computer.
Nach dem nun der Verweis gesetzt wurde kann mit der Deklaration der Objekte begonnen werden. Dazu verwende ich die Early-Binding Variante um die DirectX-Konstanten verwenden zu können:
Im Deklarationsteil des Formulars:

Private Const BufferSize As Long = 10
Private DX As DirectX8
Private DI As DirectInput8
Private DIEnum As DirectInputEnumDevices8
Private DIDevice As DirectInputDevice8
Private hEvent As Long
Implements DirectXEvent8

Im Load-Ereignis werden die Objekte dann Instanziert:

    Set DX = New DirectX8
    Set DI = DX.DirectInputCreate
    Set DIEnum = DI.GetDIDevices(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY)
    ' kein Gerät gefunden dann Abbruch
    If DIEnum.GetCount = 0 Then Exit Sub

Die Verwendeten Konstanten beim Zugriff auf die Geräte können hier nachgelesen werden:
DirectInput8::EnumDevices
Read more »

Umrechnung Minuten/Sekunden in Zeitangabe

By , 24. Mai 2012

Konvertierungsfunktionen wie Minuten oder Sekunden in Zeitangabe zu konvertieren. sollte an und für sich kein Problem sein. Wenn die Rechenarithmetik von Access uns keinen Strich durch die Rechnung machen würde. Angenommen man hat 400 Minuten und teilt diese durch 60 und weisst das Ergebnis einer Long-Variablen zu, um die Stunden zu erhalten: 400/60 = 6.66666667. Dieses einem Long-Wert zugeordnet ergibt aber 7!
Ein Trick ist die Teilung mit einem Backslash, also 400\60. Diese Division gibt immer die Zahl vor dem Komma zurück, Nachkommastellen werden einfach abgeschnitten.

Fangen wir mal mit den Funktionen an. Diese am besten in einem Modul plazieren:

Public Function ConvertMintoTime(varM As Long)
    Dim hours As Long
    Dim minutes As Long

    hours = varM \ 60
    minutes = varM - hours * 60
    
    ConvertMintoTime = Format(hours, "00") & Format(minutes, "\:00") & ":00"
End Function

Public Function ConvertSectoTime(varS As Long)
    Dim hours As Long
    Dim minutes As Long
    Dim seconds As Long

    hours = varS \ 3600
    minutes = (varS - hours * 3600) \ 60
    seconds = varS - hours * 3600 - minutes * 60
    
    ConvertSectoTime = Format(hours, "00") & Format(minutes, "\:00") & Format(seconds, "\:00")
End Function

In der ersten Funktion werden die Minuten durch 60 geteilt um die Stunden zu erhalten. Im zweiten Schritt wird die Differenz zwischen den Minuten und den Stunden x 60 ermittelt, um die Minuten zuerhalten, was letztendlich nichts anderes als der Rest der ersten Division ist.

In der zweiten Funktion haben wir Sekunden, daher teilen wir durch 3600 für die Stunden. der Rest dieser Division wird dann durch 60 geteilt für die Minuten, und der letzte Rest bildet dann die Sekunden ab.
Per Format() Funktion wird die Ausgabe der Funktion aufbereitet.

Der Aufruf kann z.B. aus einem Formular oder anderen Modul erfolgen, da die Funktionen den Gültigkeitsbereich Public besitzen. Dieser könnte z.B. so aussehen:

Sub test()
    Dim t As Long
    t = 4000

    MsgBox t & " Sekunden sind Umgerechnet: " & ConvertSectoTime(t)
    MsgBox t & " Minuten sind Umgerechnet: " & ConvertMintoTime(t)
End Sub

Das wars schon, also eigentlich bis auf den Fallstrick mit dem Teil-Strich nichts besonderes.

Bis dahin
Andreas Vogt © 2012

BCD-Code erleichtert die Auswahl von Entitäten

By , 15. April 2012

BCD-Code ist vielen sicherlich noch von früher aus dem Informatikuntericht bekannt. Ich kam damit das erste mal während meiner Ausbildung duch BCD-Codierschalter in Berührung. Beim BCD-Code wird jede Ziffer einer Dezimalzahl einzeln dualkodiert. BCD-Code wird auch 8-4-2-1 Code genannt, weil die zweierpotenzen diese Ziffern ergeben. Damit lässt sich jede Ganzzahl darstellen.

Beispiel: 14: 8+4+2 oder 22: 16+4+2 usw.

Wie nützt uns jetzt dies bei Access? Der Aufbau des Codes hat auch einen zusätzlichen Effekt. Und zwar ist jede Zahl im Code (1, 2, 4, 8, 16….) größer als die Summe aller darunter liegender Zahlen, und zwar immer genau um 1 größer. Beispiel: 64 > 32+16+8+4+2+1.

Wenn man jetzt einen Enum Definiert dann nicht mehr mit 1, 2, 3…. sondern mit 1, 2, 4…

Ich glaub ich mach jetzt am besten erst mal ein Beispiel:

Option Explicit

Private Enum eAuswahl
    vbArbeiter = 1
    vbAngestellte = 2
    vbTechniker = 4
    vbführungskräfte = 8
    vbBerater = 16
    vbAlle = 32
End Enum

Read more »

Kodieren und Dekodieren von Texten

By , 8. April 2012

Kürzlich bin ich auf eine relativ alte Methode wieder gestoßen um Texte zu kodieren. Dabei verschiebt man einfach die Buchstaben im Wort um eine definierte Anzahl stellen. Ein bekannter Vertreter dieser Art ist Rot13. (Rotate by 13). Solche Kodierer haben den Vorteil dass sie erstens wieder dekodiert werden können – was gleichzeitig aber auch ihr Nachteil in Bezug auf Sicherheit ist – und zweitens dass es bekannte Algorithmen in verschiedenen Programmiersprachen gibt. Teilweise findet man auch im internet Online-Tools die Texte kodieren bzw. dekodieren können.
Dies sollte man wissen wenn man Text-Daten in einer Tabelle verschlüsseln möchte. Jeder der die Kodierungsmethode herausfindet kann es auch wieder lesbar machen.

Um hier ein wenig Sicherheit hineinzubringen sollte man den Kodier-Algorithmus nach eigenen Vorgaben anpassen. Über Ostern hatte ich wohl ein bisschen Zeit, und hab da mal etwas gebastel.
Meine Idee war kein fester Verschiebefaktor vorzugeben, sondern in Ahhängigkeit der Stelle eines Buchstabens im Wort vergrößerten Faktur. Also der erste Buchstabe um z.B. 15 verschieben, den zweiten um 15 usw., und beim nächsten Wort wieder bei 15 anfangen. Ich nenne diesen Algorithmus mal Rot15plus.
Read more »

Rückruffunktionen (Callback Functions) in Access anwenden

By , 6. April 2012

Hallo liebe Leser,
beim Schmökern in diversen Foren bin ich auf Rückruffunktionen gestoßen, die ich bislang selbst nicht einsetzte. Eine Rückruffunktion ist eine Funktion, die als Parameter einer anderen Prozedur übergeben wird. Die Rückruffunktion selbst kann auch eigene Parameter haben die auch übergeben werden. Dadurch kann man eine allgemeine Prozedur erstellen, deren Verhalten erst durch die übergebene Rückruffunktion bestimmt wird. Das Verhalten dieser allgemeinen Prozedur kann sich mit jedem Aufruf ändern.

Dadurch kann man eine Access-Anwendung erstellen, mit einer Art Programm-Schnittstelle – bei PHP Entwicklern auch als Hook bekannt – die später hinzugefügte Module nutzen können, um eigene Funktionen auszuführen. Dies bedeutet aber auch, dass eine vom Entwickler ungewollte Prozedur ausgeführt werden könnte die auch Schadcode enthalten kann. Man sollte den Einsatz nachfolgend vorgestellter Methode also genau planen.

Da beim Übergeben von Parametern Access nicht den Datentyp „Funktion“ kennt, muss man da ein wenig tricksen. Statt dessen übergibt man den Funktionsname als String und den/die erforderlichen Parameter. Wie genau das geht zeigt nachfolgender Code.

Erstellen Sie zu erst ein Standardmodul. Beginnen wir anschließend mit der „neutralen“ Prozedur.

Function apply_to(ByVal funktion As String, ByVal werte As Variant) AS Variant
    Dim ergebnis() As Variant
    Dim i As Long
    Dim e As Variant
    For i = LBound(werte) To UBound(werte)          'Schleife über alle Werte
        e = Eval(funktion & "(" & werte(i) & ")")   'rufe die Rückruffunktion mit Parameter auf
        ReDim Preserve ergebnis(i)                  'Wertebereich des Rückgabearrays erweitern
        ergebnis(i) = e                             'und hänge den Rückgabewert an das Array an.
    Next i
    apply_to = ergebnis
End Function

Read more »

Dateipfade im Griff

By , 2. März 2012

Jeder hat sicherlich mal das Problem gehabt in seiner Access-Anwendung mit Dateipfaden klar zu kommen. Sei es der Pfad zu Bildquellen, oder zu externen Datenbanken.

Auf eine Idee dazu hat mich heute eine Frage im Access-o-Mania Forum gebracht, wobei ich spontan an CurrentdbC denken musste. Bei CurrentdbC wird ein Objekt über eine Property zugänglich gemacht, das gleiche geht ja auch mit einer String. darauf hab ich ein bisschen gebastelt und eine sehr brauchbare Lösung erarbeitet die ich euch nicht vorenthalten möchte.

Wie gewohnt erstellt man zuerst eine Tabelle wo die Pfade gespeichert werden:


Das Feld Pfad habe ich als Memo-Feld ausgeführt.
Read more »

Benutzerdefinierte Prozeduren mit eigener Intellisense

By , 23. Februar 2012

Oft erstellt man Prozeduren wo man vordefinierte Parameter übergibt. Z.B. habe ich letztens eine Prozedur erstellt welche durch 2 Schaltflächen aufgerufen wird. Eine Schaltfläche für „vor“ und eine für „zurück“. Der Parameter für die Richtung habe ich vorgegeben, 1 für vor, 2 für zurück.
Wissen Sie Wochen später wenn Sie diese Prozedur aufrufen welcher Wert was ist?
Wäre es nicht besser Sie hätten dafür eine Intellisense?

Nichts leichter als das. der nachfolgende Text und Code zeigt wie das geht:
Zuerst legen Sie dort wo die Prozedur existiert, also Modul oder Formular-Modul, im Deklarationsbereich einen Enum (Aufzählungsdatentyp) an der der Datentyp für den zu übergebenen Parameter darstellt.

Private Enum Richtung
    vor = 1
    zurück = 2
End Enum

Read more »

Access [basics] kostenlose Ausgabe mit Beispielen

By , 23. Februar 2012

Hier lesen Sie die komplette Ausgabe 5/11 von Access [basics] mit Zugriff auf mehrere Beispieldatenbanken zum Herunterladen.
Hier die Themen:

Werte zu Kombinationsfeldern hinzufügen
Kombinationsfelder bieten meist Daten aus Lookup-Tabellen zur Auswahl an. Das bedeutet, dass Sie damit etwa die Anrede oder den Titel einer Person festlegen können, wobei Anreden und Titel in separaten Tabellen gespeichert sind. Das ist schon hilfreich. Noch praktischer wäre es allerdings, wenn Sie neue Einträge für die separaten Tabellen direkt über das Kombinationsfeld eintragen könnten. Wie dies funktioniert, zeigt dieser Artikel.

Aktionsabfragen per VBA ausführen
Aktionsabfragen lassen sich bequem mit der Entwurfsansicht für Abfragen zusammenstellen. Sie können damit Daten an Tabellen anfügen, bestehende Daten ändern oder löschen und sogar gleich die passende Tabelle zum Einfügen von Daten erstellen. Wie aber soll der Benutzer eine solche Abfrage aufrufen, ohne doppelt auf den entsprechenden Eintrag im Datenbankfenster oder im Navigationsbereich zu klicken? Dieser Artikel zeigt, wie Sie dies realisieren.

Daten per Kombinationsfeld auswählen und löschen
Wenn Sie den Benutzern Ihrer Datenbank die Gelegenheit bieten möchten, Datensätze gezielt zu löschen, lässt sich das ganz leicht etwa mit einem Kombinationsfeld und einer Schaltfläche erreichen. Mit dem Kombinationsfeld wählt der Benutzer den zu löschenden Datensatz aus und die Schaltfläche startet den eigentlichen Löschvorgang.

Daten in der Endlosansicht von Formularen anzeigen
Nicht immer soll ein Formular nur einen Datensatz gleichzeitig anzeigen. Manchmal wollen Sie dem Benutzer auch eine Liste mehrerer Datensätze einer Tabelle präsentieren. Dazu gibt es mehrere Möglichkeiten, zum Beispiel die Endlosansicht. Dieser Artikel zeigt Ihnen, wie Sie die Daten einer Tabelle übersichtlich in einem Formular darstellen.

Meldungsfenster anzeigen und auswerten
Das Meldungsfenster ist ein wichtiges und einfach zu bediendendes Element zur Interaktion mit dem Benutzer. Einfache Meldungsfenster zeigen einfach nur Meldungen an und werden durch einen Klick auf die OK-Schaltfläche wieder geschlossen. Sie können damit jedoch auch einfache Fragen stellen, die der Benutzer per Mausklick auf die unterschiedlichen Schaltflächen beantworten kann.

Hier der Link zur kostenlosen Ausgabe:
Access [basics] Ausgabe 5/11

Bis dahin
Andreas Vogt ©2012

Nur kurze Zeit: Gratis E-Book downloaden

By , 19. Dezember 2011

Zum 4. Advent gibt es das 4. und letzte Gratis-Ebook, diesmal etwas was vorallem die Datenbankentwickler freuen dürfte:

Datenbanken entwickeln mit
SQL Server 2008 (R2) Express

Ein gutes Buch! Sie bekommen, was Einsteiger benötigen:
» Viele Übungen und Insider-Tipps
» Hintergrundwissen und Konzepte
» Software zum sofortigen Loslegen

Download bis zum 26.12.2011:
http://advent.microsoft-press.de/?apid=60812

Bis dahin
Andreas Vogt ©2011

OfficeFolders theme by Themocracy