Public Function Opdatering(Ugedag As Integer, Tidspunkt As Date) As Date Dim Dage As Integer If Weekday(Date, vbUseSystemDayOfWeek) > Ugedag Then Dage = Ugedag - Weekday(Date, vbUseSystemDayOfWeek) + 7 Else Dage = Ugedag - Weekday(Date, vbUseSystemDayOfWeek) End If If Dage = 0 And Tidspunkt < Time Then Dage = 7 End If Opdatering = Date + Dage + Tidspunkt End Function
Jeg har ikke lagt selve opslaget til din opdateringstabel ind her, men efter opslaget kan felterne fra tabellen bruges som parametre til denne funktion, som så vil returnere dato/tid for næste opdatering.
Faktisk kunne hele funktionen også laves i selve SQL opslaget:
SELECT us.[Weekday], us.[Time], SELECT us.Weekday, us.Time, IIf(Weekday(Date(),0)>us.Weekday, Date()+(us.Weekday-Weekday(Date(),0))+7+us.Time, IIf(Weekday(Date(),0)=us.Weekday And us.Time<Time(), Date()+7+us.Time, Date()+us.Weekday-Weekday(Date(),0)+us.Time)) AS Opdateringstid FROM UPDATE_SCHEDULE AS us WHERE Id = 1
Jeg har brugt systemværdien 0 i Weekday funktionen til at identificere første ugedag, hvilket på mit system betyder, at første ugedag er mandag (1=Mandag, 2=Tirsdag osv.). Hvis du har en anden opsætning på din maskine, skal Weekday funktionens anden parameter tilrettes.
How, der er sket noget under min klippe/klistre operation. Der skal naturligvis ikke være to SELECT'er:
SELECT us.Weekday, us.Time, IIf(Weekday(Date(),0)>us.Weekday, Date()+(us.Weekday-Weekday(Date(),0))+7+us.Time, IIf(Weekday(Date(),0)=us.Weekday And us.Time<Time(), Date()+7+us.Time, Date()+us.Weekday-Weekday(Date(),0)+us.Time)) AS Opdateringstid FROM UPDATE_SCHEDULE AS us
Synes godt om
Slettet bruger
24. oktober 2007 - 18:01#5
Hey kjulius, det ser skam fint ud det du har lavet, meget bedre end det jeg selv fandt på tidligere i dag hehe. Jeg tester det lige i morgen og så må du lige smide et svar hvis det er :-D
Ok, spørgsmålet lyder jo "VBA - Find næste opdatering" - så måske ligger problemet her? (gætter lige lidt :-))
Du kan altid finde den næste opdateringstid ved at sortere på den fundne opdateringstid og så kun medtage den første række (med en TOP 1 instruktion):
SELECT TOP 1 us.Weekday, us.Time, IIf(Weekday(Date(),0)>us.Weekday, Date()+(us.Weekday-Weekday(Date(),0))+7+us.Time, IIf(Weekday(Date(),0)=us.Weekday And us.Time<Time(), Date()+7+us.Time, Date()+us.Weekday-Weekday(Date(),0)+us.Time)) AS Opdateringstid FROM UPDATE_SCHEDULE AS us ORDER BY IIf(Weekday(Date(),0)>us.Weekday, Date()+(us.Weekday-Weekday(Date(),0))+7+us.Time, IIf(Weekday(Date(),0)=us.Weekday And us.Time<Time(), Date()+7+us.Time, Date()+us.Weekday-Weekday(Date(),0)+us.Time)) ;
Hmmm... ovenstående er jo en SQL forespørgsel, som godt nok returnerer det rigtige svar (eller det synes jeg da, at den må gøre!), men det ikke VBA. Men du kan bruge en DLOOKUP funktion til at få resultatet tilbage til en VBA variabel:
Dim NæsteOpdatering As Date NæsteOpdatering = DLookup("Opdateringstid", "dinForespørgsel")
Synes godt om
Slettet bruger
26. oktober 2007 - 07:59#11
Hej kjulius
TIME er et tidsfelt og WEEKDAY=1 er ganske rigtigt mandag.
Takker meget for din tid so far, men forespørgslerne virker ikke som de skal, desværre. Jeg tror du griber det lidt forkert an, jeg har vist ikke forklaret mig grundigt nok :-).
Det jeg skal bruge er ikke en kolonne der fortæller hvornår næste opdatering er for hver række, men derimod et opslag i tabellen der fortæller mig alt efter hvad dag det er og hvad klokken er når den laver opslaget, hvornår næste opdatering skal finde sted, dvs. den kigger i tabellen og finder det tidspunkt der er tættest på Now().
Resultatet jeg skal bruge skal være f.eks.:
NæsteOpdatering #26/10/2007 08:00:00#
Håber jeg har forklaret mig tydeligt nok, det er lidt kringlet :-)
Jeg ved heller ikke, hvor det går galt. Her hos mig virker det netop på den måde. Uanset tidspunkt vil min seneste sql (den med sortering og TOP 1) altid returnere den næste opdateringstid (den første af opdateringstiderne efter det tidspunkt, hvor forespørgslen køres).
Det er derfor, TIME nogle gange skrives som Time(), for så er det det aktuelle tidspunkt fra Time funktionen der arbejdes med, mens der andre gange refereres til us.Time, som er Time feltet fra tabellen.
Hos mig kører det som sagt upåklageligt (jeg bruger Access 2003).
Hvad er det helt konkret, der ikke virker hos dig?
Synes godt om
Slettet bruger
27. oktober 2007 - 13:03#13
Kjuluis, beklager det var min fejl.
Dataene jeg bruger er hentet fra DB2 via ODBC. Fandt ud af den sætter dags dato på alle kolonner med TIME format (den laver dem om til TIMESTAMP), så jeg var nød til at tilrette din SQL med TimeValue(us.Time) før det virkede.... Fandens til DB2 :-)
Ja, DB2 og Access arbejder ikke helt godt sammen omkring Time. Men jeg ville nu ikke give DB2 hele skylden. Access gemmer jo Time værdier i en kombineret Date/Time variabel. DB2 derimod har en speciel variabeltype der hedder TIME. Så det er nok snarere Access, der fortolker en sådan værdi forkert. Eller også præsenterer ODBC driveren en TIME værdi på en måde, som Access opfatter som en kombination af en dato og en tid. Resultatet er jo under alle omstændigheder, at det giver en fejl.
Jeg har selv haft samme problemer når Access skal arbejde med TIME data fra DB2 på en IBM iSeries maskine (som jo har en DB2 database, selv om den ikke er helt som en DB2 på PC/UNIX). Her blev en TIME på f.eks. 18:29:00 omsat til en Access Date/Time værdi på 1-1-1899 18:29:00. Hvordan det sker ved jeg ikke. Min formodning er, at fejlen ligger i fortolkningen mellem Access og ODBC driveren. Det er under alle omstændigheder meget irriterende. :-(
Synes godt om
Ny brugerNybegynder
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.