Hallo,
ich möchte nun Zeiten berechnen. Dazu habe ich eine Anfangszeit, Endzeit und den Intervall.
Ich bin mir jetzt aber nicht sicher, wie ich die Zeit in Access richtig berechnen kann.
Als Beispiel:
Startzeit = 09:00 Uhr
Endzeit = 11:00 Uhr
Intervall = 5 Minuten
Ich möchte nun ein Array mit allen Zeiten füllen, das ich dann als Auswahlmöglichkeiten zu einer Kombobox hinzufügen kann. (09:00, 09:05, 09:10, ...)
Mir wurde vorgeschlagen, die Zeiten als Industriezeiten zu berechnen, allerdings komm ich trotz googlesuche noch nicht dahinter, wie man dies genau macht in vba Access.
Die Start- und Endzeit kommt aus einer Tabelle. Der Intervall wird mittels Msgbox vom User abgefragt und als Variable übergeben.
Das ganze würde ich in eine For Schleife verpacken, aber habe noch keinen Plan, wie ich die Zeitrechnung in Access durchführen kann.
Array? Wofür?
Mit einer Hilfstabelle und DateAdd ist das als Abfragelösung recht einfsch:
Grundlagen - SQL ist leicht (1) - Hilfstabellen (https://www.ms-office-forum.net/forum/showthread.php?t=298414)
:o das sagt sich leicht.
In SQL bin ich recht neu. Habe erstmal deinen vba Code rüberkopiert und wollte mich dann an die Abfrage machen, allerdings blicke ich da noch nicht so recht durch.
Oben im Select müssen dann die zu erstellenden Werte rein, also die Zeiten (DateAdd mit Berechnung).
Hinter dem FROM im SELECT kommt dann im Grunde der Anfangs und Endwert bzw die Zeiten (Tabellenfelder).
Ich denke mal irgendwie so:
SELECT DateAdd(...)
FROM
( SELECT I FROM T999 WHERE I Between ZenTestBeginn AND ZenTestEnde) AS X
WHERE ZenID = cboZentren
:-\
Du brauchst eher das zweite Beispiel, da du einen festen Zeitraum hast und die 5 Minuten Intervalle dazwischen haben willst.
z.B.
Select
DateAdd(minute, T.I, z.Beginn)
From
tblZeitraum as Z
T999 as T
Where
T.I. between 5 and Z.ZenTestEnde - Z.ZenTestBeginn
habs nicht getestet, aber mal soweit von meinem Verstaendnis.
Ja ich habe es ungefähr so probiert, aber klappt nicht:
Select
DateAdd("n", T.I, Z.ZenTestBeginn)
From
tblZeitraum as Z
T999 as T
Where
T.I. between 5 and Z.ZenTestEnde - Z.ZenTestBeginn
Wobei ich mir nicht sicher bin mit der WHERE Bedingung.
"T.I zwischen 5 und der Differenz von Ende-Beginn. Mit was ist T.I gefüllt?
Ich habe es jetzt vorläufig erstmal wie folgt gelöst, indem ich die Kombobox direkt befülle:
Function ZeitenErstellen1(Intervall As Integer)
Dim db As DAO.Database
Dim rs As Object
Dim StrZeitEnde As String
Dim StrZeitAnfang As String
Dim AnzahlIntervalle As Variant
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM tblZentren WHERE ZenID =" & Me.cboZentren)
StrZeitAnfang = rs("ZenTestBeginn").Value
StrZeitEnde = rs("ZenTestEnde").Value
AnzahlIntervalle = (DateDiff("n", StrZeitAnfang, StrZeitEnde, vbMonday, vbUseSystem)) / Intervall
For i = 0 To AnzahlIntervalle
Me.cboUhrzeit.AddItem StrZeitAnfang
StrZeitAnfang = DateAdd("n", Intervall, StrZeitAnfang)
Next
End Function
Jetzt fehlt nur noch eine Fehlerbehandlung, wenn keine Anfangs- und Endzeiten in der DB hinterlegt sind.
Zitat von: Paddy24 am April 28, 2021, 16:05:41"T.I zwischen 5 und der Differenz von Ende-Beginn. Mit was ist T.I gefüllt?
steht ja in der Hilfe ganz oben. Mit Zahlen :)
Als Fehlerbehandlung kannst du doch auch sowas wie
If StrZeitAnfang is empty then exit function
bzw
If StrZeitAnfang is null then exit function
benutzen, oder?
Ja, habe es so gelöst mit der Fehlerbehandlung:
If IsNull(rs("ZenTestBeginn").Value) Or IsNull(rs("ZenTestEnde").Value) Then
MsgBox "Keine Anfangs- und/oder Endzeit in der Datenbank hinterlegt!"
End
End If
@Paddy24 Hallo!
Noch ein etwas verspäteter Kommentar.
Leider ist nicht klar, an welcher Stelle dies alles stattfinden soll.
Deshalb meine Annahmen:
Du möchtest Impftermine vergeben. Dazu hast du ein Erfassungs-Formular (basierend auf einer Termin-Tabelle), mit dem neben Personen-Daten auch eingegeben wird, in welchem Impfzentrum die Impfung wann genau stattfinden soll.
In einer Tabelle der Impfzentren steht neben Name etc. der Zeit-Bereich und das Intervall.
Nun könntest du im Termin-Formular eine Kombobox "cboZentrum" einbauen, die aus der Impfzentren-Tabelle folgende Info holt:
Name des IZ,
Zeit-Bereich Anfang,
Zeit-Bereich Ende,
Intervall
(also eine Kombobox mit 4 Spalten).
Nach Auswahl "berechnest" du den Inhalt der Kombobox "cboKonkreterZeitpunkt" wie folgt (Luftcode, bitte testen):
private sub cboZentrum_AfterUpdate()
dim strListe as string
dim timStart as date
dim timEnde as date
dim timZeitpunkt as date
dim intIntervall as integer
strListe = ""
timStart = me.cboZentrum.column(1)
timEnde = me.cboZentrum.column(2)
intIntervall = me.cboZentrum.column(3)
'
'hier noch prüfen...
'
timZeitpunkt = timStart
strliste = strListe & format("hh:mm;",timZeitpunkt) 'zu ";" s.u.
' do until timZeitpunkt > timEnde 'wenn z.B. 11:00 bei Endezeit 11:00 noch mit in die Kombobox soll
do until timZeitpunkt >= timEnde 'wenn z.B. 11:00 bei Endezeit 11:00 nicht mehr in die Kombobox soll
timZeitpunkt = dateAdd("n", intIntervall, timZeitpunkt)
strliste = strListe & format("hh:mm;",timZeitpunkt) 'zu ";" s.u.
loop
me.cboKonkreterZeitpunkt.RowSource = strListe
end sub
Voraussetzung: in cboKonkreterZeitpunkt steht als Herkunftstyp "Werteliste" (nicht "Tabelle/Abfrage").
Die Zuweisung von strList zur Kombobox ist erheblich schneller als addItem (ist hier allerdings nicht so wichtig).
Das Zeichen ";" ist das Trennzeihen für die Werteliste, deshalb gleich im Format-String mit drin.
Mit dieser Variante brauchst du keinen DAO-Recordset, um auf die Daten zuzugreifen, weil alles schon in der Zentrums-Kombobox bereitgestellt wird. Übrigens fehlen in deinem DAO-Beispiel "rs.close" und "set rs = nothing"...
Du brauchst auch nicht erst berechnen, wie viele Einträge es gibt.
Gruß,
crystal