![]() |
Problem mit MonthOf
Ich bin gerade etwas verwirrt. Ich benötige den Monat einer Woche. Um dies zu erreichen benutze ich MonthOf(EncodeDateWeek(2013, 1, 1)). Beispielhaft:
Delphi-Quellcode:
Mache ich jetzt einen Denkfehler oder rechnet Delphi falsch? Ich habe das mit XE und XE3 probiert und das Ergebnis ist das selbe.
EncodeDateWeek(2013, 1, 1) // = 31.12.2012 - richtig
MonthOf(StrToDate('31.12.2012')) // = 12 - falsch Wenn ich mir den Kalender ansehe, dann ist der 31.12.2012 aber schon in der KW 1/2013, was meiner Meinung nach ja auch richtig ist. Hat jemand eine Idee, wie ich das lösen kann? |
AW: Problem mit MonthOf
Was soll daran falsch sein?
vom 31.12.2012 ist der Monat nunmal die 12 :gruebel: |
AW: Problem mit MonthOf
Die KW wird so berechnet, dass die KW zwischen zwei Jahren die mit KW 1 angesehen wird, in der mehr Tage der Woche zu finden sind. Da in der letzten Woche des Jahres 2012 nur noch ein Tag (31.12.) zu finden ist, ist er bereits KW 1. Sind vier Tage der Woche noch im letzten Jahr, ist der 01.01. meinetwegen KW 53.
|
AW: Problem mit MonthOf
Ja, wenn man vor lauter Fehlersucherei dann ein Brett vorm Kopf hat und nicht weiter kommt.
Klar 12 = 12. Tja wenn ich halt den Monat der ersten KW in 2013 heraus bekommen möchte und es kommt dann 12 heraus, steht man erst mal dumm da. Ich denke das ich es wie folgt mache:
Delphi-Quellcode:
damit sollte es passen.
if berechneteKW = 1 then Monat = 1
if berechneteKW = 52 or 53 then Monat = 12 ansonsten Monat = MonthOf |
AW: Problem mit MonthOf
Nur mal so dahin gefragt, vielleicht verstehe ich nur deine Aufgabe nicht, aber warum berechnest du den Monat über die Kalenderwoche? Du wirst wahrscheinlich schon dein Gründe haben, aber abhängig von dem was du vorhast kann dein Code ungenau sein. Denn wenn die erste KW noch im letzten Jahr ist, dann ist das so. Wenn das aber unwichtig ist, dann bezeichne es nicht als KW, sondern Lfd. Woche im Jahr.
Letztendlich kannst du sicher ein, dass zumindest ein Teil der KW 1 im neuen Jahr ist, aber die erste Woche des Jahres kann auch KW 53 sein. |
AW: Problem mit MonthOf
Hintergrund ist folgender: In einer einer Erfassungsmaske kann der Benutzer das Feld "Lieferwoche" eingeben. Alle Auswertungen die gemacht werden beziehen sich aber auf Monate. Deshalb speichere ich den Monat der Lieferwoche mit in die Tabelle, damit ich über SQL einfacher die Daten ziehen kann.
In meinem Beispiel der KW 1/2013 müsste demnach als Monat der Januar gespeichert werden. So wie ich das bisher berechnet habe (habe ja keine andere Möglichkeit) kommt aber Dezember raus und das gibt Probleme, denn die Auswertung gehört in den Januar. Ich muss das ganze so abbilden wie das auf einem Kalender angezeigt wird. Wie ich im Code gesehen habe (hat ein anderer geschrieben) wird die KW 53 auch gar nicht berücksichtigt, da habe ich auch noch ein Problem. Das muss ich am Montag mit meinem neuen Programmier noch mal durchgehen, bzw. mit dem Kunden noch mal abklären. Ich merke gerade dass ich das Problem nicht nur beim Jahreswechsel habe, das kann auch innerhalb vom Jahr passieren, denn ich beziehe mich immer auf den Anfang einer Woche. Na ja, da gibt es noch einmal etwas Arbeit. Aber trotzdem Danke für die Hilfe. |
AW: Problem mit MonthOf
Die Abbildung ist gegf. uneindeutig, vielleicht kann der Nutzer bei der Eingabe angeben wohin zugeordnet werden soll
|
AW: Problem mit MonthOf
Was du machen könntest, ist erstmal über EncodeDateWeek den Anfang der Woche zu bestimmen,
dann besorgst du dir aber den letzen Tag der Woche (+6) und zum Schluß besorgst du dir davon über MonthOf den Monat. Oder doch nur +4, da für die Zugehörigkeitsbestimmung der Jahres ja die halbe Woche genutzt wird, also mindestens 4 Tage. |
AW: Problem mit MonthOf
Man muss sich einfach nur absprechen was etwas bedeutet und das umsetzen, dann wird auch niemand überrascht. Man kann sich an allgemeingültige Konventionen halten, wenn es welche gibt, oder auch mit diesen brechen, wenn es gefordert wird. Es muss nur klar sein.
Beispiel: Definition Jahr für die Auswertung: Ist das Jahr des 1. Tages der Kalenderwoche Definition Monat für die Auswertung: Ist der Monat des 1. Tages der Kalenderwoche Definition 1. Tag der Kalenderwoche: Die Kalenderwoche startet am Montag Definition Kalenderwoche: ... Ab in die Dokumentation und so umsetzen. Ohne das braucht man eine Menge Mate-Tee und einen Sack voll Problemkerzen ;) |
AW: Problem mit MonthOf
Oder mal so:
Delphi-Quellcode:
Ist das Ergebnis True, ist es ein Jahr, sonst zwei. Dann bleibt es an dir welcher dich interessiert.
function JahreDerKW(const AYear, AWeekOfYear: Word; var AYear1, AYear2: Word): Boolean;
var Dummy: Word; begin DecodeDate(EncodeDateWeek(AYear, AWeekOfYear, 1), AYear1, Dummy, Dummy); DecodeDate(EncodeDateWeek(AYear, AWeekOfYear, 7), AYear2, Dummy, Dummy); Result := AYear1 = AYear2; end; procedure TForm1.Button1Click(Sender: TObject); var Year1, Year2: Word; begin if JahreDerKW(2013, 1, Year1, Year2) then ShowMessage(Format('KW ist in einem Jahr: %d', [Year1])) else ShowMessage(Format('KW ist in zwei Jahren: %d und %d', [Year1, Year2])); end; |
AW: Problem mit MonthOf
@Popov
Das Problem tritt ja unter dem Jahr auf, da der Monat auch mitten in der Woche enden/beginnen kann. |
AW: Problem mit MonthOf
Grade nochmal drüber nachgedacht ... das müßte doch soweit stimmen?
Delphi-Quellcode:
J := YearOf (EncodeDateWeek(Jahr, Woche, 4));
M := MonthOf(EncodeDateWeek(Jahr, Woche, 4)); |
AW: Problem mit MonthOf
Das mit dem Kalender ist nicht so einfach. Den korrekten Monat einer KW zu erhalten ist so eine Sache und wie ihr beschrieben habt eigentlich gar nicht möglich, wenn die KW über zwei Monate geht.
Ich habe hierzu den Kunden noch mal gefragt wie er es denn gerne haben möchte. Wenn ich die Antwort habe, dann gebe ich noch mal über den aktuellen Status Bescheid. In irgendeinem Excel-Forum oder Blog gabs eine Funktion, die wir umgeschrieben haben.
Delphi-Quellcode:
Leider funktioniert diese Berechnung aber auch nicht ganz, ich hätte bei manchen Ergebissen etwas anderes gesagt.
function GetMonatFromKW(Jahr, KW: String): String;
var tage: Int16; Date, Date2: TDate; wochentag, wochentag2: word; year, month, day: word; begin // Was für ein tag ist der 1.1.xxxx Date := StrToDate('01.01.' + Jahr); wochentag := DayOfWeek(Date); // Was für ein Tag ist der 31.12.xxxx Date2 := StrToDate('31.12.' + Jahr); wochentag2 := DayOfWeek(Date2); // Wenn der erste oder letzte Tag eines Jahres ein Donnerstag ist // dann hat das Jahr 53 KWs if (wochentag = 5) OR (wochentag2 = 5) then begin // Alle außer KW 53 werde ignoriert und normal berechnet if KW = '53' then begin Result := '12'; Exit; end; end; // Anzahl der Tage seid Anfang des Jahres tage := StrToInt(KW) * 7; tage := tage - ((wochentag)); // Zum Datum hin rechnen Date := Date + tage; // Monat auslesen und zurückgeben DecodeDate(Date, year, month, day); Result := inttostr(month); end; Warten wir mal ab, was der Kunde sagt. |
AW: Problem mit MonthOf
Klingt vernünftig, egal wie er entscheidet, Du bist aus dem Schneider ....
|
AW: Problem mit MonthOf
Ich habe auch noch folgende Infos gefunden:
![]() ![]() ![]() ![]() Hier gibt es keine eindeutige Erklärung ob eine KW einem Monat zugeordnet werden kann. Es ist nur das Jahresende, bzw. der Jahresanfang geregelt. |
AW: Problem mit MonthOf
Zitat:
Und nun ärgere ich mich, da ich vor drei Tagen eine Funktion geprogt habe bei der flexibel per Schalter entscheiden werden konnte ob das vorherige Jahr/Monat oder das nächste Jahr/Monat genommen werden soll. Löste zwar nicht das Problem zu welchem Monat die KW gehörte, aber man konnte per Schalter zwischen beiden Möglichkeiten wählen. Und weil ich dachte, dass das Problem gelöst war, habe ich es gelöscht. |
AW: Problem mit MonthOf
Ich habe auch Großkunden die ob dieses Problems verschieden Auswertungen fahren (JKW/JM/JQ) sauber kann das Ganze nur werden wenn an dem Satz ein Datum(d.m.y) hängt.
|
AW: Problem mit MonthOf
Kunde hat jetzt entschieden:
1. im ersten Schritt soll eine KW dem Monat zugeordnet werden, in dem sich die meisten Tage des entsprechenden Monats befinden. Da müssen wir keine großen Anpassungen durchführen. 2. in einem späteren Schritt soll alles so umgestellt werden, das es prozentual den Monaten zugeordnet wird, d.h. jedem Werktag werden 20% zugeordnet, Wochenenden werden nicht berücksichtigt. Entsprechend wird dann dem Monat zugeordnet. Beispiel: Mo und Di sind im Januar, Mi, Do und Fr sind im Februar, dann werden 40% in den Januar und 60% in den Februar gelegt. |
AW: Problem mit MonthOf
Das ist eine Aussage. Aber ich würde das nicht in einen späteren Schritt packen, sondern direkt umsetzten.
Aber trotzdem eine Frage: die 1. volle Woche in einem neuen Jahr, dessen Montag am 4. Januar anfängt, ist das für den Kunden nun 1. KW oder schon die 2. KW. Denn eigentlich ist es die 1. KW, aber der letzte Monat des letzten Jahres hat vier Werktage der Woche. |
AW: Problem mit MonthOf
1. Variante ist eine Funktion mit ca. 20 Zeilen anzupassen, das mache ich für den Kunden kostenlos und müsste relativ schnell geändert sein.
2. Variante muss ich dem Kunden noch klar machen, dass er auch dafür was zahlen muss, denn hier habe ich etwas mehr Aufwand. Zu Deiner Frage: dieser Fall tritt das nächste mal im Jahr 2016 auf. Da die das so haben wollen, wie es im Kalender steht, würde ich sagen, dass das KW 1 ist. Die letzte KW in 2015 ist die KW 53 und das bekommt der Benutzer auch zur Auswahl. Ich denke, dass sollte kein Problem werden. Bis dahin habe ich aber bestimmte Variante 2. schon umgesetzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz