Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: thomino am 28.10.10 - 17:19:17

Titel: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: thomino am 28.10.10 - 17:19:17
Ich habe folgendes Problem:

In einer Maske gibt es ein Startdatum und ein Enddatum. In einem weiteren berechneten Feld möchte ich nun die Werte der jeweiligen Monate (mit dem Jahreswert) angezeigt bekommen.

Beispiel:
Startdatum 15.11.2010
Enddatum 09.02.2011

Das berechnete Feld soll nun anzeigen: 201011;201012;201101;201102

Mein erster Gedanke war, das Datum auseinanderzupflücken und per while-Schleife immer einen Monat draufzugeben.

n:=1;
@while(jahrmonat_start<jahrmonat_end;jahrmonat_start+n;
n:=n+1)


Aber

1. Habe ich es nicht hinbekommen
2. Würde dabei der Jahreswechsel nicht berücksichtigt werden.

Bin ich generell auf dem richtigen Weg oder gibt es da eine elegantere Lösung, an der ich vorbeidenke?

Viele Grüße

Thomas
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: Keydins am 28.10.10 - 18:31:23
Moin Thomas,

da ich auch des öfteren mit Datumsbereichen arbeiten muss, habe ich mir dein Problem kurz nachgebaut.

2 Felder mit Datumsauswahl (Start & Ende) und ein berechnetes mit der Ausgabe 'JahrMonat' durch folgende Formel:


_start   := @Text(Start);
_ende   := @Text(Ende);
_duration   := _start + " - " + _ende;
_dateDurr := @Date(@TextToTime(_duration));
_startend := @Explode(_dateDurr);
_anzahl := @Elements(_startend);

_listeDat := @Right(_startend[1];7);
_finalList := "";
_finalList := @Right(@Right(_startend[1];7);4) + @Left(@Right(_startend[1];7);2) + "#";

n := 2;

@While(n <= _anzahl;
   @Do(
            _readDat := @Right(_startend[n];7);
            @If(
                  @Left(_listeDat;2) = @Left(_readDat;2);
                  "";
                  @Do(
                           _finalList := _finalList +  @Right(@Right(_startend[n];7);4) + @Left(@Right(_startend[n];7);2) + "#";
                           _listeDat := @Right(_startend[n];7)
                  )
            )
   );
   n := n + 1);

@Explode(_finalList;"#")


Ist auf die schnelle gestrickt und kann sicherlich an der ein oder anderen Stelle noch optimiert werden.


Gruß
Dirk
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: thomino am 29.10.10 - 10:47:34
Hi Dirk,

PERFEKT!

Danke für die schnelle Hilfe.

Thomas
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: kawie am 29.10.10 - 11:05:14
Weil ich eh mal wieder ein wenig mit Formeln rumspielen wollte...

Wie wäre es damit ?


_tempdate := @Date(startdate);
@If( @Month(enddate)<10;_var2 := @TextToNumber(@Text(10*@Year(enddate)) + @Text(@Month(enddate)));_var2 := @TextToNumber(@Text(@Year(enddate)) + @Text(@Month(enddate))));
@If(@Month(startdate )<10;_var := @TextToNumber(@Text(10 * @Year(startdate ))+ @Text(@Month(startdate ))); _var := @TextToNumber(@Text(@Year(startdate )) + @Text(@Month(startdate))));
_list := "";

@While(_var <= _var2;
@If (_list= ""; _list:=  @Text(_var);_list :=_list + "," + @Text(_var));
_tempdate := @Adjust(_tempdate;0;1;0;0;0;0);
@If(@Month(_tempdate )<10;_var := @TextToNumber(@Text(10 * @Year(_tempdate ) )+ @Text(@Month(_tempdate ))); var := @TextToNumber(@Text(@Year(_tempdate )) + @Text(@Month(_tempdate )))));

@Prompt([Ok];"Test";@Text(_list));
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: Tim Pistor am 29.10.10 - 13:09:06
liste := @Date( @Year(startDatum); @Month(startDatum) ; 1);
ende := @Date( @Year(endDatum); @Month(endDatum) ; 1);
tmpDatum := @Adjust(liste; 0; 1;0;0;0;0);
@While( tmpDatum <= ende ;  liste := (liste : tmpDatum) ; tmpDatum := @Adjust( tmpDatum; 0;1;0;0;0;0) );

@Transform(liste ; "item"; @Text(@Year( item)) + @Right( "0" + @Text(@Month(item)); 2))


Edit : noch ein bisschen gekürzt
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: kawie am 29.10.10 - 14:45:04
liste := @Date( @Year(startDatum); @Month(startDatum) ; 1);
ende := @Date( @Year(endDatum); @Month(endDatum) ; 1);
tmpDatum := @Adjust(liste; 0; 1;0;0;0;0);
@While( tmpDatum <= ende ;  liste := (liste : tmpDatum) ; tmpDatum := @Adjust( tmpDatum; 0;1;0;0;0;0) );

@Transform(liste ; "item"; @Text(@Year( item)) + @Right( "0" + @Text(@Month(item)); 2))


Edit : noch ein bisschen gekürzt


Gleiche Idee nur vieeeeel Eleganter als meins :) Auf  @Right( "0" + @Text(@Month(item)); 2)) kam ich irgendwie gar nicht :(

P.S: Du gehst aber aufs ganez Datum das heisst ein
13.10.2010 als Start würde nie das Ergebnis 201011 liefern wenn das Enddatum = 05.11.2010 liefert  oder?
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: Tim Pistor am 29.10.10 - 17:33:01
Ich setze in den ersten zwei Zeilen das Datum auf den ersten Tag im Monat - vorher ist mir genau das passiert
was Du beschrieben hast.

offtopic : Wie wäre es mit einem "Formelrätsel" - jede Woche eine andere Aufgabenstellung die per Formel
zu lösen ist? Ich kenne da den ein oder anderen der da mit Sicherheit gute Aufgaben beisteuern könnte :)
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: Werner Götz am 29.10.10 - 18:17:12
Oder so:
Code
start   := @Date(2010; 12; 22);
ende   := @Date(2021; 2; 27);

@Right((bereich := @Unique(@Right(@Text(@Explode(@TextToTime(@Text(start) + "-" + @Text(ende)))); 7))); 4) + @Left(bereich; 2);

Funktioniert natürlich nur bei deutschem Zeitformat, ansonsten müsste man das entsprechend abändern.
Titel: Re: Monate innerhalb einer Range zwischen zwei Datumsfeldern anzeigen
Beitrag von: kawie am 02.11.10 - 09:52:12
offtopic : Wie wäre es mit einem "Formelrätsel" - jede Woche eine andere Aufgabenstellung die per Formel
zu lösen ist? Ich kenne da den ein oder anderen der da mit Sicherheit gute Aufgaben beisteuern könnte :)

Bin ich für :) Meist suche ich mein Heil in LotusScript weil ich Formeln zu wenig im Focus habe. Dabei sind die meist viel
schneller.