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

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

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:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2006.

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

Zusammenfassung

Ermitteln Sie die nächsten Kündigungszeitpunkte zu bestehenden Vertragsdaten

Techniken

VBA

Voraussetzungen

Access 2000 oder höher

Beispieldatei

Kuendigungsfristen.mdb

Shortlink

421

Kündigungsfristen berechnen

André Minhorst, Duisburg

Wer Verträge oder sonstige Objekte in einer Datenbank speichert, möchte gegebenenfalls auch einmal die möglichen Kündigungstermine ermitteln. Und das ist gar nicht so einfach: Schon das Erfassen der relevanten Vertragsdaten hat es in sich, aber das Programmieren einer Funktion zum Ermitteln des nächstmöglichen Kündigungstermins ist eine echte Herausforderung.

Der Anlass für diesen Beitrag ist eigentlich die ebenfalls in dieser Ausgabe vorgestellte Vertragsverwaltung, aber das Ermitteln von Kündigungsterminen ist durchaus auch für andere Anwendungen interessant – und das nicht nur für Unternehmen, sondern auch oder gerade für Privatpersonen.

Oder haben Sie sich noch nie geärgert, wenn Sie wieder einmal den Kündigungstermin für die Mitgliedschaft im Fitness-Studio oder für das Abo der nicht mehr benötigten Fernsehzeitung verpasst haben?

Vertragseigenschaften

Das Berechnen einer Kündigungsfrist erfordert zunächst das Vorhandensein folgender Eigenschaften:

  • Vertragsbeginn: Datum, ab dem der Vertrag gültig ist
  • Laufzeit: Laufzeit des Vertrags in Monaten
  • Mögliches Vertragsende: Zeitpunkt, zu dem mit einer gegebenenfalls vorhandenen Kündigungsfrist gekündigt wird: „Monatsbeginn“, „Monatsende“, „Quartalsbeginn“, „Quartalsende“, „Jahresbeginn“, „Jahresende“, „abhängig von Vertragsbeginn und Laufzeit“
  • Kündigungsfrist: Zeitraum, der zwischen Aussprechen der Kündigung und dem nächstmöglichen Vertragsende liegen muss
  • Laufzeitverlängerung: Zeitraum in Monaten, um den sich der Vertrag verlängert, wenn er nicht gekündigt wird

Verträge auf Eigenschaften abbilden

Mit diesen fünf Eigenschaften lassen sich alle herkömmlichen Varianten von Vertragslaufzeit/Kündigung beschreiben. Beim Vertragsbeginn gibt es keinen Spielraum: Der ist definitiv für jeden Vertrag vorhanden.

Die Laufzeit wird üblicherweise in Monaten angegeben. In manchen Fällen enthält der Vertrag auch ein konkretes Vertragsende. Beides lässt sich mit der Laufzeit und dem möglichen Vertragsende beschreiben: Ein Vertrag, der vom 15.1.2006 an genau ein Jahr laufen soll, endet am 15.1.2007; die Laufzeit beträgt entsprechend 12 Monate und das mögliche Vertragsende hängt vom Vertragsbeginn ab.

Autoversicherungen enden am 31.12. eines Jahres, also sähen die passenden Vertragseigenschaften so aus: Der Vertragsbeginn ist irrelevant, die Laufzeit auch, aber als mögliches Vertragsende geben Sie das Ende des Jahres an.

Die Versicherung verlängert sich jeweils um ein Jahr, wenn Sie nicht einen Monat vor Ablauf der Versicherung kündigen; dementsprechend lässt sich das auch mit den oben beschriebenen Eigenschaften darstellen: Die Kündidungsfrist beträgt 1 (ein Monat) und die Laufzeitverlängerung 12 (zwölf Monate beziehungsweise ein Jahr).

Wenn ein Vertrag nur ein Jahr vom Vertragsbeginn an laufen soll, beträgt der Wert der Laufzeit 12 (zwölf Monate) und das mögliche Vertragsende „abhängig von Vertragsbeginn und Laufzeit“. Die Kündigungsfrist und die Laufzeitverlängerung betragen beide 0 (0 Monate).

Ein Vertrag, der mit zwei Monaten Kündigungsfrist zum Ersten eines Monats gekündigt werden kann, kann so beschrieben werden: Laufzeit ein Monat, mögliches Vertragsende „Monatsbeginn“, Kündigungsfrist zwei Monate, Laufzeitverlängerung ein Monat.

Denkbar wäre aber auch folgende Schreibweise: Der Vertrag ist nicht befristet (Laufzeit 0 Monate), mögliches Vertragsende ist der „Monatsbeginn“, die Kündigungsfrist beträgt zwei Monate und die Laufzeitverlängerung ebenfalls 0 Monate.

Kündigungsfristen

Bezüglich der Kündigungsfristen ist Folgendes zu beachten:

Verträge mit einer angegebenen Laufzeit und einer Laufzeitverlängerung von 0 Monaten haben keinen Kündigungszeitpunkt, da sie nicht gekündigt werden können.

Verträge mit unbefristeter Laufzeit (Laufzeit ist 0) und einer Laufzeitverlängerung von 0 Monaten können jeweils mit der angegebenen Kündigungsfrist zum angegebenen Kündigungszeitpunkt gekündigt werden (etwa zwei Monate zum Jahresende).

Verträge mit unbefristeter Laufzeit, aber einer Laufzeitverlängerung von x Monaten können jeweils mit der angegebenen Kündigungsfrist zu einem Vielfachen von x Monaten nach Vertragsbeginn gekündigt werden (Beispiel: Laufzeitverlängerung beträgt zwei Monate, Kündigung kann alle zwei Monate unter Berücksichtigung der angegebenen Kündigungsfrist gekündigt werden).

Funktion zum Berechnen des nächsten Kündigungszeitpunktes

Nun wäre dies kein Fachmagazin für Datenbankentwicklung, wenn wir diese Informationen nicht in einer Tabelle abbilden und eine Funktion vorstellen würden, die für alle Fälle den nächstmöglichen Kündigungszeitpunkt ermittelt.

Was das Datenmodell angeht, finden Sie alle notwendigen Informationen im Beitrag zur Musterlösung Vertragsverwaltung [1]. Der vorliegende Beitrag kümmert sich ausschließlich um die Berechnung des Kündigungszeitpunktes - und das in Form einer passenden VBA-Funktion.

Die nachfolgend beschriebene Funktion verlangt nach den weiter oben erläuterten Parametern mit folgenden Bezeichnungen:

  • dateAktuellesDatum: Erwartet das für die Berechnung des nächsten Kündigungszeitpunkts maßgebliche Datum.
  • dateVertragsstart: Startdatum des Vertrags
  • intLaufzeit: Laufzeit in Monaten
  • lngKuendigungszeitpunkt: Art des Kündigungszeitpunktes. Erwartet einen der Werte der Enumeration eKuendigungszeitpunkt (s. Listing 1).
  • intKuendigungsfrist: Kündigungsfrist in Monaten
  • intLaufzeitverlaengerung: Verlängerung der Laufzeit nach nicht erfolgter Kündigung in Monaten

Listing 1: Diese Enumeration enthält die unterschiedlichen Kündigungszeitpunkte.

Public Enum eKuendigungszeitpunkt

     eKuendigungszeitpunkt_Startdatum = 1

     eKuendigungszeitpunkt_Monatsende = 2

     eKuendigungszeitpunkt_Quartalsende = 3

     eKuendigungszeitpunkt_Jahresende = 4

     eKuendigungszeitpunkt_Monatsbeginn = 5

     eKuendigungszeitpunkt_Quartalsbeginn = 6

     eKuendigungszeitpunkt_Jahresbeginn = 7

End Enum

Die Ermittlung des nächsten Kündigungszeitpunkts ist entsprechend der Vielfalt der möglichen Konfigurationen der Vertragslaufzeiten und Kündigungsfristen relativ kompliziert. Genau genommen ist es noch nicht einmal die Berechnung, die die größten Probleme beim Erstellen einer solchen Funktion macht, sondern das Ermitteln der möglichen Fälle und der unterschiedlichen Abläufe der Funktion.

Als große Hilfe für solche Fälle erweist es sich immer wieder, automatisiert zu testen. Nicht immer muss man dabei direkt zu einem Unit-Testing-Framework greifen – im Falle einer einzigen Funktion kann man die Tests auch einfach in eine Routine schreiben und die Ergebnisse im Direktfenster ausgeben. In diesem Fall sieht das etwa wie in Listing 2 aus.

Listing 2: Testaufrufe der Funktion zum Ermitteln von Kündigungszeitpunkten

Public Sub KuendigungszeitpunktErmittelnTest()

     Debug.Print 1, NaechstenKuendigungszeitpunktErmitteln(„4.11.2006“, „23.5.2005“, 24, _
eKuendigungszeitpunkt_Laufzeitende, 3, 12) = „23.2.2007“

     Debug.Print 2, NaechstenKuendigungszeitpunktErmitteln(„4.11.2006“, „12.6.2006“, 12, _
eKuendigungszeitpunkt_Laufzeitende, 1, 12) = „12.5.2007“

     Debug.Print 3, NaechstenKuendigungszeitpunktErmitteln(„4.11.2006“, „1.7.2003“, 0, _
eKuendigungszeitpunkt_Monatsende, 3, 0) = „30.11.2006“

     Debug.Print 4, NaechstenKuendigungszeitpunktErmitteln(„4.11.2006“, „1.1.2005“, 12, _
eKuendigungszeitpunkt_Monatsende, 1, 6) = „31.12.2006“

     ‚viele weitere Tests

End Sub

Die Tests sind so aufgebaut, dass die Funktion jeweils mit einer Kombination der verschiedenen Parameter aufgerufen wird und die Routine das Ergebnis mit dem erwarteten Ergebnis vergleicht. Das Resultat dieses Vergleichstests wird im Direktfenster ausgegeben – natürlich unter Angabe einer den Test repräsentierenden Zahl.

Der große Vorteil hierbei ist, dass Sie Schritt für Schritt neue Anforderungen stellen und neuen Code zur Funktion hinzufügen, der diese Anforderungen erfüllen soll. Gleichzeitig testen Sie bei jedem Test und – besonders wichtig – nach jeder Änderung der Funktion alle bisher aufgeführten Konfigurationen mit. Die Tests für das Erstellen der Funktion umfassen so knapp 100 Aufrufe, und damit sind sicher noch lange nicht alle möglichen Fälle (und damit potenzielle Fehlerquellen) abgedeckt.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

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:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.