Avatar billede al_pacone Nybegynder
07. november 2005 - 05:15 Der er 24 kommentarer og
2 løsninger

Find skift.

Jeg har en tabel med en skifteholdsplan, indeholdende følgende kolonner.

S_No             Autonummer
S_SkiftDagStart        Nummer
S_SkiftDagSlut        Nummer
S_SkiftStart        Date / time
S_SkiftSlut        Date / time


Her er lidt data fra tabellen.

1    1    1    06:00:00    16:00:00
2    1    1    16:00:00    22:00:00
3    1    2    22:00:00    06:00:00
4    2    2    06:00:00    16:00:00
osv. osv.
20    7    7    16:00:00    22:00:00
21     7    1    22:00:00    06:00:00


Hvordan finder jeg det skift der passer sammen med Now()
Hvis Now() passer lige i overlappet, skal det være det skift der starter.
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 13:54 #1
s_skiftdagstart og s_skiftdagslut er det numre, der referefer til den dags nummer i måneden?
Altså at 5 er lig den 5. dag i måneden?
Avatar billede fdata Forsker
07. november 2005 - 15:09 #2
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)
Avatar billede al_pacone Nybegynder
07. november 2005 - 16:28 #3
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()) & "#"
Avatar billede al_pacone Nybegynder
07. november 2005 - 16:32 #4
Det er lige nøjagtigt nat skiftet der driller, når skiftstart og skiftslut ligger på hver side af midnat.
Avatar billede al_pacone Nybegynder
07. november 2005 - 17:13 #5
Hvis i vil ha en tabel og teste på, og ikke selv gider indtaste den, emailer jeg gerne en skifteholdsplan med en hel uge indtastet.
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 18:06 #6
Jeg har lavet den her test:

s_no    s_SkiftDagStart    s_SkiftDagSlut    s_SkiftStart    s_SkiftSlut
9    1    1    06:00:00    16:00:00
10    1    1    16:00:00    22:00:00
11    1    2    22:00:00    06:00:00
19    2    2    06:00:00    16:00:00
20    2    2    16:00:00    22:00:00
21    2    3    22:00:00    06:00:00
22    3    3    06:00:00    16:00:00
23    3    3    16:00:00    22:00:00
24    3    4    22:00:00    06:00:00

er det korrekt sat op?
Jeg er lige ved at kigge på det.
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 18:08 #7
Er det i SQL eller i kode du har brug at kunne finde værdien?
Avatar billede fdata Forsker
07. november 2005 - 18:09 #8
Det er helt fint.

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)
Avatar billede fdata Forsker
07. november 2005 - 18:11 #9
... nå ja, der var vist lidt rigeligt med parametre i PseudoTidFra; men hvad fa'en. De er jo gratis  ;o)
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 18:19 #10
Jeg tror den her virker

SELECT table1.s_no, DateSerial(Year(Date()),Month(Date()),[s_skiftdagstart]) & " " & [s_skiftstart] AS start, DateSerial(Year(Date()),Month(Date()),[s_skiftdagslut]) & " " & [s_skiftslut] AS slut, *
FROM table1
WHERE (((DateSerial(Year(Date()),Month(Date()),[s_skiftdagstart]) & " " & [s_skiftstart])<Now()) AND ((DateSerial(Year(Date()),Month(Date()),[s_skiftdagslut]) & " " & [s_skiftslut])>Now()));

Det er lidt omstændigt, men det virker vidst.
Avatar billede fdata Forsker
07. november 2005 - 18:22 #11
Jesper >> Har du prøvet at stille din pc's ur frem til kl 23?  ;o)
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 18:27 #12
fdata >
Når jeg stiller mit ur til d. 2/11 kl. 23 og bruger ovenstående tabel får jeg:

s_no    start    slut    s_SkiftDagStart    s_SkiftDagSlut    s_SkiftStart    s_SkiftSlut
21    02-11-2005 22:00:00    03-11-2005 06:00:00    2    3    22:00:00    06:00:00

er det ikke det der er meningen?
Avatar billede fdata Forsker
07. november 2005 - 18:35 #13
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.
Avatar billede jesperfjoelner Nybegynder
07. november 2005 - 18:38 #14
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.
Avatar billede al_pacone Nybegynder
07. november 2005 - 18:39 #15
Jesper: Din tabel er sat rigtigt op. S_SkiftDagStart refererer til dag i ugen, ikke dag i måneden.
Avatar billede al_pacone Nybegynder
07. november 2005 - 18:41 #16
Der er ikke skrivefejl i sidste linje af mine data. Skiftet starter søndag og slutter mandag.
Avatar billede fdata Forsker
07. november 2005 - 18:46 #17
OK så. Vi skal altså ind og finde Now's ugedag.

I så fald skal min kode rettes til:

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)));
Avatar billede fdata Forsker
07. november 2005 - 19:00 #18
... jo mere man roder i vandet, jo mere mudret bliver det. Glem min kode. Den virker jo ikke i morgentimerne inden 6.
Avatar billede fdata Forsker
07. november 2005 - 19:38 #19
Ny version. Nu med 3 funktioner:

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)));

Har ikke mere tid i dag. Håber, du kommer videre.
Avatar billede al_pacone Nybegynder
07. november 2005 - 20:46 #20
fdata: Det skal også passe til skift med andre tidspunkter end kl.6.
Avatar billede fdata Forsker
07. november 2005 - 22:45 #21
Se, det fremgik jo ikke helt. Det så ud som om, der var 3 faste skift: 6-16, 16-22, 22-6.
Next step: Tænkeboks.
Avatar billede jesperfjoelner Nybegynder
08. november 2005 - 01:00 #22
Samme her - tænker....
Avatar billede al_pacone Nybegynder
08. november 2005 - 18:01 #23
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.
Avatar billede fdata Forsker
08. november 2005 - 19:22 #24
Sådan skal det gøres !
Avatar billede al_pacone Nybegynder
15. november 2005 - 12:14 #25
Lukker.
Tak for hjælpen og inspirationen til løsningen.
Avatar billede fdata Forsker
15. november 2005 - 19:44 #26
Velbekomme. Tak for point.
Avatar billede Ny bruger Nybegynder

Din 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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester