Posts tagged: Access

Accessblog auf Twitter lesen

By , 20. Mai 2011

Auf Twitter erfahrt ihr viele News und Hinweise auf neue Artikel hier im Blog.
Klickt einfach auf den Twitter-Button und ihr gelangt direkt zur AccessBlogde Twitterseite.
Wenn euch gefällt was ihr seht – bislang gibts erst wenige Tweets – dann klickt einfach auf Folgen und ihr bekommt automatisch auf eure Startseite meine Tweets.

Wir sehn uns auf Twitter
Andreas Vogt ©2011

rosige Zeiten für Microsoft Access?

By , 19. Mai 2011

In einer aktuellen Veröffentlichung der Software Initiative Deutschland wird von einer Analyse von Geschäftsprozess-Veränderungen berichtet, welche unter anderem als Ergebnis hervorbrachte, dass zur Zeit jeder dritte Geschäftsprozess auf eine Access Anwendung beruht.

Diese Prozesse laufen zumeist autark in den Fachabteilungen ab, ohne dass die IT-Abteilung davon Kenntnis erlangte bzw. informiert wurde. Da zeigt sich dass Microsoft Access durchaus Qualitäten als Rapid Aplication Development-Tool aufweist.

Die Ursache der Kluft zwischen IT-Abteilung und Fachabteilung sei die immer höhere Geschwindigkeit, mit der die Geschäftsprozesse angepasst werden müssen, deren die IT-Abteilung nicht mehr nachkommt. Da die Fachabteilungen trotzdem funktionieren müssen wird eben verstärkt zur Selbsthilfe gegriffen mit den der Fachabteilung zur Verfügung stehenden Mitteln – und das ist nun mal in aller Regel Microsoft Office. Der Autor der Veröffentlichung prognostiziert weiter, dass diese Kluft ständig sich vergrößern wird und ein Ende noch nicht abzusehen sei . Seine Einschätzung geht sogar so weit dass bald rund 80% aller Geschäftsprozesse der deutschen Konzernwelt auf Excel und Access basieren werden.

Es ist noch nicht so lange her dass Access-Anwendungen vorallem in den großen Betrieben und Konzernen als Verpöhnt galten. Sicherlich herrscht diese Meinung bei vielen ITlern noch vor, doch da wird bzw. muss ein Umdenken stattfinden, denn die Integration von Fachabteilung spezifischen Access-Anwendungen in die IT-Abteilung erhöhen spürbar Sicherheit und Qualität der Anwendungen.

Und auch Microsoft muss dieser Entwicklung mit innovativen und sichereren Access-Versionen gerecht werden – mit der Veröffentlichung von Access 2010 wurde bereits schon ein großer Schritt in diese Richtung getan. In Zukunft wird es wohl ein steigender Bedarf an Schulungen in den Betrieben geben, und auch das Heer von freiberuflichen Softwareentwickler – zu denen auch ich gehöre – wird von dieser Entwicklung profitieren.

Sogesehen könnte die Access-Zukunft schon rosig werden.

Bis dahin
Andreas Vogt ©2011

Quelle: www.softwareinitiative.de

Tips & Tricks zu Gespeicherte Prozeduren in Access

By , 9. April 2011

Im zweiten Artikel in dieser Serien ging es darum wie man Gespeicherte Prozeduren in Access aufrufen kann, welche Parameter wie übergeben werden, und wie man gleichartige Gespeicherte Prozeduren mit einem universellen VBA-Prozedur aufruft. In diesem dritten und vorerst letzten Teil geht es nur noch um Feinheiten und Vereinfachungen.

Beispielsweise kann man für Gespeicherte Prozeduren die genau einen Rückgabewert liefern, eine universelle Prozedur schreiben.
Eine solche Prozedur in Access benötigt auf jedenfall ID-Feld und ID-Wert, welche beide zusammen das Abfragekriterium bilden.
Ist die Gespeicherte Prozedur universell gehalten (siehe 4. Codelisting im zweiten Teil der Serie), wird zusätzlich der Tabellennamen benötigt.
Bzw. bei einer speziell gehaltenen Gespeicherten Prozedur wird der Name der Gespeicherten Prozedur benötigt.

Ich verwende für letztere Zwecke die nachfolgende VBA-Prozedur:

Public Function singleProc(idWert As Double, idFeld As String, outputFeld As String, strProcname As String) As Variant
    ConnectionString = "Driver={SQL Server};Server=?;Database=?;Uid=?;Pwd=?;"
    Set cnn = OpenConnection(ConnectionString)
    Set cmdObj = New ADODB.Command
    With cmdObj
        .ActiveConnection = cnn
        .CommandText = strProcname
        .CommandType = adCmdStoredProc
        .CommandTimeout = 60
        .Parameters.Refresh
        .Parameters("@" & idFeld) = idWert
        .Execute
        singleProc = .Parameters("@" & outputFeld).Value
    End With
    Set cmdObj = Nothing
    Set cnn = Nothing
End Function

Damit kann jede gespeicherte Prozedur aufgerufen werden die genau 1 Inputvariable und genau 1 Outputvariable verlangt.
Der Namen beider Variablen können Variieren, sie werden ja als idFeld und outputFeld übergeben.
Read more »

Gespeicherte Prozeduren in Access aufrufen

By , 8. April 2011

Im ersten Teil der Serie „Gespeicherte Prozeduren“ ging es darum wie im SQL Management Studio von Microsoft gespeicherte Prozeduren angelegt werden können. Es wurden zwei verschiedene Möglichkeiten einen SQL-String auszuführen erörtert, sowie zwischen „Getter“ und „Setter“ Prozeduren unterschieden. In diesem zweiten Teil geht es nun darum wie man diese Gespeicherten Prozeduren (SP für Stored Procedures) in Access nutzen kann um ausgewählte Daten zu erhalten bzw. um Daten in der SQL Server Datenbank zu speichern.

Ich erstelle zu diesem Zweck immer ein separates Modul mdlStoredProcedures worin ich verschiedene Prozeduren erstelle, je nach Anwendungszweck.
Ich unterscheide dabei zwischen Universellen Prozeduren und Speziellen Prozeduren.

Universelle Prozeduren bedienen immer mehrere gleichartige Gespeicherte Prozeduren im SQL Server. Beispiel dazu sind z.B. Prozeduren wo ein Status geändert wird. Nachfolgend als Generelles Beispiel für eine Setter-Prozedur in Access:

Deklarationsteil:

Dim cmdObj As ADODB.Command
Dim cnn As ADODB.Connection
Dim ConnectionString As String

Prozedur:

Public Function setStatus1(idWert As String, Prozedurname As String, Status As Long) As Boolean
    ConnectionString = "Driver={SQL Server};Server=?;Database=?;Uid=?????;Pwd=?;"
    Set cnn = OpenConnection(ConnectionString)
    Set cmdObj = New ADODB.Command
    With cmdObj
        .ActiveConnection = cnn
        .CommandType = adCmdStoredProc
        .Parameters.Append .CreateParameter("@indent", adVarChar, adParamInput, 10, idWert)
        .Parameters.Append .CreateParameter("@status", adVarChar, adParamInput, 2, CStr(Status))
        .CommandText = Prozedurname
        .Execute
    End With
    Set cmdObj = Nothing
    Set cnn = Nothing
End Function

Der Prozedurname wird als Parameter übergeben und der Eigenschaft CommandText des ADODB Objektes zugewiesen.
An dieser Stelle sei erwähnt, dass wir mit ADO arbeiten, und daher den Verweis „Microsoft ActiveX Data Objects 2.1 Library“ benötigen.
Die Übergabeparameter müssen in der richtigen Reihenfolge stehen wie in der SP definiert. Die Parameter der Funktion CreateParameter() sind folgende:
Parametername, Datentyp, Input/Output-Typ, Zeichenlänge, Wert
Read more »

Reguläre Ausdrücke verwenden

By , 20. April 2009

Mal angenommen Sie wollen Eingaben in einem ungebundenem Formular auf ihre Richtigkeit prüfen. Eine geläufige Vorgehensweise wäre z.B. den Feldinhalt gegen Null zu prüfen, oder die Länge auf eine bestimmte Mindestanzahl an Zeichen. Das ist alles aber ziemlich ungenau und lässt meist großen Spielraum bei der Falscheingabe.

Eine alternative Möglichkeit ist es sogenannte Reguläre Ausdrücke (Regexp, regular expressions) zu verwenden, welche in vielen Entwicklungssprachen und vorallem in Scriptsprachen wie PHP bekannt sind.

Reguläre Ausdrücke bestehen aus einem Muster, das in Begrenzer eingeschlossen wird, sowie aus verschiedenen Schaltern, den Modifizierern. In VB/VBA wurde allerdings auf die Begrenzer verzichtet, und die Modifizierer sind aus der Zeichenkette – welche dem regulären Ausdruck entspricht – ausgegliedert als Eigenschaft des entsprechenden Objektes.

Wagen wir mal einen Blick über den Tellerand hinüber zur Scriptsprache PHP und definieren wir mal einen regulären Ausdruck:

$pattern = „/^([A-Z]{1,2})?(-| )?([0-9]{5})$/“;

In diesem Muster sind so gut wie alle Techniken von regulären Ausdrücken enthalten, dass nicht kundige schon ins grübeln kommen. Mir ging das nicht anderst. Im obigen Beispiel wollen eine Eingabe einer Postleitzahl auf Ihre Richtigkeit überprüfen. Die Postleitzahl könnte z.B. so aussehen: D-80807 oder D80807 oder nur 80807.
Read more »

Access Systemobjekte

By , 16. April 2009

Haben Sie sich auch schon mal gefragt wo Access die ganzen Informationen über die vorhandenen Objekte, also Tabellen, Formulare, Abfragen, Beziehungen, Module etc., speichert? Access legt zu diesem Zweck bereits zum Zeitpunkt, wo eine neue Datenbankdatei erstellt wird, mehrere Systemtabellen an, die aber ausgeblendet sind. Darin werden die verschiedensten Access Internas gespeichert, wie die Systemobjekte, Abfragen, Makros oder Informationen über die referentielle Integrität. Diese Angaben sind nicht dokumentiert und top secret. Microsoft will sich da nicht in die Karten schauen lassen, da dies einiges an verstecktem Know How darstellt. In diesem Bericht kratzen wir auch nur wenig an der Oberfläche.

Um die Systemtabellen sichtbar zu machen, gehen Sie im Menü Extras auf Optionen und dann auf das Registerblatt Allgemein. In der Gruppe Anzeigen können Sie dann die Option „Systemobjekte“ auswählen und mit OK bestätigen.

Unter Access 2007 findet man diese Option wie folgt:
Klick auf Office-Button, dann unter:
Access-Optionen => Aktuelle Datenbank => Bereich Navigation => Navigationsoptionen
Dort die Anzeigeoption „Systemobjekte anzeigen“ markieren und 2x mit OK bestätigen.

Jetzt werden mehrere Systemtabellen angezeigt. Man erkennt diese daran dass alle mit „MSys“ beginnen. Interessant für den Access Entwickler ist z.B. die Tabelle MSysObjects, in der sämtliche Systemobjekte aufgelistet sind.

Eines vorab: Verändert man die Systemtabellen kann man in den meisten Fällen die Datenbank hinterher wegschmeißen, also nicht darin rumspielen und bei geöffneter Systemtabelle niemals auf Aufforderung speichern, sondern immer Abbrechen!

Die Tabelle MSysObjects besitzt folgende Felder:

Feldname Felddatentyp
Connect Memo
Database Memo
DateCreate Datum/Uhrzeit
DateUpdate Datum/Uhrzeit
Flags Zahl
ForeignName Text
Id Zahl
Lv OLE-Objekt
LvExtra OLE-Objekt
LvModule OLE-Objekt
LvProp OLE-Objekt
Name Text
Owner Binär
ParentID Zahl
RmtInfoLong OLE-Objekt
RmtInfoShort Binär
Type Zahl

Read more »

Anzahl Urlaubstage berechnen

By , 29. März 2009

Angenommen sie arbeiten in einer Personalabteilung. Bei Ihnen landen fast täglich Urlaubsanträge mit den Angaben Urlaubsbeginn, Urlaubsende, AnzahlTage. Soweit ja easy, aber leider sind über 10% der Anträge ohne die Angabe der Anzahl Urlaubstage. Sie holen den großen Kalender raus, zählen die Werktage, dann den zweiten Kalender mit den Feiertagen raus holen und prüfen ob ein Feiertag dazwischen liegt usw.

Die Lösung: Der Urlaubstage-Rechner.

Man sehe sich erst mal nachfolgenden VBA-Code an, der in einem Modul steht:

Public Function urlaubstage(Startdatum As Date, Enddatum As Date) As Long
    Dim i As Integer
    Dim tempDate As Date

    If Not IsDate(Startdatum) Or Not IsDate(Enddatum) Then
        MsgBox "Bitte gültiges Startdatum und Enddatum eingeben", vbExclamation + vbOKOnly
        Exit Function
    End If

    If DateDiff("d", Startdatum, Enddatum) < 0 Then
        MsgBox "Das Enddatum muss nach dem Startdatum liegen!", vbExclamation + vbOKOnly
        Exit Function
    End If

    For i = 0 To DateDiff("d", Startdatum, Enddatum)
        tempDate = DateAdd("d", i, Startdatum)
        If Weekday(tempDate) <> 1 And Weekday(tempDate) <> 7 Then
            'tempDate ist kein Wochenende
            If Not istFeiertag(tempDate) Then
                'tempDate ist kein Feiertag
                urlaubstage = urlaubstage + 1
            End If
        End If
    Next i
End Function

Read more »

Startformular mit „Countdown“ Schaltfläche

By , 18. März 2009

Ein Startbildschirm kann verschiedenste Aufgaben erfüllen. Z.B. den Anwender begrüßen oder über Neuigkeiten informieren. Ein weiterer Aspekt ist den Start der eigentlichen Anwendung bewusst zu verzögern um eine Art Barriere aufzubauen. Dies könnte man z.B. dafür Nutzen eine eingeschränkte Anwendung zu erstellen, um die Anwender zu drängen eine entsprechende Lizenz zu kaufen.

Dies zu realisieren ist sogar ziemlich einfach. Man erstelle ein Formular mit einer deaktivierten Befehlsschaltfläche die im Klick-Ereignis das Anwendungs-Formular öffnet. Im Formularmodul dann dieser Code:

Option Compare Database
Option Explicit

Dim Startintervall As Integer

Private Sub cmdApp_Click()
    DoCmd.Close acForm, Me.Name
    DoCmd.OpenForm "Anwendungsform"
End Sub

Private Sub Form_Timer()
    If Startintervall <= 10 Then
        Me.TimerInterval = 1000
        Me!cmdApp.Caption = 10 - Startintervall
        Startintervall = Startintervall + 1
    Else
        Me.TimerInterval = 0
        Me!cmdApp.Caption = "Anwendung starten"
        Me!cmdApp.Enabled = True
    End If
End Sub

Read more »

Quick-Tipp: Daten nach Excel exportieren

By , 27. Februar 2009

Auf die Schnelle die aktuellen Datensätze nach Excel rüberschieben wäre doch nicht schlecht, und beeindruckt doch sicher euren Chef – der von der Materie wieder keine Ahnung hat 😉
Und wenn der wüsste wie einfach das geht…

Hier mal der ganze Code der dazu notwendig ist:

Dim oExcel As Object, i As Integer
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb

On Error Resume Next
Err.Clear
Set oExcel = CreateObject("Excel.Application")
If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
On Error GoTo 0
With oExcel
    .Visible = True
    .Workbooks.Add
    .ActiveSheet.Name = "Arbeitsblatt1"
    Set rs = db.OpenRecordset(Me.RecordSource, dbOpenSnapshot)
    For i = 0 To rs.Fields.Count - 1
        .Cells(1, i + 1) = rs.Fields(i).Name
    Next i
    .Range("A2").SELECT
    .Selection.CopyFromRecordset rs
End With
rs.close
set rs = Nothing
set db = Nothing
Set oExcel = Nothing

Da obige Methode late Binding ist, benötigt man keinen Verweiss auf Excel.
Mittels .Cells(zeile,spalte) wird die Spaltenüberschriften eingetragen, die aus dem Namen der Datenfelder kommen. .Range(„A2“).SELECT setzt den Cursor auf das Feld A2 in Excel, und mittels .Selection.CopyFromRecordset rs werden alle Daten im aktuellen Recordset auf einen Rutsch nach Excel kopiert.

AV 2009

Quick Tipp: Popup-Formulare positionieren

By , 22. Februar 2009

Popup-Formular, d.h. Formulare mit der Eigenschaft Popup = ja, lassen sich mittig ausrichten indem man die Eigenschaft „Automatisch zentrieren“ auf ja stellt. Will man aber z.B. mehrere Popup-Formular an definierter Stelle positionieren, dann muss man dafür schon ein Stückchen VBA-Code einsetzen.

Die entsprechende Anweisung dazu lautet:
Forms("Formularname").Move Links, Oben, Breite, Höhe
Die Angaben Links, Oben, Breite und Höhe sind in Twips anzugeben. Die Angabe des Wertes Links ist erforderlich, die restlichen Angaben sind Optional.

Die Maßeinheit Twip bedeutet 1/20 eines Inch-Punktes, was 1/1440 Inch (Zoll) entspricht.
Demnach ist 1mm gerundete 56,7 Twips.

Probiert es einfach mal aus. Wenn ihr aber zu große Werte eingebt, wird euer Formular nicht mehr zu sehen sein da es außerhalb dem sichtbaren Bereich „liegt“.

Ein anderer Anwendungsfall ist, dass ein Popup-Formular relativ zu einem anderen Formular oder einem Steuerelement auf einem anderen Fomular plaziert sein soll. Dies ist z.B. bei dem DatePicker der Fall, den ich in einem anderen Beitrag beschrieben habe.

Nachfolgend eine Prozedur die ein Popup-Formular öffnet und direkt unter einer Befehlsschaltfläche plaziert:
Read more »

OfficeFolders theme by Themocracy