MainframeSupports
tip uge 10/2012:

For nylig fik jeg brug for at finde ud af, hvilket ugenummer en dato tilhørte. Jeg tænkte straks, at det er der garanteret en funktion i REXX, der kan fortælle mig. For en gangs skyld skuffede REXX mig. REXX har ellers funktioner til lidt af hvert, men ugenumre kan det ikke klare endnu.

Så måtte jeg jo til at lave en funktion selv. Først måtte jeg jo lige sætte mig ind i, hvordan et ugenummer rent faktisk er defineret. En af definitionerne (for der er flere) er, at den første uge i et nyt år med en torsdag i er uge 1. Så er det jo bare et spørgsmål om at tælle torsdage. Her er, hvad jeg fik kodet:

/* REXX */
ARG DB2DATE
thisdate = TRANSLATE('abcdefgh', db2date, 'abcd-ef-gh')
say 'this week='week(thisdate)
exit
week:
  arg thisdate
  thisdays = date('D', thisdate, 'S') - 1
  year = substr(thisdate,1,4) + 0
  frstweekday = date('B', year'0101', 'S')//7
  weekno = (thisdays + frstweekday)%7 + (frstweekday < 4)
  if weekno = 0
  then
    weekno = week(year-1'1231')
return weekno

Det centrale er selvfølgelig funktionen week. For at demonstrere den har jeg indlejret den i et REXX program, der som input tager en dato på DB2-format (YYYY-MM-DD). Jeg "fusker" denne dato om til formatet YYYYMMDD vha. translate for at REXX bedre kan behandle den. Selve week-funktionen tager altså en dato på formatet YYYYMMDD som input.

Det spændende er selvfølgelig en første uge, hvor der ikke er nogen torsdag i (0101 er en fredag, en lørdag eller en søndag). Så er jeg nødt til at finde ud af, hvad ugenummer den sidste uge i det foregående år har. Det gøres selvfølgelig lettest ved at kalde week funktionen rekursivt (jeg elsker rekursive løsninger) med det foregående års sidste dag.

Hvis du undrer dig over "+ (frstweekday < 4)" så tænk på, at et udsagn i REXX altid returnerer 1 eller 0, så jeg lægger simpelthen 1 eller 0 til antallet af beregnede torsdage ud over den første uge. En anden finurlighed er, at jeg lægger 0 til resultatet af en substr. Det er for at gøre det muligt at regne på resultatet senere i det rekursive kald til week. Med andre ord, hvis du ved at en strengvariabel indeholder noget numerisk, så kan du i REXX konvertere den til en ægte numerisk værdi ved at lægge 0 til.

Forrige danske tip        Last tip in english        Tip oversigten