Avatar billede uthsen Nybegynder
29. august 2004 - 11:14 Der er 7 kommentarer og
1 løsning

Ugenummer ud for dato i MonthCalender?

Hvordan får jeg ugenummer for en given dato regnet ud og placeret i start.table1.FieldByName('Ugenummer')?.


procedure TMainForm.MonthCalendar1DblClick(Sender: TObject);
begin
  start.table1.FieldByName('Dato').AsDateTime :=MonthCalendar1.Date;

start.table1.FieldByName('Ugenummer').AsDateTime :=?????


end;
Avatar billede borrisholt Novice
29. august 2004 - 11:24 #1
function GetWeekNumber( aDateTime : TDateTime) : Word;
var
    Y,M,D : Word;
begin
  DecodeDate( aDateTime, Y, M, D);
  dtTmp:=
  Result:=(Trunc( aDateTime - EnCodeDate( Y, 1, 1)) + ( DayOfWeek(
EnCodeDate( Y, 1, 1)) - 1)) DIV 7;
  if Result = 0 then
    Result := 51
  else
    Result := Result - 1;
end;

Jens B
Avatar billede borrisholt Novice
29. august 2004 - 11:28 #2
Ellers prøv den her :

function getWeekNumber(today: Tdatetime): string;
const Fiddle : array[1..7] of Byte = (6,7,8,9,10,4,5);
var
  present, startOfYear: Tdatetime;
  firstDayOfYear, weekNumber, numberOfDays: integer;
  year, month, day: word;
  YearNumber: string;

begin
  present:= trunc(today); //truncate to remove hours, mins and secs
  decodeDate(present, year, month, day); //decode to find year
  startOfYear:= encodeDate(year, 1, 1);  //encode 1st Jan of the year

  //find what day of week 1st Jan is, then add days according to rule
  firstDayOfYear:= Fiddle[dayOfWeek(startOfYear)];

  //calc number of days since beginning of year + additional according to rule
  numberOfDays:= trunc(present - startOfYear) + firstDayOfYear;

  //calc number of weeks
  weekNumber:= trunc(numberOfDays / 7);

  //Format year, needed to prevent millenium bug and keep the Fluffy Spangle happy
  YearNumber:= formatDateTime('yyyy',present);

  YearNumber:= YearNumber + 'W';

  if weekNumber < 10 then
    YearNumber:= YearNumber + '0';//add leading zero for week

  //create datecode string
  result:= YearNumber + inttostr(weekNumber);

  if weekNumber = 0 then //recursive call for year begin/end...
    //see if previous year end was week 52 or 53
    result:= getWeekNumber(encodeDate(year - 1, 12, 31))

  else if weekNumber = 53 then
    //if 31st December less than Thursday then must be week 01 of next year
    if dayOfWeek(encodeDate(year, 12, 31)) < 5 then
    begin
      YearNumber:= formatDateTime('yyyy',encodeDate(year + 1, 1, 1));
      result:= YearNumber + 'W01';
    end;

end;


Jens B
Avatar billede uthsen Nybegynder
29. august 2004 - 12:23 #3
Jeg kan ikke finde ud af at få resultatet af dit andet eksempel placeret i start.table1.FieldByName('Ugenummer'), sådan jeg kan se resultatet af  udregningen!

Det vil være en stor hjælp for mig om du
evt. kan placere det rigtigt indenfor:

procedure TMainForm.MonthCalendar1DblClick(Sender: TObject);
begin
  start.table1.FieldByName('Dato').AsDateTime :=MonthCalendar1.Date;



end;
Avatar billede stoney Nybegynder
29. august 2004 - 13:14 #4
uses dateutils

start.table1.FieldByName('ugenummer').Asinteger :=WeekOfTheYear(monthcalendar1.Date)

Stoney
Avatar billede uthsen Nybegynder
29. august 2004 - 13:46 #5
Får fejl:
file not found 'dateutils.dcu'

ellers

Undeclared identifier 'WeekOfTheYear'
Avatar billede stoney Nybegynder
29. august 2004 - 15:53 #6
Hvilken version af Delphi bruger du ?

ellers prøv denne

function WeekNumber( ADay: TDateTime): Integer;
var
  Year, Month, Day: Word;
  WeekDay : integer;
  DumDay: TDateTime;
  diff, diff2: integer;
begin
    DumDay:= ADay;
    DecodeDate(DumDay, Year, Month, Day);
    DumDay:= EncodeDate( Year, 1, 1); { first day of year }
    WeekDay:= DayOfWeek(DumDay);
    if (WeekDay < 6) and (Weekday > 1) then { monday -> thursday }
      DumDay:= DumDay - WeekDay + 2
    else
    begin
      if WeekDay > 5 then
        DumDay:= DumDay - WeekDay + 9;
      if WeekDay = 1 then
        DumDay:= DumDay + 1;
    end; { DumDay points to monday in week number one }
    diff:= Trunc( ADay - DumDay);
    if diff < 0 then
    begin
      Result:= WeekNumber(ADay - 7) + 1; { last week of previous year }
      Exit;
    end;
    DumDay:= EncodeDate( Year, 12, 31); { last day of year }
    WeekDay:= DayOfWeek(DumDay);
    diff2:= Trunc(DumDay - ADay);
    if (diff2 < 3) and { one of last three days of year }
      (WeekDay > 1) and (WeekDay < 5) and { monday -> wednesday }
      (WeekDay > diff2 + 1) then
    begin
      Result:= 1; { first week of next year }
      Exit;
    end;
    result:= diff div 7 + 1;
end;

-----------------------------

start.table1.FieldByName('ugenummer').Asinteger :=WeekNumber(monthcalendar1.Date)

Stoney
Avatar billede uthsen Nybegynder
29. august 2004 - 17:26 #7
Det virker! Tak!
Avatar billede uthsen Nybegynder
29. august 2004 - 17:28 #8
Altså det var din sidste kommentar, der virkede. Tak igen:)
Jeg bruger Delphi 5
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
Kurser inden for grundlæggende programmering

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