Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: schroederk am 18.02.11 - 15:38:03

Titel: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 18.02.11 - 15:38:03
Hallo,

ich versuche ein Array mit Datumwerten zu füllen.
Vorgabe ist ein Von- und ein Bis-Datum. In einer Schleife soll dann das Array gefüllt werden:

Code
			Dim aDates() As NotesDateTime, vdate As NotesDateTime, bdate As NotesDateTime
			Dim i As Integer
			Set vdate = New NotesDateTime("15.03.2011")
			Set bdate = New NotesDateTime("17.03.2011")
			ReDim aDates(0)
			Set aDates(0) = vdate
			vdate.Adjustday(1)
			i = 0
			While vdate.Dateonly <= bdate.Dateonly
				If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
					i = i + 1
					ReDim Preserve aDates(UBound(aDates) + 1)
					Set aDates(UBound(aDates)) = vdate 					
				End If
				vdate.Adjustday(1)
			Wend
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)

Was aber herauskommt ist dreimal der 18.03.2011.
Als wenn er beim Eintragen in den Array nicht den tatsächlichen Wert, sondern die Referenz auf die Variable einträgt.
Beim Beenden der Schleife entspricht vdate ja dem 18.03.2011.

Muss ich hier mit einer Hilfsvariable arbeiten oder wie?
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: Axel am 18.02.11 - 15:56:56
Als wenn er beim Eintragen in den Array nicht den tatsächlichen Wert, sondern die Referenz auf die Variable einträgt.

Du arbeitest hier mit einer Instanz der Klasse NotesDateTime und da wird nicht der Wert im Array abgelegt sondern, wie du bereits richtig erkannt hast, nur ein Verweis.

Muss ich hier mit einer Hilfsvariable arbeiten oder wie?

Du darfst dein Array nicht auf die Klasse NotesDateTime beziehen sondern z.B. als Variant.

Axel
 
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 18.02.11 - 16:19:12
Bei einem
Dim aDates() As Variant
ist jetzt CalendarDateTime ein empty String.  :-:
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: marschul am 18.02.11 - 16:26:13
Oder:

Code
Set aDates(UBound(aDates)) = New NotesDateTime(vdate.DateOnly)

Bei der letzten Zeile
Zitat
Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
ist mir allerdings neu, dass das funktioniert, da aDates ja NotesDateTime-Objekte enthält und mir war / ist nicht klar, dass diese direkt dem Feld zugeordnet werden können ?!?

Gruß
Marco
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: Axel am 18.02.11 - 16:28:07
Ich habe das Ganze mal auf die Schnelle angepasst und in einen Button innerhalb der Maske gelegt und es funktioniert.

Code
	
	Dim ws As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Dim doc As NotesDocument
	
	Dim aDates() As Variant, vdate As NotesDateTime, bdate As NotesDateTime
	Dim i As Integer
	
	Set uidoc = ws.CurrentDocument
	Set doc = uidoc.Document
	
	Set vdate = New NotesDateTime("15.03.2011")
	Set bdate = New NotesDateTime("17.03.2011")
	Redim aDates(0)
	aDates(0) = vdate.DateOnly
	vdate.Adjustday(1)
	i = 0
	While vdate.Dateonly <= bdate.Dateonly
		If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
			i = i + 1
			Redim Preserve aDates(Ubound(aDates) + 1)
			aDates(Ubound(aDates)) = vdate.DateOnly 					
		End If
		vdate.Adjustday(1)
	Wend
	
	Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
	
	Call uidoc.Refresh
	

Axel
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: koehlerbv am 18.02.11 - 16:30:30
Axel, jetzt hast Du aber ein Array of Strings.

Bernhard
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: marschul am 18.02.11 - 16:36:40
Bernhard,

das dürfte leicht zu lösen sein über
Code
aDates(Ubound(aDates)) = vdate.LSLocalTime

Gruß
Marco
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: Axel am 18.02.11 - 16:36:46
Yoo, aber wenn ich das einem DateTime - Feld zuweise sollte es doch wieder passen.

Oder sehe ich das falsch?

Axel
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: koehlerbv am 18.02.11 - 16:48:54
Dem Backend ist der Feldtyp im Frontend absolut egal. Wenn ich also ein String-Array einem Item zuweise, dann wird das auch ein String-Array - selbst, wenn es vorher schon Date/Time gewesen wäre.

Knud soll einfach mit Variants vom Typ Date/Time arbeiten. Dann kann er ganz einfach mit einer For-Next-Schleife arbeiten.

Dim vStart As Variant
Dim vEnd As Variant
Dim vLoop As Variant

For vLoop = vStart To vEnd Step 1
   'vLoop in Array schreiben
Next

HTH,
Bernhard
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 21.02.11 - 07:33:26
Date/Time ist wohl wirklich nicht so mein Fall....  :-:

Wenn ich Bernhards Beispiel versuche umzusetzen, erhalte ich einen Type Mismatch in der For-Schleife:
Ich denke, dass die For-Schleife so nur für numerische Werte funktioniert?

Code
			Dim aDates() As Variant
			Dim vStart As Variant
			Dim vEnd As Variant
			Dim vLoop As Variant
			Set vdate = New NotesDateTime("15.03.2011")
			Set bdate = New NotesDateTime("18.03.2011")
			Set vStart = vdate
			Set vEnd = bdate
			For vLoop = vStart To vEnd Step 1
				ReDim Preserve aDates(UBound(aDates) + 1)
				Set aDates(UBound(aDates)) = vLoop
			Next
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 21.02.11 - 09:15:55
Und ich war mir soo sicher, dass folgender Code funktionieren würde (erzeugt aber auch nur einen leeren CalendarDateTime):

argvdat = "15.03.2011", argbdat = "17.03.2011"
Code
			Dim aDates() As Variant
			Set vdate = New NotesDateTime(argvdat)
			Set bdate = New NotesDateTime(argbdat)
			ReDim aDates(0)
			Set aDates(0) = New NotesDateTime(argvdat & " " & starttime)
			vdate.Adjustday(1)
			While vdate.Dateonly <= bdate.Dateonly
				If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
					ReDim Preserve aDates(UBound(aDates) + 1)
					Set aDates(UBound(aDates)) = New NotesDateTime(CStr(vdate.DateOnly) & " " & starttime) 					
				End If
				vdate.Adjustday(1)
			Wend
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: pram am 21.02.11 - 09:27:04
Knud soll einfach mit Variants vom Typ Date/Time arbeiten. Dann kann er ganz einfach mit einer For-Next-Schleife arbeiten.
Date/Time != NotesDateTime


Date/Time Typen erzeugst du mit CDat/DateNumber/Now/... und sind skalare Gleitkommawerte (müssen aber als variant deklariert werdern)
NotesDateTime ist ein Objekt, welches man mit "set" zusweisen muss etc.

Gruß
Roland
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 21.02.11 - 10:30:04
Ich habe jetzt doch einfach aDates(..) = vdate.DateOnly benutzt. Damit funktioniert es, auch wenn einem Original gegenüber jetzt nur das Datum und nicht noch Uhrzeit drinsteht.

Mal schauen, wie der Kalendereintrag am Ende aussieht. Momentan wird er noch nicht korrekt erzeugt.
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: koehlerbv am 23.02.11 - 03:17:22
Hallo Knud,

in meinen als "Prinzipstudie" aus dem Kopf hingetippten Code mag etwas nicht passen, ich kann das während des EntwicklerCamps in Gelsenkirchen auch nicht tiefer checken (kurze Nächte hier  ;D).

Schau Dir mal mal folgenden definitiv funktionierenden Code unten an (da Dir sicherlich der "ErrorHandler" fehlt, musst Du da noch Hand anlegen. Wenn Du den Code nachvollziehen konntest, kannst Du ihn als "Blackbox" verwenden oder Deinen Gegebeneheiten anpassen.

HTH,
Bernhard

Function GetDateArray (vStartDate As Variant, vEndDate As Variant, szErrorMessage As String) As Variant
     '===================================================================================================================================
     ' Purpose:      Build from given start end and end date an array of date/time variants containing all days between start and end date
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Arguments:
   '               vStartDate - First date of the period (included) - must be variant of type "Date/Time"
   '               vLastDate - Last date of the period (included) - must be variant of type "Date/Time"
   '               szErrorMessage - A variable to return possible error messages by reference
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Returns:      An array of variants containing all days between start and end date
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Created by:     Bernhard Koehler on 10.04.2004                           Modified by: Bernhard Koehler on 14.10.2010
     '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ' NOTES:      We allow a maximum of 4000 elements in the resulting array to avoid an overflow
     '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ' Changes:      Enhanced error handling to avoid an overflow, new parameter szErrorMessage
     '===================================================================================================================================
   
   Dim vResult () As Variant
   Dim iLoop As Integer
   
   On Error Goto ErrorRoutine
   
   'Check for correct values:
   If (Datatype (vStartDate) <> V_DATE) Or (Datatype (vEndDate) <> V_DATE) Then
      szErrorMessage = "Wrong data types used!"
      Exit Function
   End If
   If vEndDate - vStartDate < 0 Then
      szErrorMessage = "EndDate is before StartDate!"
      Exit Function
   End If
   
   If vEndDate - vStartDate > 3999 Then
      szErrorMessage = "You tried to build a datelist between " & Cstr (vStartDate) & " and " & Cstr (vEndDate) & " which would result in an overflow!"
      Exit Function
   End If
   
   iLoop = vEndDate - vStartDate
   Redim vResult (0 To iLoop)
   
   vResult (0) = vStartDate
   For iLoop = 1 To Ubound (vResult)
      vResult (iLoop) = vStartDate + iLoop
   Next
   
   GetDateArray = vResult
   
   Exit Function
   
ErrorRoutine:
   Call ErrorHandler ("GetDateArray")
   szErrorMessage = "Run-time error " & Error$ & " in line " & Cstr (Erl) & " (vStartDate: " & Cstr (vStartDate) & "   vEndDate: " & Cstr (vEndDate)
   Exit Function   
End Function
Titel: Re: Fehler beim Erzeugen von einem Array of DateTime
Beitrag von: schroederk am 23.02.11 - 10:53:40
Vielen Dank für den Beispiel-Code.
Sehr anschaulich, wie einfach doch mit Datum gearbeitet werden kann.
Ich habe die entsprechenden Code-Teile gleich für mich übernommen.