Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2005.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Belege mit Barcodes verwalten

Christoph Spielmann, Düsseldorf

Fast jede monetäre Transaktion zieht heutzutage ein entsprechendes Stück Papier nach sich, sei es beim Kauf einer Digitalkamera oder beim Mittagessen bei Ihrem Lieblingsitaliener. Die hier vorgestellte Musterlösung stellt Ihnen eine Möglichkeit zur Verfügung, diese Belege zu verwalten und schnell wieder aufzufinden - falls beispielsweise die Digitalkamera einmal einen Defekt aufweist und Sie die Garantie in Anspruch nehmen möchten.

Hinweis

Die Musterlösung zu diesem Beitrag heißt Belegverwaltung00.mdb und funktioniert mit Access 2000 und höher. Sie finden die Datenbank und die benötigte Schriftart Barcode.ttf auf der Heft-CD oder im Internet unter http://www.ac
cess-im-unternehmen.de (Shortlink 279). (

Funktionsweise der Lösung

Die hier vorgestellte Lösung verfolgt das Prinzip "Chaos mit Ordnung". Jedes Dokument erhält eine eindeutige Nummer und wird danach auf einen Stapel gelegt. Die einzelnen Dokumente sind innerhalb des Stapels also in der Reihe des Eingangs abgelegt. Um nun schnell ein bestimmtes Dokument auffinden zu können, werden die einzelnen Dokumente mit einer Datenbank verwaltet, deren Aufbau Sie in diesem Artikel kennen lernen werden.

Die Datenstruktur

Die Datenstruktur der vorgestellten Lösung besteht aus den vier Tabellen tblBelege, tblKategorien, tblAdressen und tblSeiten. Die Tabelle tblBelege speichert die einzelnen Dokumente. Sie enthält die Felder aus Tab. 1.

Falls Sie Besitzer eines Scanners sind, können Sie das komplette Dokument als Anlage in dem Feld Anlage als OLE-Objekt hinterlegen.

Feldname

Beschreibung

BelegNr

AutoWert-Primärschlüssel

AdresseNr

Long Integer-Fremdschlüssel zur Tabelle tblAdressen

KategorieNr

Long Integer-Fremdschlüssel zur Tabelle tblAdressen

Anlagedatum

Datum, an dem der Datensatz angelegt wurde

Belegdatum

Datum des Belegs (zum Beispiel das Rechnungsdatum)

Kurzbezeichnung

Kurze Beschreibung zum Beleg (etwa "Digitalkamera")

Beschreibung

Ausführliche Beschreibung, falls erforderlich

Seitenanzahl

Anzahl der Seiten

IstSteuerrelevant

Information darüber, ob der Beleg steuerlich geltend gemacht werden soll/muss

Anlage

Dokument als OLE-Objekt

Endbetrag

Endbetrag des Belegs

MwStSatz

Zugrunde liegender Mehrwertsteuersatz

Tab. 1: Felder der Tabelle tblBelege

Um auch den Empfänger und den Absender eines Belegs hinterlegen zu können und nicht jedes Mal die Adresse erfassen zu müssen, stellt die Tabelle tblAdressen die Informationen über Name, Straße, PLZ, Ort und Telefon zur Verfügung. Um auch den Empfänger und den Absender eines Belegs hinterlegen zu können und nicht jedes Mal die Adresse erfassen zu müssen, stellt die Tabelle tblAdressen die Informationen über Name, Straße, PLZ, Ort und Telefon zur Verfügung.

Ordnung in die einzelnen Dokumente bringt die Tabelle tblKategorien, die lediglich die zwei Felder KategorieNr und Kategorie enthält. Durch die Verknüpfung zur Tabelle tblBelege kann jedes Dokument auf einen virtuellen Stapel wie beispielsweise "Handy-Abrechnung", "Bewirtung" oder "Kreditkartenabrechnung" gelegt werden. Die Verknüpfung der Tabellen entnehmen Sie Abb. 1.

Abb. 1: Das ER-Diagramm

Um die spätere Erstellung von Formularen zu vereinfachen, sind die beiden Felder AdresseNr und KategorieNr der Tabelle tblBelege als Nachschlagefelder definiert. Hierzu gehen Sie wie folgt vor:

  • Öffnen Sie die Tabelle tblBelege in der Entwurfsansicht und positionieren Sie die Einfügemarke auf das Feld AdresseNr.
  • Wechseln Sie unterhalb der Tabelle zum Register Nachschlagen.
  • Wählen Sie unter Steuerelement anzeigen die Einstellung Kombinationsfeld aus.
  • Geben Sie unter Datensatzherkunft die folgende Abfrage an: SELECT Name, AdresseNr FROM tblAdressen ORDER BY Name;
  • Ändern Sie die Eigenschaften Gebundene Spalte und Spaltenanzahl auf den Wert 2.
  • Geben Sie als Spaltenbreite den Wert 5cm;0cm ein. (
  • Auf die gleiche Weise definieren Sie für das Feld KategorieNr ein Nachschlagefeld. Verwenden Sie in diesem Fall jedoch die folgende Abfrage:

    SELECT Kategorie, KategorieNr FROM tblKategorien ORDER BY Kategorie;

    Speichern Sie anschließend die fertige Tabelle.

    Dokumente nummerieren

    Ein wesentlicher Bestandteil der hier vorgestellten Lösung ist, dass alle Dokumente mit einer eindeutigen Nummer versehen werden. Um die Nummer nicht von Hand auf das Dokument schreiben zu müssen, soll diese Aufgabe von Ihrem Drucker erledigt werden. Hierzu werden die Belege einfach in den Papiereinzug gelegt und der Drucker versieht diese mit der Nummer.

    Damit die Nummer immer sichtbar ist, wird sie in jeder Ecke und zudem noch invertiert ausgegeben. Zusätzlich zu der Nummer soll ein Barcode mit ausgegeben werden. Falls Sie also einen Barcode-Scanner haben sollten, können Sie einzelne Dokumente sehr schnell durch einfaches Scannen des Barcodes zuordnen.

    Den Ausdruck der Nummer und des Barcodes erledigt ein Berichts namens rptIndex. Der Bericht enthält im Seitenkopf und im Seitenfuß jeweils links und rechts zwei Text-Steuerelemente zur Ausgabe der Nummer und des Barcodes (s. Abb. 2).

    Falls Sie einen mehrseitigen Beleg haben, sollte die Nummer auf jeder Seite ausgegeben werden und idealerweise noch mit einer fortlaufenden Seitennummer versehen werden. Um diese zu realisieren, ist der Bericht an die Tabelle tblSeiten geknüpft. Diese Tabelle enthält nur eine einzelne Spalte namens SeiteNr. Damit für jeden Datensatz in der Tabelle tblSeiten eine Berichtsseite gedruckt wird, ist die Eigenschaft Neue Seite des Detailbereichs auf Vor Bereich eingestellt. Um nun eine bestimmte Anzahl Seiten zu drucken, muss die Tabelle tblSeiten zunächst mit der erforderlichen Anzahl Datensätze gefüllt werden. Dies erledigt die VBA-Prozedur SeitenErstellen (s. Quellcode 1).

    Abb. 2: Der Bericht rptIndex in der Entwurfsansicht.

    Die Prozedur erwartet als Parameter die Anzahl der gewünschten Seiten. Sie prüft zunächst, ob die Tabelle bereits mindestens die angegebene Anzahl an Datensätzen enthält. Sollte dies nicht der Fall sein, fügt sie die fehlenden Seiten hinzu. Der Bericht wird später mit einem Filterkriterium wie beispielsweise

    SeiteNr <= 10

    Sub SeitenErstellen(Anzahl As Integer)

        Dim i As Integer

        Dim MyRecordset As New ADODB.Recordset

        Dim AnzahlExistierendeSeiten As Long

        AnzahlExistierendeSeiten = DCount("SeiteNr", _
            "tblSeiten")

        If AnzahlExistierendeSeiten < Anzahl Then

            With MyRecordset

                .ActiveConnection = _
                    CurrentProject.Connection

                .LockType = adLockOptimistic

                .CursorLocation = adUseClient

                .Source = "tblSeiten"

                .Open

                For i = 1 To _
                    Anzahl - AnzahlExistierendeSeiten

                    .AddNew

                    !SeiteNr = AnzahlExistierendeSeiten + i

                    .Update

                Next i

            End With

        End If

    End Sub

    Quellcode 1

    geöffnet. Hierdurch stellt es kein Problem dar, wenn die Tabelle mehr Datensätze enthält, als für den Ausdruck erforderlich sind. Sie finden die fertige Prozedur im Modul modTools der Beispieldatenbank zu diesem Artikel. Wie bereits erwähnt, erfolgt der Ausdruck der Nummer und des Barcodes in allen vier Ecken jeder Seite. Um dies zu erreichen, platzieren Sie jeweils im Seitenkopf und im Seitenfuß insgesamt acht Textfelder. Vier davon sind für die Nummer, die anderen vier für die Barcodes reserviert.

    Damit die korrekte Nummer ausgegeben werden kann, muss der Bericht an die Tabelle tblBelege gebunden sein. Zusätzlich ist aber auch eine Bindung an die Tabelle tblSeiten erforderlich, um den Ausdruck mehrerer Seiten zu ermöglichen.

    Um dieses Problem zu lösen, fügen Sie der Datenquelle des Berichts einfach beide Tabellen hinzu, ohne diese zu verknüpfen (s. Abb. 3).

    Abb. 3: Die Datenquelle des Berichts besteht aus zwei nicht verknüpften Tabellen.

    Durch die fehlende Verknüpfung bildet Access einen "Cross-Join". Dies bedeutet, dass zu jedem Datensatz aus der Tabelle tblSeiten alle Datensätze aus der Tabelle tblBelege ausgegeben werden. Wenn jede Tabelle beispielsweise zehn Datensätze enthält, würde das Abfrageergebnis aus insgesamt 100 Datensätzen bestehen.

    Als Ergebnis der Abfrage reichen die beiden Felder SeiteNr und BelegNr aus. Beim Öffnen des Berichts muss nun lediglich noch die BelegNr entsprechend gefiltert werden.

    Ausgabe der Nummer

    Da zusätzlich zur Beleg-Nummer auch die Seitennummer ausgegeben werden soll, bietet sich die Definition eines Formats an. In dieser Lösung ist die Entscheidung auf das Format

    00000-0000

    gefallen, wobei der erste Teil vor dem Bindestrich die Belegnummer und der zweite Teil die Seitennummer darstellt. Die Formatierung übernimmt die VBA-Prozedur GetPageID, die Sie ebenfalls im Modul modTools der Beispieldatenbank finden:

    Public Function GetPageID(BelegNr As _
        Variant, SeiteNr As Variant) _
        As String

        GetPageID = Format(BelegNr, _
        "00000") + "-" + Format(SeiteNr, _
        "0000")

    End Function

    Die Prozedur erwartet als Parameter die Belegnummer und die aktuelle Seitennummer. Daraus bildet sie dann das vorgestellte Format.

    Zum Einsatz kommt die Prozedur in den vier Text-Steuerelementen, die zur Anzeige der Nummer reserviert sind. Hierzu tragen Sie den folgenden Ausdruck in die Steuerelementinhalt-Eigenschaft des Textfeldes ein:

    =GetPageID([BelegNr];[SeiteNr])

    Zusätzlich sollten Sie das Textfeld noch mit einer weißen Schriftfarbe und einem schwarzen Hintergrund formatieren. Durch diese invertierte Darstellung kann der Text später besser entziffert werden (s. Abb. 4).

    Abb. 4: Invertierte Formatierung des Textfeldes

    Abb. 5: Das Barcode-Textfeld

    Das Eintragen des Ausdrucks und die Formatierung wiederholen Sie für alle vier Textfelder.

    Ausgabe des Barcodes

    Die Ausgabe des Barcodes erfolgt direkt unterhalb der Belegnummer in einem weiteren Textfeld. Zur Darstellung des Barcodes kommt ein spezieller Font namens Barcode Universal zum Einsatz. Sie finden diesen Font auf der CD. Zur Installation des Fonts gehen Sie wie folgt vor:

  • Öffnen Sie die Systemsteuerung von Windows.
  • Öffnen Sie von hier aus den Ordner Schriftarten.
  • Ziehen Sie die Datei Barcode.tft von der CD in den Ordner Schriftarten. (
  • Der Font enthält lediglich drei Zeichen: Einen langen Strich, einen kurzen Strich sowie einen weißen Strich als Leerzeichen. Die drei Zeichen werden durch die Ziffern 0, 1 und 2 repräsentiert.

    Durch entsprechende Kombination dieser drei Zeichen lassen sich fast alle eindimensionalen Barcodes wie etwa Code39 oder EAN darstellen.

    Da die Seitennummer in unserem Fall einen Bindestrich - also ein Sonderzeichen - enthält, fällt die Wahl auf den Code39.

    Um den Barcode innerhalb des Textfeldes darzustellen, wählen Sie über die Schriftart-Eigenschaft des Textfeldes den Font Barcode Universal aus. Als Steuerelementinhalt-Eigenschaft geben Sie den folgenden Ausdruck ein (s. Abb. 5):

    =Barcode_Code39(GetPageID([BelegNr];[SeiteNr]))

    Die Ihnen bereits bekannte Funktion GetPageID erzeugt die fertig formatierte Seitennummer und gibt diese anschließend an die Funktion Barcode_Code39. Diese erzeugt daraus eine Folge von Nullen und Einsen, die bei Formatierung mit dem Font Barcode Universal einen Barcode ergeben.

    Sie finden die Prozedur im Modul Code39 der Beispieldatenbank.

    Abb. 6: Ein fertiger Barcode

    Damit der Barcode nicht zu klein dargestellt wird, erhöhen Sie die Schriftgröße abschließend mit Hilfe der Schriftgrad-Eigenschaft auf einen Wert von 35 (s. Abb. 6). Alle Einstellungen nehmen Sie wieder viermal vor.

    Erfassen eines
    neuen Belegs

    Um nun einen Beleg mit der Seitenindizierung zu versehen, müssen folgende Schritte durchgeführt werden:

    Anlegen eines neuen Datensatzes in der Tabelle tblBelege

    Abb. 7: Das Formular frmNeuerBeleg

    Abb. 8: Der Bericht in der Seitenvorschau

    Anlegen der erforderlichen Datensatzanzahl in der Tabelle tblSeiten

    Öffnen des Berichts rptIndex zum Ausdruck der Beleg- und Seitennummern

    Diese Aufgaben werden von dem Formular frmNeuerBeleg übernommen (s. Abb. 7). Das Formular basiert auf der Tabelle tblBelge. Damit nur die Erfassung neuer Datensätze möglich ist, ist die Eigenschaft Daten eingeben auf Ja eingestellt.

    Die OK-Schaltfläche löst die Ereignisprozedur aus Quellcode 2 aus.

    Zunächst wird die Anzahl der eingegebenen Seiten ermittelt und in der Variablen Anzahl zwischengespeichert. Anschließend wird der Datensatz gespeichert und die Tabelle tblSeiten mit der erforderlichen Anzahl an Datensätzen aufgefüllt.

    Die letzte Anweisung öffnet schließlich den Bericht in der Seitenvorschau. Mit einem Filter wird hierbei sowohl die Belegnummer als auch die Seitenanzahl eingeschränkt.

    Nachdem der Bericht in der Seitenvorschau (s. Abb. 8) angezeigt wird, kann der Benutzer den Beleg in den Drucker einlegen und den Ausdruck starten.

    Das Suchformular

    Um ein Dokument schnell wieder auffinden zu können, ist ein entsprechendes Suchformular erforderlich.

    Dieses trägt den Namen frmBelegsuche
    (s. Abb. 9).

    Private Sub btnOK_Click()

        On Error Resume Next

        Dim Anzahl As Integer

        Anzahl = CInt(Me!Seitenanzahl)

        DoCmd.RunCommand acCmdSaveRecord

        SeitenErstellen (Anzahl)

        DoCmd.OpenReport "rptIndex", acViewPreview, , "SeiteNr<=" & CStr(Anzahl) _
            & " AND DokumentNr=" + CStr(Me!DokumentNr)

    End Sub

    Quellcode 2

    Abb. 9: Das Formular zur Suche nach Belegen

    Das Formular besteht aus einem Haupt- und einem Unterformular. Im Hauptformular können über vier Felder Suchkriterien eingegeben werden. Nach einem Klick auch Suchen wird das Ergebnis im Unterformular angezeigt.

    Die vier Felder zur Eingabe der Suchkriterien tragen die Namen txtSuchBelegNr, cmbSuchAdresseNr, cmbSuchKategorieNr und txtSuchKurzbezeichnung. Die beiden Kombinationsfelder zur Auswahl der Kategorie und der Adresse sind zur Anzeige der Daten aus der jeweiligen Tabelle konfiguriert.

    Die Einstellungen entsprechen denen, die Sie bereits bei der Konfiguration der Nachschlagefelder zu Beginn dieses Artikels kennen gelernt haben.

    Die Schaltfläche Suchen ist mit der folgenden Ereignisprozedur aus Quellcode 3 verknüpft. Im ersten Schritt wird die eingegebene Belegnummer ermittelt und in der Variablen BelegNr zwischengespeichert. Die Funktion GetBelegNr (s. Quellcode 4) lernen Sie gleich noch kennen.

    Private Sub btnSuchen_Click()

        Dim BelegNr As Long

        BelegNr = GetBelegNr(Me.txtSuchBelegNr)

        Dim SQL As String

        SQL = "SELECT * FROM tblBelege WHERE 1=1"

        If BelegNr <> 0 Then SQL = SQL & " AND BelegNr=" & BelegNr

        If Not IsNull(Me.cmbSuchAdresseNr) Then _
            SQL = SQL & " AND AdresseNr=" & Me.cmbSuchAdresseNr

        If Not IsNull(Me.cmbSuchKategorieNr) Then _
            SQL = SQL & " AND KategorieNr=" & Me.cmbSuchKategorieNr

        If Not IsNull(Me.txtSuchKurzbezeichnung) Then _
            SQL = SQL & " AND Kurzbezeichnung LIKE '*" & Me.txtSuchKurzbezeichnung & "*'"

        SQL = SQL & " ORDER BY Belegdatum"

        Me.Sub.Form.RecordSource = SQL

        Me.Sub.Form.Requery

    End Sub

    Quellcode 3

    Public Function GetBelegNr(Eingabe As Variant) As Long

        On Error GoTo Fehler

        If IsNull(Eingabe) Then

            GetBelegNr = 0

        Else

            Dim pos As Integer

            pos = InStr(1, Eingabe, "-")

            If pos = 0 Then

                GetBelegNr = CInt(Eingabe)

            Else

                GetBelegNr = CInt(Left(Eingabe, pos - 1))

            End If

        End If

        Exit Function

    Fehler:

            GetBelegNr = 0

            Exit Function

    End Function

    Quellcode 4

    Anschließend wird eine SQL-Abfrage zusammengestellt. Hierbei wird pro Kriterium geprüft, ob ein Wert vorhanden ist. Sollte dies der Fall sein, wird der entsprechende Filter-Ausdruck mittels AND-Schlüsselwort hinzugefügt. Abschließend erfolgt noch eine Sortierung nach dem Belegdatum.

    Die fertige SQL-Anweisung wird schließlich dem Unterformular als Datensatzherkunft übergeben.

    Falls Ihnen ein Barcode-Lesegerät zur Verfügung steht und Sie den Barcode eines Belegs scannen, wird dieser inklusive Seitennummer eingelesen.

    Die Funktion GetBelegNr trennt die beiden Teile voneinander, sodass eine Suche nach der Belegnummer erfolgen kann. Sie hat den Aufbau aus Quellcode 4.

    Abb. 10: Das Formular frmBelege

    Zuerst wird geprüft, ob überhaupt eine Eingabe vom Benutzer gemacht wurde; wenn nicht, gibt die Funktion den Wert 0 zurück und beendet die Abarbeitung.

    Anschließend ermittelt die InStr-Funktion die Position des Bindestrichs. Falls die Positionsermittlung erfolgreich ist, wird der erste Teil abgeschnitten und als Funktionsergebnis zurückgegeben. Wenn kein Bindestrich vorhanden ist, wird die komplette Eingabe in eine Zahl umgewandelt und zurückgegeben. Zu guter Letzt sorgt noch eine Fehlerbehandlungsroutine dafür, dass bei unsinnigen Eingaben wie zum Beispiel Texten der Wert 0 zurückgegeben wird.

    Detailansicht von Dokumenten

    In der Ergebnisliste werden nicht alle Informationen zu den einzelnen Dokumenten dargestellt. Um alle Details zu einem bestimmten Dokument anzuzeigen, steht das Formular frmBelege zur Verfügung. Hierbei handelt es sich um ein einfaches Formular, das mit dem Formular-Assistenten erstellt wurde (s. Abb. 10).

    Das Öffnen des Formulars erfolgt von dem Formular frmBelegsuche-Sub aus, das als Unterformular in dem Suchformular platziert ist. Die Beim Doppelklicken-Ereigniseigenschaft ist hierbei mit der folgenden VBA-Prozedur verknüpft:

    Private Sub BelegNr_DblClick(Cancel _
        As Integer)

        DoCmd.OpenForm "frmBelege", _
        acNormal, , "BelegNr=" _
        & CStr(Me!BelegNr)

    End Sub

    Die Prozedur öffnet das Formular frmBelege und filtert hierbei den gewünschten Datensatz heraus.

    Zusammenfassung und Ausblick

    Die hier vorgestellte Lösung kann noch weiter optimiert werden, indem beispielsweise ein Scanner eingesetzt wird, der automatisch PDF-Dateien erzeugt und diese auch gleich per OCR in Text umwandelt. Idealerweise wird hierbei auch die Indexnummer in Text umgewandelt, sodass Sie diese beispielsweise im Rahmen der Volltextsuche verwenden können.

    Wenn Ihnen der Aufdruck der Nummern mit Hilfe des Druckers zu umständlich ist, können Sie alternativ auch einen Paginierstempel einsetzen. Dieser hat ein Zählwerk, womit bei jedem Stempelvorgang weitergezählt wird.

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Download

    Download

    Die .zip-Datei enthält folgende Dateien:

    AIU_CodeHistory.zip

    Beispieldateien downloaden

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.