Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: oxyd21 am 02.12.10 - 10:56:21

Titel: Variablenzuweisung
Beitrag von: oxyd21 am 02.12.10 - 10:56:21
Hallo,

folgendes Problem:

Die Variable datTempDate ist ein "Arbeitswert" in einer Funktion, dass den Ausgangswert aus einer Property bekommt.
Wenn ich nun das Datum bearbeite, wird ja auch das zugewiesene Datum geändert.

Wie setze ich elegant den temporären Wert, damit der Ausgangswert nicht geändert wird.

Code
Dim datTempDate As NotesDateTime
Set datTempDate = StartDate

Call datTempDate.Adjustday(intActualDay, True)

VG, Michael
Titel: Re: Variablenzuweisung
Beitrag von: m3 am 02.12.10 - 11:01:36
Set datTempDate = New NotesDateTime(StartDate)
Titel: Re: Variablenzuweisung
Beitrag von: oxyd21 am 02.12.10 - 11:15:58
Nee, da diese Variante nen String erwartet. Ich kann DateOnly verwenden oder den String zusammenbasteln, aber dass is nicht so prall.

Code
Property Set StartDate As NotesDateTime
	Set Me.datStartDate = StartDate
End Property
	
Property Get StartDate As NotesDateTime
	Set StartDate = Me.datStartDate
End Property
Titel: Re: Variablenzuweisung
Beitrag von: Glombi am 02.12.10 - 11:23:46
In der Funktion sollte die Variabke mit byVal als Parameter definiert sein.

Function ABC(ByVal intActualDay as ...) as ...
Dim datTempDate As NotesDateTime
Set datTempDate = StartDate

Call datTempDate.Adjustday(intActualDay, True)


Titel: Re: Variablenzuweisung
Beitrag von: oxyd21 am 02.12.10 - 11:52:40
Damit wäre aber intActualDay CallbyValue und nicht das StartDate.

Übergeben wäre m.E. auch nicht möglich, da ByVal nicht mit NotesDateTime geht.
Titel: Re: Variablenzuweisung
Beitrag von: gstueb am 12.10.12 - 00:23:17
Wie setze ich elegant den temporären Wert, damit der Ausgangswert nicht geändert wird.

Code
Dim datTempDate As NotesDateTime
Set datTempDate = StartDate

Call datTempDate.Adjustday(intActualDay, True)

VG, Michael

Da ich gerade genau das gleiche Problem habe: Wie könnte denn eine sichere Lösung aussehen?

Unter welchen Umständen kann

Code
Dim datTempDate As NotesDateTime
Set datTempDate = New NotesDateTime(StartDate.LocalTime)

zu Problemen führen?

Gruß,
Gregor
Titel: Re: Variablenzuweisung
Beitrag von: koehlerbv am 12.10.12 - 00:36:10
Wozu verwendest Du hier überhaupt die NotesDateTime-Klasse mit diesen Nachteilen? Was willst Du erreichen, Gregor?

Bernhard

PS: Warst Du nicht in meinem Vortrag "Notes und die Zeit"?
Titel: Re: Variablenzuweisung
Beitrag von: gstueb am 12.10.12 - 00:54:37
Hallo Bernhard,

ich war leider nicht auf Deinem Vortrag "Notes und die Zeit", ich hab' mich aber schon relativ ausführlich mit dem Thema beschäftigt. Ich hätte tatsächlich genauso gut (oder leichter) das einfache Datumsformat, welches intern als Double abgelegt wird, verwenden können.

Ich hab' mich aber trotzdem und bewusst für die NotesDateTime Klasse entschieden, einfach weil ich im Umgang damit noch einiges lernen kann.

Gruß,
Gregor
Titel: Re: Variablenzuweisung
Beitrag von: Peter Klett am 12.10.12 - 07:23:52
Hm, interessantes Thema. Obwohl ich auch noch nicht den Sinn gefunden habe, mit NotesDateTime zu arbeiten, habe ich mal etwas experimentiert, wie man es hinbekommt, ein neues NotesDateTime auf Basis eines anderen zu kreieren, ohne die Zeit als String zu übergeben. Das ist dabei herausgekommen, geht bestimmt noch etwas eleganter, aber funktioniert. Wird einen Überlauf bei mehr als 32000 Tagen Differenz bringen, soll aber auch nur die Möglichkeit aufzeigen. Schick machen kann es sich derjenige, der sowas tatsächlich braucht.

Code
Option Public
Option Declare

Sub Initialize
	Dim StartDate As New NotesDateTime ("")
	Call StartDate.SetNow ()
	Call StartDate.AdjustDay (1)

	Dim tmpDate As NotesDateTime
	Set tmpDate = KloneDateTime (StartDate)

	MsgBox StartDate.LocalTime, 64, tmpDate.LocalTime
	Call tmpDate.AdjustDay (2)
	MsgBox StartDate.LocalTime, 64, tmpDate.LocalTime
End Sub

Function KloneDateTime (dt As NotesDateTime) As NotesDateTime
	Dim kdt As New NotesDateTime ("")
	Call kdt.SetNow ()
	Dim td As Double
	Dim s As Integer
	Dim m As Integer
	Dim h As Integer
	td = dt.TimeDifferenceDouble (kdt)
	s = td Mod 60
	Call kdt.AdjustSecond (s)
	td = (td - s) / 60
	m = td Mod 60
	Call kdt.AdjustMinute (s)
	td = (td - m) / 60
	h = td Mod 60
	Call kdt.AdjustHour (h)
	td = td - h
	Call kdt.AdjustDay (td / 24)
	Set KloneDateTime = kdt
End Function

EDIT: Das wird so noch nicht ganz klappen. Wenn am Ende bei td / 24 etwas Krummes herauskommt, knallt es. Stecke da aber jetzt nicht mehr Energie rein, ist ja nur ein Denkanstoß ...

EDIT 2: Das passt auch an anderer Stelle noch nicht, irgendwo laufen die Minuten auseinander, wenn die Differenz unglücklich ist. Schluss jetzt damit, da müsste wohl mal ein Mathematiker ran ...
Titel: Re: Variablenzuweisung
Beitrag von: Glombi am 12.10.12 - 08:14:51
NotesDateTime erwartet zwar (laut Doku) einen String, kann aber auch mit anderen Datentypen umgehen. Bspw. liefert folgender Code 4 mal das gleiche Ergebnis:

Dim ndt As NotesDateTime
   Dim ndt1 As NotesDateTime
   Dim ndt2 As NotesDateTime
   Dim ndt3 As NotesDateTime
   
   Set ndt = New NotesDateTime( Today )
   Call ndt.AdjustDay(1)
   
   Set ndt1 = New NotesDateTime( ndt.LSLocalTime )
   Set ndt2 = New NotesDateTime( ndt.LocalTime )
   Set ndt3 = New NotesDateTime( Datenumber(2012,10,13) )   
   
   Msgbox ndt.LocalTime & " " & ndt1.LocalTime  & " " & ndt2.LocalTime   & " " & ndt3.LocalTime

Andreas
Titel: Re: Variablenzuweisung
Beitrag von: pram am 12.10.12 - 08:16:17
Notesdatetimes haben den Vorteil,  dass sie "dateonly"  bzw timeonly sein können.

Machst du dies mit normalen Variants und schreibst "Stichtag 1.1.2013" in ein Feld,  hängt ein Variant immer die Uhrzeit 00:00:00 dran. Aus dem Datum kann dan in einer anderen Zeitzone schnell der 31.12.2012 23:00:00 werden (was auch irgendwie richtig ist, aber vielleicht nicht gewollt)
Ein notesdatetime mit dateonly=true ändert sich dadurch nicht.

Aber so müsste es gehen:
Set newDate = new Notesdatetime(oldDate. LsLocaltime)
Anschließend noch dateonly/timeonly setzen. Ggf noch die timezone

Gruß Roland
Titel: Re: Variablenzuweisung
Beitrag von: pram am 12.10.12 - 08:18:15
@Glombi. Das passiert AFAIK weil Notes einen Autocast auf String durchfuhrt.
Titel: Re: Variablenzuweisung
Beitrag von: Glombi am 12.10.12 - 08:21:31
@Peter: Zu Deiner Aussage
Zitat
Obwohl ich auch noch nicht den Sinn gefunden habe, mit NotesDateTime zu arbeiten, habe ich mal etwas experimentiert

Ich benutze NotesDateTime bspw. oft, um eine Zeit in UTC umzuwandeln, was für die Fliegerei relevant ist. Und da gibts die schöne GMTTime Property.

Andreas
Titel: Re: Variablenzuweisung
Beitrag von: Glombi am 12.10.12 - 08:22:13
@Glombi. Das passiert AFAIK weil Notes einen Autocast auf String durchfuhrt.

Eben ;-)
Titel: Re: Variablenzuweisung
Beitrag von: Peter Klett am 12.10.12 - 08:25:22
Um noch mal zu meinem (elendigen) Versuch etwas weiter oben zurückzukommen, falls jemand so etwas mal in der Art braucht: Der Weg war falsch herum, natürlich müssen erst die großen Einheiten ermittelt werden und dann die kleinen, nicht umgekehrt. Also Tage - Stunden - Minuten - Sekunden, und nicht Sekunden - Minuten - Stunden - Tage :(
Titel: Re: Variablenzuweisung
Beitrag von: gstueb am 09.01.13 - 23:59:34
Ich mache es jetzt übrigens so:

Ich verwende den Code

Code
Dim ndt As NotesDateTime
Dim ndt1 As NotesDateTime
[...]
Set ndt1 = New NotesDateTime( ndt.LSLocalTime )

Und da ich nicht weiß, ob das in irgendwelchen komischen Ausnahmefällen doch schief geht, frage anschließend sicherheitshalber noch die Zeitdifferenz

Code
if ndt.Timedifference(ndt1) <> 0 then ...

ab und logge einen fatalen Error und breche das Programm ab, falls dieser Wert <> 0 sein sollte.

Gruß,
Gregor