[Gelöst] Berechnete DateFormula als Rückgabewert

4. September 2007 18:26

Auf den Lagerhaltungsdaten befindet sich die Beschaffungszeit (DateFormula).

Ziel soll es sein, dieses Feld neu zu berechnen, und zwar nach dem Schema:

Beschaffungszeit = Datum2 - Datum1.

Berücksichtigt werden soll dabei auch noch der Betriebskalender des Kreditors (sprich: Wochenendtage zählen nicht als Beschaffungszeit. Bestelle ich am Montag und es wird mir genau 1 Woche später geliefert, ist die Beschaffungszeit nicht 7T bzw. 1W, sondern 5T).

Nur wie berechne ich eine DateFormula???
Die Standardcodeunits kennen zwar Dates als Rückgabewert, aber DateFormulas werden nirgends berechnet oder zurück gegeben.

Meine Idee ist daher folgende:
Auf Betriebskalender auf Datum1 springen, dann in einer Schleife bis Datum2 die Tage zählen, die nicht Wochenende (oder aus anderen Gründen frei) sind, und das Ergebnis als <'AnzahlD'> ausgeben. Vielleicht rechne ich das noch auf Wochen und Monate um.

Gibt es das vielleicht schon irgendwo fertig, ehe ich mich hier abmühe?
Zuletzt geändert von Natalie am 6. September 2007 17:38, insgesamt 1-mal geändert.

4. September 2007 23:19

Die einzige Möglichkeit dürfte sein, die Anzahl Tage zwischen den beiden Daten zu ermitteln und anschließend diese (Integer)Zahl in eine Datumsformel umzuwandeln.
Du könntest diesen Wert natürlich noch in Wochen umrechnen, da eine Woche immer 7 Tage hat. Eine Umrechnung in Monate kann ich nicht empfehlen, da hier Ungenauigkeiten auftreten werden.
Immerhin spricht ja nichts dagegen, eine Beschaffungszeit von 8W einzutragen, denn 8W liefert nicht dasselbe Ergebnis wie 2M.

5. September 2007 08:13

Das heißt, im Downloadbereich ist auch nichts dergleichen vorhanden?

5. September 2007 08:55

Habe gerade übrigens festgestellt, dass sich eine DateFormula nicht als Rückgabewert für eine Funktion verwenden lässt. Es bleibt nur der Weg über einen VAR-Parameter.
Sachen gibts ...

5. September 2007 09:22

Du konntest auch Text für die Rückgabe nehmen und den Rückgabewert mit evaluate dem Dateformula-Feld zuweisen.
Code:
IF EVALUATE(DateFormulaFeld,GetDateFormula(Datum1,Datum2)) then;

5. September 2007 09:24

Ja, das hatte ich für den internen Ablauf meiner Funktion (oder Prozedur, besser gesagt) vor.

Mich wundert noch immer, dass der Standard solche Operationen gar nicht vorsieht (sowohl DateFormulas berechnen als auch diese als Rückgabeparameter zulassen) - hm.

5. September 2007 09:25

Natalie hat geschrieben:Das heißt, im Downloadbereich ist auch nichts dergleichen vorhanden?


Hast Du denn schon die Search-Funktion im Mibuso-Downloadbereich versucht? Wenn es was gibt, dann sicher da.

5. September 2007 10:13

Nichts gefunden ...

5. September 2007 11:05

So, es klappt tatsächlich.
Könnt ihr erkennen, ob ich hier Codekosmetik betreiben kann?

CalcDateFormula(FromDate,ToDate,CalendarCode,VAR pDateFormula)
Code:
CLEAR(pDateFormula);

DayCounter := CountDays(FromDate, ToDate, CalendarCode);
TxtDateFormula := '<' + FORMAT(DayCounter) +'D>';

EVALUATE(pDateFormula, TxtDateFormula);


CountDays(FromDate,ToDate,CalendarCode) : Integer
Code:
IF CalendarCode = '' THEN
  EXIT(ToDate - FromDate);

IF FromDate = ToDate THEN
  EXIT(0);

CountDays := 0;

IF FromDate < ToDate THEN
  TxtDateFormulaStep := '<1D>'
ELSE
  TxtDateFormulaStep := '<-1D>';

REPEAT
  IF NOT CalendarMgt.CheckDateStatus(CalendarCode, FromDate, DummyDesc) THEN
    CountDays += 1;
  FromDate := CALCDATE(TxtDateFormulaStep, FromDate);
UNTIL FromDate = ToDate;

EXIT(CountDays);