Fuhrpark --> Auslastung von Fahrzeugen
Hallo Leute,
ich habe eine Accessdatenbank, mit der ich eine Art Fuhrparkmanagement betreibe. Hierbei werden verschiedene Fahrzeuge hinterlegt, deren Einsatz dokumentiert, etc. Unter anderem gibt es eine Tabelle „Fahrzeugdisposition“, in der die Verleihdauer der Fahrzeuge eingetragen wird (Spalte „Übergabe“ und „Rückgabe“ im Format TT.MM.JJJJ hh:mm:ss).
Es besteht jetzt die Anforderung, eine Abfrage zu erstellen, um die Auslastung der einzelnen Fahrzeuge darzustellen. Ich habe dafür ein wenig gebastelt und folgendes Format für eine Abfrage hingekriegt:
Jahr | Kennzeichen | Januar | Februar | März | …
2008 | M – AB 123 | 100% | 80% | …
2007 | M – AB 123 | 99% | 100% | …
2008 | M – CD 456 | 80% | …
Die Berechnung der prozentualen Auslastung erfolgt auf Basis der ausgeliehenen Zeit. Und hier liegt genau das Problem: wie schaffe ich es, z.B. bei einer Verleihung vom 06.01.2009 bis zum 25.04.2009 das Auto für die Monate Februar und März als komplett ausgelastet darzustellen? Vielleicht mit einer Art Hilfstabelle, wo pro Fahrzeug und Monat ein Wert eingetragen wird, der als Grundlage für die prozentuale Berechnung dient? Also z.B. „1“ wenn ein Monat komplett gebucht wurde, „0,5“ wenn das Fahrzeug nur einen halben Monat lang gebucht ist, etc.? Nur wie lässt sich das hinkriegen??
Vielen Dank im Voraus für eure Hilfe, ich bin hier echt am Verzweifeln!
LG
Antwort schreiben
Antwort 1 von RaHi vom 07.01.2021, 19:55 Options
Hallo Sandra2910,
der Ansatz mit der Hilfstabelle ist richtig. Ich gehe mal davon aus, dass die Auslastung (Prozentual) folgendermaßen ausgerechnet wird:
1. Resttage des Anfangsmonats / Anzahl der Tage des Monats
2. Buchungstage des Endemonats / Anzahl des Monats
wobei das auch der gleiche Monat sein könnte.
Beim Speichern des Datensatzes musst du eine Schleife über die Monate durchlaufen und die Auslastung entsprechend berechnen. Das Ganze benötigt ein wenig VBA-Code. Da kommst du nicht drum herum.
Noch ein Tipp. Wenn schon eine Zwischentabelle, dann würde ich direkt auf die Tage gehen, da du keine Aussage mehr treffen kannst ob die 0,5er Auslastung am Anfang, am Ende oder irgendwo zwischendrin war. Hängt natürlich ein wenig auch von der fachlichen Anforderung ab.
Bist du mit VBA vertraut?
Gruß
Ralf
Antwort 2 von Sandra2910 vom 08.01.2021, 09:39 Options
Hallo Ralf,
danke für die schnelle Antwort. Mit VBA bin ich nur bedingt vertraut - "helloworld" sagt mir was, danach wird es aber eher düster... :)
Ob die Auslastung am Anfang, Ende oder Mitte eines Monats ist, ist nicht von Belang. Hauptsache, man kann pro Monat sehen, wie stark ein Fahrzeug ausgelastet ist.
Werde mal versuchen, mich dran zu setzen...
VLG
Antwort 3 von RaHi vom 08.01.2021, 18:18 Options
Hallo Sandra2910,
falls du Tipps brauchst oder nicht weiter kommst, melde dich einfach...
Gruß
Ralf
Antwort 4 von lorf55 vom 08.01.2021, 22:17 Options
Die verstrichenen Tage kriegt man mit DatDiff raus:
TageVerstrichen: DatDiff("y";[Verleih]![von];[Verleih]![bis])
den Tag mit
TagVon: Tag([Verleih]![von])
den Monat mit
MonatVon: Monat([Verleih]![von]).
Eigentlich braucht man nur von den verstrichenen Tage die Tage der folgenden Monate abziehen, bis die verstrichenen aufgebraucht sind.
Aber das hast du auch sicher selbst gewusst.
Genauer weiß ich es im Moment auch nicht.
Gruß
lorf
Antwort 5 von lorf55 vom 12.01.2021, 19:37 Options
Ich habe mal noch ein bischen geforscht und herausgekommen ist eine Mischung aus Abfrage und VBA.
Man kann nämlich auch eigene Funktionen in einer Abfrage unterbringen, die Werte aus dieser Abfrage verarbeitet.
Zuerst die Funktion:
Option Compare Database
Option Base 1
Function Monatprozent(AusleihTageGesamt As Integer, _
Startdatum As Date, Enddatum As Date, MonatAktuell As Integer)
Dim MonTage
MonTage = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
If (MonatAktuell < Month(Startdatum)) Then Exit Function
If (MonatAktuell > Month(Enddatum)) Then Exit Function
If Month(Enddatum) < Month(Startdatum) Then Exit Function 'Fehler
If AusleihTageGesamt = 0 Then Exit Function
If (Month(Startdatum) = Month(Enddatum)) Then 'Start der Ausleihe
AusleihtageImMonat = (Day(Enddatum) - Day(Startdatum))
Else
If (Month(Startdatum) = MonatAktuell) Then 'Ende der Ausleihe
AusleihtageImMonat = MonTage(MonatAktuell) - Day(Startdatum)
Else
If (Month(Enddatum) = MonatAktuell) Then 'Ende der Ausleihe
AusleihtageImMonat = Day(Enddatum)
Else
AusleihtageImMonat = MonTage(MonatAktuell)
End If
End If
End If
Monatprozent = AusleihtageImMonat / MonTage(MonatAktuell)
End Function
Jetzt die Abfrage mit den Funktionsaufrufen:
SELECT Verleih.von, Verleih.bis,
DateDiff("y",[Verleih]![von],[Verleih]![bis]) AS TageVerstrichen,
Monatprozent([TageVerstrichen],[von],[bis],1) AS Januar,
Monatprozent([TageVerstrichen],[von],[bis],2) AS Februar,
Monatprozent([TageVerstrichen],[von],[bis],3) AS März,
Monatprozent([TageVerstrichen],[von],[bis],4) AS April,
Monatprozent([TageVerstrichen],[von],[bis],5) AS Mai,
Monatprozent([TageVerstrichen],[von],[bis],6) AS Juni,
Monatprozent([TageVerstrichen],[von],[bis],7) AS Juli,
Monatprozent([TageVerstrichen],[von],[bis],8) AS August,
Monatprozent([TageVerstrichen],[von],[bis],9) AS September,
Monatprozent([TageVerstrichen],[von],[bis],10) AS Oktober,
Monatprozent([TageVerstrichen],[von],[bis],11) AS November,
Monatprozent([TageVerstrichen],[von],[bis],12) AS Dezember
FROM Verleih;
Man erhält die prozentuale Auslastung als Realzahl.
Wer Fehler findet, darf sich freuen und verbessern.
Gruß
lorf
Antwort 6 von Sandra2910 vom 14.01.2021, 19:21 Options
Wow Lorf,
das ist ja super! Ich bin bisher daran verzweifelt! Werde mir Deinen Ansatz mal anschauen und versuchen, umzusetzen! Ich melde mich dann wieder!! Vielen, vielen Dank!!
LG
Antwort 7 von RaHi vom 14.01.2021, 21:46 Options
Hallo Sandra2910,
hier noch'n Lösungsansatz, damit schön bunt wird. Ich gehe hier über eine Zwischentabelle, die die Monatsauslasung für jedes Fahrzeug aufnimmt. Du brauchst zwei Tabellen
Tabelle Buchungen
ID autowert
FarzeugID longint
BuchungVon Datum
BuchungBis Datum
Tabelle Monatsauslastungen
ID autowert
BuchungID longint
Monat longint
Auslastung single
Die Tabelle Buchungen füllst du mit sinnvollen Werten (eine Prüfung auf Korrektheit der Daten nehme ich nicht vor). Danach startest du die Prozedure. Danach sollest du eine richtig gefüllte Zwischentabelle mit den Monatsauslastungen erhalten.
Ich hoffe du hast kein ACCESS 97 oder so, da ich mit ADODB arbeite. Einfach den gesamten Code in ein neues Modul kopieren.
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 Buchungen", 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!buchungvon, "mm.yyyy")), CDate("01." & Format(DateAdd("m", 1, rec1!buchungvon), "mm.yyyy")))
dVonAnz = DateDiff("d", CDate("01." & Format(rec1!buchungvon, "mm.yyyy")), rec1!buchungvon) + 1
dBisAnz = DateDiff("d", CDate("01." & Format(rec1!buchungbis, "mm.yyyy")), rec1!buchungbis) + 1
mVon = Format(rec1!buchungvon, "yyyymm")
mBis = Format(rec1!buchungbis, "yyyymm")
dVon = Format(rec1!buchungvon, "dd")
dBis = Format(rec1!buchungbis, "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!buchungvon, "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!buchungbis, "mm.yyyy")), CDate("01." & Format(DateAdd("m", 1, rec1!buchungbis), "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
Auch hier sind Korrekturen gern gesehen...
Viel Spass beim Ausprobieren.
Gruß
Ralf
Antwort 8 von Sandra2910 vom 15.01.2021, 14:27 Options
Hallo ihr beiden,
ich habe mir das ganze noch mal angeschaut, habe aber noch eine Frage: wie schaffe ich es, einen Bezug zu meinen Spalten "Übergabe" (Datum der Fahrzeugübergabe im Format tt.mm.jjjj hh:MM:ss) und "Rückgabe" (Datum der Fahrzeugrückgabe, gleiches Format) zu erstellen? Diese Spalten befinden sich in der Tabelle "Disposition der Fahrzeuge".
Gehe ich richtig in der Annahme, dass eine Funktion ein Modul ist in Access??
Tausend Dank noch einmal im Voraus!!
VLG
Antwort 9 von RaHi vom 15.01.2021, 18:14 Options
Hallo Sandra2910,
ja das ist ein Modul in Access. Einfach neues Modul öffnen und den Inhalt durch den Code ersetzen. Danach am besten ber den Menüpunkt "Debuggen-->kompilieren von..." prüfen, ob einer da sind. Es könnte sein, dass z.B. noch Verweise fehlen.
Wenn du deine Tabelle verwenden willt, musst du im Code die Zeichenketten
Buchungen
durch
[Disposition der Fahrzeuge]
buchungvon
durch
Übergabe
und
buchungbis
durch
Rückgabe
ersetzen. Dann benötigst du noch ein Feld ID vom Typ autowert in deiner Tabelle oder du ersetzt rec1!ID durch deinen Referenzwert.
ZUm Schluss noch ein Tipp. Vermeide Leerzeichen und Umlaute in deinen Tabellen und Feldbezeichnungen. Das erspart die die [...]-Notation und weniger Probleme bei einer Portierung auf eine "richtige" Datenbank.
Viel Spass beim Ausprobieren.
Gruß
Ralf
Antwort 10 von lorf55 vom 15.01.2021, 22:19 Options
Hallo Sandra,
den Bezug zu den Spalten deiner Tabelle stellst du in meiner Variante mit der Abfrage her, wobei du
von durch
Übergabe und
bis durch
Rückgabe ersetzt .
Abfragen - Neu - Entwurfsansicht
Disposition der Fahrzeuge anklicken - hinzufügen - schließen,
Übergabe und
Rückgabe in je eine Spalte der Zeile Feld ziehen,
in eine Spalte daneben:
TageVerstrichen: DatDiff("y";[Übergabe];[Rückgabe])
einfügen,
in die Spalte daneben:
Januar: Monatprozent([TageVerstrichen];[Übergabe];[Rückgabe];1)
in die Spalte daneben:
Februar: Monatprozent([TageVerstrichen];[Übergabe];[Rückgabe];2)
usw. bis Dezember:
Dezember: Monatprozent([TageVerstrichen];[Übergabe];[Rückgabe];12)
Insgesamt sieht das denn so aus:SELECT Übergabe, Rückgabe,
DateDiff("y",[Übergabe],[Rückgabe]) AS TageVerstrichen,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],1) AS Januar,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],2) AS Februar,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],3) AS März,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],4) AS April,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],5) AS Mai,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],6) AS Juni,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],7) AS Juli,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],8) AS August,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],9) AS September,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],10) AS Oktober,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],11) AS November,
Monatprozent([TageVerstrichen],[Übergabe],[Rückgabe],12) AS Dezember
FROM [Disposition der Fahrzeuge];
Zitat:
... dass eine Funktion ein Modul ist in Access??
Das kann sein, muss aber nicht. Funktionen, die irgendwie zusammen gehören, wird man möglichst in ein Modul tun, um alles beisammen zu haben.
Na denn viel Spass damit.
Gruß
lorf
Antwort 11 von RaHi vom 17.01.2021, 18:44 Options
Hallo lorf55,
ein interessanter Ansatz. Du solltest dir aber zu folgenden Punkten Gedanken machen. Insbesondere bringt der Jahreswechsel den Algorithmus in arge Schwierigkeiten.
Zwei Beispiele für Buchungen, die fehlerhafte Informationen oder Fehler liefern bei Angaben über den Jahreswechsel hinaus:
01.12.2008 - 15.01.2009 liefert gar kein Ergebnis
01.05.2008 - 01.06.2009 liefert ein falsches Ergebnis
Weiterhin würde ich die zwei Zeilen in der Funktion:
AusleihtageImMonat = (Day(Enddatum) - Day(Startdatum)) + 1
AusleihtageImMonat = MonTage(MonatAktuell) - Day(Startdatum) + 1
wie hier notiert mit "+ 1" versehen, da eine Buchung vom 1.1.09 (morgens) bis 1.1.09 (abends) 0 ergibt und eine Buchung vom 1.1.09 bis zum 31.1.09 nicht 1 ergibt.
Der 29.2. eines Schaltjahres liefert auch eine fehlerhafte Berechnung.
Gruß
Ralf
Antwort 12 von lorf55 vom 20.01.2021, 04:21 Options
Ja stimmt. Prima, dass du alle Fehler gefunden hast.
Gruß
lorf
Antwort 13 von Sandra2910 vom 20.01.2021, 10:39 Options
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
Antwort 14 von RaHi vom 20.01.2021, 17:56 Options
Hallo Sandra2910,
schön, dass die Umsetzung in deine Umgebung zunächst geklappt hat. Nun zu deinen Fragen:
1.Ich habe bei meinem Test für die Fahrzeuge eine eigene Tabelle definiert, die eine ID (autowert) als eindeutige Referenz besitzt. Somit könnte man weitere Informationen zu einem Fahrzeug in dieser Tabelle aufnehmen. Du kannst natürlich FahrzeugID durch jedes andere Feld ersetzen. Doch denke über meinen Vorschlag nach. Das so zu machen,lohnt sich später bestimmt.
2.Die Fehlermeldung sagt fast schon alles. In einem Datensatz der Dispositionstabelle ist das Feld Rückgabe nicht gefüllt. Das solltest du prüfen. Da ist die fachliche Anforderung nicht kenne, hier drei Vorschläge:
a) du verbietest Datensätze mit leeren Datumsangaben (in der Tabellendefinition oder bei der Formulareingabe)
b) du verarbeitest keine Datensätze, in denen ein Datum auf "null" (also leer) steht. Dafür änderst du das Select von "SELECT * from [Disposition der Fahrzeuge]" nach "SELECT * from [Disposition der Fahrzeuge] WHERE Rückgabe is not null and Übergane is not null",
c) du ersetzt null-Werte bei der berechnung durch ein gültiges Datum (z.B. das aktuelle datum. Dafür ersetzt du "rec1!Rückgabe" durch "nz(rec1!Rückgabe,date())" und das Ganze auch für die Übergage, falls notwendig. Dies sieht nicht sehr schön aus. Idealer Weise würde ich hier eine Variable definieren und diese dann verwenden.
Falls du das Ganze irgendwie produktiv einsetzen willst, würde ich dir dringend raten, deinen Code von jemand gegen checken zu lassen, der die fachlichen Anforderungen genau kennt. Verkenne nicht, dass das Testen (nicht durch den Entwickler!) immer ein elementarer Bestandteil einer Softwareentwicklung sein sollte. Vor allem dann, wenn durch solch eine Berechnung finanzielle Forderungen verbunden sein könnten. Dies ist nur ein gut gemeinter Rat.
Viel Spass beim Ausprobieren...
Gruß
Ralf
Antwort 15 von Sandra2910 vom 21.01.2021, 13:38 Options
Hallo noch mal Ralf,
es tut mir leid, wenn ich noch einmal fragen muss aber ich komme einfach nicht weiter. Was genau muss ich ersetzen, um in die Spalte "Buchungen" das Kennzeichen einfügen zu lassen? Ich habe rec1!ID durch [Disposition der Fahrzeuge]!Kennzeichen bzw. rec1!Kennzeichen ersetzt, was aber leider nicht geklappt hat.
Sorry für die dumme Fragerei, bei VBA bin ich wirklich eine hohle Nuss und bin für Deine Hilfe sehr dankbar!!
VLG
Antwort 16 von RaHi vom 21.01.2021, 20:00 Options
Hallo Sandra2910,
erstens, dumme Fragen gibt es nicht. So, nun zur möglichen Umsetzung. Ich gehe davon aus, dass das Kennzeichen in der Tabelle [Disposition der Fahrzeuge] eindeutig ist UND eindeutig bleibt. In diesem Fall brauchst du nur folgendes zu tun:
1. In der Tabelle Buchungen den Typ von FahrzeugID ändern
ID autowert
FarzeugID Text
BuchungVon Datum
BuchungBis Datum
denn hier kommt in Zukunft das Kennzeichen rein. Die Länge des Textfeldes sollte mit der Größe des Feldes Kennzeichen übereinstimmen (12 Zeichen sollten reichen, oder?).
2. Ersetze alle Vorkommen von
rec2!buchungID = rec1!id
durch
rec2!buchungID = rec1!kennzeichen
denn das Feld ID gibt es in deiner Dispositionstabelle ja nicht.
Probiere es aus. Viel Erfolg.
Falls du willst, kannst du mir die DB auch mal zumailen (temporäre E-Mailadresse: sandra2910.hinki@spamgourmet.com), dann schaue ich mal drüber.
Viele Grüße
Ralf
Antwort 17 von Sandra2910 vom 11.02.2021, 09:29 Options
Hallo Ralf,
bitte entschuldige die verspätete Antwort. Neben Urlaub kam dann noch Krankheit dazu... =/
Es funktioniert jetzt alles bestens. Die Auswertungen werden gemacht. Jetzt werde ich nur noch versuchen, das Makro irgendwie durch Aufrufen einer Abfrage zu starten und ich sitze gerade daran, das Format wie oben beschrieben hinzubiegen. Es soll ja im Endeffekt so aussehen:
Jahr | Kennzeichen | Januar | Februar | März | …
2008 | M – AB 123 | 100% | 80% | …
2007 | M – AB 123 | 99% | 100% | …
2008 | M – CD 456 | 80% | …
Vielen Dank noch mal an euch beide, insbesondere an Dich Ralf, für eure Geduld mit mir :)
VLG
Antwort 18 von RaHi vom 12.02.2021, 18:34 Options
Hallo Sandra2910,
im Code ist noch ein kleiner Fehler drin. Die Zeile mit der Zuweisung der Auslastung für den ersten Monat muss folgendermaßen lauten:
rec2!Auslastung = (mAnz - dVon + 1) / mAnz
Für deine Abfrage füge mal folgendes SQL-Statement in eine Abfrage ein:
TRANSFORM Sum(Monatsauslastungen.Auslastung) AS A
SELECT Monatsauslastungen.BuchungID, Left([Monat],4) AS Y
FROM Monatsauslastungen
GROUP BY Monatsauslastungen.BuchungID, Left([Monat],4)
ORDER BY Monatsauslastungen.BuchungID, Left([Monat],4)
PIVOT Mid([Monat],5);
eventuell musst du das noch ein Wenig auf deine Felder anpassen. Aber ich glaube, das kommt einem Wunsch schon recht nahe. Gehst danach in die Entwurfsansicht der Abfrage, muss du noch das Format von A auf Prozentzahl setzen, dann sieht es fast so aus wie in deinem Vorschlag
Gruß
Ralf
Antwort 19 von Sandra2910 vom 13.02.2021, 09:30 Options
Hallo Ralf,
vielen Dank für Deinen Nachtrag! Kann es sein, dass beim letzten Buchungsmonat auch noch etwas angepasst werden muss?
Antwort 20 von RaHi vom 13.02.2021, 16:55 Options
Hallo Sandra2910,
die Berechnung des letzten Monats sieht gut aus. Es geht doch um die Zeile
rec2!Auslastung = dBis / mAnz
dBis enthält den Tag des letzten Monats und mAnz ist die Anzahl der Tage des Monats. Somit würde beim 14.2.09 genau 0,5 heraus kommen, also 14/28. mAnz wird in der Zeile davor für den letzten Monat berechnet.
Hat die View (Kreuztabelle) funktioniert?
Gruß
Ralf