Mai 17, 2021, 11:15:18

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Zeiten berechnen mit Intervallen

Begonnen von Paddy24, April 28, 2021, 12:37:41

⏪ vorheriges - nächstes ⏩

Paddy24

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.

ebs17

Array? Wofür?

Mit einer Hilfstabelle und DateAdd ist das als Abfragelösung recht einfsch:
Grundlagen - SQL ist leicht (1) - Hilfstabellen
Mit freundlichem Glück Auf!

Eberhard

Paddy24

 :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

 :-\

emmoticon

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.
Gruß, Smiley mit Rechtschreibfehler

Paddy24

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?

Paddy24

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.

emmoticon

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 functionbzw
If StrZeitAnfang is null then exit functionbenutzen, oder?
Gruß, Smiley mit Rechtschreibfehler

Paddy24

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

crystal

@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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...