Avatar billede Slettet bruger
24. oktober 2007 - 10:26 Der er 13 kommentarer og
1 løsning

VBA Find næste opdatering

Hej alle

Jeg har en tabel UPDATE_SCHEDULE der indeholder følgende: Weekday, Time

Jeg skal bruge et VBA script der udfra dag og klokkeslet kan slå op i tabellen og se hvornår den næste opdatering skal finde sted.

Tror jeg har stirret mig blind i min kode for tiden, for det virker umiddelbart som en rimelig let sag hehe :-)

På forhånd tak
Avatar billede kjulius Novice
24. oktober 2007 - 13:20 #1
Hvad med denne her:

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.
Avatar billede kjulius Novice
24. oktober 2007 - 17:19 #2
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

Det ser ikke kønt ud, men det virker faktisk. :-)
Avatar billede kjulius Novice
24. oktober 2007 - 17:23 #3
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.
Avatar billede kjulius Novice
24. oktober 2007 - 17:27 #4
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
Avatar billede 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
Avatar billede kjulius Novice
24. oktober 2007 - 19:43 #6
Okidoki. :-)
Avatar billede Slettet bruger
25. oktober 2007 - 09:16 #7
Hey kjulius fik lige testet koden her til morgen, men den har ikke helt den ønskede virkning.

Jeg bør måske lige illustrere hvad UPDATE_SCHEDULE tabellen indeholder:

WEEKDAY;TIME
1;04:00:00
1;05:00:00
1;07:00:00
1;11:00:00
1;15:00:00

2;04:00:00
2;05:00:00
2;07:00:00
2;11:00:00
2;15:00:00

3;04:00:00
3;05:00:00
3;07:00:00
3;11:00:00
3;15:00:00

etc.

Dette er bare et eksempel så du kan se hvordan det ser ud. Der er typisk mange opdateringer i løbet af en dag.
Avatar billede kjulius Novice
25. oktober 2007 - 18:57 #8
Ok - hvad er fejlen?

Hvordan er feltdefinitionerne. Jeg er gået ud fra, at feltet TIME er et Dato/Tidsfelt. Er det rigtigt?

Når WEEKDAY = 1, er det så en mandag?
Avatar billede kjulius Novice
25. oktober 2007 - 19:32 #9
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))
;
Avatar billede kjulius Novice
25. oktober 2007 - 19:42 #10
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")
Avatar billede 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 :-)
Avatar billede kjulius Novice
27. oktober 2007 - 01:19 #12
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?
Avatar billede 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 :-)

Mange tak for hjælpen mester
Avatar billede kjulius Novice
27. oktober 2007 - 16:04 #14
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. :-(
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