Belegverwaltung

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.access-im-unternehmen.de (Shortlink 279).

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 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.

    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).

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar