Hallo Ralf,
ich habe mir Deine Lösung noch einmal angeschaut und versucht, bei mir einzubinden. Hier erstmal der Code, den ich auf meine Datenbank (Access 2003) angepasst habe:
Option Compare Database
Option Explicit
Public Sub calcMonatsauslastung()
Dim rec1 As New ADODB.Recordset
Dim rec2 As New ADODB.Recordset
Dim mVon As Long
Dim mBis As Long
Dim mAkt As Long
Dim mAnz As Long
Dim dVon As Long
Dim dBis As Long
Dim dVonAnz As Long
Dim dBisAnz As Long
Dim d As Date
'
' Hier im Bsp wird alles neu berechnet! Das kann man optimieren...
'
DoCmd.RunSQL "DELETE * FROM Monatsauslastungen"
'
' Öffnen der Tabellen
'
rec1.Open "SELECT * from [Disposition der Fahrzeuge]", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
rec2.Open "SELECT * FROM Monatsauslastungen", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
While Not rec1.EOF
'
' ein paar Variablen initialisieren (eventuell ein paar zu viele ;-)
'
mAnz = DateDiff("d", CDate("01." & Format(rec1!Übergabe, "mm.yyyy")), CDate("01." & Format(DateAdd("m", 1, rec1!Übergabe), "mm.yyyy")))
dVonAnz = DateDiff("d", CDate("01." & Format(rec1!Übergabe, "mm.yyyy")), rec1!Übergabe) + 1
dBisAnz = DateDiff("d", CDate("01." & Format(rec1!Rückgabe, "mm.yyyy")), rec1!Rückgabe) + 1
mVon = Format(rec1!Übergabe, "yyyymm")
mBis = Format(rec1!Rückgabe, "yyyymm")
dVon = Format(rec1!Übergabe, "dd")
dBis = Format(rec1!Rückgabe, "dd")
'
' Buchung innerhalb eines Monats
'
If mVon = mBis Then
rec2.AddNew
rec2!buchungID = rec1!id
rec2!Monat = mVon
rec2!Auslastung = (dBis - dVon + 1) / mAnz
rec2.Update
'
' Buchung über Monatsgrenze
'
Else
'
' erster Buchungsmonat
'
rec2.AddNew
rec2!buchungID = rec1!id
rec2!Monat = mVon
rec2!Auslastung = dVon / mAnz
rec2.Update
'
' Monate dazwischen sind immer zu 100% ausgelastet
'
d = DateAdd("m", 1, CDate("01." & Format(rec1!Übergabe, "mm.yyyy")))
While mBis > Format(d, "yyyymm")
rec2.AddNew
rec2!buchungID = rec1!id
rec2!Monat = Format(d, "yyyymm")
rec2!Auslastung = 1
rec2.Update
d = DateAdd("m", 1, d)
Wend
'
' letzter Buchungsmonat
'
rec2.AddNew
rec2!buchungID = rec1!id
rec2!Monat = mBis
mAnz = DateDiff("d", CDate("01." & Format(rec1!Rückgabe, "mm.yyyy")), CDate("01." & Format(DateAdd("m", 1, rec1!Rückgabe), "mm.yyyy")))
rec2!Auslastung = dBis / mAnz
rec2.Update
End If
rec1.MoveNext
Wend
'
' schließen der Tabellen (nicht vergessen!)
'
rec1.Close
rec2.Close
End Sub
Jetzt zu meinen Fragen:
1) Oben schreibst Du, dass in der Tabelle "Buchungen" (Disposition der Fahrzeuge) folgender Wert gesetzt ist:
FarzeugID longint
In meiner Tabelle "Disposition der Fahrzeuge" ist die ID für da jeweilige Fahrzeug allerdings ein Textfeld, da das Feld "Kennzeichen" im Format "A-BC 123" gefüllt ist. Kommt es da zu irgendwelchen Problemen? Die Tabelle "Monatsauslastungen wird gefüllt, allerdings wird im Feld "BuchungID" nicht das Kennzeichen aufgeführt - da sollte es doch hingehören, oder?
2) Wenn ich das Modul ausführe, bleibt es immer mit einer Fehlermeldung bei den Einträgen mit "Rückgabe" hängen. Also z.B. hier:
dBisAnz = DateDiff("d", CDate("01." & Format(rec1!Rückgabe, "mm.yyyy")), rec1!Rückgabe) + 1
Der Fehler lautet: Laufzeitfehler 94: Unzulässige Verwendung von Null
Was hat es hiermit auf sich?
Vielen Dank noch einmal für Deine Hilfe! Die Auslastungsberechnung sieht schon mal super aus! Ich bin sicher, dass Du mich bald ins Ziel "geschleppt" hast :)
VLG