Hallo Zusammen
Ich nutze Access 2007.
Ich versuche eine Vertragsdatenbank zu erstellen. Ziel ist es, die Verträge zu filtern und diese anzeigen zu lassen, die auslaufen, resp. den letzten Kündigungstermin haben.
In einer Abfrage möchte ich daher, eine Berechnung durchführen.
Felder:
Vertragsbeginn: 10.02.2011
Laufzeit (wird autom. verlängert): 150d
Kündigungsfrist vor autom. Verlängerung): 90d
Das heisst, ich muss die 150d zum Vertragsbeginn addieren bis ich im akutellen Jahr bin 2012. Dann müssen noch diese 90d abgezogen werden, damit ich den letzen möglichen Kündigungstermin habe.
Wie gehe ich da am besten vor?
Ich zähle die 150d zum Vertragsbeginn, bis ich das Jahr 2012 habe. Resultat wäre 02.10.2012
10.02.2011 10.07.2011 07.12.2011 05.05.2012 02.10.2012
|
Nun zähle ich noch 90d vom 02.10.2012 ab und das ergibt das Resultat 04.07.2012 was als letzt möglicher Kündigungstermin ergibt.
Kann mir jemand dazu einige Hinweise geben???
Vielen herzlichen Dank
Hallo,
addiere doch einfach die Differenz zwischen Laufzeit und letztem Kündigungstermin.
Im Beispiele also 150-90=60.
Also zum Vertragsbeginn 60 Tage addieren.
Tage kannst Du einfach dazuzählen.
Vertragsbeginn + 60
Hallo MzKIMu
Ja, stimmt das würde es schon einmal etwas einfacher machen. Aber es wird so falsch berechnet.
Ich würde dann immer vom letzten Kündigungstermin rechnen aber ich muss immer zuerst die 150d für die Vertragsverlängerung addieren. Wenn ich beide Rechnungsarten durchführe, erhalte ich unterschiedlich Daten...
Gibt es evt. via SQL eine Lösung?
Addiere 150 (Laufzeit) zum Vertragsbeginn und ziehe immer 90 (Kündigungsfrist) ab, bis das Datum grösser als heute ist...?
Hallo,
ZitatNun zähle ich noch 90d vom 02.10.2012 ab und das ergibt das Resultat 04.07.2012
soll das wirklich so stimmen??
Gruß Oma
Hallo Oma
Was meinst du stimmt nicht? Die Berechnung 02.10.2012 - 90 = 04.07.2012??
Müsste eigentlich korrekt sein (90d = 3 Monate)...
Hallo,
sorry, habe das mit etwas falsch verstanden. Ein Lösung wäre eine kleine Funktion:
Public Function DatumK(DatumBeginn As Date, LZ As Long, Frist As Long) As Date
DatumK = DateAdd("d", LZ, DatumBeginn)
Do While DatumK < Date
LZ = LZ + LZ
DatumK = DateAdd("d", LZ, DatumBeginn)
Loop
DatumK = DateAdd("d", -Frist, DatumK)
End Function
und damit in einer Abfrage:
Kuendigung: DatumK([DatumVertrag];150;90)
Gruß Oma
oh wow... Besten Dank Oma!
Da ich kein Access Pro bin brauch ich noch einige Hinweise.
Also ich erstelle eine Abfrage die heisst Kuendigung.
In der Abfrage habe ich diverse Felder unteranderem auch das Feld DatumVertrag.
Dann erstelle ich ein neues Feld welches wie folgt heisst: DatumK([DatumVertrag];150;90)
(150 und 90 können je nach Vertrag noch variieren. Deshalb verweis ich dann besser auch auf Felder und nicht fix auf eine Zahl).
Wo kann ich nun die Funktion noch hinterlegen in der Abfrage? Mit Alt+F11 komme ich zum VisualBasic Explorer aber ich muss es ja spezifisch einem Feld hinterlegen??
Vielen Dank
Hallo,
du musst in deiner DB in ein beliebiges Modul (oder in ein neu angelegtesModul) die Funktion einfügen.
Dann kannst du in einer Abfrage ein berechnetes Feld einfügen --> K: DatumK([DatumVertrag];DeinFeldname_Laufzeit;DeinFeldname_Frist)
Im Aufruf der Funktion musst du also deine Feldnamen für die Größen 150 und 90 einsetzen.
Gruß Oma
Super Sache, die Berechnung funktioniert.
Es hat aber noch einen Haken.
VertragsDatum: 12.07.2010
Laufzeit: 150
Frist: 90
Er rechnet korrekt vermutlich bis zum Datum 03.03.2012 (VertragsDatum immer + Laufzeit bis ins aktuelle Jahr 2012).
Dann werden korrekt noch 90d abgezogen (Frist) dann ergibt das aber ein Datum 04.12.2011 (also bereits Vergangenheit).
Es muss also noch ein Check eingefügt werden, dass nach Abzug der Frist das Datum grösser als heute ist ansonsten muss noch eine zusätzliche Laufzeit addiert werden...
Hallo,
jo, dass muss auch bedacht werden, teste mal:
Public Function DatumK(DatumBeginn As Date, LZ As Long, Frist As Long) As Date
Dim K As Long
DatumK = DateAdd("d", LZ, DatumBeginn)
Do While DatumK < Date
K = K + LZ
DatumK = DateAdd("d", K, DatumBeginn)
Loop
DatumK = DateAdd("d", -Frist, DatumK)
K = 0
Do While DatumK < Date
DatumK = DateAdd("d", LZ, DatumK)
K = K + LZ
Loop
End Function
Gruß Oma
scheint so wunderbar zu funktionieren....
Vielen herzlichen Dank Oma!
::)
Hallo Zusammen
Ich muss dieses Thema nochmals kurz aufgreifen. Es funktioniert alles wunderbar bis auf eine Ausnahme.
Wenn ich keine Laufzeit (LZ) habe und eine 0 eingebe "hängt" sich Access auf. Deshalb habe ich eine Gültigkeitsregel hinterlegt: <>0 Oder Ist Null.
So stürzt Access nicht ab, gibt aber im Feld einen #Fehler aus.
Ist es möglich zusätzlich noch hinzuzufügen, dass wenn das Feld LZ leer ist, dann mache keine Berechnung oder gib einen Text aus??
Vielen herzlichen Dank
Hallo,
evt. eine einfache Überprüfung von LZ in der Funktion:
Public Function DatumK(DatumBeginn As Date, LZ As Long, Frist As Long) As Date
If LZ <> 0 Then
Dim K As Long
DatumK = DateAdd("d", LZ, DatumBeginn)
Do While DatumK < Date
K = K + LZ
DatumK = DateAdd("d", K, DatumBeginn)
Loop
DatumK = DateAdd("d", -Frist, DatumK)
K = 0
Do While DatumK < Date
DatumK = DateAdd("d", LZ, DatumK)
K = K + LZ
Loop
End If
End Function
Gruß Oma
Hallo Oma
Vielen herzlichen Dank...
Es funktioniert! Wenn ich 0 bei der Laufzeit angebe wird einfach 00:00:00 ausgegeben.
Somit ist sofort ersichtlich, dass hier keine fixe Laufzeit vorliegt.
Besten Dank