SELECT Tabel2.S_No FROM Tabel2 WHERE S_SkiftDagStart=Day(Now()) AND TimeValue([S_SkiftStart])<=TimeValue(Now()) AND TimeValue([S_SkiftSlut])>TimeValue(Now());
eller i kode:
DLookUp("S_No","Tabel2","where-udtryk") (where-udtryk er det samme som ovenfor)
Jesper: s_skiftdagstart og s_skiftdagslut er ugedag. 3 = onsdag.
fdata : Jeg kan godt få din kode til at finde dag og aften skift, men ikke nat skift. Hvis jeg sætter klokken til et sted imellem kl. 22:00 og 06:00, returnerer koden igenting.
Min tilpassede kode ser ud som følgende. "Select * From tblSkift " & _ "WHERE S_SkiftDagStart=" & Weekday(Now(), vbMonday) & _ " AND TimeValue(S_SkiftStart)<=#" & TimeValue(Now()) & _ "# AND TimeValue(S_SkiftSlut)>#" & TimeValue(Now()) & "#"
En løsning kunne være at konvertere klokkeslættene til en pseudotid og så sammenligne. Man kunne bruge to små funktioner:
Function PseudoTidFra(Fra As Date, Til As Date) As String PseudoTidFra = Format(Fra, "hh:nn:ss") End Function
Function PseudoTidTil(Fra As Date, Til As Date) As String If Fra < Til Then PseudoTidTil = Format(Til, "hh:nn:ss") Else PseudoTidTil = Hour(Til) + 24 & ":" & Format(Minute(Til), "00") & ":" & Format(Second(Til), "00") End If End Function
og så samneligne v.h.a. dem: SELECT Tabel2.*, PseudoTidFra([S_SkiftStart],[S_SkiftSlut]) AS P_Fra, PseudoTidTil([S_SkiftStart],[S_SkiftSlut]) AS P_Til, PseudoTidFra(Now(),Now()) AS P_Now FROM Tabel2 WHERE (((Tabel2.S_SkiftDagStart)=Day(Now())) AND ((PseudoTidFra([S_SkiftStart],[S_SkiftSlut]))<PseudoTidFra(Now(),Now())) AND ((PseudoTidTil([S_SkiftStart],[S_SkiftSlut]))>PseudoTidFra(Now(),Now())));
(indsæt koden i en forespørgsels sql, så ser du meningen)
Jesper >> Bider mig selv i tungen (eller tastaturet) Jeg skød bare din kode af; men jeg har hele vejen igennem brugt al pacones første testdata, og der er - ser jeg nu - en lille fejl i dagen i sidste linie. Din løsning er klart den enkleste. Sorry.
Ingen problem :-) Jamen, man skulle lige finde ud af hvordan det blev gjort smartest. Jeg tænkte på en kodeløsning, men det går med SQL selv om løsningen er lidt pudsig med bruge af pseudodatoer, som du kalder det.
SELECT Tabel2.*, PseudoTidFra([S_SkiftStart],[S_SkiftSlut]) AS P_Fra, PseudoTidTil([S_SkiftStart],[S_SkiftSlut]) AS P_Til, PseudoTidFra(Now(),Now()) AS P_Now FROM Tabel2 WHERE (((PseudoTidFra([S_SkiftStart],[S_SkiftSlut]))<PseudoTidFra(Now(),Now())) AND ((PseudoTidTil([S_SkiftStart],[S_SkiftSlut]))>PseudoTidFra(Now(),Now())) AND ((Tabel2.S_SkiftDagStart)=Weekday(Now(),2)));
Function PseudoTidFra(Fra As Date) As String PseudoTidFra = Format(Fra, "hh:nn:ss") End Function
Function PseudoTidTil(Fra As Date, Til As Date) As String If Fra < Til Then PseudoTidTil = Format(Til, "hh:nn:ss") Else PseudoTidTil = Hour(Til) + 24 & ":" & Format(Minute(Til), "00") & ":" & Format(Second(Til), "00") End If End Function
Function PseudoTid6(Kl As Date) As String If Hour(Kl) >= 6 Then PseudoTid6 = Format(Kl, "hh:nn:ss") Else PseudoTid6 = Hour(Kl) + 24 & ":" & Format(Minute(Kl), "00") & ":" & Format(Second(Kl), "00") End If End Function
og ny SQL:
SELECT Tabel2.*, PseudoTidFra([S_SkiftStart]) AS P_Fra, PseudoTidTil([S_SkiftStart],[S_SkiftSlut]) AS P_Til, PseudoTid6(Now()) AS P_Now FROM Tabel2 WHERE (((PseudoTidFra([S_SkiftStart]))<PseudoTid6(Now())) AND ((PseudoTidTil([S_SkiftStart],[S_SkiftSlut]))>PseudoTid6(Now())) AND ((Hour(Now()))>=6) AND ((Tabel2.S_SkiftDagStart)=Weekday(Date(),2))) OR (((PseudoTidFra([S_SkiftStart]))<PseudoTid6(Now())) AND ((PseudoTidTil([S_SkiftStart],[S_SkiftSlut]))>PseudoTid6(Now())) AND ((Hour(Now()))<6) AND ((Tabel2.S_SkiftDagSlut)=Weekday(Date(),2)));
Jeg fandt selv frem til en brugbar løsning. Ikke den mest elegante, men det virker.
Hvis i kan finde på en bedre løsning, ville det være alle tiders.
Her er hvad jeg nåede frem til.
Function QuerySkift() As Long On Error GoTo errHandler Dim lSql As String Dim lRs As ADODB.Recordset Dim lDag As Long Dim lFra As Date Dim lTil As Date Dim lNu As Date QuerySkift = 0 Set lRs = New ADODB.Recordset lDag = Weekday(Now(), vbMonday) lSql = "Select * From tblSkift " & _ "Where S_SkiftDagStart=" & lDag & _ " Or S_SkiftDagStart=" & lDag - 1 Set lRs = CurrentProject.Connection.Execute(lSql) If Not lRs.EOF Then Do Until lRs.EOF lFra = Format(lRs!S_SkiftDagStart, "00") & "-01-1900 " & lRs!S_SkiftStart If lRs!S_SkiftDagSlut = 1 And lRs!S_SkiftDagStart = 7 Then lTil = "08-01-1900 " & lRs!S_SkiftSlut Else lTil = Format(lRs!S_SkiftDagSlut, "00") & "-01-1900 " & lRs!S_SkiftSlut End If lNu = Format(Weekday(Now(), vbMonday), "00") & "-01-1900 " & TimeValue(Now()) If lNu > lFra And lNu < lTil Then QuerySkift = lRs!S_No GoTo errHandler End If lRs.MoveNext Loop End If MsgBox "Der blev ikke fundet noget skift" errHandler: If Err.Number <> 0 Then MsgBox "Fejl i sub QuerySkift.", vbCritical, "Fejl" End If Set lRs = Nothing End Function
Jeg lader spørgsmålet stå åbent lidt endnu, hvis nogen skulle have en mere elegant løsning.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.