Autor Thema: Variablenzuweisung  (Gelesen 6809 mal)

Offline oxyd21

  • Senior Mitglied
  • ****
  • Beiträge: 371
  • Geschlecht: Männlich
Variablenzuweisung
« 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

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Variablenzuweisung
« Antwort #1 am: 02.12.10 - 11:01:36 »
Set datTempDate = New NotesDateTime(StartDate)
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline oxyd21

  • Senior Mitglied
  • ****
  • Beiträge: 371
  • Geschlecht: Männlich
Re: Variablenzuweisung
« Antwort #2 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

Glombi

  • Gast
Re: Variablenzuweisung
« Antwort #3 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)



Offline oxyd21

  • Senior Mitglied
  • ****
  • Beiträge: 371
  • Geschlecht: Männlich
Re: Variablenzuweisung
« Antwort #4 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.

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Re: Variablenzuweisung
« Antwort #5 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
« Letzte Änderung: 12.10.12 - 00:31:22 von gstueb »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Variablenzuweisung
« Antwort #6 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"?

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Re: Variablenzuweisung
« Antwort #7 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Variablenzuweisung
« Antwort #8 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 ...
« Letzte Änderung: 12.10.12 - 07:47:57 von Peter Klett »

Glombi

  • Gast
Re: Variablenzuweisung
« Antwort #9 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

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Variablenzuweisung
« Antwort #10 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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Variablenzuweisung
« Antwort #11 am: 12.10.12 - 08:18:15 »
@Glombi. Das passiert AFAIK weil Notes einen Autocast auf String durchfuhrt.
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Glombi

  • Gast
Re: Variablenzuweisung
« Antwort #12 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

Glombi

  • Gast
Re: Variablenzuweisung
« Antwort #13 am: 12.10.12 - 08:22:13 »
@Glombi. Das passiert AFAIK weil Notes einen Autocast auf String durchfuhrt.

Eben ;-)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Variablenzuweisung
« Antwort #14 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 :(

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Re: Variablenzuweisung
« Antwort #15 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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz