20. januar 2009 - 17:21Der er
10 kommentarer og 1 løsning
Start ugenr med lørdag
Til beregning af hvor mange dage der er i hver uge, benytter jeg nedenstående funktion :
Function DaysInWeek(StartDate As Date, EndDate As Date, WeekNo As Integer) As Integer
Dim RunningDate As Long DaysInWeek = 0 If EndDate > StartDate Then RunningDate = StartDate Do While RunningDate <= EndDate If DatePart("ww", RunningDate) = WeekNo Then DaysInWeek = DaysInWeek + 1 End If RunningDate = RunningDate + 1 Loop End If
End Function
Jeg har behov for at beregningen foretages fra lørdag til lørdag, og ikke som nu søndag til søndag.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
firstdayofweek defaulter til søndag (vbSunday). Brug vbSaturday.
Pas i øvrigt på: Access har problemer med beregning af ugenr. Din kode vil sikkert svigte omkring årsskiftet et af de kommende år. Det var i hvert fald tilfældet i 2003 og 2007. For at være helt sikker, er du nødt til at lave en workaround i stil med:
Function KorrektUgeNr(Dato As Date) As Integer Dim UgeNr As Integer Dim DagNr As Integer
UgeNr = Val(Format(Dato, "WW", vbMonday, vbFirstFourDays)) DagNr = Val(Format(Dato, "W", vbMonday, vbFirstFourDays)) If (UgeNr > 52) And (DagNr < 4) Then UgeNr = 1 End If KorrektUgeNr = UgeNr End Function
Tjah. Det er jo en helt anden - og mere tricky - sag. Jeg er bange for at du skal have splittet de enkelte records op i et antal, der svarer til "antal dage". I dit eksempel vil hver record altså give 8 records.
Opret en tabel ved navn Datoer med 2 felter - ID (Autonummerering) - Dato (Dato og klokkeslæt)
Kør så:
Sub DanDatoer() Dim IndRst As Recordset Dim UdRst As Recordset Dim i As Integer
Set IndRst = CurrentDb.OpenRecordset("Registreringer") Set UdRst = CurrentDb.OpenRecordset("Datoer")
With IndRst Do Until .EOF
For i = 0 To .Fields("AntalDage") UdRst.AddNew UdRst.Fields("Dato") = IndRst.Fields("Dato") + i UdRst.Update Next i
.MoveNext Loop End With IndRst.Close UdRst.Close Set IndRst = Nothing Set UdRst = Nothing End Sub
(ret selv tabel- og feltnavne)
Herefter opretter du en forespørgsel, der ser på tabellen Datoer. - Træk de to felter ned i gitteret - Klik på sigma-knappen (omdan til sum-forespørgsel) - Under ID vælger du Antal - Under Dato vælger du Grupper efter (og Sorter stigende) - og så fyrer du den af ...
fdata > jeg kan se at du er mester for den modulkode jeg nu er løbet ind i problemer med. Hvis summen af Fields("AntalDage") er negativt behandles rækken ikke :-(
Det er først for nyligt jeg er begyndt at behandle negative data, så det har ikke været aktuelt da vi lavede koden i sin tid, men det det desværre nu.
En registering består/kan bestå af en tilgang på et tidspunkt og i nogen tilfælde en afgang på et andet tidspunkt ...
Dvs. jeg kan have en tilgang med en given ordre dato/periode som skal tælle 1 hvor hver dag i perioden, og tilsvarende -1 i samme periode på et andet ordretidspunkt hvis kunden efterfølgende annullerer ordren ...
Det er lige som om at negative værdier ignoreres i den hidtidige modulkode
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.