Kalender Woche 1 [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Kalender Woche 1 [erledigt]

Beitrag von AUGE_OHR »

Silvester, der 31.12.2013, ist ja Dienstag in der Kalender Woche 1 von 2014 ...

Code: Alles auswählen

FUNCTION KWOCHE( Ddate)
...
RETURN (nKwoche)
nun ist der 30.12.2013 ein Montag den ich so berechne

Code: Alles auswählen

FUNCTION XF_Kw2Date( YYYYWW )
...
RETURN dDatum
wenn ich nun folgendes hab

Code: Alles auswählen

dMontag := XF_Kw2Date( YEAR(dDatum)+KWOCHE(dDatum) ) // -> 201301
was falsch ist ... :banghead:

komme nicht darauf wie ich das nun richtig umschreibe damit der mir den Montag auf 2014 KW1 bringt ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Kalender Woche 1 [erledigt]

Beitrag von AUGE_OHR »

in meinen Fall ist der Parameter in XF_Kw2Date( YYYYWW ), was ein falsche Jahr bekommt, ja das Problem .
ich möchte aber nun nicht jedes Programm korrigieren welches die Kombination von beiden Function nutzen.

nun habe ich beide Function in einem PRG z.h. eine Fieldwide STATIC is in beiden Function "sichtbar"
ich brauche also eine Korrektur Faktor wo ich vorher das hatte

Code: Alles auswählen

nWoche := IF( nWoche < 53, nWoche, IF( nDay > 3, nWoche, 1 ) )
wird zu

Code: Alles auswählen

STATIC nSilverster := 0

FUNCTION XF_WocheJahr( dDatum )
...
   IF nWoche > 52
      IF XF_Schaltjahr( YEAR(dDatum) )
...
      ELSE
         // wenn 4 Tage oder mehr im neuen Jahr KW 1
         IF nDay > 3
            nSilverster := 0 
         ELSE
            nWoche := 1
            nSilverster := 1 
         ENDIF
      ENDIF
   ELSE
      nSilverster := 0 
   ENDIF

FUNCTION XF_Kw2Date( YYYYWW )
LOCAL nJahr  := VAL( LEFT( YYYYWW, 4 ) )+nSilverster
...
RETURN dDatum
somit kann ich alle Programme, welche diese Kombination von beiden Function nutzen, ohne grosse Änderungen weiter nutzen und muss keinen Code ändern ;)
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Kalender Woche 1 [erledigt]

Beitrag von AUGE_OHR »

Nachtrag : die Abfrage

Code: Alles auswählen

IF XF_Schaltjahr()
ist wohl für Kalenderwochen nicht relevant.

Frage : welche Jahre hatten 53 Wochen ?

2012 war Silvester wohl auch schon in KW 1 und es gab nur 52 Wochen. Ich muss das ganze noch mal mit 53 testen ob es klappt ...

Nachtrag :

Code: Alles auswählen

PROCEDURE MAIN
LOCAL I
LOCAL dDatum
LOCAL nKw

SET ALTER TO _KW53.LOG
SET ALTER ON

   FOR I = 1900 TO 2015
      dDatum := CTOD( "31.12."+STRZERO(i,4) )
      nKw    := XF_WocheJahr( dDatum )
*      ? nKw
      IF nKw = 53
         ? i
      ENDIF
   NEXT

SET ALTER OFF
SET ALTER TO
1903
1908
1914
1920
1925
1931
1936
1942
1948
1953
1959
1964
1970
1976
1981
1987
1992
1998
2004
2009
2015
ist das richtig ?
gruss by OHR
Jimmy
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 651
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Kalender Woche 1 [erledigt]

Beitrag von nightcrawler »

ich habe vor einiger Zeit mal eine SQL-Umsetzung für ADS gemacht (als damals nur das Ami-Format unterstützt war). Evtl hilft Dir der Algo:

Code: Alles auswählen

CREATE FUNCTION jdisoweek(d date)
   RETURNS integer
BEGIN

declare y integer;
declare s string;
declare w integer;

y=year(d); 
s=trim(cast(y as sql_char))+'-01-01';
w=week(d);

-- isoweek 1 is the one with the first thursday of the year
if dayofweek(cast(s as sql_date))>5 then
  w=w-1;
endif;

-- isoweek starts on monday, not sunday
if dayofweek(d)=1 then
  w=w-1;
endif;

-- there's no 0 week - so get the previous
if w=0 then
  s=trim(cast((y-1) as sql_char))+'-12-31';
  w=jdisoweek(cast(s as sql_date));
endif;
 
-- week 53 only exists if it contains a thursday
if w=53 then 
  s=trim(cast(y as sql_char))+'-12-31';
  if dayofweek(cast(s as sql_date))<5 then
    w=1;
  endif;
endif;

return w;

END;
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten