PDA

Vollständige Version anzeigen : Kalenderwoche anzeigen


Sonne im Herz
04.08.2001, 12:51
Angenehmer Samstag wünsch ich euch.

Hab eine Teilerfolg erziehlt, aber mir fehlt noch das wichtigste.

bei der Eingabe der KW 1 möchte ich den Montag der 1. KW

Hab da schon was.


Private Sub KW_AfterUpdate()
If Me.KW = 1 Then
' me.termin.value = erste Kalenderwoche im Jahr und davon der Montag.

End If
If Me.KW = 53 Then
Me.TERMIN.Value = DateAdd("d", 7, Date)
GoTo kwcheck
End If
If Me.KW = 54 Then
Me.TERMIN.Value = DateAdd("d", 14, Date)
GoTo kwcheck
End If
If Me.KW = 55 Then
Me.TERMIN.Value = Date
GoTo kwcheck
End If
If Me.KW = 56 Then
Me.TERMIN.Value = DateAdd("d", 1, Date)
GoTo kwcheck
End If
If Me.KW = 57 Then
Me.TERMIN.Value = DateAdd("d", 2, Date)
GoTo kwcheck
End If

kwcheck:
If DatePart("w", Date) = 1 Then
Me.TERMIN.Value = DateAdd("d", 1, Me.TERMIN.Value)
End If
If DatePart("w", Date) = 7 Then
Me.TERMIN.Value = DateAdd("d", 2, Me.TERMIN.Value)
End If
End Sub

Der Rest tut, aber das mit der KW 1 - 52 will nicht so recht.

Hab mit DatePart ("ww", 1,date) herumexperimentiert.

Könnte mir jemand helfen.


Währe super

Ich lass dann auch wieder die Sonne scheinen, versprochen.

Morli
04.08.2001, 13:10
Hi Sonne,

jetzt scheint Dein Namesfetter ja schon bevor hier überhaupt 'ne Antwort vorhanden ist! Find ich aber gut...!

Ach so, meine Antwort, frei nach DonKarl:

P r o b l e m
Du möchtest ermitteln, welches Datum der Montag einer vorgegebenen Kalenderwoche hat.

L ö s u n g
Ausgehend von KW 1 = die erste mit 4 Tagen:
'***************** CODE START ********************
Public Function Fkt_KWMon(ArgKW As Byte, Optional ArgJahr)
' gibt den Montag der übergebenen KW zurück
' von Karl Donaubauer
Dim M As Date
If IsMissing(ArgJahr) Then ArgJahr = Year(Date)
M = DateSerial(ArgJahr, 1, 1) + (ArgKW - 1) * 7
M = M + 1 - WeekDay(M, 2)
If Format(M, "ww", 2, 2) <> ArgKW Then M = M + 7
If (ArgKW = 1 Or ArgKW = 53) And Day(M) > 4 And Day(M) < 8 Then M = M - 7
Fkt_KWMon = M

End Function
'***************** CODE ENDE ********************
Aufruf Fkt_KWMon(1, 2000) ergibt den Montag der 1. KW im Jahr 2000.
Ohne Jahresangabe Fkt_KWMon(1) wird das aktuelle Jahr angenommen.

Viel Spaß damit!

Gruß

Rainer ;)

Sonne im Herz
04.08.2001, 14:31
Sieht interessant aus, aber will nicht so wie ich will.

Gibt es nichts einfacheres, wenn ich im Feld KW eine 24 eingebe, kommt Montag den 21.6.2001

Ist sowas nicht machbar.


Gruß Sonne


PS: Bei mir ist immer noch bewölkt

Sonne im Herz
04.08.2001, 14:51
ich bekomme immer nur die KW für ein Datum, ich möchte aber ein Datum für eine KW.

Könnte ja iterativ an die Sache herangehen, ist mir aber zu aufwendig. Will was einfaches.


Also von KW -> Datum und nicht Datum -> KW.

Ist schwierig, ich weis.

Sonne

Morli
04.08.2001, 14:56
Hi Sonne (wo bist Du? bei uns schüttet es jetzt wie aus Eimern!),

was funktioniert den da nicht? Wenn ich den Code mit MsgBox Fkt_KWMon(24) aufrufe, bekomme ich den 11.06.2001 ausgegeben und im Gegensatz zu Deinem Wunsch 21.06.2001 stimmt das auch.

Also wie schon gesagt, bei mir funzt das 100%-ig.

Und einfacher als mit einem vorgekauten Code :D kannst Du es m.E. nicht haben.

Gruß

Rainer ;)

Sonne im Herz
04.08.2001, 15:56
Ich komme aus dem Schwabenland.

bei mir tut das mit der MsgBox auch, der 21.6.2001 als KW 24 war nur geschätzt (hab ich doch gut getroffen).

Was muß ich aber tun, um das Datum in mein Feld Termin zu bringen.

OK Habs geschaft.

Me.termin.value = fkt_kwmon(me.KW)

aber ich bekomm immer nur den Mittwoch, will aber Montag. Wie kann ich das umstellen??

Bei uns ist es jetzt auch wieder bewölkt.

Gruß Sonne

Morli
04.08.2001, 18:15
Hi Sonne,

bei uns in Oberfranken (gehört glaube ich zu Bayern, darf man hier aber nicht laut sagen, besonders als "Zugerasta") schein im Moment mal wieder die Sonne!

Also das mit dem Mittwoch verstehe ich nicht! Ich habe ja schon mal was davon gehört, das im Schwabenländle die Uhren anders laufen :D, aber der Kalender ist doch der gleiche wie in ganz Deutschland, oder....?

Bei mir wir jedesmal das Datum des Montags ausgegeben! Schreib doch einfach mal ein paar Werte für die KW und das ausgegebene Datum ins Forum, dann schau ich mal, was bei mir rauskommt!

Gruß

Rainer ;)

Sonne im Herz
05.08.2001, 10:50
Hi zusammen.

Hier mein Code zum mitschreiben.
Benutze XP, KW ist Kombifeld und die Daten kommen aus der TB KW.


Private Sub KW_AfterUpdate()
If Me.KW >= 1 And Me.KW <= 53 Then
Me.TERMIN.Value = Fkt_KWMon(Me.KW)
End If
If Me.KW = 54 Then ' in 1 Woche
Me.TERMIN.Value = DateAdd("d", 7, Date)
GoTo kwcheck
End If
If Me.KW = 55 Then ' in 2 Wochen
Me.TERMIN.Value = DateAdd("d", 14, Date)
GoTo kwcheck
End If
If Me.KW = 56 Then 'heute
Me.TERMIN.Value = Date
GoTo kwcheck
End If
If Me.KW = 57 Then 'eilt sehr
Me.TERMIN.Value = DateAdd("d", 1, Date)
GoTo kwcheck
End If
If Me.KW = 58 Then 'sofort
Me.TERMIN.Value = DateAdd("d", 2, Date)
GoTo kwcheck
End If

kwcheck:
If DatePart("w", Date) = 1 Then 'Sonntag
Me.TERMIN.Value = DateAdd("d", 1, Me.TERMIN.Value)
End If
If DatePart("w", Date) = 7 Then 'Samstag
Me.TERMIN.Value = DateAdd("d", 2, Me.TERMIN.Value)
End If
End Sub

Public Function Fkt_KWMon(KaWe As Byte, Optional ArgJahr)
' gibt den Montag der übergebenen KW zurück
' von Karl Donaubauer
Dim M As Date
If IsMissing(ArgJahr) Then ArgJahr = Year(Date)
M = DateSerial(ArgJahr, 1, 1) + (KaWe - 1) * 7
M = M + 1 - Weekday(M, 2)
If Format(M, "ww", 2, 2) <> KaWe Then M = M + 7
If (KaWe = 1 Or KW = 53) And Day(M) > 4 And Day(M) < 8 Then M = M - 7
Fkt_KWMon = M

End Function


für kw 3 16.1.2001
für kw 6 6.2.2001
für kw 35 28.8.2001
für kw 49 4.12.2001

alles am Dienstag.

Kommt das, weil ich den Smastag und Sonntag ausgemustert habe.

:cool: Und noch ein Problem :cool:

das Ausgabefeld ist der Termin der Lieferung

wenn ich eine kleinere KW als die Aktuelle eingebe, soll die KW von nächstem Jahr genommen werden. Da unsere Kunden z.T. bis zu 11 Monate im Voraus bestellen.

Gruß Sonne

Morli
05.08.2001, 19:07
Hi Sonne,

ich habe Deine DB mal nachgestellt und siehe da, du hast recht. Oberwohl die Funktion genau so aussieht wie die von DonKArl, kommt ein anderes Ergebnis raus. Und was noch beser ist: Wenn ich das Ganze aus eine Sub mit MsgBox Fkt_KWMon(24) aufrufe, bekomme ich den 12.07.01, wenn ich aber aus der Kombi mit 24 aufrufe, dann bekomme ich den 12.07.01! Das soll mir mal jemand erklären.

Abhilfe: ziehe von Fkt_KWMon "-Dateserial(0,0,2) ab und es passt. Warum weiß ich aber auch nicht! Arno, weiss Du was da los ist?????

Gruß

Rainer ;)

Morli
06.08.2001, 06:36
Hi Sonne,

also, so langsam blick ich nicht mehr durch!
Ich habe jetzt die gleiche Funktion auf meinem Rechner im Büro getestet (ohne -Dateserial(0,0,2) und siehe da, es klappt einwandfrei!!!!????
Scheint also irgendwie mit den Systemsettings zusammenzuhängen!
Ist natürlich nicht so schön, würde heißen, das Du bei deinem Code auch noch das jeweilige Setting berücksichtigen mußt!

Zu dem zweiten Problem:

If Me.KW >= 1 And Me.KW <= 53 Then
If Me.KW < DatePart("ww", Now, 2, 2) Then
Me.Termin.Value = Fkt_KWMon(Me.KW, DatePart("yyyy", Now) + 1)
Else
Me.Termin.Value = Fkt_KWMon(Me.KW)
End If
End If

Gruß

Rainer ;)

Sonne im Herz
06.08.2001, 20:11
Guten Abend Rainer,

ich stehe auf dem Schlauch.
Deine Lösung blicke ich nicht.
Abhilfe: ziehe von Fkt_KWMon "-Dateserial(0,0,2) ab und es passt.

Und das mit dem nächsten Jahr will auch nicht so.

Ist nicht mein Tag heute, sorry.


Gruß Sonne

Sonne im Herz
07.08.2001, 20:20
guten Abend zusammen

hab das von Rainer vorgeschlagene Codebeispiel versucht. Der Code tut (einzeln), aber in der If-Anwendung bleibt die KW 30 immer noch auf 2001 und nicht 2002.

Da muß ein Logic-Fehler drin sein.

Kann mir jemand helfen.

Private Sub KW_AfterUpdate()
' KW 1 bis 53
If Me.KW >= 1 And Me.KW <= 53 And Me.KW < DatePart("ww", Now, 2, 2) Then
' Wenn der Termin im nächsten Jahr ist
Me.TERMIN.Value = Fkt_KWMon(Me.KW, DatePart("yyyy", Now) + 1)
End If
If Me.KW >= 1 And Me.KW <= 53 And Me.KW >= DatePart("ww", Now, 2, 2) Then
' Wenn der Termin noch dieses Jahr ist
Me.TERMIN.Value = Fkt_KWMon(Me.KW)
End If

der Rest ist gleich wie oben.

Gruß Sonne