Avatar billede Wassini Novice
19. september 2016 - 12:05 Der er 21 kommentarer

Beregning af ugenummer

Hej

Jeg er på jagt efter en forklaring på hvordan man beregner ugenummeret ude fra en dato.
Jeg ved at Excel har funktioner til det, men jeg skal finde metoden bag ved - ikke bare en formel - men den grundlæggende beskrivelse af hvordan den beregnes.

Længere forklaring:

Jeg skal beregne ugenummeret i MS Infopath 2013 på en Sharepoint 2010

I Excel kan følgende formel benyttes:
UGE.NUMMER(dato; 21)

På Sharepoint 2010 kan følgende formel benyttes:
=INT(([dato]-DATE(YEAR([dato]-WEEKDAY([dato]-1)+4);1;3)+WEEKDAY(DATE(YEAR([dato]-WEEKDAY([dato]-1)+4);1;3))+5)/7)

Men jeg kan ikke lige ud fra ovenstående formel gennemskue, hvad den reelt gør...
Avatar billede jakobdo Ekspert
19. september 2016 - 12:14 #1
Kan du bruge dette til noget: https://da.wikipedia.org/wiki/Uge ?
Avatar billede Slettet bruger
19. september 2016 - 12:35 #2
Der er forskellige metoder rundt omkring i verden.

Den vi bruger i Danmark er kort fortalt at uge 1 er den første uge i kalenderåret med en torsdag.
Det lyder lidt kryptisk/underligt, men det skyldes naturligvis at den første uge med en torsdag er den uge hvor de fleste af dagene (4 eller flere) ligger i det nye år.
Så ud fra den viden bør du kunne konstruere en formel der kan anvendes...
Avatar billede Wassini Novice
19. september 2016 - 12:46 #3
Jeg kender udmærket pricippet bage ugenumre, men er mere interesseret i hvordan man matematisk/logisk beregner det.
Avatar billede jakobdo Ekspert
19. september 2016 - 13:07 #4
Avatar billede arne_v Ekspert
19. september 2016 - 13:35 #5
Jeg plejer at bruge den her (C# version men jeg har i andre sprog):


        public static int WeekNumber(int year, int mon, int day)
        {
            int a = (14 - mon) / 12;
            int y = year + 4800 - a;
            int m = mon + 12*a - 3;
            int JD = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
            int d4 = (((JD + 31741 - JD % 7) % 146097) % 36524) % 1461;
            int L = d4 / 1460;
            int d1 = ((d4 - L) % 365) + L;
            return d1 / 7 + 1;
        }
Avatar billede Wassini Novice
19. september 2016 - 15:24 #6
Problemet er at jeg skal bruge EEN formel. Det er ikke et programmeringssprog - det er et XML felt, der kan indeholde en meget simpel formel. Så derfor forsøger jeg at gennemskue hvordan den formel, jeg har skrevet i starten fungerer.
Avatar billede Wassini Novice
19. september 2016 - 15:26 #7
I Excel vil den se sådan her ud:

=RUND.NED((A1-DATO(ÅR(A1-UGEDAG(A1-1)+4);1;3)+UGEDAG(DATO(ÅR(A1-UGEDAG(A1-1)+4);1;3))+5) /7;0)

A1 = datoen
Avatar billede Slettet bruger
19. september 2016 - 16:06 #8
Excels "UGEDAG" formel dækker jo over noget komplekst som næppe kan udtrykkes i (med dine egne ord) "et XML felt, der kan indeholde en meget simpel formel".

Men nu misforstod jeg dig jo også da du skrev "ikke bare en formel - men den grundlæggende beskrivelse af hvordan den beregnes", så det er muligt at din definition af "et XML felt, der kan indeholde en meget simpel formel" er anderledes end min :-).

Har du evt. mulighed for i stedet at slå værdien op i en tabel du har for-beregnet med dato, ugenr. kombination i stedet?
19. september 2016 - 19:46 #9
HEJ,

Jeg har en ganske kort rutine . men den er i Delphi (7 --> ).

Sig til hvis interesseret ...

Kristian
Avatar billede folj Forsker
20. september 2016 - 11:28 #10
måske du vil kunne inspireres af denne måde at regne sig frem til det.
Metoden har jeg selv hentet her fra eksperten.dk for flere år siden, og jeg husker ikke hvem der er fadder til den.
Den fodres blot med en dato, og vil altid virke til den danske norm for ugenumre.
Function UgeNr(MyDate)
' funktion der producerer ugenummer med RIGTIGE ugernumre - også når året starter med uge 53
' hentet fra Eksperten.dk
Dim Resten As Single
Resten = (MyDate - 2) Mod 7
UgeNr = Int((MyDate - DateSerial(Year(MyDate + 3 - Resten), 1, Resten - 9)) / 7)
End Function


I excel (engelk version) hedder formlen WEEKNUM(date,[return_type])

Den skal fodres med 2 input: dato, og returntype skal altid være 21, for at få brergnet efter den norm der gælder i DK
Avatar billede Wassini Novice
21. september 2016 - 11:26 #11
Ha ha... Det er godt nok svært at forklare sig her....

Jeg er på jagt efter pseudo-koden til hvordan man beregner ugenummeret.

1: Tag den aktuelle dato og find mandagen (ugestart) for denne
2: Find den dato, der er begyndelsen på året
3: Finde den dato, der .....

etc....

Jeg HAR formlen. Jeg forsøger bare at finde ud af hvad den præcist gør så jeg kan "konverterer" den til en anden formel, i et system, der ikke har de samme funktioner/metoder.
Avatar billede folj Forsker
21. september 2016 - 18:17 #12
Hvis du vil i gang med at analysere en formel og omskrive det til en beregningsmetode, så vil jeg anbefale at analysere den enkleste metode.
Den enkleste metode til beregningen jeg har set til dato er den jeg beskriver i #10. Den stammer også fra en ekspert her på eksperten.dk

Jeg vil helst ikke påtage mig at omskrive det til købmandsregning, da jeg nemt falder af på at jeg generelt har et dårligt overblik.
Avatar billede jakobdo Ekspert
22. september 2016 - 08:32 #13
#11: Du har nu fået adskillige stumper kode der gør det, du har fået den helt enkelte forklaring på hvordan ugenummer beregnes, jeg kan ikke se hvad du mangler for at strikke noget sammen selv.
Avatar billede Wassini Novice
22. september 2016 - 10:03 #14
#13 Jo - jeg har fået adskillige stykker kode - og jeg havde selv i forvejen masser af kode, der kunne beregne dette, men jeg har stadig ikke fundet ud af hvordan koden reelt beregner ugen.
Det jeg manger er IKKE kode, men systemet forklaret i pseudokode - og ikke at "sådan er det bare".

F.eks. #10:

Resten = (MyDate - 2) Mod 7
UgeNr = Int((MyDate - DateSerial(Year(MyDate + 3 - Resten), 1, Resten - 9)) / 7)

Hvad er "Resten"... Hvorfor trækkes 2 fra datoen? "MOD 7" forstår jeg.
Hvorfor lægges 3 til datoen inden Resten trækkes fra? Hvorfor trækkes der 9 fra?

Eller min egen kode fra #1:

=INT(([dato] - DATE(YEAR([dato] - WEEKDAY([dato] - 1) + 4); 1; 3) + WEEKDAY(DATE(YEAR([dato] - WEEKDAY([dato] - 1) + 4); 1; 3)) + 5) / 7)

"[dato] - WEEKDAY([dato] - 1) + 4": Finder mandagen i aktuel uge
"DATE(YEAR([dato] - WEEKDAY([dato] - 1) + 4); 1; 3)":  Finder 1. marts i det aktuelle år (Hvorfor marts????)
Avatar billede folj Forsker
22. september 2016 - 10:30 #15
Ja det kan være nogle komplicerede beregninger, og noget af det du ser i dine formler er beregning af divisionsrest.

Du kender formodentligt excelfunktionen MOD der beregner divisionrest.
Det kan være meget brugbart, og bruges også i linien (fra #10):
Resten = (MyDate - 2) Mod 7

hvor der kommer forst trækkes 2 fra et datoinput hvorefter der beregnes en divisionsrest hvis tallet divideres med 7 (husk at datoen i excel også repræsenterer et tal - datoen i dag 22.aept repræsenteres af talværdien 42635)


Vedr ugenumre, så er der 2 grundregler:
Alm. år: Uge 53 indeholder altid datoen 3. januar året efter, men uge 53 eksisterer kun
hvis 27. december var en søndag.

Skudår: Uge 53 indeholder altid datoen 2. januar året efter, men uge 53 eksisterer kun hvis 26. december var en lørdag eller en søndag.

for at kunne beregne skudår så er der nogle langhårede matrik'er i spil:
eksempelvis så er der ikke bare skudår hvert 4. år.
For hvert 400'ende år så springes der et skudår over, men så vidt vides bliver det ikke aktuelt hverken i vores eller vores børns tid.
Avatar billede Slettet bruger
22. september 2016 - 10:50 #16
Formlen for skudår er ikke helt korrekt beskrevet: Det er skudår hvert 4. år (år deleligt med 4), med mindre årstallet OGSÅ er deleligt med 100. For så er det ikke skudår alligevel.
Dog er det så alligevel skudår selvom årstallet er deleligt med både 4 og 100, hvis det OGSÅ er deleligt med 400.
Så det er hvert 100 år der springes et skudår over, med mindre årstallet også er deleligt med 400.
Men du har ret i pointen om at næste gang det er aktuelt er i år 2100 (som jo så IKKE er skudår. I øvrigt var 400-års reglen jo i brug i år 2000 - som jo så altså VAR et skudår).

#14 Jeg er fortsat skeptisk da du ikke har delt noget som helst om hvilke regneformer du rent faktisk har adgang til. Så kunne det jo være nogen havde en formel der kun indeholdt dem.
Avatar billede Wassini Novice
24. september 2016 - 11:06 #17
#16 De metoder jeg har adgang til er MEGET begrænset. Det er MS InfoPath og der understøttes kun standard XML funktioner. Det er +-*/, ToDay, DateAdd, Floor (INT) og strengmanipulation (substring, left etc). Det er ULTRA begrænset og jeg tror egentlig jeg bare giver op og siger til dem, at de ikke kan få vist ugenummer på den form.

Tak for alle input!
Avatar billede folj Forsker
26. september 2016 - 10:49 #18
Med de begrænsede regnefunktioner du har til rådighed, så kan det vist heller ikke lade sig gøre.
Alene det at du ikke kan beregne divisionsrest, sætter en begrænsning...
Divisionsrest indgår i alle de beregningsformer jeg har set.
Avatar billede jka Juniormester
07. august 2017 - 12:48 #19
Har tidligere selv brugt denne formel:

=AFKORT((A1-DATO(ÅR(A1+3-REST(A1-2;7));1;REST(A1-2;7)-9))/7)

Hvor A1 er = dato.

Men lige opdaget denne her i Office 365
=ISOUGE.NR(A1)

Som ser ud til og virke efter hensigten :)
Avatar billede katborg Praktikant
11. januar 2018 - 09:36 #20
Man kan også bruge UGE.NR(A1;21)
Avatar billede folj Forsker
12. januar 2018 - 09:46 #21
@katborg

Du har helt ret i at man også kan bruge WeekNum.(det hedder den I den engelske version).
Jeg har blot valgt at bruge min brugerdefinerede funktion her, og de stammer helt tilbage fra den tid hvor WeekNum ikke kunne beregne korrekt efter danske normer. Det kan den nu når den får Optional 21 med.

Fordi jeg har men brugerdefinerede funktion stadigvæk så indgår den i mange af mine VBA-procedurer.

Og så er der også lige det at hvis jeg vil kalde en WorksheetFunction som Weeknum i min VBA-procedure, så skal jeg have noget mere med:

Så vil funktions-kaldet blive noget i stil med:

UgeNr = Application.WorksheetFunction.Weeknum(InputDate, 21)
Der skelnes imellem Worksheet-Functions og VBA-functions.
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

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